Armadilloフォーラム

G3L: 起動直後のLTE接続後、数10秒で切断しないようにするには?

sshida

2018年5月22日 19時15分

G3Lは起動後20秒程度でLTEが接続するので高速に見えます。
ですがその数10秒後にいったん切断してしまいます。
G3LでLTE接続したあと、数10秒で切断しないようにするにはどのようにしたらよいでしょうか?

理由は2つあります。
1. 常時命令を待ち受ける端末として使うため、極力切断中の時間を短くしたいです
2. 起動後すぐにサーバーに接続しますがすぐに再接続するため動作が不安定になりやすいです

■試した環境
- soracom SIM (fast, 1 Mbps)
- signal quality = 77 (mmcli -m 0 | grep signal)
- G3L kernel: Linux armadillo 3.14.79-at21 #2 SMP PREEMPT Tue Feb 27 09:49:09 JST 2018 armv7l GNU/Linux

■soracom接続を設定する
# nmcli c add con-name wan type gsm ifname ttyACM0 autoconnect yes apn soracom.io user sora password sora

■接続を確認するスクリプトを作る
# cat <<__EOF__ > /root/wait-connect.sh
#!/bin/bash

logExit() {
logger -p daemon.err $2
tty -s && echo $(date -Iseconds) $2
[ "-" = "$1" ] || exit $1
}

# ping : count 1, wait 2 second, to 8.8.8.8
DEST=8.8.8.8
RETRY=10
C=0
while ! ping -c 1 -W 2 $DEST > /dev/null; do
logExit - "PING no response from $DEST: count=$C"
sleep 1
C=$((C + 1))
[ $C -ge $RETRY ] && logExit 1 "Error: PING retry out: count=$C"
done
logExit - "Success PING to $DEST: $?"

ping -c 120 $DEST | tee /root/ping.log
__EOF__

■接続確認するsystemdサービスを設定ファイルにする
# cat <<__EOF__ > /etc/systemd/system/ping.service
[Unit]
Description=Ping test after reboot
After=network-online.target

[Service]
Type=oneshot
ExecStart=/root/wait-connect.sh

[Install]
WantedBy=multi-user.target
__EOF__

■sysmtedにサービスを登録する
# systemctl enable ping.service

■現在時刻を記録して再起動する
# logger -p daemon.info "reboot and PING after reboot"; reboot

■再起動後確認したログ
# grep PING /var/log/daemon.log | tail
May 22 18:33:11 armadillo root: reboot and PING after reboot
May 22 18:33:27 armadillo logger: PING no response from 8.8.8.8: count=0
May 22 18:33:27 armadillo logger: PING no response from 8.8.8.8: count=1
May 22 18:33:28 armadillo logger: PING no response from 8.8.8.8: count=2
May 22 18:33:30 armadillo logger: Success PING to 8.8.8.8: 1
Tue May 22 18:33:52 JST 2018
... 起動後 20秒程度でLTE接続しています

... LTE接続してから23秒程度するとコンソールにエラーが表示されて切断します
IPv6: ADDRCONF(NETDEV_UP): usb0: link is not ready

root@armadillo:~# ping 8.8.8.8
connect: Network is unreachable
root@armadillo:~# date
Tue May 22 18:34:03 JST 2018

■切断時のNetworkManagerのログ: /var/log/daemon.log
May 22 18:59:17 armadillo wait-connect.sh[409]: 64 bytes from 8.8.8.8: icmp_seq=22 ttl=57 time=37.3 ms
May 22 18:59:18 armadillo wait-connect.sh[409]: 64 bytes from 8.8.8.8: icmp_seq=23 ttl=57 time=36.3 ms
... ここまでは接続していました ...
May 22 18:59:19 armadillo ModemManager[419]: Modem: state changed (unknown -> disabled)
May 22 18:59:19 armadillo NetworkManager[426]: (ttyACM0): failed to look up interface index
May 22 18:59:19 armadillo NetworkManager[426]: (usb0): device state change: activated -> unmanaged (reason 'removed') [100 10 36]
May 22 18:59:19 armadillo NetworkManager[426]: (usb0): deactivating device (reason 'removed') [36]
May 22 18:59:19 armadillo NetworkManager[426]: (usb0): canceled DHCP transaction, DHCP client pid 774
May 22 18:59:19 armadillo NetworkManager[426]: _nl_get_vtable: assertion 'vtable.handle' failed
May 22 18:59:19 armadillo NetworkManager[426]: NetworkManager state is now CONNECTED_LOCAL
May 22 18:59:19 armadillo NetworkManager[426]: (usb0): link disconnected
May 22 18:59:19 armadillo NetworkManager[426]: NetworkManager state is now DISCONNECTED

