我希望将Android智能手机收集的实时传感器数据传输到我的电脑,并在我的电脑上进行信号处理。 我怎样才能实现这个目标?非常欢迎任何有用的教程链接。
无线方式或 USB 电缆均可。
数据传输后,计算机如何处理?
我熟悉Python,所以最好使用Python来处理即将到来的数据。
Python有可能不断接受新来的数据并处理它们吗?
一些 Android 应用程序允许您通过网络共享传感器:
http://SMARTPHONE_IP:8080/sensors.json
用作webapi)您还可以通过 ADB 读取传感器!
有多个 Android 应用程序可以无线传输传感器数据。结帐例如“智能手机 IMU GPS”[1],它是开源的 [2]。它通过UDP传输数据。应用程序描述 [1] 中给出了用于接收数据流的 Python 代码片段。确保智能手机和接收设备连接到同一 WiFi 网络,并且没有防火墙阻止流量。
[1] https://play.google.com/store/apps/details?id=de.lorenz_fenster.sensorstreamgps
[2] https://sourceforge.net/projects/smartphone-imu/
您可以使用Python套接字来接收数据并处理它。 请参阅:https://docs.python.org/2/howto/sockets.html 了解如何设置服务器计算机的一些想法。
Android 有一个兼容的套接字,您可以使用它来发送数据: 看看:http://examples.javacodegeeks.com/android/core/socket-core/android-socket-example/ 有关如何使用它的一些想法。
编辑:这适用于 wifi 和 3g/4g。
phyphox可以。
首先,您选择要在 phypox 中测量的内容,我将以原始音频为例,但它可能也适用于其他传感器和音频类型。首先进入音频自相关并进入原始数据选项卡。当您按下播放键时,您可以看到电脑上将收到的内容的图表。然后从右上角的菜单中选择“允许远程访问”。屏幕底部会出现一个网址。
以下代码可以在您的电脑上运行,并显示瞬时测量结果的图表,但当然可以对其进行调整以连续接收数据:
import requests
import json
import matplotlib.pyplot as plt
def send_request():
try:
response = requests.get(
url=f"{url}/get?recording=full&time=full" # this can be changed for other audio types
)
print(f'Response HTTP Status Code: {response.status_code}')
# print(f'Response HTTP Response Body: {response.content}')
return response.content
except requests.exceptions.RequestException:
print('HTTP Request failed')
def graph(raw):
data = json.loads(raw.decode('utf-8')) # Turns data into a large dictionary
amplitude = data["buffer"]["recording"]["buffer"] # This location depends on the sensor type
t = data["buffer"]["time"]["buffer"]
print(amplitude)
plt.plot(t, amplitude)
plt.show()
url = "url" # insert url from phyphox here
raw_data = send_request()
if raw_data:
graph(raw_data)
查看其他传感器时,可以通过在浏览器中打开 phyphox 提供的 url 找到 requests.get()
的完整 url,然后使用检查元素,在“网络”选项卡下会传入大量数据。单击其中之一和链接将显示在标题顶部。
Sensor Server 应用程序,它将实时传感器数据传输到 WebSocket 客户端。
要从 Android 接收实时传感器数据,您只需使用以下 URL 连接到应用程序
ws://ip:port/sensor/connect?type=<sensor-type>
其中 <sensor-type>
是您要连接的传感器类型。例如对于加速度计:
/sensor/connect?type=android.sensor.accelerometer
/sensor/connect?type=android.sensor.orientation
/sensor/connect?type=android.sensor.gyroscope
几乎每种语言都提供了Websocket协议的实现。要在 Python 脚本中接收实时数据,您可以使用
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()