MAVLinkのCRCチェックサム(Checksum)は、MAVLinkの送信と受信で使っています。
MAVLinkの送信側と受信側で、MAVLink XML定義ファイルを変更した場合、メッセージ名前、フィルード名前、フィルードタイプ、フィルード長さ等差異よりChecksumが不一致で、MAVLink受信失敗になります。
Checksum の概要
Checksumは、uint16_tのデータでMAVLinkの送信側と受信側のメッセージ内容が一致するかをチャックします。
MAVLink送信側、head、payloadとCRC_EXTRAからChecksumを計算してメッセージに2バイトChecksumを追加して送信します。
MAVLink受信側、送信側と同じでhead、payloadとCRC_EXTRAからChecksumを計算して受信したメッセージの2バイトChecksumと比較して同じプロトコルのメッセージかどうかをチャックします。
MAVLinkのデータ構造は、MAVLinkの入門を参考してください。
CRC_EXTRA の計算
CRC_EXTRAは、uint8_tのデータでMAVLinkの送信側と受信側のメッセージ定義が一致するかをチャックします。
CRC_EXTRAは、メッセージ定義XMLファイル(メッセージ名前、フィルード名前、フィルードタイプ、フィルード長さ)を基づいて1バイトのデータを計算します。
CRC_EXTRA 計算詳細は、公式サイトを参考してください。
Checksum の計算
Checksum 計算詳細は、MAVLink source codeを参考してください。
uint16_t checksum = crc_calculate(&buf[1], header_len-1);
crc_accumulate_buffer(&checksum, _MAV_PAYLOAD(msg), msg->len);
crc_accumulate(crc_extra, &checksum);
Step1 Checksumを初期化
# define X25_INIT_CRC 0xffff
static inline void crc_init(uint16_t* crcAccum)
{
*crcAccum = X25_INIT_CRC;
}
Step2 メッセージのHeadからChecksumを計算
uint16_t checksum = crc_calculate(&buf[1], header_len-1);
MAVLinkメッセージのHeadからChecksumを計算するイメージ
Step3 メッセージのpayloadからChecksumを計算
crc_accumulate_buffer(&checksum, _MAV_PAYLOAD(msg), msg->len);
MAVLinkメッセージのpayloadからChecksumを計算するイメージ
Step4 メッセージのCRC_EXTRAからChecksumを計算
crc_accumulate(crc_extra, &checksum);
Step5 受信側でChecksumを比較
MAVLink受信側で、受信したメッセージから計算したChecksumと受信したChecksumを比較します。
Checksumが不一致場合、MAVLink受信失敗になります。