このあと24秒ほど経過すると接続するため、起動後90秒ほどで接続したように見えます。
初回の接続はもっと早いので、そのまま維持したいですし、
接続がバタつくのを抑えたいです。

■関連する記事
- LTE接続に関して, 2018/04/24, https://armadillo.atmark-techno.com/forum/armadillo/3171

コメント

sshida

2018年5月24日 13時06分

G3L起動後20秒程度で早くLTE接続できるのはG3LのLTEモデムがcdc_etherで、
NetworkManagerだけで接続できるためのようです。

このあと10秒程度で切断する理由はModemManagerが起動し、cdc_etherとは別経路の
cdc_acmでモデムへの制御を始めるためのようです。
/var/log/daemon.logで、ModemManagerが起動したあとすぐに切断していることがわかりました。
ModemManagerと無効にして再起動すると、切断現象はなくなりました。

他社のcdc_ether対応モジュールの取説では「ModemManagerを削除する」と説明されていました。
https://nimbelink.com/Documentation/Skywire/4G_LTE_Cat_1_WNC/30262_NL-S…

ModemManagerはAPN設定やモデムの状態表示、SIM管理に便利なので、
ModemManager起動時にモデムの接続を初期化しないなど、
cdc_ether対応があればよいように感じますが、どなたかご存知でしょうか?

at_koseki

2018年5月24日 14時28分

古関です。

> G3L起動後20秒程度で早くLTE接続できるのはG3LのLTEモデムがcdc_etherで、
> NetworkManagerだけで接続できるためのようです。
>
> このあと10秒程度で切断する理由はModemManagerが起動し、cdc_etherとは別経路の
> cdc_acmでモデムへの制御を始めるためのようです。
> /var/log/daemon.logで、ModemManagerが起動したあとすぐに切断していることがわかりました。
> ModemManagerと無効にして再起動すると、切断現象はなくなりました。
はい。ご指摘の通りの動きをしています。

G3L起動後、LTEモジュール内部の不揮発性メモリに
過去にcdc_acm経由で設定されたAPNや、前回接続時の情報が保存されていた場合、
その情報を元にLTEモジュールが自動的にLTE回線への接続をします。

また、リブート時にはLTEモジュールの電源をOFFしない仕様なので、
LTEモジュール内では接続が維持されている可能性が高いです。

この段階ではNetworkManagerは起動していますが、ModemManagerは起動していない状態となります。
(接続に時間がかかる場合、接続前にModemManagerが立ち上がることもあります)

ただし、APN情報などが無かった場合や、接続に失敗した場合でも
cdc-etherにはIPアドレスが割り振られ、デバイスとしてUpする状態なります。

これは、Armadillo-IoT G3Lでは、ホストとLTE回線はLTEモジュールを介してNATされ、
ホストにはLTE回線ではなくローカルIPが割り当てられる仕様であるためです。
※ 以下、製品マニュアルを参照ください
https://manual.atmark-techno.com/armadillo-iot-g3l/armadillo-iotg-g3l_p…

その後、ModemManagerが起動した場合、LTEモジュールの接続状態に関係なく
cdc_acm経由で、一度RFを初期化(データ通信の切断)をし、APN・パスワードの設定、データ接続を行う動きをします。
そのため、一旦切断されてから接続されます。

> ModemManagerはAPN設定やモデムの状態表示、SIM管理に便利なので、
> ModemManager起動時にモデムの接続を初期化しないなど、
> cdc_ether対応があればよいように感じますが、どなたかご存知でしょうか?
ModemManagerを修正すればできる可能性がありますが、現時点で対応予定はありません。

開発時に一度、以下のような実装をトライしました。
(1) 起動時、ModemManagerを立ち上げた段階でデータ通信の状態をチェック
(2) 接続されていた場合はRFの初期化・再接続をしない

しかし、評価の中で、(1)の段階でcdc_acmからATコマンドベースで接続状態と確認できたにも関わらず、
実通信できない状態がおき、安定動作させることができなかったため現在の構成となっております。
(おそらく、モジュール側の要因だと考えているのですが、明確な原因と対策ができていません)

よろしくおねがいします。

sshida

2018年5月24日 16時45分

古関様

すでにいろいろとご苦労されておられたとのことで、ありがとうございます。

AT+CEREGでわかるモデムの接続状態は電波のレベルなので、
G3/G3Lの接続チェックスクリプトにあるようにping 8.8.8.8など、
IPレイヤの通信で確認すると確実ですが、いかがでしょう?