2017-12-15 4 views
1

In der Kern-Bluetooth 4.2 Dokumentation here spricht es über eine CRC-Prüfung auf Datenintegrität (P2456). Diese Details die folgenden:CRC Bluetooth Low Energy 4.2

enter image description here

mit einem Beispiel unter:

4e 01 02 03 04 05 06 07 08 09

CRC Producing: 6d d2

ich versucht habe, eine Anzahl der verschiedenen Methoden, kann aber das Beispiel nicht reproduzieren. Kann jemand einen Beispielcode zur Verfügung stellen, um das oben genannte CRC zu erzeugen.

Antwort

0

Ich weiß nicht, wie dies mit BLE verwandt ist, aber hier gehen wir: Das Beispiel ist in C++, aber ist leicht in jede Programmiersprache portiert.

unsigned short crc16(data_p, length) 
char *data_p; 
unsigned short length; 
{ 
     unsigned char i; 
     unsigned int data; 
     unsigned int crc; 

     crc = 0xffff; 

     if (length == 0) 
       return (~crc); 

     do { 
       for (i = 0 data = (unsigned int)0xff & *data_p++; 
        i < 8; 
        i++, data >>= 1) { 
        if ((crc & 0x0001)^(data & 0x0001)) 
          crc = (crc >> 1)^POLY; 
        else 
          crc >>= 1; 
       } 
     } while (--length); 

     crc = ~crc; 

     data = crc; 
     crc = (crc << 8) | (data >> 8 & 0xFF); 

     return (crc); 
} 
+0

Um, Syntaxfehler, nicht benötigte Anweisungen, fehlende POLY-Definition, falsche Initialisierung ..., offensichtlich nicht getestet. –

0

Sie links im Dokument einen wichtigen Bestandteil des Beispiels aus, die, dass der UAP im Beispiel wird 0x47 verwendet wird. Der CRC muss mit dem UAP initialisiert werden. (Seltsamerweise mit den umgekehrten Bits und in dem hohen Byte relativ zu den hereinkommenden Datenbits.)

Der folgende Code berechnet das Beispiel. Das Ergebnis ist d26d. Der CRC wird zuerst als niedrigstwertiges Bit gesendet, daher wird er gesendet 6d d2. Auf der Empfangsseite wird die gleiche CRC für die gesamte Sache mit der CRC berechnet, und das Ergebnis ist Null, wobei die Empfangsseite prüfen soll, was gesendet wurde.

#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; 
} 

Ihr Code müsste das UAP für dieses Gerät entsprechend initialisieren.

Verwandte Themen