Arduino_CAN
로딩중...
검색중...
일치하는것 없음
receive_check.ino 파일 참조

CAN 통신 수신 예제 (Mini-MAC 인증 검증 포함) 더 자세히 ...

#include "minimac.h"
#include <EEPROM.h>
#include <SPI.h>
#include <mcp_can.h>
receive_check.ino에 대한 include 의존 그래프

이 파일의 소스 코드 페이지로 가기

매크로

#define PROTECTED_ID   0x123
 Mini-MAC 인증이 적용되는 보호 대상 CAN 메시지 식별자.
 

함수

MCP_CAN CAN (10)
 CAN 버스 제어 객체.
 
void setup ()
 수신기 시스템 초기화 함수로, 필요한 설정을 수행합니다.
 
void loop ()
 수신 루프 함수로, 도착한 CAN 메시지를 확인하고 Mini-MAC 태그를 검증합니다.
 

변수

const uint8_t SECRET_KEY [16]
 Mini-MAC 프로토콜에 사용되는 16바이트 비밀 키.
 

상세한 설명

CAN 통신 수신 예제 (Mini-MAC 인증 검증 포함)

이 파일은 Mini-MAC 기반의 메시지 인증을 적용하여 CAN 버스로 들어오는 메시지를 검증하는 예제 코드입니다. 수신된 CAN 메시지의 ID와 인증 태그를 검사하여, 유효한 메시지인지 여부를 판단합니다.

receive_check.ino 파일에서 정의되었습니다.

매크로 문서화

◆ PROTECTED_ID

#define PROTECTED_ID   0x123

Mini-MAC 인증이 적용되는 보호 대상 CAN 메시지 식별자.

송신 측과 동일한 식별자로, 이 ID의 메시지에 대해 인증 태그를 검증합니다.

receive_check.ino 파일의 20 번째 라인에서 정의되었습니다.

함수 문서화

◆ CAN()

MCP_CAN CAN ( 10 )

CAN 버스 제어 객체.

MCP2515 기반 CAN 트랜시버를 제어하는 MCP_CAN 인스턴스이며, CS 핀 10번을 사용합니다.

이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ loop()

void loop ( )

수신 루프 함수로, 도착한 CAN 메시지를 확인하고 Mini-MAC 태그를 검증합니다.

주기적으로 새로운 CAN 메시지의 도착 여부를 확인합니다. 대기 중 메시지가 없으면 함수를 빠져나와 다음 주기를 준비합니다. 메시지가 수신되면 ID와 데이터 길이를 읽은 후, 해당 ID가 보호 대상(PROTECTED_ID)인지 및 데이터 길이가 태그 길이 이상인지 검사합니다. 보호 대상 ID가 아니거나 길이가 짧으면 해당 메시지를 무시합니다. 올바른 메시지인 경우 데이터 버퍼를 페이로드와 태그로 분리합니다. 분리한 페이로드와 수신 태그를 HEX 형식으로 시리얼 모니터에 출력하여 디버깅 정보를 제공합니다. 마지막으로 minimac_verify 함수를 호출하여 태그의 유효성을 검사하고, 인증이 성공하면 "[INFO] Auth OK", 실패하면 "[ERROR] Auth FAIL"을 출력합니다.

receive_check.ino 파일의 87 번째 라인에서 정의되었습니다.

