Raspberry Pi A+ (Raspbian wheezy) でAK-020を使ってSORACOMに自動接続する

# 概要
[Raspberry PiでUSBモデム挿入時にSORACOMへ自動接続する]
(http://qiita.com/gimy/items/1d49f8e08210e9c9f20a) を踏襲する形で、AK-020を使って起動時、またはAK-020挿入時に自動的にSORACOMに繋がるようにします。
Raspbian wheezyのusb_modeswitch(1系)には--std-ejectオプションが無いのでusb_modeswitchは使わず、ejectとmodprobeを使ってmodemデバイスとして認識させます。
Raspbian Jessieのusb_modeswitch(2系)では--std-ejectオプションが使えるようになっています。

参考サイトを見ながらなるべく最小の設定になるようにまとめたつもりです。udevやwvdialの細かい記述やオプションは把握できていない部分があります。


# パッケージのインストール

```
$ sudo apt-get install eject wvdial
```

# udevルールの設定

AK-020接続時にCD-ROMデバイスをejectしてmodprobeでモデムデバイスを認識させる設定

```/etc/udev/rules.d/40-ak-020.rules
ACTION=="add", ATTRS{idVendor}=="15eb", ATTRS{idProduct}=="a403", RUN+="/usr/bin/eject /dev/sr0"
ACTION=="add", ATTRS{idVendor}=="15eb", ATTRS{idProduct}=="7d0e", RUN+="/sbin/modprobe usbserial vendor=0x15eb product=0x7d0e"
```

モデムデバイスを認識したときシンボリックリンク/dev/modemを作成し、ifupコマンドでSORACOMへのダイヤルアップを行う設定

```/etc/udev/rules.d/50-soracom.rules
KERNEL=="ttyUSB*", ATTRS{../idVendor}=="15eb", ATTRS{../idProduct}=="7d0e", ATTRS{bNumEndpoints}=="03", ATTRS{bInterfaceNumber}=="02", SYMLINK+="modem", ENV{SYSTEMD_WANTS}="ifup@soracom"
```

モデムデバイスを認識した後ダイヤルアップさせるため、ファイル名先頭の番号を大きくしておく必要があります。


# wvdialの設定

AK-020のモデムデバイスは通常/dev/ttyUSB0で認識されますが、抜き差しで番号がずれることがあるのでudevの設定で作られるシンボリックリンク /dev/modem を利用する設定にします。
wvdial.confのModemのデフォルト値が/dev/modemになるので該当行をコメントアウトします。

```/etc/wvdial.conf
[Dialer Defaults]
Init1 = ATZ
Init2 = AT+CFUN=1
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/ttyUSB0 # デフォルトの/dev/modemを使う
ISDN = 0
APN = soracom.io
Phone = *99***1#
Username = sora
Password = sora
Carrier Check = no
Auto DNS = 1
Check Def Route = 1
```

回線切断時自動的に再接続するようにwvdialのオプションを追加します。

```text:/etc/ppp/peers/wvdial
noauth
name wvdial
usepeerdns
replacedefaultroute
persist
holdoff 10 
```

``replacedefaultroute`` … デフォルトルートの置き換え
``persist`` … リンク切断時、再接続する　
``holdoff 10`` … 切断後10秒後に再接続する


# ifup/ifdownでSORACOMに接続・切断する設定

ifup/ifdownでwvdialコマンドが実行されるように、設定を最後尾に追加します

```text:/etc/network/interfaces
...
auto soracom
allow-hotplug soracom
iface soracom inet wvdial
```

# 動作確認

設定が終わったら再起動します。

- ls /dev でモデムデバイス ttyUSB* が存在する
- ls -l /dev/modem で ttyUSB* へのシンボリックリンクができている

```
pi@raspberrypia ~ $ ls -l /dev/modem
lrwxrwxrwx 1 root root 7  1月  1  1970 /dev/modem -> ttyUSB0
```

- ifconfig で ppp0 でSORACOMに接続されている（IPアドレスは 10.x.x.x）

```ifconfig
...
ppp0      Link encap:Point-to-Pointプロトコル
          inetアドレス:10.xxx.xxx.xxx P-t-P:10.64.64.64  マスク:255.255.255.255
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1500  メトリック:1
          RXパケット:20959 エラー:0 損失:0 オーバラン:0 フレーム:0
          TXパケット:26040 エラー:0 損失:0 オーバラン:0 キャリア:0
      衝突(Collisions):0 TXキュー長:3
          RXバイト:5454296 (5.2 MiB)  TXバイト:1919287 (1.8 MiB)
...
```

- route -n でルーティングテーブルを確認し、デフォルトゲートウェイがppp0になっている

```text:ルーティングテーブル
カーネルIP経路テーブル
受信先サイト    ゲートウェイ    ネットマスク   フラグ Metric Ref 使用数 インタフェース
0.0.0.0         0.0.0.0         0.0.0.0         U     0      0        0 ppp0
0.0.0.0         192.168.1.1     0.0.0.0         UG    303    0        0 wlan0
10.64.64.64     0.0.0.0         255.255.255.255 UH    0      0        0 ppp0
192.168.1.0     0.0.0.0         255.255.255.0   U     303    0        0 wlan0
```

- sudo ifdown soracomで切断できる
- sudo ifup soracomで接続できる
- AK-020を抜き差ししたとき自動的に再接続される（数分かかることがある？）



## 参考サイト
- [(Raspbian) AK-020で3Gモデム自動接続(毎回のejectとmodprobeなし)](http://qiita.com/aquahika/items/dc7d8ad8f481414d3528)
- [AK-020 を Raspbian で使う(とりあえず版)](http://qiita.com/j3tm0t0/items/08c199fb8863b69e1139)
- [Raspberry PiでUSBモデム挿入時にSORACOMへ自動接続する](http://qiita.com/gimy/items/1d49f8e08210e9c9f20a)