树莓派3b连接Polar心率带读心率报Connection Refused(111)求助
适用场景:Raspberry Pi 3B 运行Raspbian系统,bluetoothctl可发现设备、获取UUID,但GATT连接报Connection Refused(111),gatttool、bleak、pygatt均无法正常建立连接读取心率数据。
第一步:修正基础配置错误
树莓派3B板载蓝牙默认接口为hci0,之前gatttool指定hci1属于接口选择错误,先执行hciconfig -a确认当前可用蓝牙适配器的接口编号,后续操作不要填错接口。
执行以下命令将当前用户加入蓝牙用户组,避免权限不足导致的连接拒绝,执行完成后必须重启树莓派生效:sudo usermod -aG bluetooth $USER注意:Polar心率带必须贴身佩戴、电极处沾少量水激活才会进入可连接状态,未佩戴时设备仅发送广播、拒绝所有GATT连接请求,这是新手最高发的问题。
第二步:清理损坏的蓝牙配对缓存
旧的配对缓存损坏是导致能扫到设备、但无法建立GATT连接的常见原因,按顺序执行以下命令清理:sudo systemctl stop bluetooth sudo rm -rf /var/lib/bluetooth/* sudo systemctl start bluetooth清理完成后重新在bluetoothctl中完成完整配对流程,不要跳过pair/trust步骤:
bluetoothctl power on agent on default-agent scan on # 等待终端输出你的心率带MAC地址 00:22:D0:33:1E:0F 后执行后续命令 pair 00:22:D0:33:1E:0F trust 00:22:D0:33:1E:0F connect 00:22:D0:33:1E:0F配对完成后输入
exit退出bluetoothctl,BLE设备同一时间仅支持一个客户端连接,bluetoothctl占用连接时,其他脚本/工具都会报连接拒绝。第三步:弃用过时工具,使用bleak读取心率数据
hcitool、gatttool属于BlueZ已废弃的旧工具,在新系统上兼容性极差,pygatt对旧工具依赖度高,不推荐使用。直接使用bleak库连接即可:
先安装依赖:sudo apt update sudo apt install python3-pip libglib2.0-dev -y pip3 install bleak心率服务为蓝牙标准服务,不需要手动查UUID,直接使用以下测试脚本读取数据即可:
import asyncio from bleak import BleakClient DEVICE_MAC = "00:22:D0:33:1E:0F" HR_CHAR_UUID = "00002a37-0000-1000-8000-00805f9b34fb" def parse_hr(sender, data): hr_flag = data[0] & 0x01 hr = data[1] if hr_flag == 0 else int.from_bytes(data[1:3], byteorder="little") print(f"实时心率: {hr} bpm") async def main(): async with BleakClient(DEVICE_MAC) as client: print("连接成功") await client.start_notify(HR_CHAR_UUID, parse_hr) await asyncio.sleep(60) # 采集60秒数据 await client.stop_notify(HR_CHAR_UUID) if __name__ == "__main__": asyncio.run(main())第四步:版本兼容问题处理
如果以上操作完成后仍然报错,先执行bluetoothd -v查看BlueZ版本,版本低于5.65时直接升级BlueZ到最新稳定版即可,Raspbian旧软件源自带的BlueZ版本对低功耗蓝牙的支持存在已知bug。
内容的提问来源于stack exchange,提问作者rawonith

