タイトルのまんま、Raspberry PiにD02HWを接続して3G通信します。
もはや過去に幾度となくやられていて新規性は0ですが、ATコマンドを使って設定してみました。
D02HWは1000円未満で買える3G Modemで、IoT系であれば3Gで十分なのでコスパが良いです(メルカリだと400円くらいかな)。
SIMはSORACOM Airを使用しました。
- Raspberry Pi zero
- D02HW
- SORACOM Air SIM
OSバージョンは以下。
$ uname -a
Linux node01 4.9.65+ #1056 Fri Nov 24 13:53:32 GMT 2017 armv6l GNU/Linux
事前にSORACOM ユーザーコンソールにSIMを登録しておきます。
D02HWを使用する場合はUnlockしておかないといけないかもしれません(後述)。
ATコマンドとは
米国Hayes社が定めたモデムと通信する制御コマンドです。
仕様に「Hayes標準ATコマンドに準拠」などと書かれていれば使えます(D02HWには記載されています)。
基本モデムであれば使えると思います。
詳しくはATコマンド hayes
でググれば大量に出てくるので興味があればそちらを参照してみてください。
モデムの認識
D02HWにSORACOM Air SIMを挿入して、そのD02HWをRaspberry Piに接続します。
lsusb
コマンドでHuawei Technologies...と表示されていれば認識されています。
$ 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ダイアラをインストールします。
$ sudo apt-get update
$ sudo apt-get install -y wvdial
モデムの設定
wvdialconf
コマンドで設定を自動生成します。
$ 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
に設定が書き込まれています。
各パラメータの並び順はランダムの模様。
$ 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
コマンドでモデムの設定を確認します。
$ 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
で切断。
$ screen /dev/ttyUSB0 9600,cs8
AT^SYSCFG?
^SYSCFG:2,2,3FFFFFFF,1,1
OK
上記の場合はNetwork TypeとBandは正しく設定されています。
パラメータの意味は^SYSCFGの値の意味を参照。
設定を変更する場合は以下のようにします。
AT^SYSCFG=2,2,3FFFFFFF,1,1
OK
数分待つとLEDが赤色から青色に変わることを確認します。
変わらなければモデムをUSBから抜き差ししてみてください。
SORACOM Airに必要な情報を追記する
各種デバイスで SORACOM Air を使用するのconnect_air.sh
を参考に、SORACOM Air SIMに必要な情報を追記します。
$ 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に切り替える (これでWiFiが繋がっていても大丈夫) |
$ vi /etc/ppp/peers/wvdial
noauth
name wvdial
usepeerdns
persist
replacedefaultroute
ダイアルアップする
wvdial
コマンドで3Gに接続します。
以下のように出力されれば成功です。
$ 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
で通信できています。
$ 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
残念ですが、安いですしちょっと遊ぶには十分ではないでしょうか。
D02HWのSIM Lockの解除状況の確認方法
screen
コマンドで/dev/ttyUSB0
に接続します。
$ 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、パケット交換