树莓派4下Bleak扫描蓝牙正常但连接时提示找不到设备求助
故障原因
- BlueZ DBus后台的设备缓存问题:Bleak默认通过BlueZ的DBus接口获取已扫描到的设备列表,若之前的扫描缓存过期、或者设备广播包没有被DBus接口正确记录,即使扫描工具能找到设备,连接时也会出现找不到设备的报错。gatttool是直接和蓝牙适配器交互绕过了部分DBus缓存逻辑,所以能正常连接。
- ATC固件的广播参数配置问题:部分版本的ATC_MiThermometer固件默认的广播间隔较长,Bleak连接前的即时扫描超时时间不够,导致连接校验时无法抓到设备广播包。
- Bleak默认连接逻辑的适配问题:Bleak的BlueZ后端默认连接时会优先从系统蓝牙的已配对设备列表和近期扫描缓存中查找设备,若没有提前将设备加入扫描白名单、或者连接时没有附带扫描参数,会出现识别不到设备的情况。
解决方案
- 清空BlueZ的设备缓存,执行以下命令:
操作完成后重新执行扫描代码,再尝试连接即可。sudo systemctl stop bluetooth sudo rm -rf /var/lib/bluetooth/* sudo systemctl start bluetooth - 修改Bleak连接代码,连接时主动开启扫描:不要直接调用
BleakClient(mac).connect(),改为在connect参数中指定适配器、延长扫描超时时间,示例代码片段:
部分Bleak版本还支持设置async with BleakClient("A4:C1:38:82:8A:50", timeout=30, adapter="hci0") as client: # 后续业务逻辑scanning_mode参数,强制连接前进行10-15秒的主动扫描,大幅提升设备识别率。 - 调整ATC固件的广播参数:进入ATC固件的配置页,将广播间隔调整到1000ms以内,关闭广播过滤功能,确保设备的广播包能被树莓派的蓝牙适配器持续捕获。
- 绕过DBus接口连接:如果你使用的Bleak版本 >= 0.19,可以在启动脚本前添加环境变量,强制使用蓝牙套接字后端代替DBus后端,该模式逻辑和gatttool一致,适配性更高:
export BLEAK_BACKEND=bleak.backends.bluez.client python3 i.py
内容的提问来源于stack exchange,提问作者StefanBD
相关产品推荐
相关产品推荐

