SIMフリーモデムのL-05AにSORACOM Airを挿し、Raspberry PIでの通信を確立し、さらにsystemdによるサービス化を実施する手順です。
(注意)とりあえず下記の手順で動作しました!というものですので、確実にどの環境でも動作するかはまだ怪しいところです。
随時更新していきますので、試してみた結果などコメントを頂けると幸いです。
使用したもの
- Raspberry PI 2 A+
- OS: Raspbian
- USBモデム: docomo L-05A(白ロム)
- SIM: SORACOM Air nano
下準備
- とりあえずRaspberry PIを有線/無線LANにつないで下記をインストールする。
$ sudo apt-get install -y eject wvdial dnsutils
- もしusb-modeswitchをインストール済である場合は、 L-05Aの設定をコメントアウト してリブートする。(でないとうまく動作しませんでした。)
$ sudo vi /lib/udev/rules.d/40-usb_modeswitch.rules
# LG L-05A
#ATTR{idVndor}=="1004", ATTR{idProduct}=="613a", RUN+="usb_modeswitch '%b/%k'"
L-05Aの認識
L-05Aを挿して起動すると、下記のようにUSBデバイスとして認識されます。
$ lsusb
:
Bus 001 Device 006: ID 1004:613a LG Electronics, Inc.
ただしこの時点ではCD/DVDデバイスとして認識されています。(これを防ぐためのusb_modeswitchは無効化しているので)
ejectコマンドでイジェクトします。するとttyACM0〜ttyACM2デバイスが認識されます。
$ ls /dev
:
sr0 <- CDデバイス
$ sudo eject /dev/sr0
$ ls /dev
:
ttyACM0
ttyACM1
ttyACM2
$ lsusb
Bus 001 Device 006: ID 1004:6124 LG Electronics, Inc.
(デバイスIDが変わっている)
USBモデムによる通信
wvdialを使います。
設定ファイル(/etc/wvdial.conf)
$ sudo vi /etc/wvdial.conf
[Dialer Defaults]
Init1 = ATZ
Init2 = ATQ0 V1 E1 S0=0 &C1 &D2
Init3 = AT+CGDCONT=1,"IP","soracom.io"
Dial Attempts = 3
Modem Type = Analog Modem
Dial Command = ATD
Stupid Mode = yes
Baud = 460800
New PPPD = yes
Modem = /dev/ttyACM0
ISDN = 0
Phone = *99***1#
APN = soracom.io
Username = sora
Password = sora
Carrier Check = no
Auto DNS = 1
Check Def Route = 1
接続
バックグラウンドで実行します。
$ sudo wvdial &
--> Initializing modem.
--> Sending: ATZ
ATZ
OK
--> Sending: ATQ0 V1 E1 S0=0 &C1 &D2
ATQ0 V1 E1 S0=0 &C1 &D2
OK
--> Sending: AT+CGDCONT=1,"IP","soracom.io"
AT+CGDCONT=1,"IP","soracom.io"
OK
--> Modem initialized.
--> Sending: ATD*99***1#
--> Waiting for carrier.
ATD*99***1#
CONNECT
--> Carrier detected. Starting PPP immediately.
--> Starting pppd at Sat Nov 7 10:31:07 2015
--> Pid of pppd: 3878
--> Using interface ppp0
--> pppd: [18]& [01]
--> pppd: [18]& [01]
:
--> local IP address 10.*.*.*
--> remote IP address 10.64.64.64
--> primary DNS address 169.254.0.53
通信確認
有線LAN等を抜き、USBモデムより外部にアクセスできることを確認します。
$ route
:
10.64.64.64 * 255.255.255.255 UH 0 0 0 ppp0
$ traceroute google.co.jp
traceroute to google.co.jp (173.194.117.151), 30 hops max, 60 byte packets
1 ec2-175-41-192-132.ap-northeast-1.compute.amazonaws.com (175.41.192.132) 2186.949 ms ec2-175-41-192-128.ap-northeast-1.compute.amazonaws.com (175.41.192.128) 2196.026 ms 2205.013 ms
:
8 nrt04s09-in-f23.1e100.net (173.194.117.151) 2233.625 ms 2233.643 ms 2234.958 ms
切断
バックグラウンドジョブを終了します。
$ fg
sudo wvdial
【CTRL+c】
Caught signal 2: Attempting to exit gracefully...
--> Terminating on signal 15
--> pppd: [18]& [01]
--> Connect time 26.7 minutes.
--> pppd: [18]& [01]
--> pppd: [18]& [01]
--> pppd: [18]& [01]
--> Disconnecting at Sat Nov 7 10:57:53 2015
[1]+ Done sudo wvdial
サービス化(Systemd)
現段階ではマシンを起動するたびにCDドライブをEject→wvdial実行しなければなりません。
マシン起動時に自動接続するようにサービスとして登録します。
RaspbianでのサービスはSystemdによる管理が基本になっています。
Unitの作成
wvdial.serviceファイルを作成します。
$ sudo vi /etc/systemd/system/wvdial.service
[Unit]
Description=wvdial service
Wants=network.target
[Service]
Type=simple
ExecStartPre=test -e /dev/sr0 && /bin/eject ←起動前に実行するコマンド
ExecStart=/usr/bin/wvdial ←起動コマンド
ExecStop=/bin/kill -HUP $MAINPID ←終了コマンド($MAINPIDにPIDが保存されている)
[Install]
WantedBy=multi-user.target ←レベル3,5で起動
サービス登録
$ sudo systemctl enable wvdial.service
サービス起動/停止確認
起動
$ sudo systemctl start wvdial.service
$ sudo systemctl status wvdial.service
● wvdial.service - wvdial service
Loaded: loaded (/etc/systemd/system/wvdial.service; enabled)
Active: active (running) since 土 2015-11-07 10:30:30 JST; 4s ago
Process: 3519 ExecStop=/bin/kill -HUP $MAINPID (code=exited, status=0/SUCCESS)
Main PID: 3641 (wvdial)
:
停止
$ sudo systemctl stop wvdial.service
$ sudo systemctl status wvdial.service
● wvdial.service - wvdial service
Loaded: loaded (/etc/systemd/system/wvdial.service; enabled)
Active: failed (Result: exit-code) since 土 2015-11-07 10:29:45 JST; 2s ago
Process: 3519 ExecStop=/bin/kill -HUP $MAINPID (code=exited, status=0/SUCCESS)
Main PID: 478 (code=exited, status=1/FAILURE)
:
※なぜかstatus=1/FAILUREと出てしまいます。これについては確認中
サービス自動起動確認
マシンをリブートしてサービスが立ち上がることを確認します。