通信プロトコル設計上で、送信側がデータを送信後、正常受信した受信側からACKを返送する疑似コードです。
ダウンロード・サポート内のESP32・Arduino ライブラリを使用した例となります。
【疑似コードの説明】
送信側は送信パケットに自機アドレスとチャンネルを含めて送信。
受信側は送信側アドレスとチャンネル向けに、ACKパケットを、自機アドレス、チャンネルを含めてを送信。
送信側は、ACK受信の確認と同時に、受信側のアドレス、チャンネルも確認する。
//
// ACK を利用した送受信の疑似コード
//
// @送信側 SendPacket()
//
// @受信側 ReceivePacket()
//
//--------------------------------------------------------
//
// 送信側 ブロードキャスト送信の場合の例
//
int SendPacket() {
// ブロードキャスト送信のためのアドレス、チャンネルのセット
config.target_address = 0xffff; // ブロードキャストアドレス
config.target_channel = 0x00; // チャンネルを0に
// 送信パケットデータに自機アドレス、チャンネルをセット
uint8_t IDENT = id; // (必要なら)通信フォーマット上の任意の識別コード
uint8_t ADDH = addr >> 8; // 自機アドレスHigh
uint8_t ADDL = addr & 0xff; // 自機アドレスLow
uint8_t CHANNEL = ch; // 自機チャンネル
send_data[0] = IDENT; // 識別コードのセット
send_data[1] = ADDH; // 自機アドレスHigh のセット
send_data[2] = ADDL; // 自機アドレスLow のセット
send_data[3] = CHANNEL; // 自機チャンネルのセット
// 送信データのセット
send_data[] = データ; // 送信データ長分のデータをセット
// パケット送信
SendFrame(struct LoRaConfigItem_t &config, uint8_t *send_data, int size);
// ACK受信
RecieveFrame(struct RecvFrameE220900T22SJP_t *recv_frame);
// ACK受信チェック
recv_frame[4] が ACK ?
// ACKを送信したデバイスのアドレスを確認
code = ACK受信 or NACK(フォーマットエラーなど)
return code;
}
//--------------------------------------------------------
//
// 受信側 の例
//
int ReceivePacket() {
// パケットの受信
RecieveFrame(struct RecvFrameE220900T22SJP_t *recv_frame);
// 通信フォーマット上のエラー有無チェック
code = 結果;
// 受信データから返信先アドレス、チャンネルを取得
uint8_t TXADDRH = recv_frame[1]; // 返信先アドレスHigh
uint8_t TXADDRL = recv_frame[2]; // 返信先アドレスLow
uint8_t TXCHANNEL = recv_frame[3]; // 返信先チャンネル
// 送信先アドレス,、チャンネルのセット
config.target_address = (uint16_t)TXADDRH << 8 | (uint16_t)TXADDRL;
config.target_channel = TXCHANNEL;
// 返信データセット
uint8_t IDENT = id_ack; // 識別コード
uint8_t ADDH = addr >> 8; // 自機アドレスHigh
uint8_t ADDL = addr & 0xff; // 自機アドレスLow
uint8_t CHANNEL = ch; // 自機チャンネル
send_data[0] = IDENT; // (必要なら)識別コード
send_data[1] = ADDH; // 自機アドレスHigh
send_data[2] = ADDL; // 自機アドレスLow
send_data[3] = CHANNEL; // 自機チャンネル
// code がエラーか否かで、ACK or NACKのセット
if (code) で ACK or NACK
send_data[4] = ACK or NACK;
// パケット送信
SendFrame(struct LoRaConfigItem_t &config, uint8_t *send_data, int size);
return code;
}