URoad-Home2+にLTEモジュール(T77W676)を搭載してみた

投稿者: | 4月 17, 2024

目次

はじめに

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

URoad-Home2+にLTEモジュール(T77W676)を搭載してみた
HP LT4220 Snapdragon x12 LTE
T77W676表
URoad-Home2+にLTEモジュール(T77W676)を搭載してみた
HP LT4220 Snapdragon x12 LTE
T77W676裏

どうやら、HP LT4220 Snapdragon x12 LTEという名前もあるようです。ハードオフで500円で買いました。

取り付け

もとから付いているMTE-N100を取り外して、代わりにつけるだけです。サイズも同じな上に、アンテナの端子も同じなので完全にそのまま取り付けられます。

URoad-Home2+にLTEモジュール(T77W676)を搭載してみた
HP LT4220 Snapdragon x12 LTE
T7W676をURoad-Home2+に取り付けしたところ

ドライバ類のインストール

必要なパッケージは、

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で

URoad-Home2+にLTEモジュール(T77W676)を搭載してみた
HP LT4220 Snapdragon x12 LTE
lsusb -tvの結果(bConfigurationValueは2)

このように認識されました。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はこんな感じです。

URoad-Home2+にLTEモジュール(T77W676)を搭載してみた
HP LT4220 Snapdragon x12 LTE
bConfigurationValueが1のとき

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が変化していることが確認できます。

URoad-Home2+にLTEモジュール(T77W676)を搭載してみた
HP LT4220 Snapdragon x12 LTE
AT^SETMODE= 1でのlsusb -tv

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に設定します。
これで晴れて使えるようになると思います。

URoad-Home2+にLTEモジュール(T77W676)を搭載してみた
HP LT4220 Snapdragon x12 LTE
設定が完了した後の3ginfo-lite

再起動の問題

再起動すると、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
URoad-Home2+にLTEモジュール(T77W676)を搭載してみた
HP LT4220 Snapdragon x12 LTE

を登録します。これで起動・再起動時に正常に認識される様になりました。

勝手に途切れる問題

2日間くらいつけておくと、再起動時の後にUSBをリセットした後みたいに、IPアドレスが降ってきているのにも関わらず、ネットに繋がらなくなります。同様に、ネットワークインターフェースを再起動しまくるとそのうち繋がります。

URoad-Home2+にLTEモジュール(T77W676)を搭載してみた
HP LT4220 Snapdragon x12 LTE
<info>  [modem1] state changed (connected -> registered)

同様の問題に悩んでいる人もいました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関係の記事の一覧と概要はこちら

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)