在Raspberry Pi和计算机之间使用带有Python套接字库的蓝牙串行端口配置文件发送数据

问题描述

我已经能够通过蓝牙将传感器连接到我的 RaspBerry Pi,并使用 Python Socket 库和此程序通过串行端口配置文件接收其信息:

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.BTPROTO_RFCOMM)
s_comp.connect((computerMACAddress,port))


# This goes inside the loop
s_comp.send(YPR.encode())

显然这个程序正在发送信息,它确实通过蓝牙连接到我的电脑(或我的手机),但我的电脑 (Windows) 似乎没有收到它,我的手机 (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.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 手机我也无法接收信息,即使我可以建立蓝牙连接。

所以,总结一下:

  1. 为什么 send() 和 recv() 函数适用于传感器而不适用于计算机或手机?
  2. 如果我需要一个服务器程序,为什么我不需要它来接收来自传感器的信息,我该如何让它工作?
  3. 如果这不是问题,那是什么?

谢谢。

解决方法

看起来传感器上运行着蓝牙串行端口配置文件 (SPP) 服务器,因此 Raspberry Pi 上的 SPP 客户端连接并成功交换信息。

Windows 上蓝牙 SPP 的 Python 套接字仅在 Python 3.9 中引入,因此您需要在 Windows 计算机上安装最新版本的 Python。

但是,如果它已连接,那么您可能需要寻找它所连接的串行端口。也许以下内容会有所帮助:https://www.instructables.com/Raspberry-Pi-Bluetooth-to-PuTTY-on-Windows-10/

然而,更典型的设置是 Raspberry Pi 将成为传感器和网络之间的桥梁。这意味着来自传感器的值通过蓝牙传输到 RPi。然后,RPi 通过在 RPi 上运行的网站/套接字,通过 WiFi/互联网提供传感器数据。

作为旁注,您可以更高效地解包数据。例如:

>>> 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]