Raspberry PI+docomo L-05A+SORACOM AirでUSBモデム自動起動


SIMフリーモデムのL-05AにSORACOM Airを挿し、Raspberry PIでの通信を確立し、さらにsystemdによるサービス化を実施する手順です。
（注意）とりあえず下記の手順で動作しました！というものですので、確実にどの環境でも動作するかはまだ怪しいところです。
随時更新していきますので、試してみた結果などコメントを頂けると幸いです。

# 使用したもの
* Raspberry PI 2 A+
* OS: Raspbian
* USBモデム: [docomo L-05A（白ロム）](http://www.amazon.co.jp/docomo-%E3%83%87%E3%83%BC%E3%82%BF%E3%82%AB%E3%83%BC%E3%83%89-L-05A-%E3%82%B7%E3%83%AB%E3%83%90%E3%83%BC-%E6%90%BA%E5%B8%AF%E9%9B%BB%E8%A9%B1/dp/B007HYRH3A/ref=pd_sim_23_3?ie=UTF8&dpID=31olRoj2Y1L&dpSrc=sims&preST=_AC_UL160_SR160%2C160_&refRID=125M1XW6WYSV7CDGH3YT "Amazon.co.jp")
* SIM: SORACOM Air nano

# 下準備

* とりあえずRaspberry PIを有線／無線LANにつないで下記をインストールする。

```bash
$ sudo apt-get install -y eject wvdial dnsutils
```

* もしusb-modeswitchをインストール済である場合は、 **L-05Aの設定をコメントアウト** してリブートする。（でないとうまく動作しませんでした。）

```bash
$ 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デバイスとして認識されます。

```bash
$ lsusb
:
Bus 001 Device 006: ID 1004:613a LG Electronics, Inc.
```

ただしこの時点ではCD/DVDデバイスとして認識されています。（これを防ぐためのusb_modeswitchは無効化しているので）
ejectコマンドでイジェクトします。するとttyACM0〜ttyACM2デバイスが認識されます。

```bash
$ 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）

```bash
$ 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
```

## 接続

バックグラウンドで実行します。
  
```bash
$ 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モデムより外部にアクセスできることを確認します。

```bash
$ 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

```

## 切断

バックグラウンドジョブを終了します。

```bash
$ 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ファイルを作成します。

```bash
$ 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で起動
```

## サービス登録

```bash
$ sudo systemctl enable wvdial.service
```

## サービス起動／停止確認

### 起動

```bash
$ 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と出てしまいます。これについては確認中

## サービス自動起動確認

マシンをリブートしてサービスが立ち上がることを確認します。

# 参考にしたドキュメント

* [Raspberry PiでSORACOM SIMを使う(FS01BU)](http://qiita.com/osada9000/items/9254646652717cba0267 "Raspberry PiでSORACOM SIMを使う(FS01BU)") @osada9000
* [もうちょっと楽にRaspberry PiでSORACOM Airを使う(FS01BU USBモデムを用いて)](http://qiita.com/dietposter/items/bf3b0311a044eaf36df8 "もうちょっと楽にRaspberry PiでSORACOM Airを使う") @dietposter
* [Systemdを使ってさくっと自作コマンドをサービス化してみる](
http://qiita.com/DQNEO/items/0b5d0bc5d3cf407cb7ff "Qiita") @DQNEO
* [[OBDNマガジン] .tested docomo L-05A [debian Wheezy][AX3][A6]](http://obdnmagazine.blogspot.jp/2013/05/tested-docomo-l-05a-debian-wheezyax3a6.html)
* [Systemd入門(4) - serviceタイプUnitの設定ファイル](http://enakai00.hatenablog.com/entry/20130917/1379374797)