首页 > 解决方案 > Garmin BLE 心率监测器 - 无法通过蓝牙获取 HRM 数据,我错过了什么?

问题描述

使用无品牌蓝牙/ANT+ 心率监测器,我可以使用以下方法轻松获取 HRM 数据gatttool

<MAC address>> connect
Attempting to connect to <MAC address>
Connection successful
<MAC address>> primary
(...)
<MAC address>> char-desc 0x000c 0x0011
(...)
<MAC address>> char-write-req 0x000f 0100
Characteristic value was written successfully
Notification handle = 0x000e value: 16 34 e4 04 
Notification handle = 0x000e value: 16 34 a5 04 
Notification handle = 0x000e value: 16 33 ea 04 
Notification handle = 0x000e value: 16 33 de 04

有了这个,我发送到句柄0x000fwhich is 00002902-0000-1000-8000-00805f9b34fb,这是我需要发送请求的地方(0x2902的文档),我从另一个句柄(0x2a37的文档)获得响应。

我已经对0100我们发送的有效载荷感到有些困惑。的规范0x2902说我们应该发送 16 位,并且0x01000b100000000. 这会导致0b0000000100000000还是导致0b1000000000000000?为什么我们发送0x0100而不是发送0x8000(即1使用 15 0)?

无论如何,01, 010, 0100,01000会起作用,但任何更多的数字都会失败。由于 4 个十六进制字符是 16 位,它不应该以 5 位数字失败吗?无论如何,01工作(通知打开,指示关闭?),02不会导致更新(通知关闭,指示打开?),03工作(通知打开,指示打开?)。我的理解是正确的吗?

我现在带上我的 Garmin 心率监测器(它是 Garmin HRM Dual)。我可以通过蓝牙很好地连接到它,我可以找到 HRM 交互的正确句柄(对应于 UUID 的句柄0x2902),但是当我像以前一样向句柄gatttool发送 a时,它说值已写入,但是char-write-req什么都没有发生。我尝试了许多值,但没有任何反应。

我错过了什么吗?在调用 HRM 句柄之前是否需要采取任何额外的步骤?谢谢你。

标签: bluetooth-lowenergybluetooth-gattgarmin

解决方案


您发送的 0100 只是Little Endian中的 0001 。因为 BlueZ 在写入值时使用的是 Little Endian,所以最后一个字节在前。例如,如果您想写 01 02 03,则必须将其写为 030201。这就是为什么 01、010、0100 和 01000 都可以工作的原因,因为在所有这些情况下,您都在写 01。您也是正确的关于 02 启用指示,而 03 将启用通知和指示。

至于启用通知和读取 HRM 数据,请确保您在启用通知之前已佩戴 HRM Dual。这样做的原因是 HRM Dual 将无法工作,除非它检测到实际的心率数据。您可以通过 Android/iOS 设备上的 nRF Connect 应用程序连接并尝试读取 HRM 数据来测试这一点。


推荐阅读