Armadilloフォーラム

Armadillo-IoT G4のsocket UDP通信について

kitamura-a

2022年10月26日 19時27分

お世話になっております。

●内容
 ・armadilloーIoT G4にてUDPソケット通信が動作できない為、解決したいと考えております。
・仮想環境(Virtual Box)ではホストCPU経由で外部PCと通信動作できるが、
  その実行ファイルをarmadilloーIoT G4に持っていくと通信動作ができない。といった状況です。
  仮想環境(Virtual Box)で動作する為、アプリケーション自体の問題ではないと推測していますが
  armadilloーIoT G4側の設定、及び使用している環境での問題は何か考えられますでしょうか。

●開発環境
 ・仮想環境(Virtual Box)上のATDE9環境にて、Qtデザイナー5.15にてアプリケーションを作成しております。
 ・コンテナを起動し、ATDE9にある上記で作成した実行ファイルをArmadillo G4に転送し動作確認しております。
 ・Armadillo IoT G4本体にはeth0に静的IPアドレス 192.168.100.113を設定しています。このコネクタと通信を試している。
 ・eth1にも静的IPアドレス192.168.1.xxを設定している。
 ・テスト環境は、外部のPC端末から1秒間隔でデータ(8バイト程度)を送信し、データを受信したら
  アプリケーションで表示させている画面を変化させるというプログラムで確認しています。

・確認したこと
 コンテナ上でwgetやpingコマンドにてホストPC、及び仮想環境(Virtual Box)と通信はできている
 コンテナの起動時にUDPに必要とされる記述をおこなっている(下記参照)。しかしながら追記前と変化なし。

 ●Podman コマンドでコンテナ起動(ポート 50241を追加)
----------------------------------------------------------------------
podman run -it --name=demo16 \
--publish=50241:50241/udp \
--env=XDG_RUNTIME_DIR=/tmp \
--env=QT_QPA_PLATFORM=wayland \
--volume=/sys:/sys \
--volume=/dev:/dev \
--volume=/run/udev:/run/udev \
--volume=/opt/firmware:/opt/firmware \
--privileged \
localhost/myimg:3 /bin/bash

よろしくお願いいたします。

コメント

at_dominique.m…

2022年10月27日 8時33分

kitamura-aさん、

お世話になっています。

> ●内容
>  ・armadilloーIoT G4にてUDPソケット通信が動作できない為、解決したいと考えております。

armadillo側で UDP で listen しても、パケットを受信できていないということでよろしでしょうか?

とりあえず一番シンプルなコンテナで試してから、自分のアプリケーションに少しずつ近づいていきたいと思います。

私の環境では、以下のコンテナで受信できていますが、そちらも同じコマンドで確認できていますか?

armadillo:~# cat > /etc/atmark/containers/udp.conf
set_image docker.io/alpine
set_pull missing
add_ports 50241:50241/udp
set_command sleep infinity
armadillo:~# podman_start -v udp
Starting 'udp'
eval podman run -d --name 'udp' --replace --log-opt max-size=1mb 
    --restart=on-failure --pull='missing'  '--publish=50241:50241/udp' '--init'
    'docker.io/alpine'  'sleep' 'infinity'
Trying to pull docker.io/library/alpine:latest...
Getting image source signatures
Copying blob 9b18e9b68314 done  
Copying config a6215f2719 done  
Writing manifest to image destination
Storing signatures
0645e713b5463fc808f25b2429ae61684e7bf9bfb033b75414307e16bd803b12
armadillo:~# podman exec -i udp nc -u -l -p 50241
 
# そこで ATDE の方から通信します
[ATDE ~]$ date | nc -u 192.168.100.113 50241
 
# armadillo 画面の出力
Thu 27 Oct 08:29:10 JST 2022

これで受信ができていたら、アプリケーションに何か問題あるかもしれませんので、確認の上もうちょっと詳しく教えてください。
これで受信できなかった場合には問題を探す必要がありますね。詳しいコマンドをその時に教えますので、また聞いてください。

よろしくお願いします。

回答ありがとうございます。

同じディレクトリに、udp.confを作成しコマンドを実行した結果を下に追加します(添付も同様)。
結果的にはエラーが出ているようですが、この内容で状況は判断できますでしょうか。

armadillo:/etc/atmark/containers# podman_start -v udp
Starting 'udp'
eval podman run -d --name 'udp' --replace --log-opt max-size=1mb --restart=on-failure --pull='missing' '--publish=50241:50241/udp' 'docker.io/alpine' 'sleep' 'infinity'
Trying to pull docker.io/library/alpine:latest...
Error: initializing source docker://alpine:latest: pinging container registry registry-1.docker.io: Get "https://registry-1.docker.io/v2/": dial tcp: lookup registry-1.docker.io on 127.0.0.1:53: server misbehaving
error: Could not start 'udp'

