借助无品牌蓝牙/ANT+心率监视器,我可以使用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有了这个,我发送到处理00002902-0000-1000-8000-00805f9b34fb的0x000f,这是我需要发送请求(doc for 0x2902)的地方,并且我从另一个处理(doc for 0x2a37)得到响应。
我已经被我们发送的0100负载搞糊涂了。0x2902的规格说明我们应该发送16位,而0x0100是0b100000000。这会导致0b0000000100000000还是0b1000000000000000?为什么我们发送的是0x0100而不是0x8000 (即15 0的1 )?
无论如何,01、010、0100、01000都可以工作,但是任何更多的数字都将失败。既然4个十六进制字符是16位,它不应该已经失败了5位吗?无论如何,01工作(通知打开,指示关闭?),02不会导致更新(通知关闭,指示打开?),03工作(通知打开,指示打开?)。我的理解是正确的吗?
我现在带着我的Garmin心率监测器( Garmin HRM Dual)。我可以很好地通过蓝牙连接到它,我可以找到正确的HRM交互句柄(对应于UUID 0x2902的句柄),但当我像以前一样使用gatttool发送char-write-req到句柄时,它会提示值已写入,但什么也没有发生。我尝试了许多值,但什么都没有发生。
我是不是遗漏了什么?在调用HRM句柄之前,是否需要采取任何额外的步骤?谢谢。
发布于 2020-11-30 15:32:55
您发送的0100在Little Endian中仅为0001。因为BlueZ在写值时使用小端,所以最后一个字节在前面。例如,如果要编写01 02 03,则必须将其编写为030201。这就是为什么01、010、0100和01000都可以工作的原因,因为在所有这些情况下,您都是在编写01。您关于启用02的指示也是正确的,03将启用通知和指示。
至于启用通知和读取HRM数据,请确保您在启用通知之前穿戴了HRM Dual。这样做的原因是,除非检测到实际的心率数据,否则HRM Dual将无法工作。你可以通过你的Android/iOS设备上的nRF连接应用程序连接并尝试读取人力资源管理数据来测试这一点。
https://stackoverflow.com/questions/60599696
复制相似问题