(Raspbian) AK-020で3Gモデム自動接続(毎回のejectとmodprobeなし)


Soracomから販売されている、エイビット製AK-020を使ってSoracomに自動接続します。

基本的にはAK-020 を Raspbian で使う(とりあえず版)を元にしていますが、以下が異なります。

  • ejectなしでusb_modeswitchを使って自動的にモデムモードに移行
  • modprobeなしで接続時に自動的にドライバをロード

依存パッケージのインストール

pi@raspberrypi:~ $ sudo apt-get install -y wvdial usb-modeswitch

wvdialの設定

/etc/wvdial.conf/etc/ppp/peers/wvdialを編集してください。
参考と同じです。

usb_modeswitchの設定

まずはudevの設定をします。
/lib/udev/rules.d/40-usb_modeswitch.rulesにAK-020が接続されたときにusb_modeswitchが動作するように記述します。
以下を最下行から2行目に記述します。

/lib/udev/rules.d/40-usb_modeswitch.rules
#ABIT AK-020
ATTRS{idVendor}=="15eb", ATTRS{idProduct}=="a403", RUN+="usb_modeswitch '%b/%k'"

usb_modeswitchの設定ファイルを記述します。以下のファイルを/etc/usb_modeswitch.d/15eb:a403に新規に作成してください。

DefaultVendor = 0x15eb
DefaultProduct = 0xa403
TargetVendor = 0x15eb
TargetProduct = 0x7d0e

StandardEject = 1

それぞれのProductIDはeject前と後の値です。
StandardEjectでモデムモードに移行していますが、usb_modeswitchの他のデバイスの設定と同じように、MessageContentで移行したほうが良いと思います。
私はSniffUsbで解析するためのWindowsマシンがないので断念しました。

usbserialドライバの設定

/etc/rc.localの適当な位置に、AK-020に対してusbserialドライバを使用する設定を書きます。

/etc/rc.local
modprobe -v option
echo "15eb 7d0e" > /sys/bus/usb-serial/drivers/option1/new_id

これで、抜き差しするたびにmodprobe usbserialしなくても自動的に/dev/ttyUSB*として認識されます。

デバイス名を固定する

なぜか私の環境では、初回起動時は/dev/ttyUSB2~/dev/ttyUSB5に割り振られるが、再起動後は/dev/ttyUSB0~/dev/ttyUSB3にポート番号が変わる挙動をするため、モデムとして用いるポートにシンボリックリンクを貼って常に同じ名前でアクセスできるようにします。

Raspberry PiでUSBモデム挿入時にSORACOMへ自動接続するを参考に。
ttyUSB0~ttyUSB3のうち、wvdialなどのツールではttyUSB0を使ってダイアルします。
参考元より、sudo udevadmで調べてみると、同じようにbNumEndpointsbInterfaceNumberで判別できそうでした。

よって、参考と同じ要領で以下のファイルを作成します。

/etc/udev/rules.d/10-soracom.rules
ATTRS{../idVendor}=="15eb", ATTRS{../idProduct}=="7d0e", ATTRS{bNumEndpoints}=="03", ATTRS{bInterfaceNumber}=="02", SYMLINK+="modem"

再起動すると、/dev/modemが現れており、これを使ってponwvdialでppp接続できるようになると思います。
wvdialの設定で使用するデバイスを/dev/modemに変更しておきましょう

起動時にppp接続

wvdialを使って、起動時に自動的にppp接続してみます。
参考元と同じように、先ほどの/etc/rc.localの中に追加した下に以下を追加しますが、私の環境ではsleep 3でしばらく待ってからでないと、/dev/modemが見つからずエラーになるようでした。

/etc/rc.local
echo waiting for modem device
for i in {1..30}
do
  [ -e /dev/modem ] && break
  echo -n .
  sleep 1
done
[ $i = 30 ] && ( echo modem not found ; exit 1 )

sleep 3
wvdial > /home/pi/wvdial.log 2>&1 &

補足

sleep 3が必要な理由は、どうやら何度か接続/切断を繰りかえすような挙動をし、/dev/modemがあることを確認してもその次のタイミングには存在しないようになってしまうからでした。一定時間経てば安定するので、3秒待っています。
もう少し根本から治す賢い方法があると思いますが、なにが原因かわかりませんでした。

参考ページ

AK-020 を Raspbian で使う(とりあえず版)
デバイス名を固定する