关于心率测量特性:
编辑
链接现在位于 https://www.bluetooth.com/specifications/gatt/characteristics/ 并查找“心率测量”。
它们不再提供 XML 查看器,而是您需要直接查看 XML 。
对于服务,它也在此页面上。
结束编辑
我想确保我正确阅读它。这实际上是说 5 个字段吗?强制性的,C1、C2、C3 和 C4?强制在第一个字节,C4在最后两个字节,C1和C2是8位字段,C3到C4都是16位。总共有 8 个字节。我是否正确阅读了这份文件?
编辑:
我被告知强制标志字段表明某事为 0,这意味着它不存在。例如,如果第一位为 0,则 C1 为下一个字段,如果为 1,则 C2 紧随其后。
结束编辑
在 Apple 的OSX 心率监测器示例中:
- (void) updateWithHRMData:(NSData *)data
{
const uint8_t *reportData = [data bytes];
uint16_t bpm = 0;
if ((reportData[0] & 0x01) == 0)
{
/* uint8 bpm */
bpm = reportData[1];
}
else
{
/* uint16 bpm */
bpm = CFSwapInt16LittleToHost(*(uint16_t *)(&reportData[1]));
}
... // I ignore rest of the code for simplicity
}
它将第一位检查为零,如果不是,则通过将 CFSwapInt16LittleToHost 应用于reportData[1]
.
那位检查是如何工作的?我不完全确定字节序。是说不管是小还是大,第一个字节总是必填字段,第二个字节是C1,等等?并且由于 reportData 是一个 8 位指针(typedef to unsigned char
),它正在检查必填字段的第 0 位或第 8 位。
如果该位是第 8 位,则该位保留供将来使用,为什么要在那里读取?
如果该位为 0,它是小端且不需要转换?但是如果是little-endian,根据规范,第一位可能是1,1表示“心率值格式设置为UINT16。单位:每分钟节拍(bpm)”,这不会误读吗?
我不明白它是如何进行检查的。
编辑:我一直说有 C5,那是个错误。它仅由 C4 决定,我在上面进行了编辑。