87 {
88 // 메시지 도착 체크
89 if (CAN.checkReceive() != CAN_MSGAVAIL) {
90 delay(10);
91 return;
92 }
93
94 // 메시지 읽기
95 unsigned long rxId;
96 uint8_t len;
97 uint8_t buf[MINIMAC_MAX_DATA + MINIMAC_TAG_LEN];
98 CAN.readMsgBuf(&rxId, &len, buf);
99
100 Serial.print("[DBG] CAN received ID=0x");
101 Serial.print(rxId, HEX);
102 Serial.print(" len=");
103 Serial.println(len);
104
105 // ID 검증
106 if (rxId != PROTECTED_ID) {
107 Serial.println("[DBG] Ignored (unprotected ID)");
108 return;
109 }
110 if (len < MINIMAC_TAG_LEN) {
111 Serial.println("[ERROR] Frame too short");
112 return;
113 }
114
115 // 페이로드/태그 분리
116 uint8_t payloadLen = len - MINIMAC_TAG_LEN;
117 uint8_t payload[MINIMAC_MAX_DATA];
118 uint8_t tag[MINIMAC_TAG_LEN];
119 memcpy(payload, buf, payloadLen);
120 memcpy(tag, buf + payloadLen, MINIMAC_TAG_LEN);
121
122 // 디버그: payload
123 Serial.print("[DBG] payload = ");
124 for (uint8_t i = 0; i < payloadLen; i++) {
125 if (payload[i] < 0x10)
126 Serial.print('0');
127 Serial.print(payload[i], HEX);
128 Serial.print(' ');
129 }
130 Serial.println();
131
132 // 디버그: recv tag
133 Serial.print("[DBG] recv tag = ");
134 for (uint8_t i = 0; i < MINIMAC_TAG_LEN; i++) {
135 if (tag[i] < 0x10)
136 Serial.print('0');
137 Serial.print(tag[i], HEX);
138 Serial.print(' ');
139 }
140 Serial.println();
141
142 // 검증
143 Serial.println("[DBG] minimac_verify()");
144 if (minimac_verify(payload, payloadLen, tag)) {
145 Serial.println("[INFO] Auth OK");
146 } else {
147 Serial.println("[ERROR] Auth FAIL");
148 }
149}
bool minimac_verify(const uint8_t *data, uint8_t payload_len, const uint8_t *tag)
수신된 메시지의 Mini-MAC 태그 검증 및 상태 동기화
Definition minimac.cpp:338
#define MINIMAC_TAG_LEN
Mini-MAC 다이제스트에서 사용할 태그 길이 (4바이트, 32비트)
Definition minimac.h:25
#define MINIMAC_MAX_DATA
CAN 데이터 필드 최대 길이 (8바이트)
Definition minimac.h:35
MCP_CAN CAN(10)
CAN 버스 제어 객체.
#define PROTECTED_ID
Mini-MAC 인증이 적용되는 보호 대상 CAN 메시지 식별자.
이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:

◆ setup()

void setup ( )

수신기 시스템 초기화 함수로, 필요한 설정을 수행합니다.

시리얼 통신을 115200 baud로 시작하고 Serial 연결을 기다립니다. EEPROM 메모리 내용을 0xFF로 모두 채워 초기화합니다. CAN 컨트롤러를 초기화(all ID 수신, 500kbps, 16MHz 클럭) 후 정상 모드(MCP_NORMAL)로 설정합니다. Mini-MAC 프로토콜을 PROTECTED_ID와 SECRET_KEY로 초기화하여 수신 시 인증 검증을 수행할 준비를 합니다. 설정이 완료되면 시리얼 모니터에 "[INFO] Receiver Initialized" 메시지를 출력합니다.

receive_check.ino 파일의 49 번째 라인에서 정의되었습니다.

49 {
50 Serial.begin(115200);
51 while (!Serial)
52 ;
53
54 // EEPROM 전체 초기화
55 for (int i = 0; i < EEPROM.length(); i++) {
56 EEPROM.write(i, 0xFF);
57 }
58
59 // CAN 초기화 (all IDs, 500kbps, 16MHz)
60 if (CAN.begin(MCP_ANY, CAN_500KBPS, MCP_16MHZ) != CAN_OK) {
61 Serial.println("[ERROR] CAN Init Failed!");
62 for (;;)
63 ;
64 }
65 CAN.setMode(MCP_NORMAL);
66
67 // Mini-MAC 초기화 (fresh 상태로 시작)
69
70 Serial.println("[INFO] Receiver Initialized");
71}
void minimac_init(uint16_t can_id, const uint8_t *key)
Mini-MAC 초기화 및 EEPROM 동기화
Definition minimac.cpp:241
const uint8_t SECRET_KEY[16]
Mini-MAC 프로토콜에 사용되는 16바이트 비밀 키.
이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:

변수 문서화

◆ SECRET_KEY

const uint8_t SECRET_KEY[16]
초기값:
= {0x1A, 0x2B, 0x3C, 0x4D, 0x5E, 0x6F,
0x70, 0x81, 0x92, 0xA3, 0xB4, 0xC5,
0xD6, 0xE7, 0xF8, 0x09}

Mini-MAC 프로토콜에 사용되는 16바이트 비밀 키.

송신 측과 공유되는 키로, 수신된 메시지의 태그 검증 시 사용됩니다.

receive_check.ino 파일의 27 번째 라인에서 정의되었습니다.

27 {0x1A, 0x2B, 0x3C, 0x4D, 0x5E, 0x6F,
28 0x70, 0x81, 0x92, 0xA3, 0xB4, 0xC5,
29 0xD6, 0xE7, 0xF8, 0x09};