2017-12-15 24 views
1

코어 블루투스 4.2 문서 here에서는 데이터 무결성 (P2456)에 대한 CRC 검사에 대해 설명합니다. 이것은 아래의 사항 :CRC 블루투스 저에너지 4.2

4E 01 02 03 04 05 06 07 08 09

CRC를 생산 : 6D D2 나는 시도했다

아래의 예와

enter image description here

다른 메소드의 수는 예제를 재현 할 수 없습니다. 누구든지 위의 CRC를 생성 할 수있는 몇 가지 샘플 코드를 제공 할 수 있습니까?

답변

0

이것이 BLE와 어떤 관련이 있는지 알지 못하지만, 여기에 우리가 간다. 예제는 C++이지만 어떤 프로그래밍 언어로도 쉽게 포팅된다.

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

음, 구문 오류, 불필요한 문, POLY 정의 누락, 잘못된 초기화 ..., 분명히 테스트되지 않았습니다. –

0

당신은 UAP이 예에서 0x47되어 사용이다 문서에서 예제의 핵심 부분을 떠났다. CRC는 UAP로 초기화되어야합니다. (기이하게도 비트가 반전되고 상위 바이트에서 들어오는 데이터 비트에 비례하여)

아래 코드는 예제를 계산합니다. 결과는 d26d입니다. CRC는 최하위 비트가 먼저 전송되므로 6d d2으로 전송됩니다. 수신 측에서는 동일한 CRC가 CRC로 계산되며 결과는 수신 측에서 보낸 내용을 확인하는 방법 인 0입니다.

#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를 적절하게 초기화해야합니다.