树莓派3通过Bluepy无法找到BLE继电器板RB1的ffe0服务
问题分析与解决方案
首先可以确定不是RB1内部存储数据导致的问题——毕竟bluetoothctl和iPhone都能正常识别它的ffe0服务,说明硬件和服务本身是没问题的。问题出在bluepy库连接RB1时的服务发现流程细节上,以下是几个可能的原因和对应的解决办法:
1. 地址类型不匹配
你的脚本里指定了地址类型为"random",虽然RB2能用这个类型连接,但RB1可能使用的是"public"地址类型。bluepy对不同设备的地址类型判断可能存在差异,试试去掉地址类型参数让bluepy自动检测,或者手动改为"public":
import bluepy.btle as btle # 方案1:不指定地址类型,让bluepy自动识别 p = btle.Peripheral("00:0E:0B:00:75:12") # 方案2:手动指定public类型 # p = btle.Peripheral("00:0E:0B:00:75:12", "public") s = p.getServiceByUUID("0000ffe0-0000-1000-8000-00805f9b34fb") c = s.getCharacteristics()[0] c.write("o", "utf-8") p.disconnect()
2. 服务发现时机过早
连接BLE设备后,服务枚举需要一定时间,bluepy的getServiceByUUID可能在服务还没被完全发现时就被调用了,导致找不到目标服务。可以在连接后添加短暂延迟,或者手动触发完整的服务发现:
import bluepy.btle as btle import time p = btle.Peripheral("00:0E:0B:00:75:12", "random") time.sleep(1) # 等待1秒让设备完成服务广播 p.discoverServices() # 手动触发全量服务发现 s = p.getServiceByUUID("0000ffe0-0000-1000-8000-00805f9b34fb") c = s.getCharacteristics()[0] c.write("o", "utf-8") p.disconnect()
3. bluepy版本兼容性问题
旧版本的bluepy对某些BLE设备的服务发现支持可能不够完善,建议更新到最新版本试试:
sudo pip install --upgrade bluepy
为什么bluetoothctl和iPhone能正常工作?
- bluetoothctl:它会自动执行完整的BLE连接流程,包括等待服务枚举完成,不会像脚本那样刚连接就立刻查询服务;
- iPhone:iOS的BLE栈对不同设备的兼容性做了大量优化,会自动处理地址类型、服务发现时机这类细节问题。
内容的提问来源于stack exchange,提问作者marciokoko
相关产品推荐
相关产品推荐

