MAVLink란?
드론과 통신하기 위한 매우 가벼운 메시징 프로토콜
리소스 제약 시스템과 대역폭 제약 링크를 위해 설계된 이진 원격 측정 프로토콜
modern hybrid publish-subscribe 패턴 + point-to-point 패턴
구성 하위 프로토콜이 재전송과 함께 point-to-point 되는 동안 데이터 스트림이 토픽으로 전송/게시
*Point-to-Point Mode
대상 ID와 대상 컴포넌트를 사용
이러한 필드가 사용되는 경우 하위 프로토콜은 전송을 보장(missions, parameters, command)
시스템이 신뢰할 수 있는 소스의 메시지를 인증할 수 있도록 메시지 서명을 제공
메시지 암호화는 제공하지 않음
시스템 ID는 특정 MAVLink 시스템의 ID를 나타냄
최대 255개의 시스템에서 동시에 사용할 수 있음
컴포넌트 ID를 통해 MAVLink를 온보드 및 오프보드 통신 모두에 사용할 수 있음
메시지를 감지하고 디코딩하는 순서
- 패킷 시작 신호를 기다린 다음 패킷 길이를 읽음
- 체크섬을 n바이트 이후 일치시킴
- 체크섬이 일치하면 디코딩된 패킷을 반환하고 다시 시작 신호를 기다림
- 바이트가 변경되거나 손실되면 현재 메시지가 삭제되고 다음 메시지에서 다음 시도를 계속
MAVLink1
MAVLink 1은 시작신호(start sign)와 패킷 손실 탐지(packet drop detection)을 포함해 패킷당 8바이트의 오버헤드 가짐
자료형 | Name | Value | 의미 |
uint8_t | magic | 0xFE | 시작점 |
uint8_t | len | 0~255 | Payload 길이 |
uint8_t | seq | 0~255 | 패킷 순서 |
uint8_t | sysid | 1~255 | 메시지 발신자 ID |
uint8_t | compid | 1~255 | 메시지 발신 Component ID |
uint8_t | msgid | 0~255 | Payload에 있는 메시지 유형 ID |
uint8_t | payload | 메시지 데이터 | |
uint16_t | checksum | CRC-16/MCRF4XX |
MAVLink 2
자료형 | Name | Value | 의미 |
uint8_t | magic | 0xFD | 시작점 |
uint8_t | len | 0~255 | Payload 길이 |
uint8_t | incompat_flags | 해석 flag | |
uint8_t | compat_flags | 해석 불가능 시 무시할 flag | |
uint8_t | seq | 0~255 | 패킷 순서 |
uint8_t | sysid | 1~255 | 메시지 발신자 ID |
uint8_t | compid | 1~255 | 메시지 발신 Component ID |
uint32_t | msgid:24 | 0~16777215 | Payload에 있는 메시지 유형 ID |
uint8_t | payload | 메시지 데이터 | |
uint16_t | checksum | CRC-16/MCRF4XX | |
uint8_t | signature | 변조 방지 서명 |
Incompability Flags
비호환성 플래그는 MAVLink 라이브러리가 패킷을 처리하기 위해 지원해야 하는 기능을 나타내기 위해 사용됨
Compatibility Flags
호환성 플래그는 기능이 이해되지 않더라도 MAVLink 라이브러리가 패킷을 처리하는 것을 막지 않음을 나타내기 위해 사용
Payload Format
오버헤드를 줄이기 위해 페이로드 자체에 메시지 구조에 대한 정보를 포함하지 않음
Empty-Byte Payload Truncation
0으로 채워진 후행 바이트가 있는 (비호환) MAVLink 2 메시지를 수신하는 구현은 메시지의 디코딩을 지원해야 하며(다른 방법으로 유효한 경우), 메시지를 라우팅/전달하는 방법을 제공해야 함
메시지는 완전히 변경되지 않은 채 전달되거나(즉, 0이 조정되지 않은 채 원래 CRC와 함께) 전달 구현이 0을 자르고 CRC를 재계산할 수 있음
- CRC-16/MCRF4XX checksum을 사용하여 전송하는 동안 패킷의 무결성을 확인 데이터가 변경되지 않았음을 보장할 뿐 데이터 정의와의 일관성은 보장되지 않음
- 데이터 설명에 대해 ID가 같은 두 메시지에 동일한 정보가 포함되어 있는지 확인 결과 값은 seed the packet CRC에 사용 대부분의 reference implementations 는 CRC_EXTRA에 저장
CRC_EXTRA Calculation
CRC_EXTRA CRC는 송신자와 수신자가 특정 메시지의 유선 형식을 공유하는지 확인하는 데 사용
송신자가 메시지의 체크섬을 계산할 때 체크섬이 계산되는 데이터의 끝에 CRC_EXTRA 바이트를 추가
수신인은 수신된 메시지의 체크섬을 계산하고 특정 메시지 ID에 대한 자체 CRC_EXTRA를 추가
송신자와 수신자의 CRC_EXTRA가 다르면 체크섬이 일치하지 않음
이 접근 방식은 송신자와 수신자가 동일한 메시지 구조를 사용하는 메시지만 디코딩되도록 보장
CRC_EXTRA는 XML 순서가 아닌 공중파 메시지 레이아웃을 기준으로 계산
- 24비트 메시지 ID - 1600만 개 이상의 고유한 메시지 정의를 허용
- 패킷 서명 - 신뢰할 수 있는 시스템에서 메시지를 보냈음을 인증
- 메시지 확장 - 업데이트되지 않은 수신기의 이진 호환성을 해제하지 않고 기존 MAVLink 메시지 정의에 새 필드 추가
- 빈 바이트 페이로드 잘라내기 - 직렬화된 페이로드의 끝에 있는 비어 있는 바이트는 전송 전에 제거되어야 함
- 호환성 플래그/비호환성 플래그 - 특수/비표준 방식으로 처리해야 하는 프레임을 표시하여 프로토콜의 역호환성 진화를 허용
Message Signing
Frame Format
link id(8 bits): 패킷이 전송되는 링크의 ID, 채널
tm.stamp(48 bits): 타임스탬프
signature(48 bits): 전체 패킷, 타임 스탬프 및 비밀 키에 기반한 48비트 패킷 서명
Signature
비밀키에 추가된 전체 패킷(서명은 없지만 타임스탬프 포함)의 SHA-256 해시의 첫 48비트
비밀키는 MAVLink 채널의 양 끝에 저장된 32바이트의 바이너리 데이터
signature = sha256_48(secret_key + header + payload + CRC + link-ID + timestamp)
Secret Key Management
비밀키를 생성하는 방법
- SHA-256을 통해 실행되는 사용자 입력 문자열
- 임의의 키 생성기
비밀키는 SETUP_SIGNING 메시지를 사용하여 다른 장치와 공유할 수 있음. 메시지는 보안 링크를 통해 연결된 각 사용자에게 직접 메시지로만 전송되어야 함. system_id / component_id 수신 시스템은 메시지를 처리하고 수신된 비밀키를 적절한 영구 저장소에 저장하도록 설정되어야 함.
*해당 파일은 공부하면서 필기한 내용
*더 자세한 내용은 mavlink 공식 홈페이지 참고
'Study > Drone' 카테고리의 다른 글
전파 개념 (0) | 2022.01.11 |
---|---|
신호 개념 (0) | 2021.12.26 |
[Network]Wi-Fi protocol spec (0) | 2021.12.26 |
[Network]Wi-Fi (0) | 2021.12.26 |
[Drone] 랩탑에서 공유기 구현 (0) | 2021.12.10 |