バックナンバーはこちら。
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アドレス、ポート番号もコールバック時に取得できる。
バックナンバーはこちら。
コメント