bluetooth-lowenergy - 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
有了这个,我发送到句柄0x000f
which is 00002902-0000-1000-8000-00805f9b34fb
,这是我需要发送请求的地方(0x2902的文档),我从另一个句柄(0x2a37的文档)获得响应。
我已经对0100
我们发送的有效载荷感到有些困惑。的规范0x2902
说我们应该发送 16 位,并且0x0100
是0b100000000
. 这会导致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 句柄之前是否需要采取任何额外的步骤?谢谢你。
解决方案
您发送的 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 数据来测试这一点。
推荐阅读
- java - 如何在 5 小时后强制会话退出 TOMCAT 服务器(不是非活动会话退出)
- python - 无法注册碰撞
- firebase - 如何在 Firebase 上创建 Busuu 每日提醒通知
- aws-lambda - 功能即服务 (FaaS) 托管如何在后台工作?
- go - 为什么 go-jaeger-client 需要度量和日志的包装器?
- reactjs - 为什么 Scrollspy 未在反应应用程序中加载?
- java - 异步回调和监听器
- sql - 如何在 SQL Server 脚本中使用临时表?
- python - python内存因循环而爆炸
- php - 我们可以在 php 中使用和操作 mysql 数据吗?