苹果的心率监测示例和蓝牙心率测量特性的字节顺序



关于心率测量特性:

http://developer.bluetooth.org/gatt/characteristics/Pages/CharacteristicViewer.aspx?u=org.bluetooth.characteristic.heart_rate_measurement.xml

编辑

链接现在在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
}

它检查第一个位为零,如果不是,它通过对reportData[1]应用CFSwapInt16LittleToHost,将小端序改变为主机字节顺序。

位检查是如何工作的?我不完全确定是否有结尾。它是说,无论大小,第一个字节总是必填字段,第二个字节是C1,等等?由于reportData是一个8位指针(对unsigned char的类型定义),它检查强制字段的第0位或第8位。

如果该位是第8位,那么该位是保留供将来使用的,为什么它在那里读取?

如果那个位是0,它是小端序,不需要转换?但如果它是小端,根据规范,第一个位可以是1,1意味着"心率值格式设置为UINT16"。单位:每分钟跳动(bpm)",这不会是误读吗?

我不明白它是怎么检查的。

编辑:我一直说有C5,这是个错误。

我是否正确阅读了这份文件?

恕我直言,你读错了。

C1到C4应读为条件1到条件4。在org。bluetooth。characteristic表中。如果标志字节的最低位为0,则满足C1,否则满足C2。

可以认为是C语言中运行时可配置的联合类型(,由flag决定)。注意,这并不总是正确的,因为情况变得复杂的C3和C4)。

// Note: this struct is only for you to better understand a simplified case.
// You should still stick to the profile documentations to implement.
typedef struct {
    uint8_t flag;
    union {
        uint8_t bpm1;
        uint16_t bpm2;
    }bpm;
} MEASUREMENT_CHAR; 

位检查是如何工作的?

if ((reportData[0] & 0x01) == 0)用位与运算符有效地校验位。如果有任何疑问,去找一本C/c++编程入门书。

在本例中,第一个字节始终是标志。flag的值动态地决定了应该如何处理其余的字节。C3和C4都是可选的,如果标志中相应的位被置零,则可以省略。C1和C2互斥

在蓝牙标准中没有端序歧义,因为它已经很好地解决了应该一直使用小端序的问题。您应该始终假设这些uint16_t字段以小端序传输。苹果的预防措施只是为了保证代码的可移植性,因为他们不会保证他们未来产品中使用的架构的顺序。

我明白了。它不是检测端序。相反,它测试字段是8位还是16位,在16位的情况下,它将从小端序转换为主机顺序。但我看到转换前和转换后是相同的数字。所以我猜这个系统一开始就有点端序所以我不知道这有什么意义

最新更新