Bluetooth Raspberry Pi4和ESP32(蓝牙)之间的BluePy频繁断开

Bluetooth Raspberry Pi4和ESP32(蓝牙)之间的BluePy频繁断开,bluetooth,raspberry-pi,bluetooth-lowenergy,raspbian,esp32,Bluetooth,Raspberry Pi,Bluetooth Lowenergy,Raspbian,Esp32,我(和其他人一样)在RPi4中央(客户端)和ESP32外围(服务器)之间有多个断开连接。在安卓手机上使用“nRF Connect”应用程序,与ESP32的连接非常牢固。然而,RPi4-ESP32 BLE通信非常不稳定。该发现意味着故障与RPi和/或代码有关。最初的BLE连接忠实地发生,但在随机数次成功读取(通常为1-50次读取)后,连接不可避免地会断开。我正在RPI4上使用BluePy 1.3.0和新的Raspbian图像。我附加了骨架代码和随机数次成功读取后生成的错误消息 import

我(和其他人一样)在RPi4中央(客户端)和ESP32外围(服务器)之间有多个断开连接。在安卓手机上使用“nRF Connect”应用程序,与ESP32的连接非常牢固。然而,RPi4-ESP32 BLE通信非常不稳定。该发现意味着故障与RPi和/或代码有关。最初的BLE连接忠实地发生,但在随机数次成功读取(通常为1-50次读取)后,连接不可避免地会断开。我正在RPI4上使用BluePy 1.3.0和新的Raspbian图像。我附加了骨架代码和随机数次成功读取后生成的错误消息

    import time
    from bluepy.btle import Peripheral

    peripheral_address = "8c:aa:b5:85:20:1e"
    service_uuid =  "537e7010-9928-4595-89dc-46b495862dc6"
    characteristic_uuid = "3778ceab-0974-4eb0-9da5-26c3a69cc742" # Read from peripheral

    p = Peripheral(peripheral_address, "public") #random does not work!!
    Service=p.getServiceByUUID(service_uuid)
    Characterization=Service.getCharacteristics(characteristic_uuid)[0]
    print("Got characterization")

    time.sleep(1)

    while True:
        value = Characterization.read()
        print(value)
        time.sleep(0.1)

Traceback (most recent call last):
  File "/home/pi/Desktop/BLETest/bleRead.py", line 16, in <module>
    value = Characterization.read()
  File "/usr/local/lib/python3.7/dist-packages/bluepy/btle.py", line 197, in read
    return self.peripheral.readCharacteristic(self.valHandle)
  File "/usr/local/lib/python3.7/dist-packages/bluepy/btle.py", line 530, in readCharacteristic
    resp = self._getResp('rd')
  File "/usr/local/lib/python3.7/dist-packages/bluepy/btle.py", line 407, in _getResp
    resp = self._waitResp(wantType + ['ntfy', 'ind'], timeout)
  File "/usr/local/lib/python3.7/dist-packages/bluepy/btle.py", line 362, in _waitResp
    raise BTLEDisconnectError("Device disconnected", resp)
bluepy.btle.BTLEDisconnectError: Device disconnected
导入时间
从bluepy.btle导入外围设备
外围设备地址=“8c:aa:b5:85:20:1e”
服务_uuid=“537e7010-9928-4595-89dc-46b495862dc6”
特征_uuid=“3778ceab-0974-4eb0-9da5-26c3a69cc742”#从外围设备读取
p=外设(外设地址,“公共”)#随机不起作用!!
服务=p.getServiceByUUID(服务\u uuid)
特征化=服务.getCharacteristics(特征\u uuid)[0]
打印(“获得角色化”)
时间。睡眠(1)
尽管如此:
value=Characterization.read()
打印(值)
睡眠时间(0.1)
回溯(最近一次呼叫最后一次):
文件“/home/pi/Desktop/BLETest/bleRead.py”,第16行,在
value=Characterization.read()
文件“/usr/local/lib/python3.7/dist-packages/bluepy/btle.py”,第197行,已读
返回self.peripheral.readCharacteristic(self.valHandle)
readCharacteristic中的文件“/usr/local/lib/python3.7/dist packages/bluepy/btle.py”,第530行
resp=self.\u getResp('rd'))
文件“/usr/local/lib/python3.7/dist-packages/bluepy/btle.py”,第407行,在
resp=self.\u waitResp(wantType+['ntfy','ind'],超时)
文件“/usr/local/lib/python3.7/dist packages/bluepy/btle.py”,第362行,in_waitResp
升起BTLEDisconnectError(“设备断开”,resp)
bluepy.btle.btleDisconnector错误:设备已断开连接
注意:添加代码以捕获断开连接异常到目前为止还未成功,这导致了额外的引发错误和数据丢失,这与重新连接所需的时间无关


