SORACOMのドングルを識別して接続する方法

SORACOMのドングルをRaspberry Piで使用するとき、AK-020(3G)とMS2373(LTE)のどちらを挿入しても適切に繋いでくれる設定を行いました。正しいやり方なのか解りませんが、とりあえず動いたので防備録として記載。

SORACOMさんの公式サイトではwvdialを用いて接続する方法が記載されていますが、動作が不安定だったのでpppconfigを使用して接続しています。

### 1. AK-020固有の設定
AK-020はRaspberry Piに接続するとCD-ROMとして認識されてしまいます。それをUSBシリアルに変換するための設定がこちらです。CD-ROMをejectしてusbserialに登録するまでが記述されています。

```[/etc/udev/rules.d/40-ak020.rules]
# for AK-020
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"
```

### 2. AK-020とMS2372共通の設定
この部分はUSBシリアルが接続してきたら、AK020の場合はUSBシリアルと/dev/ak020に、MS2372のばあいは/dev/ms2372にシンボリックリンクを作成させて、wwan0のネットワークを起動させる部分が記述されています。

```[/etc/udev/rules.d/50-soracom.rules]
# for AK-020
KERNEL=="ttyUSB*", ATTRS{../idVendor}=="15eb", ATTRS{../idProduct}=="7d0e", ATTRS{bNumEndpoints}=="03", ATTRS{bInterfaceNumber}=="02", SYMLINK+="ak020",ENV{SYSTEMD_WANTS}="ifup@wwan0.service"
# for MS2372
KERNEL=="ttyUSB*", ATTRS{../idVendor}=="12d1", ATTRS{../idProduct}=="1506", ATTRS{bNumEndpoints}=="03", ATTRS{bInterfaceNumber}=="00", SYMLINK+="ms2372", ENV{SYSTEMD_WANTS}="ifup@wwan0.service"

```

### 3. pppconfigの設定

pppconfigでモデム毎の接続情報を設定していきます。

```
$ sudo pppconfig
```

