Raspberry PiとD02HWとSORACOM Air SIMで3G通信する

タイトルのまんま、Raspberry PiにD02HWを接続して3G通信します。

もはや過去に幾度となくやられていて新規性は0ですが、ATコマンドを使って設定してみました。

D02HWは1000円未満で買える3G Modemで、IoT系であれば3Gで十分なのでコスパが良いです（メルカリだと400円くらいかな）。

SIMはSORACOM Airを使用しました。

* Raspberry Pi zero
* D02HW
* SORACOM Air SIM

OSバージョンは以下。

```bash
$ uname -a
Linux node01 4.9.65+ #1056 Fri Nov 24 13:53:32 GMT 2017 armv6l GNU/Linux
```

事前に[SORACOM ユーザーコンソール](https://console.soracom.io/#/login)にSIMを登録しておきます。

D02HWを使用する場合はUnlockしておかないといけないかもしれません（後述）。

## ATコマンドとは

米国Hayes社が定めたモデムと通信する制御コマンドです。

仕様に「Hayes標準ATコマンドに準拠」などと書かれていれば使えます（D02HWには記載されています）。
基本モデムであれば使えると思います。

詳しくは`ATコマンド hayes`でググれば大量に出てくるので興味があればそちらを参照してみてください。

## モデムの認識

D02HWにSORACOM Air SIMを挿入して、そのD02HWをRaspberry Piに接続します。

`lsusb`コマンドでHuawei Technologies...と表示されていれば認識されています。

```bash
$ lsusb
Bus 001 Device 004: ID 056e:4008 Elecom Co., Ltd 
Bus 001 Device 003: ID 046d:c52b Logitech, Inc. Unifying Receiver
Bus 001 Device 006: ID 12d1:1003 Huawei Technologies Co., Ltd. E220 HSDPA Modem / E230/E270/E870 HSDPA/HSUPA Modem
Bus 001 Device 002: ID 05e3:0608 Genesys Logic, Inc. Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
```

## wvdialをインストール

`wvdial`というPoint-to-Point Protocolダイアラをインストールします。

```bash
$ sudo apt-get update
$ sudo apt-get install -y wvdial
```

## モデムの設定

`wvdialconf`コマンドで設定を自動生成します。

```bash
$ sudo wvdialconf
Scanning your serial ports for a modem.

ttyUSB0<*1>: ATQ0 V1 E1 -- OK
ttyUSB0<*1>: ATQ0 V1 E1 Z -- OK
ttyUSB0<*1>: ATQ0 V1 E1 S0=0 -- OK
ttyUSB0<*1>: ATQ0 V1 E1 S0=0 &C1 -- OK
ttyUSB0<*1>: ATQ0 V1 E1 S0=0 &C1 &D2 -- OK
ttyUSB0<*1>: ATQ0 V1 E1 S0=0 &C1 &D2 +FCLASS=0 -- OK
ttyUSB0<*1>: Modem Identifier: ATI -- Manufacturer: huawei
ttyUSB0<*1>: Speed 9600: AT -- OK
ttyUSB0<*1>: Max speed is 9600; that should be safe.
ttyUSB0<*1>: ATQ0 V1 E1 S0=0 &C1 &D2 +FCLASS=0 -- OK
ttyUSB1<*1>: ATQ0 V1 E1 -- OK
ttyUSB1<*1>: ATQ0 V1 E1 Z -- OK
ttyUSB1<*1>: ATQ0 V1 E1 S0=0 -- OK
ttyUSB1<*1>: ATQ0 V1 E1 S0=0 &C1 -- OK
ttyUSB1<*1>: ATQ0 V1 E1 S0=0 &C1 &D2 -- OK
ttyUSB1<*1>: ATQ0 V1 E1 S0=0 &C1 &D2 +FCLASS=0 -- OK
ttyUSB1<*1>: Modem Identifier: ATI -- Manufacturer: huawei
ttyUSB1<*1>: Speed 9600: AT -- OK
ttyUSB1<*1>: Max speed is 9600; that should be safe.
ttyUSB1<*1>: ATQ0 V1 E1 S0=0 &C1 &D2 +FCLASS=0 -- OK

Found a modem on /dev/ttyUSB0.
Modem configuration written to /etc/wvdial.conf.
ttyUSB0<Info>: Speed 9600; init "ATQ0 V1 E1 S0=0 &C1 &D2 +FCLASS=0"
ttyUSB1<Info>: Speed 9600; init "ATQ0 V1 E1 S0=0 &C1 &D2 +FCLASS=0"
```

`/etc/wvdial.conf`に設定が書き込まれています。

各パラメータの並び順はランダムの模様。

```bash
$ cat /etc/wvdial.conf 

[Dialer Defaults]
Init2 = ATQ0 V1 E1 S0=0 &C1 &D2 +FCLASS=0
Modem Type = Analog Modem
; Phone = <Target Phone Number>
ISDN = 0
; Username = <Your Login Name>
Init1 = ATZ
; Password = <Your Password>
Modem = /dev/ttyUSB0
Baud = 9600
```

### モデムの設定変更

ここでD02HWのLEDが赤色の場合はネットワークが検出できていないので、モデムの設定を変更します（BandがSIMのバンドと合っていない模様）。

青色で点滅している場合は問題ないので次の手順へ。

`stty`コマンドでモデムの設定を確認します。

```bash
$ sudo apt-get install -y screen
$ stty -F /dev/ttyUSB0 -a
speed 9600 baud; rows 0; columns 0; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>;
eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R;
werase = ^W; lnext = ^V; discard = ^O; min = 100; time = 2;
-parenb -parodd -cmspar cs8 -hupcl -cstopb cread clocal -crtscts
-ignbrk brkint ignpar -parmrk -inpck -istrip -inlcr -igncr -icrnl ixon -ixoff
-iuclc -ixany -imaxbel -iutf8
-opost -olcuc -ocrnl -onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
-isig -icanon iexten -echo echoe echok -echonl -noflsh -xcase -tostop -echoprt
echoctl echoke -flusho -extproc
```

表示内容からscreenに9600とcs8を設定します。

`wvdial.conf`のModemに`/dev/ttyUSB0`が指定されているので`/dev/ttyUSB0`に接続します。

screenは`Ctrl+A,Shift+k`で切断。

```bash
$ screen /dev/ttyUSB0 9600,cs8
AT^SYSCFG?
^SYSCFG:2,2,3FFFFFFF,1,1

OK
```

上記の場合はNetwork TypeとBandは正しく設定されています。

パラメータの意味は^SYSCFGの値の意味を参照。

設定を変更する場合は以下のようにします。

```bash
AT^SYSCFG=2,2,3FFFFFFF,1,1

OK
```

数分待つとLEDが赤色から青色に変わることを確認します。
変わらなければモデムをUSBから抜き差ししてみてください。

## SORACOM Airに必要な情報を追記する

[各種デバイスで SORACOM Air を使用する](https://dev.soracom.io/jp/start/device_setting/)の`connect_air.sh`を参考に、SORACOM Air SIMに必要な情報を追記します。

```bash
$ cat /etc/wvdial.conf
[Dialer Defaults]
Init1 = ATZ
Init2 = ATQ0 V1 E1 S0=0 &C1 &D2 +FCLASS=0
init3 = AT+CGDCONT=1,"IP","soracom.io"
Check Def Route = 1
Phone = *99***1#
New PPPD = yes
Modem Type = Analog Modem
Stupid Mode = yes
Baud = 9600
Auto DNS = 1
Dial Command = ATD
Dial Attempts = 3
Modem = /dev/ttyUSB0
ISDN = 0
Carrier Check = no
APN = soracom.io
Username = sora
Password = sora
```

`/etc/ppp/peers/wvdial`に以下のパラメータを追記します。

値 | 意味
---|---
persist | 切断時に再接続する
replacedefaultroute | ppp接続時にデフォルトルートをpppに切り替える<br>（これでWiFiが繋がっていても大丈夫）

```bash
$ vi /etc/ppp/peers/wvdial
noauth
name wvdial
usepeerdns
persist
replacedefaultroute
```

## ダイアルアップする

`wvdial`コマンドで3Gに接続します。

以下のように出力されれば成功です。

```bash
$ sudo wvdial
--> 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
--> Carrier detected.  Starting PPP immediately.
--> Starting pppd at Sat Dec  2 20:11:18 2017
--> Pid of pppd: 1475
--> Using interface ppp0
--> pppd: ????9?[01]?9?[01]
--> pppd: ????9?[01]?9?[01]
--> pppd: ????9?[01]?9?[01]
--> pppd: ????9?[01]?9?[01]
--> pppd: ????9?[01]?9?[01]
--> pppd: ????9?[01]?9?[01]
--> local  IP address 10.206.119.254
--> pppd: ????9?[01]?9?[01]
--> remote IP address 10.64.64.64
--> pppd: ????9?[01]?9?[01]
--> primary   DNS address 100.127.0.53
--> pppd: ????9?[01]?9?[01]
--> secondary DNS address 100.127.1.53
--> pppd: ????9?[01]?9?[01]
```

SORACOMはAWS経由で通信するので、AWS経由なっていれば`ppp0`で通信できています。

```bash
$ transroute www.yahoo.co.jp
traceroute to www.yahoo.co.jp (183.79.250.123), 30 hops max, 60 byte packets
 1  ec2-175-41-192-242.ap-northeast-1.compute.amazonaws.com (175.41.192.242)  405.406 ms  526.161 ms ec2-175-41-192-240.ap-northeast-1.compute.amazonaws.com (175.41.192.240)  594.372 ms
...
```
## さいごに

私が所有していたD02HWは1時間ほどで通信できなくなるようでした。
本家フォーラムの記事は消えていたので詳細はわかりませんが、電源周りの問題のようです（E220はOEM元の型番）。

[How to solve random disconnects to internet of E220 and E170 USB HSDPA modem sticks](http://forums.ocworkbench.com/showthread.php?t=78060)

残念ですが、安いですしちょっと遊ぶには十分ではないでしょうか。


## D02HWのSIM Lockの解除状況の確認方法

`screen`コマンドで`/dev/ttyUSB0`に接続します。

```bash
$ screen /dev/ttyUSB0 9600,cs8
AT^CARDLOCK?
^CARDLOCK: 2,10,0

OK
```

戻り値の最初の数値が2だとUnlockされています。

値 | 意味
---|---
1 | Unlockコードを入力すればUnlock可能
2 | Unlock済み
3 | Unlock不可能

## ^SYSCFGの値の意味

`^SYSCFG:Mode,Order,Band,Roaming,Domain`

Mode

値 | 意味
---|---
2 | Automatic search
13 | 2G ONLY
14 | 3G ONLY
16 | No change

Order

値 | 意味
---|---
0 | Automatic search
1 | 2G first, then 3G
2 | 3G first, then 2G
3 | No change

Band

値 | 意味
---|---
80 | GSM DCS systems
100 | Extended GSM 900
200 | Primary GSM 900
200000 | GSM PCS
400000 | WCDMA IMT 2000
3FFFFFFF | Any band
40000000 | No change of band

Roaming

値 | 意味
---|---
0 | Not supported
1 | Roaming is supported
2 | No change

Domain（通信モード）

値 | 意味
---|---
0 | CS_ONLY
1 | PS_ONLY
2 | CS_PS
3 | ANY
4 | No change

* CS : Circuit Switched、回線交換
* PS : Packet Switched、パケット交換

## 参考

* [Raspberry Pi (Raspbian "wheezy") + D02HW + イオンSIM でRaspberry Pi を3G回線へ接続させた](http://d.hatena.ne.jp/ramencozo/20121125/1353826296)
* [各種デバイスで SORACOM Air を使用する](https://dev.soracom.io/jp/start/device_setting/)
* [AT^SYSCFG - System Configuration | M2MSupport.net](http://m2msupport.net/m2msupport/atsyscfg-system-configuration/)
* [Huawei E1550 3G モデム](https://wiki.archlinux.jp/index.php/Huawei_E1550_3G_モデム)
* [Linuxにおけるシリアルポートのトラブルシューティング](https://qiita.com/yuiseki/items/bfa9ad984f7333377870)
* [ATコマンドの基本（PDF）](http://www.omron.co.jp/ese/ups/discontinued/me5614u2/me5614u2.pdf)
* [Wvdial - ArchWiki](https://wiki.archlinux.jp/index.php/Wvdial)