バックナンバーはこちら。
https://www.simulationroom999.com/blog/In-vehicle-network-backnumber/
はじめに
lwIPのUDP受信について。
登場人物
博識フクロウのフクさん

イラストACにて公開の「kino_k」さんのイラストを使用しています。
https://www.ac-illust.com/main/profile.php?id=iKciwKA9&area=1
エンジニア歴8年の太郎くん

イラストACにて公開の「しのみ」さんのイラストを使用しています。
https://www.ac-illust.com/main/profile.php?id=uCKphAW2&area=1
lwIPのUDP受信

今回はUDP受信について。
- lwIP自身の初期化
- ネットワークインターフェースの追加
- マルチキャストグループの参加
- ネットワークインターフェースの初期化
- リンクアップ
- UDP Socket生成
- IPアドレス、ポートへのBind
- UDP受信待ち ← これ
- EthnertFrameの疑似受信

これは受信関数呼ぶ終わりな予感!

ざんねーん。
そうは問屋が卸さない!

(ずいぶん古い言い回しを・・・。)

なんか他にやり方があるの?

受信処理。
そして、組み込み。
といったら?

んー?
受信割込みからの~?

あ!
受信コールバックか?!

正解!

おー。これは以外と面倒というかなんというか・・・。

まぁコールバック関数をセットして、
コールバック関数が呼ばれた際に受信データを受け取るって流れなんで、
それほど複雑な話でもないけどねー。
ちなみに受信コールバックを設定するAPIはudp_recv関数になる。
udp_recv関数説明

まず引数を説明
pcb:UDP SocketのPCB
recv:受信用コールバック関数
recv_arg:コールバック時に一緒に渡すパラメータ

コールバック関数の方は以下になる。
typedef void (*udp_recv_fn)(void *arg, struct udp_pcb *pcb, struct pbuf *p,
const ip_addr_t *addr, u16_t port);

コールバック関数の引数は?

こんなん。
arg:udp_recvで渡したrecv_arg
pcb:UDP SocketのPCB
p:受信したパケットのバッファ
addr:受信したパケットの送信元IPアドレス
port:受信したパケットの送信元ポート番号

おー。
これだけ情報あれば、いろいろ出来そう!

そうね。
送信元の情報も取得できるんで、
そのまま送信元にレスポンスするとかに使える。

今回の場合は、
ここにIPフラグメントで分断されたデータが
結合されて渡される感じか。

そうだね。

うん。イメージは湧いたから大丈夫そうだ。
まとめ

まとめだよ。
- lwIPのUDP受信の説明。
- 受信用APIは存在せず、受信コールバック設定用APIが存在する。
- 受信コールバックでデータを取得可能。
- 送信元IPアドレス、ポート番号もコールバック時に取得できる。
バックナンバーはこちら。
コメント