![pppconfig.png](https://qiita-image-store.s3.amazonaws.com/0/136933/9d034dcf-a9f8-5d7e-798b-d66e2ad0b3a2.png)

"Create a connection"を選択してモデム毎に次のように設定します

|modem | AK-020 | MS2372 |
|------|--------|--------|
|Provider Name | soracom020 | soracom2372|
|COnfiguration Name Server| Dynamic | Dynamic |
|Authorization | PAP | PAP |
| Your ISP | sora | sora |
| password | sora | sora |
| speed | 460800 | 460800 |
| Pulse or Tone | Tone | Tone |
| Replace your number | *99# | *99***1# |
| Choose Modem Config Method | No | No |
| Manually Select Modem Port | /dev/ak020 | /dev/ms2372 |

最後に "Finished write files and return main menu"を選択して終了します。


この作業でそれぞれ２つのファイル（合計４ファイル）が作成されます。
/etc/ppp/peers/soracom020
/etc/ppp/peers/soracom2372
/etc/chatscripts/soracom020
/etc/chatscripts/soracom2372

### スクリプトの編集1
`sudo -s`でルート権限でログインします。そして、`/etc/ppp/peers/soracom020`と`/etc/ppp/peers/soracom2372`を開き、debugを削除したり、最後にpersist, replacedefaultrouteを追記したりします。作成したファイルがこちら

#### ....peers/soracom020
```[/etc/ppp/peers/soracom020]
# This optionfile was generated by pppconfig 2.3.18. \
# 
#
hide-password 
noauth
connect "/usr/sbin/chat -f /etc/chatscripts/soracom020"

/dev/ak020
460800
defaultroute
noipdefault 
user "sora"
 
ipparam soracom020
|
usepeerdns
persist
replacedefaultroute
```

#### .... peers/soracom2372
```[/etc/ppp/peers/soracom2372]
# This optionfile was generated by pppconfig 2.3.18. 
# 
#
hide-password 
noauth
connect "/usr/sbin/chat -v -f /etc/chatscripts/soracom2372"
/dev/ms2372
460800
defaultroute
noipdefault 
user "sora"
remotename soracom2372
ipparam soracom2372

usepeerdns
persist
replacedefaultroute
```

### スクリプトの編集2  /etc/chatscripts/...

#### /etc/chatscripts/soracom020

```
# This chatfile was generated by pppconfig 2.3.18.
# Please do not delete any of the comments.  Pppconfig needs them.
# 
# ispauth CHAP
# abortstring
ABORT BUSY ABORT 'NO CARRIER' ABORT VOICE ABORT 'NO DIALTONE' ABORT 'NO DIAL TONE' ABORT 'NO ANSWER' ABORT DELAYED
# modeminit
'' ATH
OK AT+CFUN=1
OK ATZ
OK 'ATQ0 V1 E1 S0=0 &C1 &D2'
OK AT+CGDCONT=1,"IP","soracom.io"
# ispnumber
OK-AT-OK "ATD*99#"
# ispconnect
CONNECT \d\c
# prelogin

# ispname
# isppassword
# postlogin

# end of pppconfig stuff
```

#### /etc/chatscripts/soracom2372

```
# This chatfile was generated by pppconfig 2.3.18.
# Please do not delete any of the comments.  Pppconfig needs them.
# 
# ispauth PAP
# abortstring
ABORT BUSY ABORT 'NO CARRIER' ABORT VOICE ABORT 'NO DIALTONE' ABORT 'NO DIAL TONE' ABORT 'NO ANSWER' ABORT DELAYED
# modeminit
'' ATZ
OK ATZ
OK AT+CGDCONT=0,"IP","soracom.io"
OK AT+CGDCONT=1,"IP","soracom.io"

# ispnumber
OK-AT-OK "ATD*99***1#"
# ispconnect
CONNECT \d\c
# prelogin

# ispname
# isppassword
# postlogin

# end of pppconfig stuff
```
### 4. wwan0設定
USBモデムが挿入されるとwwan0からスクリプトが実行されるように設定します。
`/etc/network/interfaces`に次の３行を追加します。

```
allow-hotplug wwan0
mapping wwan0 inet ppp
	script /...../script.rb
```

### 5. モデムが挿入された時のスクリプト
/devに登録されたモデムを調べて、モデムの起動スクリプトである`pon`のスクリプトを変更しています。
exit 1, exit 2などを用いて`network/interfaces`のファイル内でもできるようですが、うまく行きませんでした。

```[script.rb]
#!/usr/bin/ruby
tmp = `ls /dev`
dev = tmp.split("\n")
dev.each {|d|
	if d == "ak020" then
		`pon soracom020`
		exit 1
		elsif d == "ms2372" then
		`pon soracom2372`
		exit 2
	end
}
exit 0
```

これで一通りうまく動作しました。

## 動作確認方法
動作しない時のデバックは `/var/log/syslog`などを見ながら行います。

#### (1) rules.dの確認
`/dev/ak020`や`/dev/ms2372`のシンボリックリンクが作られていない場合は1.と2.に問題があります。
#### (2) /etc/network/interfacesの設定
（１）が正常に動作した場合、syslogにはscript.rbを実行したというメッセージが出力されるはずです。以下のケースでは失敗しているようなメッセージが流れていますが、しばらく待つと通信が成功します。

script.shを実行したというメッセージが流れてきたら、`ifup@wwan0.service`の設定は動作しています。

```[/var/log/syslog]
Apr  8 10:05:38 raspberrypi sh[2597]: ifup: error trying to executing mapping script /xxxxxxxxx/script.sh on wwan0
　--- (省略) ---
Apr  8 10:05:41 raspberrypi pppd[2623]: Serial connection established.
Apr  8 10:05:41 raspberrypi pppd[2623]: Using interface ppp0
Apr  8 10:05:41 raspberrypi pppd[2623]: Connect: ppp0 <--> /dev/ak020
Apr  8 10:05:44 raspberrypi pppd[2623]: CHAP authentication succeeded
Apr  8 10:05:44 raspberrypi pppd[2623]: CHAP authentication succeeded
Apr  8 10:05:55 raspberrypi pppd[2623]: Could not determine remote IP address: defaulting to 10.64.64.64
Apr  8 10:05:55 raspberrypi pppd[2623]: replacing old default route to wlan0 [192.168.30.1]
Apr  8 10:05:55 raspberrypi pppd[2623]: local  IP address xx.xx.xx.xx
Apr  8 10:05:55 raspberrypi pppd[2623]: remote IP address xx.xx.xx.xx
Apr  8 10:05:55 raspberrypi pppd[2623]: primary   DNS address xx.xx.xx.xx
Apr  8 10:05:55 raspberrypi pppd[2623]: secondary DNS address xx.xx.xx.xx
Apr  8 10:06:02 raspberrypi dhcpcd[667]: wwan0: removing interface
```

#### (3) スクリプトの動作確認
スクリプトを動作させたとき、このサンプルプログラムではexit 1, exit2をそれぞれ返します。
`echo $?`をスクリプトを実行した直後にコンソール上で行うと、exitコードを取得できるのでスクリプトが正しいか確認できます。

#### (4) モデムの起動プログラム
最後は`/etc/ppp/peers/xxxxx`と`/etc/chatscripts/`が正しく動作していれば、回線を自動で接続することができます。