目次
- はじめに
- 参考にしたサイト
- OpenWRTの導入
- 搭載するモジュール
- 取り付け
- ドライバ類のインストール
- USBの認識
- ATコマンドでの操作
- OpenWRTでの設定
- 再起動の問題
- 勝手に途切れる問題
- ATコマンド集(おまけ)
- MBIMコマンド集(おまけ)
- おわりに
はじめに
URoad-Home2+には、元々、MTE-N100というWiMAX2+用のモジュールが搭載されているのですが、電波のつかみが悪いので、一般的なLTEモジュールに載せ替えてみました。
USBのモードの切り替えが上手くできず、かなり大変でした。
URoad-Home関係の記事の一覧と概要はこちら
参考にしたサイト
Qiita「OpenWrt NCP-HG100」
OpenWRT「ModemManager」
Qiita「LTEドングルを使ってpovoをNEC UNIVERGE IX2215に収容する」
Qitta「SORACOM Onyx LTE USB ドングルの電波状況を SORACOM に保存する」
MACNICA「5G通信評価をやってみた」
It’s a note not a blog「Switching USB Modem to Serial Manually」
RADENKU.COM「Cara Setting Protocol QMI Cellular Openwrt」
RADENKU.COM「Mengatasi HP LT4220 Stuck Setmode 0」
OpenWRTの導入
OpenWRTの導入が必須です。
URoad-Home2+(URoad-TEC101)へのOpenWRTのインストール方法
を参考にOpenWRTをインストールしてみてください。
搭載するモジュール
FOXCONN製 T77W676
どうやら、HP LT4220 Snapdragon x12 LTEという名前もあるようです。ハードオフで500円で買いました。
取り付け
もとから付いているMTE-N100を取り外して、代わりにつけるだけです。サイズも同じな上に、アンテナの端子も同じなので完全にそのまま取り付けられます。
ドライバ類のインストール
必要なパッケージは、
kmod-usb-serial
kmod-usb-serial-option
kmod-usb-net-qmi-wwan
kmod-usb-net-cdc-mbim
kmod-usb-net-cdc-ether
usbutils
qmi-utils
screen
です。
さらに追加で、GUI(luci)で扱うために
luci-app-3ginfo-lite
uci-proto-modemmanager
も入れました。sms-toolというのがluci-app-3ginfo-liteの依存で必要なのですが、直接インストールできず、少し手間でした。URoad-Home2+の場合は
http://downloads.openwrt.org/snapshots/packages/mips_24kc/packages/sms-tool_2023-09-21-1b6ca032-1_mips_24kc.ipk
のリンクを、luciのソフトウェアの「パッケージのダウンロードとインストール:パッケージ名またはURL…」のところに貼り付けてインストールしました。
他にも
luci-app-sms-tool-jsでSMSの送受信ができたり、
luci-app-modembandでバンドの設定ができたりします。
USBの認識
これが難しくて時間がかかりました。 刺して特に設定をしないとlsusb -tvで
このように認識されました。2つのデバイスが見え、どちらもcdc_etherと認識され、usb0としてネットワークデバイスが出現します。
自分はATコマンドを使えるようにしたかった(3ginfoでluciで簡単に電波状況とかを確認できるようになる)のでここからさらに設定を弄りましたが、そのままモデムインターフェースとして登録すれば使えるのかもしれません。
ATコマンドを使えるようにするにはbConfigurationValueを変更する必要がありました。値を変更するとUSBデバイスの構成を変更できるようです。値ごとの動作を調べた感じ
0・・・消える(デバイスなし)
1・・・5つのデバイス いずれもドライバ刺さらず
2・・・2つのデバイス どちらもcdc_ether(特に設定しなかった時)
3・・・3つのデバイス 2つはcdc_mbim、1つドライバ刺さらず
の様に認識されました。3はATコマンドを受け付けなかったので
echo 1 > /sys/bus/usb/devices/1-1/bConfigurationValue
で1に設定しました。lsbus -tvはこんな感じです。
USBのベンダID(03f0)とプロダクトID(0857)を確認して、
echo 0x03f0 0x0857 > /sys/bus/usb-serial/drivers/option1/new_id
でシリアルポートとして登録します。そうするとlsusb -tvでドライバが刺さっていなかった5つのうち、3つのデバイスがoptionとして認識されます。また、ls /devで見るとttyUSB0〜4が出現します。この内ttyUSB1と2でATコマンドが使用できます。他のポートは、GNSS用とデバッグ(DM)用のポートだと思います。
ATコマンドでの操作
ややこしいことにbConfigurationValue以外にもATコマンドで動作モードを設定できるようです。
Normal Mode=0 (03f0:0857) MBIM
Extension Mode=1 (03f0:0a57) MBIM + Serial port
Legacy Mode=2 (03f0:0857) QMI + Serial port
のモードがあるようです。まず
screen /dev/ttyUSB2 115200
で接続します。ttyUSB1でも大丈夫です。切断はctrl+aの後でk、yでできます。以下で現在のモードを確認し、
AT^SETMODE?
以下のコマンドで1に設定します。
AT^SETMODE=1
そうすると、シリアルコンソールから切断されるとともに、lsusb -tvで確認できる6つのデバイスのうち2つがcdc_mbimで認識されます。また、プロダクトIDが変化していることが確認できます。
ATコマンドに接続できるように再びシリアルポートの登録を行います。
echo 0x03f0 0x0a57 > /sys/bus/usb-serial/drivers/option1/new_id
OpenWRTでの設定
uci-proto-modemmanagerを導入している前提で進めます。
OpenWRTのluciを開いてネットワーク→インターフェース→インターフェースを新規作成…で
名前: wan
プロトコル: モデムマネージャ
で「インターフェースの作成」を押すと、詳細な設定が出ると思います。そこで、モデムデバイスのところでデバイスを選択します。APNやPIN等も使用するキャリアに合わせて入力してください。ファイアウォール設定のタブに移動してwanを選択し、保存して適用します。
後は、待っていればIPアドレスが降ってくると思います。
luci-app-3ginfo-liteの設定としては、Modem→Information about 3G/4G/5G connectionで設定のタブで、インターフェースを先程作成したインターフェースとIP adress / Port for communication with the modemをATコマンドが使える/dev/ttyUSB2か/dev/ttyUSB1に設定します。
これで晴れて使えるようになると思います。
再起動の問題
再起動すると、ttyUSBが消えるのと、インターフェースでモデムが存在しませんと言われてします。システムログを見ると、
timed out waiting for the modem to get exported at /sys/devices/platform/ahb/1b000000.usb/usb1/1-1′
みたいな感じでタイムアウトしています。同様の現象に悩んでいる人もいるようです。
OpenWRT「Zyxel NR7101 – Bad start every other reboot?」
読む感じ、LTEモデムを再起動すればいいよみたいな感じです。多くのM.2スロットのLTEモジュールの6番ピンが電源のON/OFFとなっており、HighでON、LowでOFFとなります。URoad-Home2+ではGPIO18がそれに当たります。URoad-Home2+用のOpenWRTではusb-powerというピンに割り当てがされているのでそれを使います。また、それに加えて、LTEモジュールは正常にネットワークに接続されているにも関わらず、OpenWRTがインターネットに接続できないという事態も発生します。そのため、以下のシェルスクリプトを書きました。
#!/bin/ash
# ベンダIDとプロダクトIDを設定
VENDOR_ID="03f0"
PRODUCT_ID="0a57"
#pingの対象
TARGET_HOST="8.8.8.8"
# WANインターフェースの名前を指定
WAN_INTERFACE="wan"
#LTEモジュールをON/OFF
ifdown ${WAN_INTERFACE}
sleep 20
echo 0 > /sys/class/leds/usb-power/brightness
sleep 10
echo 255 > /sys/class/leds/usb-power/brightness
sleep 60
#シリアルポートの登録
echo 0x${VENDOR_ID} 0x${PRODUCT_ID} > /sys/bus/usb-serial/drivers/option1/new_id
# WANインターフェースのIPv4アドレスを取得
WAN_IP=$(ubus call network.interface.${WAN_INTERFACE} status | jsonfilter -e '@["ipv4-address"][0].address')
# IPアドレスが割り当てられているか判定
if [ -z "$WAN_IP" ]; then
echo "LTE module is not connected to the network."
exit 0
else
echo "LTE module is successfully connected to the network."
fi
#ループ開始
while : ; do
# lsusbの出力から指定されたベンダIDとプロダクトIDを持つデバイスを検索
DEVICE=$(lsusb | grep "${VENDOR_ID}:${PRODUCT_ID}")
# デバイスが見つかったかどうかをチェック
if [ ! -z "$DEVICE" ]; then
# デバイスが見つかった場合
echo "T77W676 is found"
# Pingコマンド実行(1回のみ)
if ! ping -c 1 $TARGET_HOST > /dev/null 2>&1; then
echo "Ping to $TARGET_HOST failed, restarting WAN interface..."
# WANインターフェースの再起動
ifdown ${WAN_INTERFACE}
sleep 30
ifup ${WAN_INTERFACE}
sleep 30
echo "WAN interface restarted."
else
echo "Ping to $TARGET_HOST succeeded."
break
fi
else
echo "T77W676 is not found"
break
fi
done
このシェルスクリプトでは、まず初めにLTEモジュールの再起動を行い、LTEモジュールにIPアドレスが割り当てられていること(⇔APN、SIMが正しく設定されている)を確認したのち、8.8.8.8にpingを行い、正常にパケットが受信できるまでwanインターフェースを再起動し続けるものです。
実行権限をつけて
chmod 775 startLTE.sh
これを、luciでシステム→スタートアップ→ローカルスタートアップで
/root/startLTE.sh
を登録します。これで起動・再起動時に正常に認識される様になりました。
勝手に途切れる問題
2日間くらいつけておくと、再起動時の後にUSBをリセットした後みたいに、IPアドレスが降ってきているのにも関わらず、ネットに繋がらなくなります。同様に、ネットワークインターフェースを再起動しまくるとそのうち繋がります。
同様の問題に悩んでいる人もいましたGithub「modemmanager: modem in “registered” state, no internet access #14096」
対策としては、先ほどのシェルスクリプトからUSB周りを消した感じのものをcronで定期的に実行することで回避しました。Githubの方ではさらに発展した切断検知方法が提示されていますが、めんどくさいのでこれで行きます。
#!/bin/ash
#pingの対象
TARGET_HOST="8.8.8.8"
# WANインターフェースの名前を指定
WAN_INTERFACE="wan"
# WANインターフェースのIPv4アドレスを取得
WAN_IP=$(ubus call network.interface.${WAN_INTERFACE} status | jsonfilter -e '@["ipv4-address"][0].address')
# IPアドレスが割り当てられているか判定
if [ -z "$WAN_IP" ]; then
echo "LTE module is not connected to the network."
exit 0
else
echo "LTE module is successfully connected to the network."
fi
#ループ開始
while : ; do
# lsusbの出力から指定されたベンダIDとプロダクトIDを持つデバイスを検索
DEVICE=$(lsusb | grep "${VENDOR_ID}:${PRODUCT_ID}")
# デバイスが見つかったかどうかをチェック
if [ ! -z "$DEVICE" ]; then
# デバイスが見つかった場合
echo "T77W676 is found"
# Pingコマンド実行(1回のみ)
if ! ping -c 1 $TARGET_HOST > /dev/null 2>&1; then
echo "Ping to $TARGET_HOST failed, restarting WAN interface..."
# WANインターフェースの再起動
ifdown ${WAN_INTERFACE}
sleep 30
ifup ${WAN_INTERFACE}
sleep 30
echo "WAN interface restarted."
else
echo "Ping to $TARGET_HOST succeeded."
break
fi
else
echo "T77W676 is not found"
break
fi
done
cronへの登録はluci→システム→スケジュールタスクで
0 * * * * /root/reconnectLTE.sh
を追加すれば1時間毎に8.8.8.8にpingを飛ばして、帰ってこなかったらpingが通るまでインターフェースを再起動させます。本当は10回再起動してもダメだったら止める、みたいなのを追加した方がいいと思います。
ATコマンド集(おまけ)
キャリアを選択するには、
au: AT+COPS=0,2,"44051",7
SoftBank: AT+COPS=0,2,"44020",7
Rakuten: AT+COPS=0,2,"44110",7
UQ: AT+COPS=0,2,"44110",7
を行えば良いようです。確認はAT+COPS=?
、リセットはAT+COPS
で行えます。
APNの確認は
AT+CGDCONT?
で行うことができて、povoを設定する場合は
AT+CGDCONT=1,"IPV4V6","povo.jp"
REMOモバイルなら
AT+CGDCONT=1,"IPV4V6","mmtmobile.jp"
でできます。1の部分はAPNの登録番号でいくつか登録することができます。
AT+CGACT?
で設定したAPNの動作状態を知ることができます。1つ目の番号はAPNの登録番号で、2つ目の番号は
0: 登録されていない、モデムは現在ネットワークを検索中
1: ホームネットワークに登録されている
2: 登録されていない、モデムはネットワーク検索を試みていない
3: 登録拒否
4: 不明な状態
5: ローミング中に登録されている
だそうです。
AT+CSQ
で電波状況を知ることができます。1つ目の番号がdBで、2つ目の番号がビットエラー率です。99の場合は有効なデータなし(電波なしor送受信なし)です。
AT+CGATT?
ネットワークアタッチしているかどうかです。0で未アタッチ、1でアタッチです。
AT+CEREG?
LTEネットワークへ登録されているかいないかです。1つ目はネットワーク登録の状況通知の設定で、2つ目は、1で登録されていることを示します。
AT+CFUN?
キャリア通信をON(1)/OFF(0)です。
AT+CFUN=1,1
リセット後再起動を行います。
MBIMコマンド集(おまけ)
mmcli -m any
接続されているLTEモジュールの詳細情報を示してくれます。色々な確認ができます。
mmcli -L
接続されているMBIMなLTEモジュールを一覧で出してくれます。/org/freedesktop/ModemManager1/Modem/1 [Qualcomm] Snapdragon(TM) X12 LTE-A
みたいな感じで出力されるので、番号(モデム番号)を覚えておく必要があります。
mmcli -m 番号 --disable
mmcli -m 番号 --enable
モデムを無効/有効にします。
mmcli -m 番号 --set-power-state-off
mmcli -m 番号 --set-power-state-on
モデムの電源をOFF/ONにします。今回使ったT77W676はこのコマンドに対応していませんでした。
mmcli -m 番号 --reset
リセットできます。OFF/ONするのと効果は同じだと思います。
mmcli -m "num" --simple-connect="apn='povo.jp',ip-type=ipv4v6"
APNの設定をできます。例としてpovo.jpの場合です。
おわりに
「再起動の問題」にめちゃめちゃ時間を取られました。無事に接続できたのでとりあえずは良かったです。これでバックアップ回線として使えます。
URoad-Home関係の記事の一覧と概要はこちら