ファイル ファイルの説明
WS000081.JPG

at_dominique.m…

2022年10月27日 13時07分

マルティネです。

> Trying to pull docker.io/library/alpine:latest...
> Error: initializing source docker://alpine:latest: pinging container registry registry-1.docker.io: Get "https://registry-1.docker.io/v2/": dial tcp: lookup registry-1.docker.io on 127.0.0.1:53: server misbehaving

すみません、確認してませんでしたが、手元の Armadillo にインターネットにアクセスできないんですね?(DNSサーバーが変というエラーはちょっと不明ですが…)

これでは確認しにくいので、添付したファイルを armadillo にコピーして、「podman load -i alpine.tar」で一時的のストレージへイメージを追加していただければ podman_start が通るはずです。
お手数ですが、よろしくお願いします。

ファイル ファイルの説明
alpine.tar docker.io/alpine:latest コンテナイメージ

回答ありがとうございます。
以下の手順で実行しました(添付写真と同様)が、メッセージはこない状態です。
podman_start -v udp でのエラーは無くなっているように見えました。
podman_start -v udpの時、こちらに添付していただいた内容とは少し違うので気にはなっています(添付参照)。

手順
---------------------------------------------------------------
・いただいた[alpine.tar]をG4にコピー。
・podman load -i alpine.tar コマンド実施。
・podman_start -v udp を実行(エラー等は出ていない)。
・podman exec -i udp nc -l -p 50241 を実行。
・仮想環境VBのATDE9から、date | nc -u 192.168.100.113 50241 を実行。
 (G4ターミナルには何も出ない状態)

-------------------------------------------------------------------
開発時はインターネットにアクセスは可能です(もう一方のLANにて設定しており、環境構築の際に使用していました)。
最終的なリリース時はローカル(インターネットなし)で構築したいと考えております。

ファイル ファイルの説明
WS000082.JPG

佐藤です。

> ・podman exec -i udp nc -l -p 50241 を実行。
-u が抜けているかと思います。
podman exec -i udp nc -u -l -p 50241
としてみてください。

失礼しました。ありがとうございます。

podman exec -i udp nc -u -l -p 50241

こちらで試しましたが、状況は変わりませんでした。

> 佐藤です。
>
> > ・podman exec -i udp nc -l -p 50241 を実行。
> -u が抜けているかと思います。
> podman exec -i udp nc -u -l -p 50241
> としてみてください。
>

at_dominique.m…

2022年10月28日 8時46分

kitamura-aさん

> こちらで試しましたが、状況は変わりませんでした。

ありがとうございます。
これで完全にネットワークの問題であることを確認できましたので、次の確認に進めます。

一旦 podman を止めて、armadillo の方でいくつかの確認をお願いします。
ネットワークを使えない前提で、パッケージの追加は少し面倒になりますが、よろしくお願いします。添付にした tcpdump-4.99.1-r3.apk.tar を armadillo にコピーしていただいて、以下のコマンドを実効していただけますでしょうか。
`ip route` と `tcpdump` コマンドの出力をお願いします。

# フォーラムで .apk を添付できないので .tar ファイルに入れて、その展開が必要です。
armadillo:~# tar xvf tcpdump-4.99.1-r3.apk.tar 
tcpdump-4.99.1-r3.apk
# パッケージのインストール自体です。ネットワークを使わないようにオプションが必要です。
armadillo:~# apk add --no-network --force-broken-world ./tcpdump-4.99.1-r3.apk
WARNING: Ignoring https://download.atmark-techno.com/alpine/v3.16/atmark: No such file or directory
WARNING: Ignoring https://dl-cdn.alpinelinux.org/alpine/v3.16/main: No such file or directory
WARNING: Ignoring https://dl-cdn.alpinelinux.org/alpine/v3.16/community: No such file or directory
(1/1) Installing tcpdump (4.99.1-r3)
Executing busybox-1.35.0-r17.trigger
OK: 166 MiB in 219 packages
# ネットワーク設定の確認です。kitamura-aさんの場合は eth1 も載ってるはずです。
armadillo:~# ip route
default via 172.16.0.1 dev eth0  src 172.16.1.71  metric 100 
172.16.0.0/16 dev eth0 scope link  src 172.16.1.71  metric 100 
# tcpdump でパケットをログしてみます。そのコマンドを実効してから、
# 再び ATDE から「date | nc -u 192.168.100.113 50241」を実効してみてください。
armadillo:~# tcpdump -i any -n port 50241
tcpdump: data link type LINUX_SLL2
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on any, link-type LINUX_SLL2 (Linux cooked v2), snapshot length 262144 bytes
08:35:45.425047 eth0  In  IP 172.16.69.20.33574 > 172.16.1.71.50241: UDP, length 29
#確認が終わった際に ctrl + C で終了させます
^C
1 packet captured
2 packets received by filter
0 packets dropped by kernel

