はじめに.
実はタイトルの通り、「ラズベリーパイ用4G(LTE)通信モジュール 4GPi」は、1台のラズベリーパイに対して 2台同時に使用すること が可能です。
これにより、2つ の LTE 回線を同時に利用でき、通信の冗長化やシステムの障害耐性向上が期待できます。
今回は、セットアップ方法を紹介します。
なお、同時に使用可能な 4GPi の台数は2台までです。
別記事にて ラズパイ1個で2個の4GPiを同時使用する際の、LTE回線自動切換え を実装する方法も紹介します。セットアップ後にはぜひお試しください。
4GPi に関する詳細な情報は、弊社ホームページ をご参照ください。
実行環境
- Raspberry Pi 3B
- Raspberry Pi OS Lite (64bit) Bookworm ※ CLI(CUI) 版
- 4GPi x 2台
- 標準サイズ SIMカード x 2枚
今回は SORACOM Air for セルラー と NTTコミュニケーションズ IoT Connect Mobile(R) Type S を使用。
※ 弊社動作確認済み SIM を使用しています。記載以外の SIM では接続が不安定になる等、意図しない挙動をする可能性があります。 - ACアダプタ
※ DC6~24V 出力、外径5.5 mm、内径2.1 mm、センタープラスの DC プラグであれば、4GPi 付属の変換ハーネスでそのまま接続できます。推奨の AC アダプタは こちら。 - USB-シリアル変換ケーブル
- Ethernet ケーブル
セットアップ
次のように組んでいます。
4GPi 2台を区別するために以降 4GPi-1、4GPi-2 と呼称します。
-----------------------------------
| 4GPi-1 (SORACOM) |
-----------------------------------
| 4GPi-2 (NTTコミュニケーションズ) |
-----------------------------------
| Raspberry Pi 3B |
-----------------------------------
SD カード
SD カードに Raspberry Pi Imager 等で 最新版の Raspberry Pi OS Lite を書き込みます。
今回は端末へのログインに UART と Tera Term を使用しています。
UART でのログインについては 弊社ブログ をご参照ください。
ハードウェア
この項では主にハードウェアを設定します。
ジャンパピンの設定
各 4GPi 基板上のジャンパピンを次の通りに設定します。
4GPi-1 ※初期出荷状態から変更なし
- JP3 : GPIO 17
- JP4 : GPIO 22
- JP5 : GPIO 27
4GPi-2
- JP3 : GPIO 12
- JP4 : GPIO 6
- JP5 : GPIO 13
4GPi-2 のジャンパピン位置
ジャンパピンの詳細は GitHub をご参照ください。
SIMカード挿入
各 4GPi に SIM カードを挿入して、ラズベリーパイに重ねます。
USB ケーブル接続
4GPi 付属の USB ケーブルを使用します。
LAN ポートから遠い位置にある USB コネクタの上段ポートに 4GPi-1、下段ポートに 4GPi-2 の USB ケーブルを接続します。
接続するラズベリーパイの USB ポートを間違えると、後々の設定が反映されなくなるのでご注意ください。
電源投入
4GPi-1 のみ付属の電源ハーネスを取り付けて電源投入します。
4GPi-1 からピンヘッダ経由でラズベリーパイにも電源供給され、ラズベリーパイが起動します。
ソフトウェア
この項では主にソフトウェアを設定します。
端末にログインし、コマンドが実行できる状態にしておいてください。
4GPi ユーティリティソフト
4GPi 用のユーティリティソフトを次のコマンドでインストールします。
curl https://mechatrax.github.io/setup.sh | sudo bash
sudo apt install 4gpi-utils 4gpi-net-mods 4gpi-networkmanager
ユーティリティソフトウェアのセットアップの詳細は GitHub をご参照ください。
設定ファイル作成
ユーティリティソフトウェアは、デフォルトでは1台の 4GPi を操作するように設定されています。
2台の 4GPi を操作するためには、設定ファイルを新たに作成し、設定を変更する必要があります。
udev rules 作成
次の内容で /etc/udev/rules.d/99-4gpi.rules 作成します。
ModemManager 1.10 以降では ID_MM_PHYSDEV_UID の udev タグを使用することで、モデムに固有の名前を付けることができます。
これにより、特定のモデムに対して名前を使用したアクセスが可能になります。
ID_MM_PHYSDEV_UID の詳細は こちら をご参照ください。
ACTION!="add|change|move|bind", GOTO="4gpi_port_end"
# 1st 4GPi
# Raspberry Pi 3B
KERNEL=="ttyUSB*", ENV{ID_PATH_TAG}=="platform-3f980000_usb-usb-0_1_4_1_2",SYMLINK+="tty4GPI-1"
DEVPATH=="/devices/platform/soc/3f980000.usb/usb1/1-1/1-1.4*", ENV{ID_MM_PHYSDEV_UID}="4gpi-1"
KERNEL=="cdc-wdm*",KERNELS=="1-1.4:1.5",SYMLINK+="cdc-4gpi-1"
# Raspberry Pi 4B
#KERNEL=="ttyUSB*",ENV{ID_PATH_TAG}=="platform-fd500000_pcie-pci-0000_01_00_0-usb-0_1_3_1_2",SYMLINK+="tty4GPI-1"
#DEVPATH=="/devices/platform/scb/fd500000.pcie/pci0000:00/0000:00:00.0/0000:01:00.0/usb1/1-1/1-1.3/*",ENV{ID_MM_PHYSDEV_UID}="4gpi-1"
#KERNEL=="cdc-wdm*",KERNELS=="1-1.3:1.5",SYMLINK+="cdc-4gpi-1"
# 2nd 4GPi
# Raspberry Pi 3B
KERNEL=="ttyUSB*", ENV{ID_PATH_TAG}=="platform-3f980000_usb-usb-0_1_5_1_2",SYMLINK+="tty4GPI-2"
DEVPATH=="/devices/platform/soc/3f980000.usb/usb1/1-1/1-1.5*", ENV{ID_MM_PHYSDEV_UID}="4gpi-2"
KERNEL=="cdc-wdm*",KERNELS=="1-1.5:1.5",SYMLINK+="cdc-4gpi-2"
# Raspberry Pi 4B
#KERNEL=="ttyUSB*",ENV{ID_PATH_TAG}=="platform-fd500000_pcie-pci-0000_01_00_0-usb-0_1_4_1_2",SYMLINK+="tty4GPI-2"
#DEVPATH=="/devices/platform/scb/fd500000.pcie/pci0000:00/0000:00:00.0/0000:01:00.0/usb1/1-1/1-1.4/*",ENV{ID_MM_PHYSDEV_UID}="4gpi-2"
#KERNEL=="cdc-wdm*",KERNELS=="1-1.4:1.5",SYMLINK+="cdc-4gpi-2"
LABEL="4gpi_port_end"
各行の設定内容は次の通りです。
- KERNEL=="ttyUSB*", ENV{ID_PATH_TAG}=="platform-3f980000_usb-usb-0_1_*_1_2",SYMLINK+="tty4GPI-*"
- /dev/tty4GPI-* を介して各 4GPi の AT コマンドポートにアクセスするためのシンボリックリンクを作成します。
ID_PATH_TAG を使うことで物理的な USB ポートの位置による識別を可能にしています。
- DEVPATH=="/devices/platform/soc/3f980000.usb/usb1/1-1/1-1.*", ENV{ID_MM_PHYSDEV_UID}="4gpi-*"
- ModemManager から各 4GPi にアクセスするための一意な ID を設定します。
DEVPATH を使うことで物理的な USB ポートの位置による複数のデバイスノードの識別を可能にしています。
- KERNEL=="cdc-wdm*",KERNELS=="1-1.*:1.5",SYMLINK+="cdc-4gpi-*"
- /dev/cdc-4gpi-* を介して各 4GPi の QMI コマンドインターフェースにアクセスするためのシンボリックを作成します。
KERNELS を使うことで物理的な USB ポートの位置による識別を可能にしています。
Raspberry Pi 4B を使用する場合は、99-4gpi.rules のコメントアウトを変更してください。
次のコマンドで rules 読み込み後、設定が反映されているかどうか確認してください。
sudo udevadm trigger
ls /dev/{*4gpi*,tty4GPI*}
mtx@raspberrypi:~$ ls /dev/{*4gpi*,tty4GPI*}
/dev/cdc-4gpi-1 /dev/cdc-4gpi-2 /dev/tty4GPI /dev/tty4GPI-1 /dev/tty4GPI-2
反映されない場合は USB ケーブルの再確認、設定の見直しやラズベリーパイの再起動をお試しください。
初めて設定する場合は、4gpi-1 のみ表示されます。
動作設定ファイル 作成
次の内容で各 4GPi 用の設定ファイルを作成します。
#
# 4GPi settings
#
# AT command port
CONSOLE_PORT=/dev/tty4GPI-1
# GPIO pins
# RI_PIN: 16 or 18
# POWER_PIN: 17(default) or 12
# STATUS_PIN: 22(default) or 13
# RESET_PIN: 27(default) or 6
# Disabled if not set
RI_PIN=
POWER_PIN=17
STATUS_PIN=22
RESET_PIN=27
# Power on 4GPi at boot
# AUTO_ON=0: disable auto power on
# AUTO_ON=1: enable auto power on
AUTO_ON=1
# Power off 4GPi at shutdown
# AUTO_OFF=0: disable auto power off
# AUTO_OFF=1: enable auto power off
AUTO_OFF=1
# Enable the modem to wake up on ring during standby
# WAKE_ON_RING=0: disable Wake-on-Ring
# WAKE_ON_RING=1: enable Wake-on-Ring (AUTO_OFF=0 is required)
WAKE_ON_RING=0
# Store SMS at Wake-on-Ring (WAKE_ON_RING=1 is required)
# STORE_SMS_ON_RING=0: do not store the sms
# STORE_SMS_ON_RING=1: store the sms
STORE_SMS_ON_RING=0
#
# 4GPi settings
#
# AT command port
CONSOLE_PORT=/dev/tty4GPI-2
# GPIO pins
# RI_PIN: 16 or 18
# POWER_PIN: 17(default) or 12
# STATUS_PIN: 22(default) or 13
# RESET_PIN: 27(default) or 6
# Disabled if not set
RI_PIN=
POWER_PIN=12
STATUS_PIN=13
RESET_PIN=6
# Power on 4GPi at boot
# AUTO_ON=0: disable auto power on
# AUTO_ON=1: enable auto power on
AUTO_ON=1
# Power off 4GPi at shutdown
# AUTO_OFF=0: disable auto power off
# AUTO_OFF=1: enable auto power off
AUTO_OFF=1
# Enable the modem to wake up on ring during standby
# WAKE_ON_RING=0: disable Wake-on-Ring
# WAKE_ON_RING=1: enable Wake-on-Ring (AUTO_OFF=0 is required)
WAKE_ON_RING=0
# Store SMS at Wake-on-Ring (WAKE_ON_RING=1 is required)
# STORE_SMS_ON_RING=0: do not store the sms
# STORE_SMS_ON_RING=1: store the sms
STORE_SMS_ON_RING=0
次のコマンドで既存の設定ファイル(/etc/default/4gpi)から各 4GPi 用の設定ファイル(/etc/default/4gpi-1、/etc/default/4gpi-2)を作成できます。
for i in {1..2}; do sudo cp /etc/default/4gpi /etc/default/4gpi-${i}; done
sudo systemctl disable 4gpi-setup.service
sudo mv /etc/default/4gpi{,.bak}
sudo sed -i /etc/default/4gpi-1 -e 's|CONSOLE_PORT=.*|CONSOLE_PORT=/dev/tty4GPI-1|'
sudo sed -i /etc/default/4gpi-2 -e 's|CONSOLE_PORT=.*|CONSOLE_PORT=/dev/tty4GPI-2|' -e 's/POWER_PIN=.*/POWER_PIN=12/' -e 's/STATUS_PIN=.*/STATUS_PIN=13/' -e 's/RESET_PIN=.*/RESET_PIN=6/'
既存の設定ファイルの詳細は GitHub をご参照ください。
systemd service 作成
次の内容で各 4GPi の起動終了処理を行うサービスを作成します。
[Unit]
Description=4GPi Setup
[Service]
Type=oneshot
Environment="GPIOCHIP=gpiochip0"
EnvironmentFile=/etc/default/%i
ExecStart=/usr/lib/4gpi-utils/device-start.sh
ExecStop=/usr/lib/4gpi-utils/device-stop.sh
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
次のコマンドで既存のサービス(/lib/systemd/system/4gpi-setup.service)から /etc/systemd/system/4gpi-setup@.service を作成できます。
sudo cp /lib/systemd/system/4gpi-setup.service /etc/systemd/system/4gpi-setup@.service
sudo sed -i /etc/systemd/system/4gpi-setup@.service -e "s|EnvironmentFile=.*|EnvironmentFile=/etc/default/%i|"
サービスファイルの作成後、次のコマンドで各 4GPi のサービスのインスタンス(4gpi-setup@4gpi-1.service、4gpi-setup@4gpi-2.service)を有効にします。
sudo systemctl daemon-reload
sudo systemctl enable 4gpi-setup@4gpi-1.service
sudo systemctl enable 4gpi-setup@4gpi-2.service
既存の service 無効化
今回の構成では 4GPi を SMS 起動させることはできないため、次のコマンドで SMS 起動に関するサービスを無効化します。
sudo systemctl mask 4gpi-modem-config.service
接続設定
各回線の接続設定を行います。
SIM の ICCID を確認
次のコマンドを実行して ICCID(スマートカード識別番号)を取得します。
" * " の部分は実際のインターフェース名に合わせて変更してください。
mmcli -i * | grep iccid
mtx@raspberrypi:~$ mmcli -i 4gpi-1 | grep iccid
| iccid: 898110000***********
APN 登録
次のコマンド例のように APN 登録します。
sudo nmcli con add type gsm con-name soracom apn soracom.io user sora password sora gsm.sim-id 898110000***********
gsm.sim-id は先ほど確認した ICCID に置き換えてください
APN登録時に gsm.sim-id(ICCID)を使用すると、NetworkManager が SIM を一意に識別できます。
これにより、特定の回線接続を ifname へ依存せずに up/down できます。
APN 登録の詳細は GitHub をご参照ください。
問題なければ次のように connected となります。
mtx@raspberrypi:~$ nmcli d
DEVICE TYPE STATE CONNECTION
eth0 ethernet connected Wired connection 1
lo loopback connected (externally) lo
cdc-wdm0 gsm connected soracom
cdc-wdm1 gsm connected ntt
wlan0 wifi disconnected --
p2p-dev-wlan0 wifi-p2p disconnected --
connected にならない場合は設定の見直しやラズベリーパイの再起動をお試しください。
各インターフェースの IP アドレス確認例です。
mtx@raspberrypi:~$ ip a s wwan0
4: wwan0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 143o qdisc fq state UNKNOWN group default qlen 1000
link/none
inet 10.230.**.**/** brd 10.230.**.** scope global noprefixroute wwan0
valid_lft forever preferred_lft forever
mtx@raspberrypi:~$ ip a s wwan1
5: wwan1: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1430 qdisc fq state UNKNOWN group default qlen 1000
link/none
inet 10.128.**.**/** brd 10.128.**.** scope global noprefixroute wwan1
valid_lft forever preferred_lft forever
wwan0 が SORACOM、wwan1 が NTT コミュニケーションズ です。
接続状態の確認
回線の接続状態を確認します。
電波強度取得
次のコマンドで LTE 通信の電波強度を取得します。
" * " の部分は実際のインターフェース名に合わせて変更してください。
sudo qmicli -p -d /dev/cdc-4gpi-* --nas-get-signal-info
mtx@raspberrypi:~$ sudo qmicli -p -d /dev/cdc-4gpi-1 --nas-get-signal-info
[/dev/cdc-4gpi-1] Successfully got signal info
LTE:
RSSI: '-59 dBm'
RSRQ: '-11 dB'
RSRP: '-87 dBm'
SNR: '16.2 dB'
mtx@raspberrypi:~$ sudo qmicli -p -d /dev/cdc-4gpi-2 --nas-get-signal-info
[/dev/cdc-4gpi-2] Successfully got signal info
LTE:
RSSI: '-55 dBm'
RSRQ: '-10 dB'
RSRP: '-82 dBm'
SNR: '19.8 dB'
qmicli コマンドの詳細は こちら をご参照ください。
疎通確認
ping コマンドで回線の疎通を確認します。
mtx@raspberrypi:~$ ping -c4 8.8.8.8 -I wwan0
PING 8.8.8.8 (8.8.8.8) from 10.230.**.** wwan0: 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=119 time=223 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=119 time=70.6 ms
64 bytes from 8.8.8.8: icmp_seq=3 ttl=119 time=62.8 ms
64 bytes from 8.8.8.8: icmp_seq=4 ttl=119 time=61.7 ms
--- 8.8.8.8 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3005ms
rtt min/avg/max/mdev = 61.671/104.622/223.370/68.645 ms
mtx@raspberrypi:~$ ping -c4 8.8.8.8 -I wwan1
PING 8.8.8.8 (8.8.8.8) from 10.128.**.** wwan1: 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=115 time=214 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=115 time=53.2 ms
64 bytes from 8.8.8.8: icmp_seq=3 ttl=115 time=51.5 ms
64 bytes from 8.8.8.8: icmp_seq=4 ttl=115 time=49.7 ms
--- 8.8.8.8 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3003ms
rtt min/avg/max/mdev = 49.701/92.080/213.941/70.366 ms
wwan{0, 1}は実際のインターフェース名に合わせて変更してください。
疎通の確認が取れましたらセットアップ完了となります。
おわりに.
2台の 4GPi を同時に利用することで、通信の冗長化と障害耐性を向上させることが可能です。
冗長な構成により、1台の 4GPi が障害に見舞われても、もう一方の 4GPi が引き続き通信を担当できます。
これにより、システムの信頼性が向上し、サービスの中断を最小限に抑えることができます。
別記事にて、回線の自動切換えを実装してみましょう。
ラズパイ1個で2個の4GPiを同時使用する際の、LTE回線自動切換え をご参照ください。
補足
4gpictl コマンドはデフォルトで /etc/default/4gpi を参照しますが、今回は新たに設定ファイル(/etc/default/4gpi-{1,2})を作成しました。
そのため、4gpictl コマンドで各 4GPi を操作する際には -c または --config オプションを使用して設定ファイルのパスを指定する必要があります。
コマンド実行例です。
mtx@raspberrypi:~$ 4gpictl -c /etc/default/4gpi-1 status
on
mtx@raspberrypi:~$ 4gpictl -c /etc/default/4gpi-2 status
on
4gpictl コマンドの詳細は GitHub をご参照ください。