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については
とてつもない不具合があるので、そちらは
別エントリ参照。