1

我有一个 Android 应用程序,可以从 Polar H10 设备获取心率测量值。我完全不知道如何解释心率。不幸的是,各种指向 bluetooth.com 网站的链接都导致了 404 错误。

特征值为 ie [16, 59, 83, 4]

据我了解,第二个字节(59)是以 BPM 为单位的心率。但这似乎不是十进制的,因为值上升到 127 然后继续 -127、-126、-125,......它也不是十六进制。

我试过(在科特林)

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 个字节的值。

特征 0x2a37

4

2 回答 2

3

有关文档的链接,请参阅BLE 中的心率值。就像那个答案一样,这里是解码:

字节 0 - 标志:16 (0001 0000)

位从 LSB (0) 到 MSB (7) 编号。

  • 位 0 - 心率值格式:0 => 每分钟 UINT8 次
  • 位 1-2 - 传感器接触状态:00 => 不支持或未检测到
  • 位 3 - 能量消耗状态:0 => 不存在
  • 位 4 - RR 间隔:1 => 存在一个或多个值

所以第一个字节是 UInt8 格式的心率,接下来的两个字节是 RR 间隔。

要在 Kotlin 中阅读此内容:

characteristic.getIntValue(FORMAT_UINT8, 1)

这将返回 56 bpm 的心率。

除非你想要 RR,否则忽略其他两个字节。

于 2021-04-09T17:16:07.977 回答
0

看来我找到了一种通过检索值的方法,如下所示

val hearRateDecimal = characteristic.getIntValue(BluetoothGattCharacteristic.FORMAT_UINT8, 1)

首先有两件事很重要 - UINT8 的格式(虽然我不知道什么时候使用 UINT8,什么时候使用 UINT16。实际上我认为我需要使用 UINT16,因为第一个字节实际上是 16(见上面的问题)第二个 - 偏移量参数 1

我现在得到的是一个整数,甚至超过 127 -> 127, 128, 129, 130, ...

于 2021-04-09T17:05:30.827 回答