28
27

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ラズパイ1個に4GPiを2個スタックし、LTE 回線の冗長化&障害耐性を向上

Last updated at Posted at 2024-01-16

はじめに.

実はタイトルの通り、「ラズベリーパイ用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-14GPi-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 の詳細は こちら をご参照ください。

/etc/udev/rules.d/99-4gpi.rules
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 のコメントアウトを変更してください。

  • udev rules におけるラズベリーパイのポート番号の判別方法については 弊社ブログ をご参照ください。
  • ID_PATH_TAG や DEVPATH に記述する固有情報は、ラズベリーパイのモデルごとに異なります。
    固有情報の取得方法については 弊社ブログ から確認できます。

次のコマンドで 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 用の設定ファイルを作成します。

/etc/default/4gpi-1
#
# 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
/etc/default/4gpi-2
#
# 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 の起動終了処理を行うサービスを作成します。

/etc/systemd/system/4gpi-setup@.service
[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(スマートカード識別番号)を取得します。
" * " の部分は実際のインターフェース名に合わせて変更してください。

Termianl
mmcli -i * | grep iccid
4gpi-1 でのコマンド実行結果
mtx@raspberrypi:~$ mmcli -i 4gpi-1 | grep iccid
             |             iccid: 898110000***********

APN 登録

次のコマンド例のように APN 登録します。

SORACOM Air の 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 アドレス確認例です。

wwan0 の実行結果例
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
wwan1 の実行結果例
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
cdc-4gpi-1 (SORACOM Air)での実行例
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'
cdc-4gpi-2 (NTT コミュニケーションズ)での実行例
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 コマンドで回線の疎通を確認します。

wwan0 での実行例
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
wwan1 での実行例
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 をご参照ください。

28
27
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
28
27

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?