使用gatttool读取小米手环8心率数据失败及无通知问题求助
问题:无法通过BlueZ gatttool获取小米手环8的心率通知数据
尝试使用BlueZ的gatttool读取小米手环8的心率数据,目标特征UUID为0x2a37(心率测量特征),属性为NOTIFY,但操作后既收不到通知,读取特征时还报错:
Error: Characteristic value/descriptor read failed: Attribute can't be read
已执行的操作:
- 发现特征及描述符:
[AA:BB:CC:DD:EE:FF][LE]> char-desc 0x0025 0xffff handle: 0x0026, uuid: 00002a37-0000-1000-8000-00805f9b34fb (Heart Rate Measurement characteristic) handle: 0x0027, uuid: 00002902-0000-1000-8000-00805f9b34fb (Client Characteristic Configuration Descriptor)
- 尝试启用心率通知:
[AA:BB:CC:DD:EE:FF][LE]> char-write-req 0x0026 0100 Characteristic value was written successfully
- 尝试读取特征值:
[AA:BB:CC:DD:EE:FF][LE]> char-read-hnd 0x0026 Error: Characteristic value/descriptor read failed: Attribute can't be read
已确认手环佩戴正确且处于心率测量状态,但始终收不到通知。
解决方法
核心问题分析
- 开启通知的handle错误:你把
0100写到了心率特征的handle(0x0026)上,但NOTIFY的开关是写在**Client Characteristic Configuration Descriptor(CCCD)**的handle(0x0027)上,这是最关键的错误。 - NOTIFY特征无法主动读取:属性为NOTIFY的特征是设备主动推送数据,不能用
char-read-hnd主动读取,这就是报错的直接原因。
正确操作步骤
- 进入gatttool交互模式并连接手环:
gatttool -b AA:BB:CC:DD:EE:FF -I connect
- 写入CCCD开启通知:
目标handle是CCCD的0x0027,写入0100表示启用通知:
[AA:BB:CC:DD:EE:FF][LE]> char-write-req 0x0027 0100
- 保持交互模式等待通知:
执行完写入命令后,不要退出gatttool,保持当前窗口打开,手环的心率数据会主动推送到终端中,格式类似:
Notification handle = 0x0026 value: 00 4b
其中4b是十六进制心率值(对应十进制75)。
额外注意事项
- 确保手环处于持续心率监测模式:有些手环默认是触发式测量(比如仅打开APP时才测),需要在手环设置里切换为持续监测。
- 检查蓝牙连接稳定性:如果连接断开,需要重新执行连接和开启通知的步骤。
- 若
char-write-req无效,尝试用char-write-cmd:部分设备需要无响应的写入命令:
char-write-cmd 0x0027 0100
内容的提问来源于stack exchange,提问作者abdul
相关产品推荐
相关产品推荐