我非常有兴趣听到任何与RPi客户有良好沟通的人的来信?非常感谢您的帮助。谢谢。

可能有很多事情,但我会调查几个方面

首先,目前RPi上的蓝牙固件有点混乱,正如您从该线程中看到的:

所以我会检查你是否同意

我相信BluePy有一个
BluePy helper
模块,它基于Bluez版本5.47,这是RPi现在使用的版本。可能值得尝试另一个库,看看问题是否仍然存在

下面是一个使用BlueZ D-Bus API直接读取特性的示例,用于python D-Bus绑定:

从时间导入睡眠
导入pydbus
从gi.repository导入GLib
外围设备地址=“8C:AA:B5:85:20:1E”
服务_uuid=“537e7010-9928-4595-89dc-46b495862dc6”
特征_uuid=“3778ceab-0974-4eb0-9da5-26c3a69cc742”#从外围设备读取
#DBus对象路径
BLUEZ_服务='org.BLUEZ'
适配器路径='/org/bluez/hci0'
device_path=f“{ADAPTER_path}/dev_{peripheral_address.replace(':','''.')}”
#设置数据库总线
总线=pydbus.SystemBus()
mngr=bus.get(BLUEZ_服务“/”)
adapter=bus.get(BLUEZ_服务,适配器路径)
device=bus.get(BLUEZ_服务,设备路径)
device.Connect()
虽然没有解决device.Services问题:
睡眠(0.5)
def获取特征路径(开发路径,uuid):
“”“查找特征UUID的DBus路径”“”
mng_objs=mngr.GetManagedObjects()
对于mng_objs中的路径:
chr_uuid=mng_objs[path].get('org.bluez.GattCharacteristic1',{}.get('uuid'))
如果path.startswith(dev_path)和chr_uuid==uuid.casefold():
返回路径
#特征DBus信息
char\u path=get\u characteristic\u path(设备.\u path,characteristic\u uuid)
角色化=bus.get(BLUEZ_服务,char_路径)
#无事件循环通知的读取特征
尽管如此:
打印(characterization.ReadValue({}))
睡眠时间(0.1)
您从支持通知中读取的特征是否正确?如果是这样,那么这是一种更有效的方式来使用蓝牙链接。上述
while
循环可替换为:

#为通知启用eventloop
def notify_处理程序(如果更换、更换道具、移除道具):
“”“通知特征的事件处理程序”“”
如果项目中的“值”发生变化:
新值=属性更改['value']
打印(f“已接收:{new_value}”)
mainloop=GLib.mainloop()
characterization.onPropertiesChanged=通知处理程序
特征化。StartNotify()
尝试:
mainloop.run()
除键盘中断外:
mainloop.quit()
特性化。StopNotify()
设备断开连接()

可能有很多事情,但我会调查几个方面

首先,目前RPi上的蓝牙固件有点混乱,正如您从该线程中看到的:

所以我会检查你是否同意

我相信BluePy有一个
BluePy helper
模块,它基于Bluez版本5.47,这是RPi现在使用的版本。可能值得尝试另一个库,看看问题是否仍然存在

下面是一个使用BlueZ D-Bus API直接读取特性的示例,用于python D-Bus绑定:

从时间导入睡眠
导入pydbus
从gi.repository导入GLib
外围设备地址=“8C:AA:B5:85:20:1E”
服务_uuid=“537e7010-9928-4595-89dc-46b495862dc6”
特征_uuid=“3778ceab-0974-4eb0-9da5-26c3a69cc742”#从外围设备读取
#DBus对象路径
BLUEZ_服务='org.BLUEZ'
适配器路径='/org/bluez/hci0'
设备路径=f{A