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}="[email protected]"
# for MS2372
KERNEL=="ttyUSB*", ATTRS{../idVendor}=="12d1", ATTRS{../idProduct}=="1506", ATTRS{bNumEndpoints}=="03", ATTRS{bInterfaceNumber}=="00", SYMLINK+="ms2372", ENV{SYSTEMD_WANTS}="[email protected]"

3. pppconfigの設定

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

$ sudo pppconfig

"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"を選択して終了します。

この作業でそれぞれ2つのファイル(合計4ファイル)が作成されます。
/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

# 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

# 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に次の3行を追加します。

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の設定

(1)が正常に動作した場合、syslogにはscript.rbを実行したというメッセージが出力されるはずです。以下のケースでは失敗しているようなメッセージが流れていますが、しばらく待つと通信が成功します。

script.shを実行したというメッセージが流れてきたら、[email protected]の設定は動作しています。

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/が正しく動作していれば、回線を自動で接続することができます。