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

  • 28
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

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

使用したもの

下準備

  • とりあえずRaspberry PIを有線/無線LANにつないで下記をインストールする。
$ sudo apt-get install -y eject wvdial dnsutils
  • もしusb-modeswitchをインストール済である場合は、 L-05Aの設定をコメントアウト してリブートする。(でないとうまく動作しませんでした。)
$ 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デバイスとして認識されます。

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

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

$ 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)

$ 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

接続

バックグラウンドで実行します。

$ 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モデムより外部にアクセスできることを確認します。

$ 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

切断

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

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

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

サービス登録

$ sudo systemctl enable wvdial.service

サービス起動/停止確認

起動

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

サービス自動起動確認

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

参考にしたドキュメント