RaspberryPiを格安SIM+USB通信モジュールで運用する(1)
Category : サーバ管理日記
Published by M-naka on 2015/10/3
 RaspberryPiをUSB通信モジュールでスタンドアローン運用させる。
 OSはRaspibian。

1.使用通信モジュール

 ・docomo L-02A(3G、HSDPA)
 ・docomo L-05A(3G、HSDPA/HSUPA)
 ・docomo L-02C(LTE)

での動作を確認済み。

 価格で一番こなれているのはL-05Aだろうか。Amazonで中古扱いのバルク品(実際はほぼ新品未使用)が1,500円くらいだったので。L-02Cもそこそこの値段でLTE対応な点は魅力的だが、とてつもない地雷品なのでチャレンジャー以外にはおすすめしない。


2.通信モジュールを挿す前の設定

1)必要パッケージ
 事前にppp、screen、ejectをapt-get installでインストールしておく。
 有線LANポートのないRaspberryPi A+の場合は、無線LANアダプタを取り付けてインストールする。

2)cdc_acmドライバの無効化
 通信モジュールを挿すと、デフォルトでACMドライバが優先して読み込まれてしまうことがあるので、これを回避する。ちなみにL-02AはACMドライバでも動作はするが、Ping値が劣悪なので、性能的には「ACMドライバを使わない」方が正解と思われる。

/etc/modprobe.d/cdc_acm-blacklist.conf
 blacklist cdc_acm

3)usbserialドライバの有効化
 下記を起動スクリプトに仕込めば、自動的にusbserialで各モジュールが使用されるようになる。
 使用機種に応じコメントアウト。

#For L-02A only
#sudo modprobe usbserial vendor=0x1004 product=0x6109

#For L-05A only
#sudo modprobe usbserial vendor=0x1004 product=0x6124

#For L-02C only
#sudo modprobe usbserial vendor=0x1004 product=0x618f


3.通信モジュールを挿した直後の設定

 前述の通信モジュール3つは全て「挿すと最初、CD-ROMとして認識される」デバイス(USB Composite Device)であり、いわゆる「ゼロインストール機能」を備えている。仮想CD-ROMからデバイスドライバを読み出させる……という、Windows/MacOSのための機能。Linuxだと傍迷惑なだけでそのままでは通信デバイスとしては認識されないので、

 ・CD-ROM相当の/dev/sr0か/dev/sg0をejectする
 ・「usb_modeswitch」でejectを自動処理させる

のがトレンドだが、実はどちらも不要。理由は

 ・screenコマンドで/dev/ttyUSBx(xはpppdで使うポート番号)に繋ぎ、「AT%USBMODEM=0」を実行する

で、恒久的に「USBモデムとして最初から認識される」ようにできるから。詳細はこちら参照。


4.pppd設定

 使用するOSはRaspibianだが、ダイヤルアップ設定(pppd)はArchLinuxARMのものが共通で使える。
 下記例ではIIJmio使用の設定のため、他MVNOの場合は適宜修正を。

/etc/ppp/options-mobile
 ttyUSB2  921600
 lock
 crtscts
 modem
 passive
 novj
 defaultroute
 noipdefault
 usepeerdns
 noauth
 hide-password
 persist
 holdoff 10
 maxfail 0
 debug

/etc/ppp/peers/provider
 file /etc/ppp/options-mobile
 user "mio@iij"
 password "iij"
 connect "/usr/sbin/chat -v -t15 -f /etc/ppp/chatscripts/mobile-modem.chat"

/etc/ppp/chatscripts/mobile-modem.chat
 ABORT 'NO CARRIER'
 ABORT 'VOICE'
 ABORT 'NO DIALTONE'
 ABORT 'NO DIAL TONE'
 ABORT 'NO ANSWER'
 ABORT 'DELAYED'
 REPORT CONNECT
 TIMEOUT 6
 '' 'ATQ0'
 'OK-AT-OK' 'ATZ'
 'OK' 'ATZ'
 'OK' 'ATH'
 TIMEOUT 3
 'OK' @/etc/ppp/chatscripts/pin
 'OK\d-AT-OK' 'ATI'
 'OK' 'ATZ'
 'OK' 'ATH'
 'OK' 'ATQ0 V1 E1 S0=0 &C1 &D2 +FCLASS=0' #3Gモジュールの場合は「+FCLASS=0」を削除(エラーになる)
 'OK' @/etc/ppp/chatscripts/mode
 'OK-AT-OK' @/etc/ppp/chatscripts/apn
 'OK' 'ATD*99***1#'
 TIMEOUT 30
 CONNECT ''

/etc/ppp/chatscripts/apn
 AT+CGDCONT=1,"IP","iijmio.jp"

/etc/ppp/chatscripts/mode
 AT

/etc/ppp/chatscripts/pin(※PIN未設定の場合)
 AT
 →PIN設定済みの場合は、前述のArchLinuxARMのWebサイトで確認のこと。

 ちなみにこのスクリプト一式を使うと、ダイヤルアップ切断時の再接続も自動でやってくれるので、通信断を検知して再接続コマンドを……といった別設定が一切不要で、楽である。


5.起動直後の自動接続

 起動スクリプトで「/usr/bin/sudo /usr/bin/pon」を実行するだけ。ponコマンドは前述の「/etc/ppp/peers/provider」がデフォルトの実行ターゲットのため、未指定の場合はproviderが実行される。OpenVPNなんかはサービス起動しておけば特に追加設定なく、ダイヤルアップ実行で自動的にそちらも繋がる。


 L-02AとL-05AについてはこれでOK。
 L-02Cについてはとてつもない不具合があるので、そちらは別エントリ参照。