そこで、tcpdump で何も表示されない場合は ATDE と Armadillo の間に何かつながらない理由がありますので、ネットワーク設定の確認が必要です。
ここでパケットが表示された場合は、ip route の出力によって解決方法が異なる場合もありますので、後ほどの返事で再び案内します。

よろしくお願いします

ファイル ファイルの説明
tcpdump-4.99.1-r3.apk_.tar alpine リポジトリに入ってる tcpdump パッケージです。

回答ありがとうございます。

開通しました。
ご説明いただいたコマンドを入力してパケットを受信できました。
(ポートと試験方法は少し変更しましたが、今回の手順によって初めて受信できました。)

引き続きよろしくお願いいたします。

ファイル ファイルの説明
20221028_log.txt

at_dominique.m…

2022年10月28日 13時22分

kitamura-aさん

> 開通しました。
> ご説明いただいたコマンドを入力してパケットを受信できました。
> (ポートと試験方法は少し変更しましたが、今回の手順によって初めて受信できました。)

添付していただいたログがよく分かりませんが、受信ができたようで何よりです。

また何かあったら聞いてください。
よろしくおねがいします、

> 添付していただいたログがよく分かりませんが、受信ができたようで何よりです。

すいません。添付内容を間違えていたようでした。実際は下記の通りになりました。
たとえば、これをコンテナ起動内のアプリケーションで実施する場合は、コンテナごとに同様の操作、インストールが必要であるということでしょうか。
また、現状はコンテナ起動時に
podman run -it --name=demo \
--publish=50241:50241/udp \

といったudpの部分を追加しているのですが、これも必要ということでしょうか。

UDP受信ができた時のログ
---------------------------------------------------------------------------------------------
armadillo:/etc/atmark/containers# tcpdump -i any -n port 50041
tcpdump: data link type LINUX_SLL2
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on any, link-type LINUX_SLL2 (Linux cooked v2), snapshot length 262144 bytes
09:24:54.100631 eth0 B IP 192.168.100.41.50241 > 192.168.100.255.50041: UDP, length 10
09:24:55.120653 eth0 B IP 192.168.100.41.50241 > 192.168.100.255.50041: UDP, length 10
09:24:56.140620 eth0 B IP 192.168.100.41.50241 > 192.168.100.255.50041: UDP, length 10
09:24:57.160315 eth0 B IP 192.168.100.41.50241 > 192.168.100.255.50041: UDP, length 10
09:24:58.180586 eth0 B IP 192.168.100.41.50241 > 192.168.100.255.50041: UDP, length 10
09:24:59.200530 eth0 B IP 192.168.100.41.50241 > 192.168.100.255.50041: UDP, length 10
09:25:00.220493 eth0 B IP 192.168.100.41.50241 > 192.168.100.255.50041: UDP, length 10
^C
7 packets captured
7 packets received by filter
0 packets dropped by kernel

at_dominique.m…

2022年10月28日 15時00分

> たとえば、これをコンテナ起動内のアプリケーションで実施する場合は、コンテナごとに同様の操作、インストールが必要であるということでしょうか。

tcpdump は調査のためのツールです。
受信ができたのは、nc -u -l か自分のアプリケーションでできたように理解しましたので、tcpdump がもう不要です。
ご自分のコンテナをインストールして、起動時に --publish=50241:50241/udp の様なオプションを設定すれば大丈夫です。

私が案内した apk add のコマンドでは、g4 のメモリオーバーレーでしかインストールされてませんので、Armadilloを再起動させれば tcpdump のコマンドが消えます。

> また、現状はコンテナ起動時に
> podman run -it --name=demo \
> --publish=50241:50241/udp \
>
> といったudpの部分を追加しているのですが、これも必要ということでしょうか。

はい、/udp の部分も必要です。 `--publish=50241:50241` だけを設定した場合は tcp の 50241 ポートを意味しますので、間違った場合には受信できません。

よろしくお願いします。

度々すみません。

> ここでパケットが表示された場合は、ip route の出力によって解決方法が異なる場合もありますので、後ほどの返事で再び案内します。
ip routeの結果を添付し忘れたので下記に添付しておきます。

>後ほどの返事で再び案内します。
先に回答しました実際にコンテナで使用する方法と合わせてお教えいただけると助かります。
よろしくお願い致します。

ip routeコマンドの結果log
-------------------------------------------------------------------
ip route
default via 192.168.1.253 dev eth1 metric 101
10.88.0.0/16 dev podman0 scope link src 10.88.0.1
192.168.1.0/24 dev eth1 scope link src 192.168.1.211 metric 101
192.168.100.0/24 dev eth0 scope link src 192.168.100.113 metric 100

at_dominique.m…

2022年10月28日 15時26分

