BLE心率传感器数值解读
BLE Heart Rate Senser Value Interpretation
我有一个 Android 应用程序,可以从 Polar H10 设备获取心率测量值。
我完全不知道如何解释心率。不幸的是,指向 bluetooth.com 站点的各种链接导致 404 错误。
特征值为即
[16, 59, 83, 4]
据我了解,第二个字节 (59) 是 BPM 中的心率。但这似乎不是十进制,因为值上升到 127,然后继续 -127、-126、-125,...它也不是十六进制。
我试过(在 kotlin 中)
characteristic.value[1].toUInt()
characteristic.value[1].toInt()
characteristic.value[1].toShort()
characteristic.value[1].toULong()
characteristic.value[1].toDouble()
-127 出现后,所有值都会崩溃。
我是否必须将 59 转换为二进制 (59=111011) 并在其中查看?请给我一些见解。
### 编辑(2021 年 4 月 12 日)###
我为获得这些值所做的是 BluetoothDevice.connectGatt()。
然后持有关贸总协定。
为了获得心率值,我寻找
- 服务 0x180d 及其
- 特征 0x2a37 及其唯一
- 描述符 0x2902.
然后我通过在描述符上设置 0x01 来启用通知。然后我在 GattClientCallback.onCharacteristicChanged() 回调中获得正在进行的事件。我将在下面添加包含所有数据的屏幕截图。
根据我的理解,响应应该是 6 个字节而不是 4 个字节,对吧?我做错了什么?
在图片上,您可以看到最上面的特征。它链接到服务 180d,特征保存底部 4 个字节的值。
看来我找到了一种方法,检索值如下
val hearRateDecimal = characteristic.getIntValue(BluetoothGattCharacteristic.FORMAT_UINT8, 1)
2件事很重要
首先 - UINT8 的格式(虽然我不知道什么时候使用 UINT8 什么时候使用 UINT16。实际上我认为我需要使用 UINT16 因为第一个字节实际上是 16(见上面的问题)
second - 偏移量参数 1
我现在得到的是一个甚至超过 127 的整数 -> 127, 128, 129, 130, ...
有关文档的链接,请参阅 。就像那个答案一样,这里是解码:
字节 0 - 标志:16 (0001 0000)
位从 LSB (0) 到 MSB (7) 编号。
- Bit 0 - 心率值格式:0 => UINT8 次/分钟
- 位 1-2 - 传感器接触状态:00 => 不支持或未检测到
- 位 3 - 能量消耗状态:0 => 不存在
- 位 4 - RR 间隔:1 => 存在一个或多个值
所以第一个字节是UInt8格式的心率,接下来的两个字节是RR间隔。
要在 Kotlin 中阅读此内容:
characteristic.getIntValue(FORMAT_UINT8, 1)
这 return 心率为 56 bpm。
并忽略其他两个字节,除非你想要 RR。
我有一个 Android 应用程序,可以从 Polar H10 设备获取心率测量值。 我完全不知道如何解释心率。不幸的是,指向 bluetooth.com 站点的各种链接导致 404 错误。
特征值为即 [16, 59, 83, 4]
据我了解,第二个字节 (59) 是 BPM 中的心率。但这似乎不是十进制,因为值上升到 127,然后继续 -127、-126、-125,...它也不是十六进制。
我试过(在 kotlin 中)
characteristic.value[1].toUInt()
characteristic.value[1].toInt()
characteristic.value[1].toShort()
characteristic.value[1].toULong()
characteristic.value[1].toDouble()
-127 出现后,所有值都会崩溃。
我是否必须将 59 转换为二进制 (59=111011) 并在其中查看?请给我一些见解。
### 编辑(2021 年 4 月 12 日)###
我为获得这些值所做的是 BluetoothDevice.connectGatt()。 然后持有关贸总协定。 为了获得心率值,我寻找
- 服务 0x180d 及其
- 特征 0x2a37 及其唯一
- 描述符 0x2902.
然后我通过在描述符上设置 0x01 来启用通知。然后我在 GattClientCallback.onCharacteristicChanged() 回调中获得正在进行的事件。我将在下面添加包含所有数据的屏幕截图。
根据我的理解,响应应该是 6 个字节而不是 4 个字节,对吧?我做错了什么?
在图片上,您可以看到最上面的特征。它链接到服务 180d,特征保存底部 4 个字节的值。
看来我找到了一种方法,检索值如下
val hearRateDecimal = characteristic.getIntValue(BluetoothGattCharacteristic.FORMAT_UINT8, 1)
2件事很重要 首先 - UINT8 的格式(虽然我不知道什么时候使用 UINT8 什么时候使用 UINT16。实际上我认为我需要使用 UINT16 因为第一个字节实际上是 16(见上面的问题) second - 偏移量参数 1
我现在得到的是一个甚至超过 127 的整数 -> 127, 128, 129, 130, ...
有关文档的链接,请参阅
字节 0 - 标志:16 (0001 0000)
位从 LSB (0) 到 MSB (7) 编号。
- Bit 0 - 心率值格式:0 => UINT8 次/分钟
- 位 1-2 - 传感器接触状态:00 => 不支持或未检测到
- 位 3 - 能量消耗状态:0 => 不存在
- 位 4 - RR 间隔:1 => 存在一个或多个值
所以第一个字节是UInt8格式的心率,接下来的两个字节是RR间隔。
要在 Kotlin 中阅读此内容:
characteristic.getIntValue(FORMAT_UINT8, 1)
这 return 心率为 56 bpm。
并忽略其他两个字节,除非你想要 RR。