ADSLの終了により楽天モバイルを使って固定回線化することになりました。ルーターを探していた時にLTEバンド3が使えるIO-DETAのルーターがあるのですが、高額のため躊躇していました。そんなところにSonyのNCP-HG100/Cellularが使えるという情報があったのでアマゾンで四千円弱で購入しました。APNの設定すぐに使えたのですがいろいろと問題も出てきました。
- バンド3で使っているいうちに突然パートナー回線に切り替わり容量を使い切って遅くなる
- LTEモジュールに高負荷をかけるとリセットする
最初のセットアップ
購入から最初の設定はSIMを差して電源を入れます。本体のIPアドレスは192.168.132.1
です。ブラウザーからアクセスしてダッシュボードでAPNの設定をします。
- APN: rakuten.jp
- PIN: (空欄)
- Authentication Type: NONE
- APNプロトコル: IPv4
ターミナルでアクセス
シリアルアクセスするにはルータの殻割りをします。後方のゴム足2箇所と前方の丸シール2箇所を取り外しプラスドライバーでネジを外します。細いマイナスドライバで下からケースの爪を外してカバーを外します。
基盤にはUART用のピンホールが4つ並んでそれを下にして左から3.3v、TX、RX、GNDの配列になっています。PCで USB TTL シリアル 変換等で基盤につなぎターミナルからアクセスします。
*私の環境:macOS、CP2102
# cu -l /dev/tty.wchusbserial1420 -s 115200
U-Boot画面が見えたら適当なキーを押してU-Bootに入ります。
setenv bootargs console=ttyMSM0,115200n8
printenv
saveenv
これでターミナルの設定ができ、次からはブートから直接OpenWrtにアクセスできます。
バンド3に固定する
ターミナルでNCP-HG100のOpenWrtにアクセスできるようになったらバンドの固定をします。方法は先駆者のやり方通りです。
mmcli -m 0 --command 'AT^SLBAND?'
mmcli -m 0 --command 'AT^SLBAND=LTE,1,3,8,19,21,28'
mmcli -m 0 --command 'AT^SLBAND?'
LTEモジュールをUSB2.0化する
LTEモジュール(Telit LN940 A9 LTE CAT-9 M.2)のネジとカバーを外します。カバーはマイナスドライバーで丁寧に外します。LTEモジュールの#29, #31をマスキングすればUSB3.0は無効になるようです。自宅にあるメンディングを使いました。#30,#32は貼りません。
1 - 11 <切り欠き> 21 - (29,31) - 75
マスキングしたモジュールを再セットします。
# modemproxy -t at^usbtype?
at^usbtype?
^USBTYPE: USB2.0
最新のOpneWrtをインストールする
Stock ROMだと限られた機能しか使えないので最新版のOpenWrtをインストールすることにしました。
先駆者達によってSnapshot版が既にありますが不安定だというレポートしてたので躊躇してました。
ある先駆者の一人で快適に動いているというブログを読んで、USBポートから起動できることもありやってみることにしました。
まずはOpenWrtのソースをダウンロードしてパッチを当てます。
私の方ではext4のファイルシステムを使えるようにして4GBのUSBディスクを使いました。またカーネルモジュールもネットワーク関係は周りはできるだけ取り込むようにしました。リポジトリからインストールできないのが理由です。
OpenWrtをビルドします。
# Download and update the sources
git clone https://git.openwrt.org/openwrt/openwrt.git
cd openwrt
git pull
# Select a specific code revision
git branch -a
git tag
git checkout v21.02.1
# パッチを当てます
git apply --reject --whitespace=fix my_ncp-hg100.patch
# .configファイルをコピーします
cp confg_my_ncp-hg100 .config
# Update the feeds
./scripts/feeds update -a
./scripts/feeds install -a
# Configure the firmware image and the kernel
make menuconfig
make kernel_menuconfig
# Build the firmware image
make -j $(nproc) defconfig download clean
make -j $(nproc) V=s
コンパイルが済んだらUSBディスクにコピーします。
# USBディスクをフォーマットする
sudo fdisk /dev/sdb
# +3500mで作成
sudo fdisk -l /dev/sdb
Disk /dev/sdb: 3.61 GiB, 3880452096 bytes, 7579008 sectors
Disk model: USB DISK 2.0
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x7fcbcda3
Device Boot Start End Sectors Size Id Type
/dev/sdb1 2048 7342079 7340032 3.5G 83 Linux
# ext4でフォーマットします
sudo mkfs.ext4 /dev/sdb1
# FITイメージをUSBにコピーします
cp $HOME/src/openwrt/build_dir/target-arm_cortex-a7+neon-vfpv4_musl_eabi/linux-ipq40xx_generic/sony_ncp-hg100-cellular-fit-uImage.itb .
sudo dd if=sony_ncp-hg100-cellular-fit-uImage.itb of=/dev/sdb bs=512 seek=7500000
# cpioアーカイブのroofsをUSBディスクに展開します
sudo mount /dev/sdb1 /mnt
cd /mnt
sudo gzip -cd $HOME/src/openwrt/bin/targets/ipq40xx/generic/openwrt-ipq40xx-generic-rootfs.cpio.gz | sudo cpio -idmv
sudo sync
cd -
sudo umount /mnt
# blkidを使ってPARTUUIDを調べます。このPARTUUIDのデータはu-bootの環境設定で使います。
sudo blkid /dev/sdb1
u-bootの環境設定を変更します。
set bootusb 'set bootargs console=ttyMSM0,115200n8 root=PARTUUID=xxxxxxxx-01 rw rootfstype=ext4 rootwait; usb start; usb read 0x84000000 0x7270E0 0x4000; bootm'
set fallback 'set bootargs console=ttyMSM0,115200n8; bootipq'
set bootcmd 'run bootusb; run fallback'
printenv
saveenv
これでUSBディスク→Stock ROMの順でブートするようになります。
SMSの送受信をしてみる
このSIMには050から始まるナンバーが割り当てられているのでSMS通信ができます。SMS送受信ができるようにセットアップしました。
# open update
# opkg install smstools3
フロントエンドは外部のgitリポジトリからインストールします。
$ cd $HOME/src/openwrt/feeds/luci/applications
$ git clone https://github.com/koshev-msk/luci-app-smstools3.git
$ cd $HOME/src/openwrt
$ ./scripts/feeds update -a
$ ./scripts/feeds install -a
$ make defconfig
$ make package/feeds/luci/luci-app-smstools3/compile
Setup→Decode SMSをオンにするとutf-8でメッセージがデコードできます。
devices = GSM1
incoming = /var/spool/sms/incoming
outgoing = /var/spool/sms/outgoing
checked = /var/spool/sms/checked
failed = /var/spool/sms/failed
sent = /var/spool/sms/sent
receive_before_send = no
date_filename = 1
date_filename_format = %s
eventhandler = /usr/share/luci-app-smstools3/led.sh
decode_unicode_text = yes
incoming_utf8 = yes
receive_before_send = no
autosplit = 3
loglevel = 5
[GSM1]
init = AT+CPMS="ME","ME","ME"
device = /dev/ttyUSB2
detect_unexpected_input = no
incoming = yes
pin = 0000
baudrate = 115200
config sms
option decode_utf '1'
option loglevel '5'
option device '/dev/ttyUSB2'
option pin '0000'
option storage 'persistent'
LEDはgpioと12c制御のバックライトがあります。そのバックライトLEDを使って点灯制御ができます。
- https://memo205.wordpress.com/tag/ncp-hg100/
デュアルスタック化にする
最新のOpenWrtが起動できたらデュアルスタック化にしてみます。プロファイルを変更します。
# qmicli -d /dev/cdc-wdm0 --wds-modify-profile=3gpp,1,apn=rakuten.jp,pdp-type=IPV4V6,auth=,username=,password=,no-roaming=yes
インターフェースのWANの設定を変更します。
QoS
HowToにはQoSには2つの方式があると書かれてます。SQM方式の方が優れているということなのでそちらを導入します。
tcコマンドが使えればトラフィックをコントロールできるのですが、ダッシュボードでSmart Queue Managementを使えるようにしてみます。
tcコマンドに依存しているカーネルモジュールが必要なのでカーネールを再ビルドします。
CONFIG_PACKAGE_kmod-nf-conntrack-netlink=y
CONFIG_PACKAGE_kmod-ifb=y
CONFIG_PACKAGE_kmod-sched=y
CONFIG_PACKAGE_kmod-sched-cake=y
CONFIG_PACKAGE_kmod-sched-core=y
CONFIG_PACKAGE_kmod-nft-bridge=y
CONFIG_PACKAGE_kmod-nft-core=y
CONFIG_PACKAGE_kmod-nft-netdev=y
カーネルを再構築して新たなファームウェアを作り再起動します。
opkg install tc luci-app-sqm
ダッシュボードのSmart Queue Management
でInterface name
とQueue setup script
をpiece_of_cake.qos
にセットします。とりあえずこれでしばらく運用してみます。
参考
- https://nodemand.hatenablog.com/entry/2020/11/24/155129。
- https://ameblo.jp/kawamura-tokei-megane/entry-12674651576.html
- https://qiita.com/himalock/items/b863a92ed43baf8d85fb
- https://himahima.ldblog.jp/archives/57666526.html
- https://tetsupc.wordpress.com/2021/02/25/ncp-hg100%e9%80%b2%e6%8d%97%e5%a0%b1%e5%91%8a/
- https://firejp.com/2021/10/07/post-695/
- https://openwrt.org/docs/guide-user/network/traffic-shaping/packet.scheduler