> >後ほどの返事で再び案内します。
> 先に回答しました実際にコンテナで使用する方法と合わせてお教えいただけると助かります。

こちらこそ分かっておらず、すみません。
tcpdumpでパケットを確認できましたが、まだアプリケーションでは確認できてないということでよろしいですね?

それでは、tcpdump の行をもう一度確認してみましょう:
09:24:59.200530 eth0 B IP 192.168.100.41.50241 > 192.168.100.255.50041: UDP, length 10

これでは、192.168.100.41 を物デバイス(ATDE?)の 50241 ポートから、eth0 の broadcast アドレス(192.168.100.255)の ポート50041へ通信しているように見えます。

そこで:
- 受信側のポート設定は 50241 ではなく、 50041 にするべきです。
- podman では broadcast アドレスをデフォルトのネットワークでは使えませんので、host のネットワークを使う必要があります。その場合は --publish のオプションも不要になりますが、コンテナからなんでも出きるようになりますので unicast の場合は publish を使ってください。

以下のコマンドで確認できると思います:

# 必要な場合にはまた podman load で前回の alpine.tar をロードしてください
armadillo:~# podman run --rm -ti --network=host docker.io/alpine nc -vulp 50041
listening on [::]:50041 ...
connect to [::ffff:172.16.255.255]:50041 from [::ffff:172.16.69.20]:41840 ([::ffff:172.16.69.20]:41840)
Fri 28 Oct 15:23:55 JST 2022
# ctrl+c で停止してください
^Cpunt!

nc で確認を取れましたら、自分が開発したアプリケーションでも確認してください。

よろしくお願いします

回答ありがとうございます。

armadillo上で確認した結果を添付します。
下記①、②どちらも確認は取れています。
しかし、コンテナを起動してその中のアプリケーションを実行して起動した場合には動作が確認できておりません。
そこでコンテナの実行方法や指定の方法に何かあるのではないかな(ATDE9上で①と通信ができることもあり)と推測していますが、この辺りの仕組みがはっきりわかっていない為、お問い合わせをしているという次第です。

ご確認お願い致します。

①ハードウェア(192.168.100.41)からグローバル(192.168.100.255)で、aa 55 30 30 30 32 52 02 a5 5a という10バイトのデータを送信してG4が受信できた結果
-----------------------------------------------------------------------------------------------------------------------

armadillo:/etc# podman run --rm -ti --network=host docker.io/alpine nc -vulp 50041
listening on [::]:50041 ...
connect to [::ffff:192.168.100.255]:50041 from [::ffff:192.168.100.41]:50241 ([::ffff:192.168.100.41]:50241)
・0002Rペ^Cpunt!
armadillo:/etc#

②バーチャルボックス ATDE9(192.168.100.200)から date | nc -u 192.168.100.113 50041 というコマンドを送信してG4が受信できた結果
-----------------------------------------------------------------------------------------------------------------------
armadillo:/etc# podman run --rm -ti --network=host docker.io/alpine nc -vulp 50041
listening on [::]:50041 ...
connect to [::ffff:192.168.100.113]:50041 from [::ffff:192.168.100.200]:53023 ([::ffff:192.168.100.200]:53023)
2022年 10月 28日 金曜日 15:58:27 JST

1つ前のコメントを読み飛ばしていました。
自作のアプリケーションでのUDP受信通信動作確認ができました。
(グローバルに送信していたものをG4のIPアドレス192.168.100.113にのみ送信に変更した)

基本的な質問になりますが、G4側は相手からのグローバル送信は受信できないということですか。

at_dominique.m…

2022年10月31日 9時41分

kitamura-aさん

自作のアプリケーションでのUDP受信通信動作確認ができました。 (グローバルに送信していたものをG4のIPアドレス192.168.100.113にのみ送信に変更した)

基本的な質問になりますが、G4側は相手からのグローバル送信は受信できないということですか。

コンテナを --network=host で起動した場合はグローバル送信(broadcast の .255アドレス)あてのパケットでも受信できるはずです。

--publish の制限でG4のIPアドレス以外のパケットはコンテナに転送されませんが、 --network=host の場合はG4のネットワークをそのまま使ってますので普通に受信できます。

そちらのログでも、以下の行にちゃんと「192.168.100.255」アドレスへの接続ができています:

connect to [::ffff:192.168.100.255]:50041 from [::ffff:192.168.100.41]:50241 ([::ffff:192.168.100.41]:50241)

なので、自分のアプリケーションでも使えるはずです。自分のアプリケーションの podman コマンドをもう一度確認して、 --publish を使わずに --network=host を使ってください。 (/etc/atmark/containers/*.conf の場合は「 add_ports 」を使わず、「 set_network host 」でネットワークを設定してください)

よろしくお願いします。

内容を理解し、グローバル送信に対しても動作確認ができました。
ありがとうございました。