如何将实时 Android 传感器数据无线传输到 PC?

问题描述 投票:0回答:3

我希望将传感器数据(例如加速度计数据)从我的 Android 手机无线传输到我的电脑。

我目前已经创建了一个非常基本的应用程序,可以在屏幕上显示加速度计数据。 我已经在这个帖子中看到了答案如何将Android实时传感器数据传输到计算机?.

但是,我希望能够将其放入我现有的基本加速度计应用程序中,该应用程序是根据基本活动模板以及此链接中的代码进行编辑的https://www.javatpoint.com/android-sensor-教程,我还想看看Python代码本身。

如果信息不足,请提前致歉。这是我第一次在这里发帖。

android
3个回答
4
投票

您可以使用 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()

2
投票

不知道你是否已经找到解决办法了。但对于任何寻找方向的人来说。 现在有两种方法可以在两台机器之间进行无线通信(在您的情况下是 Android 和 PC):UDP 和 TCP。如果要保证数据的完整性和传输,请使用TCP。

Socket
是您需要的课程。在这种情况下,谁是客户端和服务器并不重要,因为通信是双向的,就像聊天应用程序一样。 如果您使用 UDP,则
DatagramSocket
是要转到的类。它不保证数据完整性和传输,但比前者更快。

建议使用UDP进行传感器数据传输,因为传感器产生的数据是连续流,必须立即传输以避免阻塞。 阅读官方文档,你就可以开始了。

TCP官方文档

UDP官方文档


2
投票

所以我不久前发现,套接字和服务器是正确的选择

在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);

© www.soinside.com 2019 - 2024. All rights reserved.