我希望将传感器数据(例如加速度计数据)从我的 Android 手机无线传输到我的电脑。
我目前已经创建了一个非常基本的应用程序,可以在屏幕上显示加速度计数据。 我已经在这个帖子中看到了答案如何将Android实时传感器数据传输到计算机?.
但是,我希望能够将其放入我现有的基本加速度计应用程序中,该应用程序是根据基本活动模板以及此链接中的代码进行编辑的https://www.javatpoint.com/android-sensor-教程,我还想看看Python代码本身。
如果信息不足,请提前致歉。这是我第一次在这里发帖。
您可以使用 Github 上的 Sensor Server 应用程序,它运行 Websocket 服务器并将实时传感器数据发送到 WebSocket 客户端。
要从
Accelerometer
传感器接收实时数据,您只需使用以下 URL 连接到应用程序
ws://ip:port/sensor/connect?type=android.sensor.accelerometer
要在 Python 脚本中接收实时数据,您可以使用 Python 的 WebSocket 客户端
import websocket
def on_message(ws, message):
print(message) # sensor data here in JSON format
def on_error(ws, error):
print("### error ###")
print(error)
def on_close(ws, close_code, reason):
print("### closed ###")
print("close code : ", close_code)
print("reason : ", reason )
def on_open(ws):
print("connection opened")
if __name__ == "__main__":
ws = websocket.WebSocketApp("ws://192.168.0.102:8082/sensor/connect?type=android.sensor.accelerometer",
on_open=on_open,
on_message=on_message,
on_error=on_error,
on_close=on_close)
ws.run_forever()
传感器服务器应用程序和Websocket客户端必须连接到同一网络
对于基于 UDP 的通信,您可以使用 SensaGram 应用程序。要接收传感器数据,您需要建立 UDP 服务器并侦听来自应用程序的传入数据
from udpserver import UDPServer
import json
def onData(data):
jsonData = json.loads(data)
sensorType = jsonData["type"]
timestamp = jsonData.get("timestamp")
values = jsonData.get("values")
if sensorType == "android.sensor.accelerometer":
x, y, z = values
print(f"accelerometer : x = {x}, y = {y}, z = {z} timestamp = {timestamp} ")
if sensorType == "android.sensor.gyroscope":
x, y, z = values
print(f"gyroscope : x = {x}, y = {y}, z = {z} timestamp = {timestamp} ")
if sensorType == "android.gps":
print(jsonData)
# Initialize the server to listen on all network interfaces (0.0.0.0) and port 8080
server = UDPServer(address=("0.0.0.0", 8080))
server.setDataCallBack(onData)
server.start()
所以我不久前发现,套接字和服务器是正确的选择
在Python方面:
import socket
import sys
HOST="your ip address"
PORT= some_port
ss=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
print('Socket created')
ss.bind((HOST,PORT))
print('Socket bind complete')
ss.listen(10)
print('Socket now listening')
conn, addr = ss.accept()
print("socket accept")
在安卓端:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
...
...
Runnable threadname = new Runnable() {
@Override
public void run() {
try {
textView2.append("threadname is running\n");
String SERVER_ADDRESS = "your ip address";
int SERVER_PORT = your port;
if (clientSocket == null) {
clientSocket = new Socket(InetAddress.getByName(SERVER_ADDRESS), SERVER_PORT);
SocketAddress socketAddress = new InetSocketAddress(SERVER_ADDRESS, SERVER_PORT);
if (!clientSocket.isConnected() ) {
clientSocket.connect(socketAddress);
}
if (!clientSocket.isBound()) {
clientSocket.bind(socketAddress);
}
if (clientSocket.isClosed()) {
}
}
DataOutputStream DOS = new DataOutputStream(clientSocket.getOutputStream());
DOS.writeBytes(stufftosend);