【问题标题】:CRC Bluetooth Low Energy 4.2CRC 蓝牙低功耗 4.2
【发布时间】:2017-12-15 20:30:43
【问题描述】:

在核心蓝牙 4.2 文档here 中,它谈到了数据完整性的 CRC 检查 (P2456)。这详细说明如下:

下面是一个例子:

4e 01 02 03 04 05 06 07 08 09

生成 CRC:6d d2

我尝试了许多不同的方法,但似乎无法重现该示例。谁能提供一些示例代码来生成上述 CRC。

【问题讨论】:

    标签: bluetooth bluetooth-lowenergy checksum crc


    【解决方案1】:

    您在文档中遗漏了示例的关键部分,即示例中使用的 UAP 是0x47。 CRC 需要使用 UAP 进行初始化。 (奇怪的是,相对于传入的数据位,位反转并且在高字节中。)

    下面的代码计算示例。结果是d26d。 CRC首先传输最低有效位,因此发送6d d2。在接收端,使用 CRC 对整个事物计算相同的 CRC,结果为零,这就是接收端应该如何检查发送的内容。

    #include <stdio.h>
    
    static unsigned crc_blue(unsigned char *payload, size_t len) {
        unsigned crc = 0xe200;      // UAP == 0x47
        while (len--) {
            crc ^= *payload++;
            for (int k = 0; k < 8; k++)
                crc = crc & 1 ? (crc >> 1) ^ 0x8408 : crc >> 1;
        }
        return crc;
    }
    
    int main(void) {
        unsigned char payload[] = {
            0x4e, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09};
        printf("%04x\n", crc_blue(payload, sizeof(payload)));
        unsigned char recvd[] = {
            0x4e, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x6d, 0xd2};
        printf("%04x\n", crc_blue(recvd, sizeof(recvd)));
        return 0;
    }
    

    您的代码需要为该设备适当地初始化 UAP。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-23
      • 2018-10-12
      • 2012-05-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多