kiso.masaki
2019年3月28日 17時26分
お世話になります。木曽です。
以下の環境で、PLC<-有線LAN->Armadillo-IoT G3<-LTE->AWS IoT接続を行うと、
LTEのMQTT接続が行えない事象が発生しており、同様の事例や解決方法をご教示いただけますでしょうか。
また、調査のため必要なログなどあれば、ご連絡をお願いいたします。
■環境
実機:Armadillo-IoT G3(ソフトバンク版)
Linuxカーネル:linux-4.9-x1-at5
イメージ:install_disk_sd_20190228_iotg3_m1.img
SIM:Softbank M2M
接続:PLC <- 有線LAN -> Armadillo-IoT G3 <- LTE(MQTT) -> AWS IoT
■問題
以下のように、有線LANが刺さっている状態と刺さっていない状態で、LTEで接続するMQTT接続の動作が異なり、
有線LANが刺さった状態でMQTT接続できない状態が問題となります。
※アプリでは、有線LANがさせているかどうかの判断はしておりません。
・有線LAN、SIMが同時に刺さっているとMQTT接続に失敗する。
・有線LANを抜いた状態で、SIMが刺さっているとMQTT接続に成功する。
■やりたいこと
G3に組み込んだ自作アプリで、PLCからソケット通信で取得したデータを、AWS IoTへMQTT送信する
■状況
・「ping 8.8.8.8」は通るため、インターネット接続可能です。
・MQTT接続は、以下「Mosquitto」のC++ライブラリを利用しております。
https://mosquitto.org
・関係性は薄いと推測しますが、この現象は2/28社内テスト時点では発生しておらず、
Linuxカーネルは、linux-4.9-x1-at3に以下のパッチを当てた状態でした。
usb_hub_reset.patch
■施行錯誤した対策は以下です
- [ネットワークが有効になるまで待つ | アットマークテクノ ユーザーズサイト](https://users.atmark-techno.com/forum/armadillo/3345)
systemctl enable systemd-networkd systemctl enable systemd-networkd-wait-online
[Unit] Description = hoge app daemon After=network-online.target [Service] ExecStartPre=/bin/sleep 30 ExecStart = /opt/hoge/bin/startup.sh Restart = on Type = oneshot RemainAfterExit=yes [Install] WantedBy = network-online.target
[Armadillo-IoT G3/G3L: 有線LANをデフォルトゲートウェイに設定しない方法 | アットマークテクノ ユーザーズサイト](https://users.atmark-techno.com/blog/750/2582)
- [LANケーブルが繋がっていると3G側から接続を受け付けない | アットマークテクノ ユーザーズサイト](https://users.atmark-techno.com/forum/armadillo/2907)
nmcli c nmcli c down "Wired connection 1" nmcli c add con-name ether type ethernet ifname eth0 nmcli c show ether nmcli c modify ether ipv4.method manual ipv4.addresses "192.168.3.251/24" ipv6.method ignore nmcli c modify ether ipv4.never-default true nmcli c show ether nmcli c down ether nmcli c up ether
- ルーティングのメトリクスを変更(LTEが700だったため、有線LANを変更)
nmcli c modify ether ipv4.method manual ipv4.addresses "192.168.3.251/24" ipv6.method ignore ipv4.route-metric 1000
- serviceの起動時間を延長
[Unit] Description = hoge app daemon After=network-online.target [Service] ExecStartPre=/bin/sleep 120 ExecStart = /opt/hoge/bin/startup.sh Restart = on Type = oneshot RemainAfterExit=yes [Install] WantedBy = network-online.target
以上です。
よろしくお願いいたします。
コメント
at_koseki
kiso.masaki
木曽です。
以下のようにエラーは発生せず、statusもactiveです。
※サービス名などマスキングしています。
root@armadillo:~# systemctl status hoge.service ● hoge.service - lh-iot hoge app daemon Loaded: loaded (/etc/systemd/system/hoge.service; enabled; vendor preset: en Active: active (exited) since Thu 2019-03-28 15:11:27 JST; 3h 42min ago Process: 1540 ExecStart=/opt/hoge/bin/startup.sh (code=exited, status=0/SUCCE Process: 1454 ExecStartPre=/bin/sleep 30 (code=exited, status=0/SUCCESS) Main PID: 1540 (code=exited, status=0/SUCCESS) CGroup: /system.slice/hoge.service └─1544 ./hoge Mar 28 15:10:57 armadillo systemd[1]: Starting lh-iot hoge app daemon... Mar 28 15:11:27 armadillo startup.sh[1540]: hoge app startup... Mar 28 15:11:27 armadillo startup.sh[1540]: hoge app started successfully. Mar 28 15:11:27 armadillo systemd[1]: Started lh-iot hoge app daemon.
>
> > Restart = on
> > Type = oneshot
> > RemainAfterExit=yes
>
> 「Type = oneshot」と「Restart = on」を同時指定するとエラーがでませんでしょうか?
>
> 以下コマンドを実行しサービスが動作しているか確認をお願いいたします。
> # systemctl status [サービス名]
以下については、確認次第、ご連絡いたします。
> また、「Type = simple」にしたらどうなるでしょうか?
at_koseki
kiso.masaki
木曽です。
> > また、「Type = simple」にしたらどうなるでしょうか?
以下のように「Type = simple」で確認しましたが、改善ありませんでした。
[Unit] Description = lh-iot hoge app daemon After=systemd-networkd-wait-online.service [Service] ExecStartPre=/bin/sleep 30 ExecStart = /opt/hoge/bin/startup.sh Restart = on Type = simple RemainAfterExit=yes [Install] WantedBy = network-online.target
アプリ側の話ですが、以下のようにMosquittoのmosquitto_connect_bindメソッドの戻り値が
MOSQ_ERR_EAIの「15」でエラーとなります。
[2019-03-28 18:59:25.058] [relay] [error] [init:143] mosquitto_connect_bind. ret:15
ログ
Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent permitted by applicable law. root@armadillo:~# ping google.com PING google.com (172.217.26.46) 56(84) bytes of data. 64 bytes from nrt12s17-in-f46.1e100.net (172.217.26.46): icmp_seq=1 ttl=54 time=86.7 ms 64 bytes from nrt12s17-in-f46.1e100.net (172.217.26.46): icmp_seq=2 ttl=54 time=67.1 ms ^C --- google.com ping statistics --- 2 packets transmitted, 2 received, 0% packet loss, time 1001ms rtt min/avg/max/mdev = 67.125/76.960/86.795/9.835 ms root@armadillo:~# systemctl status hoge.service ● hoge.service - lh-iot hoge app daemon Loaded: loaded (/etc/systemd/system/hoge.service; enabled; vendor preset: en Active: active (exited) since Thu 2019-03-28 18:59:24 JST; 29s ago Process: 1518 ExecStart=/opt/hoge/bin/startup.sh (code=exited, status=0/SUCCE Process: 1454 ExecStartPre=/bin/sleep 30 (code=exited, status=0/SUCCESS) Main PID: 1518 (code=exited, status=0/SUCCESS) CGroup: /system.slice/hoge.service └─1523 ./hoge Mar 28 18:58:54 armadillo systemd[1]: Starting lh-iot hoge app daemon... Mar 28 18:59:24 armadillo systemd[1]: Started lh-iot hoge app daemon. Mar 28 18:59:24 armadillo startup.sh[1518]: hoge app startup... Mar 28 18:59:24 armadillo startup.sh[1518]: hoge app started successfully.
at_koseki
古関です。
アプリ自体は問題なく立ち上がっているのですね。
> MOSQ_ERR_EAIの「15」でエラーとなります。
mosquitto のコードを読みましたが、getaddrinfo()が失敗したときに出るエラーのようですね。
debianパッケージのコードしかみていないので、upstreamに修正がされていないか見てみます。
また、こちらでも似たような環境を作って再現を試みてみます。
既知かもしれませんが、ここで似たような症状が議論されていますね。
https://github.com/owntracks/recorder/issues/185
kiso.masaki
木曽です。
ご確認いただき、誠にありがとうございます。
はい、私はATDE環境(クロスコンパイラ環境)にて、mosquittoのコードを確認しております。
また、現在、弊社にはソフトバンク版のみしか無い状況なので、ドコモ版も持ち合わせているようなら
ご確認いただければ、幸いです。
> > MOSQ_ERR_EAIの「15」でエラーとなります。
> mosquitto のコードを読みましたが、getaddrinfo()が失敗したときに出るエラーのようですね。
>
> debianパッケージのコードしかみていないので、upstreamに修正がされていないか見てみます。
> また、こちらでも似たような環境を作って再現を試みてみます。
以下URL確認いたします。
> 既知かもしれませんが、ここで似たような症状が議論されていますね。
> https://github.com/owntracks/recorder/issues/185
>
at_koseki
古関です。
Linux-KernelのコンフィグレーションでIPv6を無効にしたらどうなるでしょうか?
明確な根拠があるわけではないのですが、
ethernetを接続すると再現、LTEだけなら問題ないとのことでした。
LTE(ppp0)とeth0のifconfigの差を見ると、eth0はipv6のアドレスが出ています。
NetworkManagerの設定で、"ipv6.method ignore"しても
カーネルがサポートしているためifconfigにipv6のaddressが見えると思われます。
root@armadillo:~# ifconfig -a
eth0: flags=4163 mtu 1500
inet 192.168.3.251 netmask 255.255.255.0 broadcast 192.168.3.255
inet6 fe80::211:cff:fe00:7e0 prefixlen 64 scopeid 0x20
ether 00:11:0c:00:07:e0 txqueuelen 1000 (Ethernet)
RX packets 230 bytes 23628 (23.0 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 85 bytes 10127 (9.8 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
ppp0: flags=4305 mtu 1500
inet 10.181.89.250 netmask 255.255.255.255 destination 10.181.0.1
ppp txqueuelen 3 (Point-to-Point Protocol)
RX packets 487 bytes 433837 (423.6 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 462 bytes 27484 (26.8 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
kiso.masaki
木曽です。
以下のように「ipv6.method ignore」はしましたが、eth0のipv6のaddressは見えております。
お手数ですが、「Linux-KernelのコンフィグレーションでIPv6を無効にしたらどうなるでしょうか?」について、
手順をご教示いただけますでしょうか。
root@armadillo:~# ifconfig -a eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.3.251 netmask 255.255.255.0 broadcast 192.168.3.255 inet6 fe80::211:cff:fe2b:120 prefixlen 64 scopeid 0x20<link> ether 00:11:0c:2b:01:20 txqueuelen 1000 (Ethernet) RX packets 21 bytes 16909 (16.5 KiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 76 bytes 11657 (11.3 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 gre0: flags=128<NOARP> mtu 1476 unspec 00-00-00-00-3A-30-30-30-00-00-00-00-00-00-00-00 txqueuelen 1 (UNSPEC) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 0 bytes 0 (0.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 gretap0: flags=4098<BROADCAST,MULTICAST> mtu 1462 ether 00:00:00:00:00:00 txqueuelen 1000 (Ethernet) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 0 bytes 0 (0.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 ip6_vti0: flags=128<NOARP> mtu 1500 unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 txqueuelen 1 (UNSPEC) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 0 bytes 0 (0.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 ip6gre0: flags=128<NOARP> mtu 1448 unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 txqueuelen 1 (UNSPEC) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 0 bytes 0 (0.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 ip6tnl0: flags=128<NOARP> mtu 1452 unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 txqueuelen 1 (UNSPEC) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 0 bytes 0 (0.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536 inet 127.0.0.1 netmask 255.0.0.0 inet6 ::1 prefixlen 128 scopeid 0x10<host> loop txqueuelen 1 (Local Loopback) RX packets 608 bytes 51072 (49.8 KiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 608 bytes 51072 (49.8 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 sit0: flags=128<NOARP> mtu 1480 sit txqueuelen 1 (IPv6-in-IPv4) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 0 bytes 0 (0.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 tunl0: flags=128<NOARP> mtu 1480 tunnel txqueuelen 1 (IPIP Tunnel) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 0 bytes 0 (0.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 wlan0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500 ether 44:c3:06:47:be:80 txqueuelen 1000 (Ethernet) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 0 bytes 0 (0.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
root@armadillo:~# nmcli c show ether connection.id: ether connection.uuid: 5797cc7b-4cd0-4fbe-bd0d-efa3e48a5124 connection.stable-id: -- connection.interface-name: eth0 connection.type: 802-3-ethernet connection.autoconnect: yes connection.autoconnect-priority: 0 connection.autoconnect-retries: -1 (default) connection.timestamp: 1553771726 connection.read-only: no connection.permissions: connection.zone: -- connection.master: -- connection.slave-type: -- connection.autoconnect-slaves: -1 (default) connection.secondaries: connection.gateway-ping-timeout: 0 connection.metered: unknown connection.lldp: -1 (default) 802-3-ethernet.port: -- 802-3-ethernet.speed: 0 802-3-ethernet.duplex: -- 802-3-ethernet.auto-negotiate: no 802-3-ethernet.mac-address: -- 802-3-ethernet.cloned-mac-address: -- 802-3-ethernet.generate-mac-address-mask:-- 802-3-ethernet.mac-address-blacklist: 802-3-ethernet.mtu: auto 802-3-ethernet.s390-subchannels: 802-3-ethernet.s390-nettype: -- 802-3-ethernet.s390-options: 802-3-ethernet.wake-on-lan: 1 (default) 802-3-ethernet.wake-on-lan-password: -- ipv4.method: manual ipv4.dns: ipv4.dns-search: ipv4.dns-options: (default) ipv4.dns-priority: 0 ipv4.addresses: 192.168.3.251/24 ipv4.gateway: -- ipv4.routes: ipv4.route-metric: 1000 ipv4.ignore-auto-routes: no ipv4.ignore-auto-dns: no ipv4.dhcp-client-id: -- ipv4.dhcp-timeout: 0 ipv4.dhcp-send-hostname: yes ipv4.dhcp-hostname: -- ipv4.dhcp-fqdn: -- ipv4.never-default: yes ipv4.may-fail: yes ipv4.dad-timeout: -1 (default) ipv6.method: ignore ipv6.dns: ipv6.dns-search: ipv6.dns-options: (default) ipv6.dns-priority: 0 ipv6.addresses: ipv6.gateway: -- ipv6.routes: ipv6.route-metric: -1 ipv6.ignore-auto-routes: no ipv6.ignore-auto-dns: no ipv6.never-default: no ipv6.may-fail: yes ipv6.ip6-privacy: -1 (unknown) ipv6.addr-gen-mode: stable-privacy ipv6.dhcp-send-hostname: yes ipv6.dhcp-hostname: -- ipv6.token: -- proxy.method: none proxy.browser-only: no proxy.pac-url: -- proxy.pac-script: -- GENERAL.NAME: ether GENERAL.UUID: 5797cc7b-4cd0-4fbe-bd0d-efa3e48a5124 GENERAL.DEVICES: eth0 GENERAL.STATE: activated GENERAL.DEFAULT: no GENERAL.DEFAULT6: no GENERAL.VPN: no GENERAL.ZONE: -- GENERAL.DBUS-PATH: /org/freedesktop/NetworkManager/ActiveConnection/1 GENERAL.CON-PATH: /org/freedesktop/NetworkManager/Settings/2 GENERAL.SPEC-OBJECT: -- GENERAL.MASTER-PATH: -- IP4.ADDRESS[1]: 192.168.3.251/24 IP4.GATEWAY: -- IP4.ROUTE[1]: dst = 169.254.0.0/16, nh = 0.0.0.0, mt = 1000 IP6.ADDRESS[1]: fe80::211:cff:fe2b:120/64 IP6.GATEWAY: --
at_koseki
古関です。
> お手数ですが、「Linux-KernelのコンフィグレーションでIPv6を無効にしたらどうなるでしょうか?」について、
> 手順をご教示いただけますでしょうか。
以下になります。
Linux-Kernelのコードツリーで以下コマンドを実行。
# make ARCH=arm menuconfig
以下に移動します。
--------------------------------------------------------
-> Networking support
-> Networking options
-> TCP/IP networking
--------------------------------------------------------
スペースを押して、「The IPv6 protocol」のチェック * を外しLinux-Kernelをビルド、uImageを書き込んでください。
<*> The IPv6 protocol ----
コンフィグレーションの手順は以下を参照してください。
https://manual.atmark-techno.com/armadillo-iot-g3/armadillo-iotg-g3_pro…
kiso.masaki
木曽です。
ご確認いただき、ありがとうございます。
早速以下、作業します。
> 以下になります。
>
> Linux-Kernelのコードツリーで以下コマンドを実行。
>
> # make ARCH=arm menuconfig
>
> 以下に移動します。
> --------------------------------------------------------
> -> Networking support
> -> Networking options
> -> TCP/IP networking
> --------------------------------------------------------
>
> スペースを押して、「The IPv6 protocol」のチェック * を外しLinux-Kernelをビルド、uImageを書き込んでください。
> <*> The IPv6 protocol ----
>
>
> コンフィグレーションの手順は以下を参照してください。
> https://manual.atmark-techno.com/armadillo-iot-g3/armadillo-iotg-g3_pro…
at_koseki
kiso.masaki
at_koseki
at_koseki
kiso.masaki
木曽です。
以下手順にて、ipv6を無効にしたuImageをG3に書き込んだところ、無事、MQTT接続が行えました!
ありがとうございます。
> > 以下になります。
> >
> > Linux-Kernelのコードツリーで以下コマンドを実行。
> >
> > # make ARCH=arm menuconfig
> >
> > 以下に移動します。
> > --------------------------------------------------------
> > -> Networking support
> > -> Networking options
> > -> TCP/IP networking
> > --------------------------------------------------------
> >
> > スペースを押して、「The IPv6 protocol」のチェック * を外しLinux-Kernelをビルド、uImageを書き込んでください。
> > <*> The IPv6 protocol ----
uImageは、以下URLのカーネルから作成しております。
wget https://users.atmark-techno.com/files/downloads/armadillo-iot-g3/source/linux-4.9-x1-at5.tar.gz wget https://users.atmark-techno.com/files/downloads/armadillo-iot-g3/source/initramfs_x1-v1.1.0.cpio.gz
アプリログ抜粋
[2019-03-28 23:17:03.179] [relay] [info] [on_publish:37] on_publish. mid:17 [2019-03-28 23:17:42.893] [relay] [info] [on_publish:37] on_publish. mid:18 [2019-03-28 23:18:22.730] [relay] [info] [on_publish:37] on_publish. mid:19 [2019-03-28 23:19:13.584] [relay] [info] [on_publish:37] on_publish. mid:20 [2019-03-28 23:19:53.143] [relay] [info] [on_publish:37] on_publish. mid:21 [2019-03-28 23:20:32.974] [relay] [info] [on_publish:37] on_publish. mid:22 tail: '/opt/relay/bin/logs/relay.log' has been replaced; following new file [2019-03-28 23:21:22.875] [relay] [info] [on_publish:37] on_publish. mid:23 [2019-03-28 23:22:03.543] [relay] [info] [on_publish:37] on_publish. mid:24 [2019-03-28 23:22:43.505] [relay] [info] [on_publish:37] on_publish. mid:25 [2019-03-28 23:23:33.116] [relay] [info] [on_publish:37] on_publish. mid:26
kiso.masaki
at_koseki
2019年3月28日 17時41分
古関です。
> ■状況
> ・「ping8.8.8.8」は通るため、インターネット接続可能です。
このとき、ping google.comは通るでしょうか?
IPアドレスではインターネットに出れるけど、
名前解決ができていない状況では?と思った次第です。