蓝牙心率监测器字节解码

Bluetooth heartrate monitor byte decoding

问题:

我无法理解 BLE Heart Rate Characteristic(服务 180d,特征 2a37)的 returned 数据。

根据规范会有 6 或 7 个字节的数据(当 base64 解码时),我完全理解这种情况下如何处理。

但有时它不会 return 6 或 7 个字节,而是 8 个字节,很少有 4 个字节,我不知道为什么有 more/less 个字节以及添加字节的含义是什么或者遗漏了哪些字节。

我可以跳过所有没有 6 或 7 个字节的情况,但我想完全理解这一点。

确定 将 base64 编码转换为字节数组是正确完成的,我为此创建了一个函数使用手动 base64 解码结合 charCodeAt(index) 真正手动检查它使用好的铅笔、纸和大脑(不一定按此顺序)。

长话短说:

BLE 心率 (180d,2a37) 有时不会 return 预期的字节数(4 和 8,而它应该是 6 或 7 字节)。 到底发生了什么,为什么?

示例:

// Example results in byte-array's
["00010110", "01110111", "00000100", "00000010"] // unexpected 4 byte
["00010110", "01111000", "11111111", "00000001", "11111111", "00000001", "00001100", "00000001"] // unexpected 8 byte
["00010110", "01110111", "00001000", "00000010", "00001000", "00000010"] // normal 6 byte

// Example results in hex-array's (easier to read on small screens)
["0x16","0x77","0x04","0x02"] // unexpected 4 byte
["0x16","0x78","0xFF","0x01","0xFF","0x01","0x0C","0x01"] // unexpected 8 byte
["0x16","0x77","0x08","0x02","0x08","0x02"] // normal 6 byte

字节解释:

  1. 旗帜。如果心率是 16 位格式(我只有 8 位),则第一位(最右边)打开。
  2. heartrate,如果心率是16位格式,这里会有2个字节
  3. 能量消耗
  4. 能量消耗
  5. rr间隔
  6. rr间隔

能量消耗是可选的,检查示例数据中标志的第 3 位是否存在。有可变数量的 rr 间隔。 4 个字节只有 1 个,6 个字节有 2 个,8 个字节有 3 个,理论上可以得到 10 和 4。

您应该使用标志对字节进行解码,然后如果存在 rr,则剩余的字节数/2 就是您拥有的 rr 的数量。

有关详细信息,请参阅 XML-Definition 文件。