使用带有 Python 套接字库的蓝牙串行端口配置文件在 Raspberry Pi 和计算机之间发送数据
Sending data using Bluetooth Serial Port Profile with Python socket library between Raspberry Pi and computer
我已经能够通过蓝牙将传感器连接到我的 Raspberry Pi,并使用带有此程序的 Python 套接字库通过串行端口配置文件接收其信息:
import socket
sensorMACAddress = 'XX:XX:XX:XX:XX:XX'
port = 1
s = socket.socket(socket.AF_BLUETOOTH, socket.SOCK_STREAM, socket.BTPROTO_RFCOMM)
s.connect((sensorMACAddress,port))
s.send(bytes('#ob', 'UTF-8')) # Tells the sensor to send the data in bytes
while(1):
data = s.recv(12)
while len(data) < 12:
data = data + s.recv(12)
Y = struct.unpack('<f', data[0:4])[0]
P = struct.unpack('<f', data[4:8])[0]
R = struct.unpack('<f', data[8:12])[0]
YPR = str(['S3', int(Y), int(P), int(R)])
print(YPR)
print('\n')
(传感器连接后自动发送数据。)
现在我想把这个传感器的信息发送到我的电脑,所以我更新了之前的程序,为树莓派和电脑之间的连接创建了一个新的套接字对象,用 send() 发送信息功能:
# This goes outside the loop
computerMACAddress = 'XX:XX:XX:XX:XX:XX'
s_comp = socket.socket(socket.AF_BLUETOOTH, socket.SOCK_STREAM, socket.BTPROTO_RFCOMM)
s_comp.connect((computerMACAddress,port))
# This goes inside the loop
s_comp.send(YPR.encode())
显然这个程序正在发送信息,它确实通过蓝牙连接到我的电脑(或我的phone)但我的电脑(Windows)似乎没有收到它,也没有我的 phone (Android).
按照这些步骤 (https://scribles.net/setting-up-bluetooth-serial-port-profile-on-raspberry-pi/) 我能够使用各自的键盘通过蓝牙在我的 Raspberry Pi 和我的计算机之间发送和接收信息,使用蓝牙串行端口配置文件,所以问题似乎在插座上而不是在蓝牙串行端口配置文件连接上。以下简单程序也不起作用:
import socket
computerMACAddress = 'XX:XX:XX:XX:XX:XX'
port = 1
s = socket.socket(socket.AF_BLUETOOTH, socket.SOCK_STREAM, socket.BTPROTO_RFCOMM)
s.connect((computerMACAddress,port))
data = 'Hello world!'
while 1:
s.send(bytes(data, 'UTF-8'))
print(data)
在这个例子中 (http://blog.kevindoran.co/bluetooth-programming-with-python-3/) 我看到他们创建了一个客户端程序来发送信息和一个服务器程序来接收它,但我不必这样做就可以从传感器接收信息到树莓派,所以我不知道为什么我需要用电脑来做。无论如何,我试过了,但没能成功。显然,套接字在 Windows 中不能很好地工作,但是在我的 Android phone 中,即使我可以建立蓝牙连接,我也无法接收信息。
所以,总结一下:
- 为什么 send() 和 recv() 函数对传感器起作用,但对计算机或 phone 不起作用?
- 如果我需要一个服务器程序,为什么我不需要它来接收来自传感器的信息,我怎样才能让它工作?
- 如果这不是问题,那是什么问题?
谢谢。
传感器上似乎有蓝牙串行端口配置文件 (SPP) 服务器 运行,因此 Raspberry Pi 上的 SPP 客户端成功连接并交换信息。
Python Windows 上的蓝牙 SPP 套接字仅在 Python 3.9 中引入,因此您需要在 Windows 上安装最新版本的 Python计算机。
但是,如果它已连接,那么您可能需要去寻找它所连接的串口。也许以下内容会有所帮助:https://www.instructables.com/Raspberry-Pi-Bluetooth-to-PuTTY-on-Windows-10/
然而,更典型的设置是 Raspberry Pi 将成为传感器和网络之间的桥梁。这意味着来自传感器的值通过蓝牙传输到 RPi。然后 RPi 通过 RPi 上的 website/socket 运行 使传感器数据在 WiFi/internet 上可用。
附带说明一下,您可以更有效地解包数据。例如:
>>> data = b'\x11\x11\x11\x11\x22\x22\x22\x22\x33\x33\x33\x33'
>>> import struct
>>> Y, P, R = struct.unpack('<fff', data)
>>> print(f"['S3', {Y}, {P}, {R}]\n")
['S3', 1.1443742118159064e-28, 2.1973163753312686e-18, 4.17232506322307e-08]
我已经能够通过蓝牙将传感器连接到我的 Raspberry Pi,并使用带有此程序的 Python 套接字库通过串行端口配置文件接收其信息:
import socket
sensorMACAddress = 'XX:XX:XX:XX:XX:XX'
port = 1
s = socket.socket(socket.AF_BLUETOOTH, socket.SOCK_STREAM, socket.BTPROTO_RFCOMM)
s.connect((sensorMACAddress,port))
s.send(bytes('#ob', 'UTF-8')) # Tells the sensor to send the data in bytes
while(1):
data = s.recv(12)
while len(data) < 12:
data = data + s.recv(12)
Y = struct.unpack('<f', data[0:4])[0]
P = struct.unpack('<f', data[4:8])[0]
R = struct.unpack('<f', data[8:12])[0]
YPR = str(['S3', int(Y), int(P), int(R)])
print(YPR)
print('\n')
(传感器连接后自动发送数据。)
现在我想把这个传感器的信息发送到我的电脑,所以我更新了之前的程序,为树莓派和电脑之间的连接创建了一个新的套接字对象,用 send() 发送信息功能:
# This goes outside the loop
computerMACAddress = 'XX:XX:XX:XX:XX:XX'
s_comp = socket.socket(socket.AF_BLUETOOTH, socket.SOCK_STREAM, socket.BTPROTO_RFCOMM)
s_comp.connect((computerMACAddress,port))
# This goes inside the loop
s_comp.send(YPR.encode())
显然这个程序正在发送信息,它确实通过蓝牙连接到我的电脑(或我的phone)但我的电脑(Windows)似乎没有收到它,也没有我的 phone (Android).
按照这些步骤 (https://scribles.net/setting-up-bluetooth-serial-port-profile-on-raspberry-pi/) 我能够使用各自的键盘通过蓝牙在我的 Raspberry Pi 和我的计算机之间发送和接收信息,使用蓝牙串行端口配置文件,所以问题似乎在插座上而不是在蓝牙串行端口配置文件连接上。以下简单程序也不起作用:
import socket
computerMACAddress = 'XX:XX:XX:XX:XX:XX'
port = 1
s = socket.socket(socket.AF_BLUETOOTH, socket.SOCK_STREAM, socket.BTPROTO_RFCOMM)
s.connect((computerMACAddress,port))
data = 'Hello world!'
while 1:
s.send(bytes(data, 'UTF-8'))
print(data)
在这个例子中 (http://blog.kevindoran.co/bluetooth-programming-with-python-3/) 我看到他们创建了一个客户端程序来发送信息和一个服务器程序来接收它,但我不必这样做就可以从传感器接收信息到树莓派,所以我不知道为什么我需要用电脑来做。无论如何,我试过了,但没能成功。显然,套接字在 Windows 中不能很好地工作,但是在我的 Android phone 中,即使我可以建立蓝牙连接,我也无法接收信息。
所以,总结一下:
- 为什么 send() 和 recv() 函数对传感器起作用,但对计算机或 phone 不起作用?
- 如果我需要一个服务器程序,为什么我不需要它来接收来自传感器的信息,我怎样才能让它工作?
- 如果这不是问题,那是什么问题?
谢谢。
传感器上似乎有蓝牙串行端口配置文件 (SPP) 服务器 运行,因此 Raspberry Pi 上的 SPP 客户端成功连接并交换信息。
Python Windows 上的蓝牙 SPP 套接字仅在 Python 3.9 中引入,因此您需要在 Windows 上安装最新版本的 Python计算机。
但是,如果它已连接,那么您可能需要去寻找它所连接的串口。也许以下内容会有所帮助:https://www.instructables.com/Raspberry-Pi-Bluetooth-to-PuTTY-on-Windows-10/
然而,更典型的设置是 Raspberry Pi 将成为传感器和网络之间的桥梁。这意味着来自传感器的值通过蓝牙传输到 RPi。然后 RPi 通过 RPi 上的 website/socket 运行 使传感器数据在 WiFi/internet 上可用。
附带说明一下,您可以更有效地解包数据。例如:
>>> data = b'\x11\x11\x11\x11\x22\x22\x22\x22\x33\x33\x33\x33'
>>> import struct
>>> Y, P, R = struct.unpack('<fff', data)
>>> print(f"['S3', {Y}, {P}, {R}]\n")
['S3', 1.1443742118159064e-28, 2.1973163753312686e-18, 4.17232506322307e-08]