如何从 Raspberry Pi Zero 向 PC 发送实时传感器数据?
Posted
技术标签:
【中文标题】如何从 Raspberry Pi Zero 向 PC 发送实时传感器数据?【英文标题】:How to send real-time sensor data to PC from Raspberry Pi Zero? 【发布时间】:2020-11-02 08:30:09 【问题描述】:我编写了一个 Python3 脚本,该脚本在 Raspberry Pi Zero W 上运行,该脚本从 IMU 传感器 (MPU9250) 收集数据并创建 3 个不同的角度值;滚动,俯仰,偏航。看起来像这样:
def main():
while True:
dataAcc = mpu.readAccelerometerMaster()
dataGyro = mpu.readGyroscopeMaster()
dataMag = mpu.readMagnetometerMaster()
[ax, ay, az] = [round(dataAcc[0], 5), round(dataAcc[1], 5), round(dataAcc[2], 5)]
[gx, gy, gz] = [round(dataGyro[0], 5), round(dataGyro[1], 5), round(dataGyro[2], 5)]
[mx, my, mz] = [round(dataMag[0], 5), round(dataMag[1], 5), round(dataMag[2], 5)]
update(gx, gy, gz, ax, ay, az, mx, my, mz)
roll = getRoll()
pitch = getPitch()
yaw = getYaw()
print(f"Roll: round(roll, 2)\tPitch: round(pitch, 2)\tYaw: round(yaw, 2)")
我想要做的就是将这 3 个值发送到我的 PC 并读取它们。有什么方法可以发送这些数据。
(如果可能,serial
除外)。
【问题讨论】:
【参考方案1】:有很多方法可以做到这一点,仅举几例:
从 Raspi 向 PC 发送 UDP 消息 从 Raspi 向 PC 发送 TCP 流 将读数放入 Redis 并允许您网络上的任何人收集它们 - 例如 here 使用 MQTT 客户端从您的 Raspi 发布读数,并在您的 PC 作为服务器上订阅该主题 在一台机器上运行 Python 多处理管理器并从另一台机器连接 - 请参阅“使用远程管理器”here 通过蓝牙发送读数这是上面第一个建议的可能实现与 UDP。首先,Raspi 端生成 3 个读数 X、Y 和 Z,每秒通过 UDP 发送给 PC:
#!/usr/bin/env python3
import socket
import sys
from time import sleep
import random
from struct import pack
# Create a UDP socket
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
host, port = '192.168.0.8', 65000
server_address = (host, port)
# Generate some random start values
x, y, z = random.random(), random.random(), random.random()
# Send a few messages
for i in range(10):
# Pack three 32-bit floats into message and send
message = pack('3f', x, y, z)
sock.sendto(message, server_address)
sleep(1)
x += 1
y += 1
z += 1
这是它的PC端的匹配代码:
#!/usr/bin/env python3
import socket
import sys
from struct import unpack
# Create a UDP socket
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# Bind the socket to the port
host, port = '0.0.0.0', 65000
server_address = (host, port)
print(f'Starting UDP server on host port port')
sock.bind(server_address)
while True:
# Wait for message
message, address = sock.recvfrom(4096)
print(f'Received len(message) bytes:')
x, y, z = unpack('3f', message)
print(f'X: x, Y: y, Z: z')
这是 MQTT 建议的可能实现。首先,发布这三个值的发布者。请注意,我的桌面上正在运行 mosquitto
代理:
#!/usr/bin/env python3
from time import sleep
import random
import paho.mqtt.client as mqtt
broker = '192.168.0.8'
client = mqtt.Client()
client.connect(broker,1883,60)
# Generate some random start values
x, y, z = random.random(), random.random(), random.random()
# Send a few messages
for i in range(10):
# Publish out three values
client.publish("topic/XYZ", f'x,y,z');
sleep(1)
x += 1
y += 1
z += 1
这里是订阅者,它监听消息并打印它们:
#!/usr/bin/env python3
import socket
import sys
import paho.mqtt.client as mqtt
def on_connect(client, userdata, flags, rc):
print("Connected with result code "+str(rc))
client.subscribe("topic/XYZ")
def on_message(client, userdata, msg):
message = msg.payload.decode()
print(f'Message received: message')
broker = '192.168.0.8'
client = mqtt.Client()
client.connect(broker,1883,60)
client.on_connect = on_connect
client.on_message = on_message
client.loop_forever()
有一个蓝牙通信的例子here。
【讨论】:
如何获取主机和端口值? @AchmadSetiawan 您使用hostname -I
获取Raspberry Pi 上的主机IP 地址。在 Windows 上,您可能会使用 ipconfig
,而在 macOS 上,您将使用 ifconfig -a
或查看 Apple 菜单->系统偏好设置->Newtork。您可以选择任何您喜欢的端口,只要它小于 65536,通常使用 1024 以上的非特权端口更容易。所以,尝试 65,000 或类似的端口。【参考方案2】:
您可以在 pi 上设置一个简单的 Web 服务器,并从同一网络上的任何设备访问该服务器,而无需进行任何花哨的设置。
如果你的 pi 零有 wifi 或者如果你能得到适配器,你可以很容易地用烧瓶或 Django 启动你的服务器。
【讨论】:
以上是关于如何从 Raspberry Pi Zero 向 PC 发送实时传感器数据?的主要内容,如果未能解决你的问题,请参考以下文章
使用Raspberry Pi Zero和Golang制作硬件比特币钱包
问题+澄清:使用 Google 云消息传递从 Raspberry Pi 向 Android 手机发送消息
Android Things 3 无法从 Raspberry PI 3 上的 rxtx 读取
我有一个 Arduino Rs485 网络,正在尝试在 Raspberry Pi 中添加一个。 Pi 能够向 Arduino 发送消息,但无法接收