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

2024-09-28 20:57:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我已经能够通过蓝牙将传感器连接到我的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())

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

因此,总而言之:

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

多谢各位


Tags: 文件the程序send信息dataport计算机
1条回答
网友
1楼 · 发布于 2024-09-28 20:57:53

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

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

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

然而,更典型的设置是,树莓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]

相关问题 更多 >