【发布时间】:2012-12-26 09:59:14
【问题描述】:
关于心率测量特性:
编辑
链接现在在 https://www.bluetooth.com/specifications/gatt/characteristics/ 并寻找“心率测量”。
他们不再提供 XML 查看器,但您需要查看 XML directly。
对于this page 上的服务也是如此。
结束编辑
我想确保我阅读正确。这实际上是说 5 个字段吗?强制性的,C1、C2、C3 和 C4?强制在第一个字节,C4 在最后两个字节,C1 和C2 是8 位字段,C3 到C4 都是16 位。总共有 8 个字节。我是否正确阅读了这份文档?
编辑:
我被告知强制标志字段表明某些内容为 0,这意味着它不存在。例如,如果第一位为 0,则 C1 为下一个字段,如果为 1,则为 C2。
结束编辑
在苹果的OSX heart rate monitor example:
- (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 指向unsigned char),它会检查必填字段的位0 或位8。
如果该位是第 8 位,则该位保留以供将来使用,为什么要在那里读取?
如果该位为 0,它是 little-endian 并且不需要转换?但是如果是little-endian,根据规范,第一位可能是1,1表示“心率值格式设置为UINT16。单位:每分钟节拍(bpm)”,不会误读吗?
我不明白它是如何进行检查的。
编辑: 我一直说有 C5,那是个错误。仅由 C4 决定,我在上面进行了编辑。
【问题讨论】:
-
您的链接似乎已损坏。请问可以更新一下吗?
-
@jaaq 链接已更新。
标签: bluetooth bluetooth-lowenergy endianness