簡単にRaspberry PiでSORACOM Airを使う(FS01BU USBモデムを用いて自動接続)

# 概要
Raspberry Piで富士ソフトのUSBモデム FS01BUを使い、SORACOM Airの3G通信ができます。接続スクリプトが[gistで公開](https://gist.github.com/j3tm0t0/65367f971c3d770557f3)されていますので、それを利用して自動起動するようにして常時運用できるようにしてみましょう。
手動で確認しつつ接続する方法は以下のサイトで紹介しました。

+ [もうちょっと楽にRaspberry PiでSORACOM Airを使う(FS01BU USBモデムを用いて)](http://qiita.com/dietposter/items/bf3b0311a044eaf36df8)

#手順
FS01BUをRaspberry Piに差します。Raspberry Piを立ち上げてターミナルで操作を行います。
実行する前に`wvdial`と`usb-modeswitch`をインストールしておきます。

```bash
$ sudo apt-get update
$ sudo apt-get install wvdial usb-modeswitch
```

`git clone`コマンドでラズパイ側にソースをコピーします。`./sora`ディレクトリができます。

```bash
$ git clone https://gist.github.com/j3tm0t0/65367f971c3d770557f3 sora
Cloning into 'sora'...
remote: Counting objects: 8, done.
remote: Compressing objects: 100% (7/7), done.
remote: Total 8 (delta 5), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (8/8), done.
Checking connectivity... done.
$ ls -d sora
sora
```
単体でも使えるように`/opt`にコピーします。

```bash
$ sudo cp -R sora /opt/
$ ls -l /opt/sora
合計 4
-rw-r--r-- 1 root root 1369 10月 11 12:39 connect_air.sh
```
お好みに応じて実行可能(`$ sudo chmod 755 /opt/sora/connect_air.sh`)にしたり、パスを通す(`$ PATH=$PATH:/opt/sora/`)と良いかと思います。

手動でスクリプトを実行＆確認してみましょう。

```bash
$ sudo bash /opt/sora/connect_air.sh
```
以下の表示になれば、正常に接続できています。`Ctrl+C`を２回打って終了しておきます。

```bash
Bus 001 Device 007: ID 0bda:8176 Realtek Semiconductor Corp. RTL8188CUS 802.11n WLAN Adapter
Bus 001 Device 006: ID 046d:c52b Logitech, Inc. Unifying Receiver
Bus 001 Device 009: ID 1c9e:6801 OMEGA TECHNOLOGY 
Bus 001 Device 004: ID 1a40:0101 Terminus Technology Inc. 4-Port HUB
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp. SMSC9512/9514 Fast Ethernet Adapter
Bus 001 Device 002: ID 0424:9512 Standard Microsystems Corp. LAN9500 Ethernet 10/100 Adapter / SMSC9512/9514 Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 009: ID 1c9e:6801 OMEGA TECHNOLOGY 
Look for target devices ...
   product ID matched
 Found devices in target mode or class (1)
Look for default devices ...
   product ID matched
 Found devices in default mode (1)
Access device 009 on bus 001
Current configuration number is 1
Use interface number 0
Use endpoints 0x01 (out) and 0x81 (in)
Error: can't use storage command in MessageContent with interface 0;
       interface class is 255, expected 8. Abort

waiting for modem device
--> WvDial: Internet dialer version 1.61
--> Initializing modem.
--> Sending: ATZ
ATZ
OK
--> Sending: ATQ0 V1 E1 S0=0 &C1 &D2 +FCLASS=0
ATQ0 V1 E1 S0=0 &C1 &D2 +FCLASS=0
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 14400000
--> Carrier detected.  Starting PPP immediately.
--> Starting pppd at Sun Oct 11 13:00:48 2015
--> Pid of pppd: 2597
--> Using interface ppp0
--> pppd: ?????J?[01]?J?[01]
--> pppd: ?????J?[01]?J?[01]
--> pppd: ?????J?[01]?J?[01]
--> pppd: ?????J?[01]?J?[01]
--> pppd: ?????J?[01]?J?[01]
--> pppd: ?????J?[01]?J?[01]
--> local  IP address 10.214.154.107
--> pppd: ?????J?[01]?J?[01]
--> remote IP address 10.64.64.64
--> pppd: ?????J?[01]?J?[01]
--> primary   DNS address 169.254.0.53
--> pppd: ?????J?[01]?J?[01]
←[Ctrl+C]で中止
^CCaught signal 2:  Attempting to exit gracefully...
--> Terminating on signal 15
--> pppd: ?????J?[01]?J?[01]
--> Connect time 9.9 minutes.
--> pppd: ?????J?[01]?J?[01]
--> pppd: ?????J?[01]?J?[01]
--> pppd: ?????J?[01]?J?[01]
--> Disconnecting at Sun Oct 11 13:10:46 2015 ←もう一度[Ctrl+C]で終了
^C
$
```

`Ctrl＋C`を１回打ったら、少なくとも１分以内に`Ctrl＋C`を打つ必要があります。そうでないと、再接続してしまいますので注意^^
接続できたら自動起動スクリプト`/etc/init.d/soracomair`を作成します。

```bash
$ sudo vi /etc/init.d/soracomair
```

```bash:/etc/init.d/soracomair
#!/bin/sh
### BEGIN INIT INFO
# Provides:          soracomair
# Required-Start:    $remote_fs $syslog 
# Required-Stop:     $remote_fs $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Example initscript
# Description:       This file should be used to construct scripts to be
#                    placed in /etc/init.d.  This example start a
#                    single forking daemon capable of writing a pid
#                    file.  To get other behavoirs, implemend
#                    do_start(), do_stop() or other functions to
#                    override the defaults in /lib/init/init-d-script.
### END INIT INFO

#SORACOM Air接続スクリプトのフルパスを設定
cmd="/opt/sora/connect_air.sh"

start(){
    #working  /opt/sora/connect_air.sh
    echo -n "connect air...\n"
    #スクリプトの実行
    bash $cmd &

    return 0
}
stop(){
    echo -n "stopping connect air...\n"
    #スクリプトが実行されているプロセスのPIDを設定
    pid=`ps ax | grep -v grep | grep "$cmd" | awk '{ print $1 }'`
    #スクリプトの停止
    kill $pid
    #ダイヤラーwvdialの停止 pppdも停止する
    killall wvdial

    return 0
}

case $1 in
        start)
                start
                        ;;
        stop)
                stop
                        ;;
        *)
               echo "Usage: $0 {start|stop}"
               exit 2
                        ;;
esac
```
**※上記スクリプトはconnect_air.shを呼び出している単純なものです。より適切なスクリプトについてコメントいただけると幸いです**

起動スクリプトを作成・保存できたら、`insserv`コマンドで各ランレベルの起動リンクを設定します。

```bash
$ sudo chmod 755 /etc/init.d/soracomair
$ sudo insserv -d /etc/init.d/soracomair
$ ls -l /etc/rc*.d/*soracomair
lrwxrwxrwx 1 root root 20 10月 11 13:20 /etc/rc0.d/K01soracomair -> ../init.d/soracomair
lrwxrwxrwx 1 root root 20 10月 11 13:20 /etc/rc1.d/K01soracomair -> ../init.d/soracomair
lrwxrwxrwx 1 root root 20 10月 11 13:20 /etc/rc2.d/S02soracomair -> ../init.d/soracomair
lrwxrwxrwx 1 root root 20 10月 11 13:20 /etc/rc3.d/S02soracomair -> ../init.d/soracomair
lrwxrwxrwx 1 root root 20 10月 11 13:20 /etc/rc4.d/S02soracomair -> ../init.d/soracomair
lrwxrwxrwx 1 root root 20 10月 11 13:20 /etc/rc5.d/S02soracomair -> ../init.d/soracomair
lrwxrwxrwx 1 root root 20 10月 11 13:20 /etc/rc6.d/K01soracomair -> ../init.d/soracomair
$ 
```

うまく設定できているようなら再起動します。

```bash
$ sudo reboot
```

再起動後、起動時に自動接続されているか確認してみましょう。
#接続確認
再起動後、piユーザーでログインし`ifconfig`コマンドで確認します。

```bash
$ ifconfig ppp0
ppp0      Link encap:Point-to-Pointプロトコル  
          inetアドレス:10.214.154.107 P-t-P:10.64.64.64  マスク:255.255.255.255
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1500  メトリック:1
          RXパケット:7 エラー:0 損失:0 オーバラン:0 フレーム:0
          TXパケット:8 エラー:0 損失:0 オーバラン:0 キャリア:0
      衝突(Collisions):0 TXキュー長:3 

```

あと、curlやpingなどを打っておけばいいでしょう。名前解決も確認できます。

```bash
$ curl http://www.yahoo.co.jp
```

```bash
$ ping www.yahoo.co.jp
```


#接続されない時

手動による接続確認の際にlsusbの出力結果のみ表示され接続できないときがあります。

```bash
$ bash /opt/sora/connect_air.sh
…
Bus 001 Device 005: ID 1c9e:98ff OMEGA TECHNOLOGY 
…
$ 
```
このとき、IDが1c9e:98ffになっているため接続できません。FS01BU USBモデムを抜き差しして再度コマンドを打ってみるか、再起動してみてください。IDが1c9e:6801のときに接続可能になります。
#自動再接続など
なんらかのトラブルで接続が切れた場合、再接続ができるか否かが運用の鍵となりますが、[gistで公開されている接続スクリプト](https://gist.github.com/j3tm0t0/65367f971c3d770557f3)では、接続後１分おきに再接続を行うようになっています。実際、SORACOM Airコンソールで休止／開始を繰り返しても再接続されることを確認しました。
色々検討・確認する必要がありますが、とりあえず自動接続と自動再接続ができるようになりました。よりよい方法などありましたら、この投稿にコメントかまたはQiitaに投稿お願いします。

ではでは！SORACOM AirでIoTをお楽しみください:smile: