蓝牙心率监测器字节解码
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
字节解释:
- 旗帜。如果心率是 16 位格式(我只有 8 位),则第一位(最右边)打开。
- heartrate,如果心率是16位格式,这里会有2个字节
- 能量消耗
- 能量消耗
- rr间隔
- rr间隔
能量消耗是可选的,检查示例数据中标志的第 3 位是否存在。有可变数量的 rr 间隔。 4 个字节只有 1 个,6 个字节有 2 个,8 个字节有 3 个,理论上可以得到 10 和 4。
您应该使用标志对字节进行解码,然后如果存在 rr,则剩余的字节数/2 就是您拥有的 rr 的数量。
有关详细信息,请参阅 XML-Definition 文件。
问题:
我无法理解 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
字节解释:
- 旗帜。如果心率是 16 位格式(我只有 8 位),则第一位(最右边)打开。
- heartrate,如果心率是16位格式,这里会有2个字节
- 能量消耗
- 能量消耗
- rr间隔
- rr间隔
能量消耗是可选的,检查示例数据中标志的第 3 位是否存在。有可变数量的 rr 间隔。 4 个字节只有 1 个,6 个字节有 2 个,8 个字节有 3 个,理论上可以得到 10 和 4。
您应该使用标志对字节进行解码,然后如果存在 rr,则剩余的字节数/2 就是您拥有的 rr 的数量。
有关详细信息,请参阅 XML-Definition 文件。