RaspberryPiにSIMカードを挿して通信する

遠隔操作・監視するときに色々と便利なのでメモ

動作確認済みUSBモデム

△L-02C ドコモ LTE対応(一応通信できるが、クセがあり時々通信不能になったりするのでオススメしない)
〇L-03D ドコモ LTE対応 動作良好
〇E3372h-153 LTE対応 外国製なのでバンドの問題あり docomosimでSMS付きでないものはLTE不可。フルMVNOのIIjmioIoTsimはSMSなくてもLTE通信できた。
〇W903 TIANJIE ノーブランド品? aliexpressで1000円。3Gのみ。速度を必要としなければ十分使える。

※ドコモのは大体SIMロックがかかっているがフルMVNOのIIjmioはdocomosimの扱いではないのでロックが掛かっている機器では使えない

レシピ

・RaspberryPi
・USBモデム(今回はL-03Dで設定)

・使用するソフト
wvdial または pppconfig

udevの設定(必要に応じて)

L-03Dは通常接続するとCDROM(VID=0x1004, PID=0x6327)として認識してしまうが、標準インストールされているusb_modeswitchによって
USBデバイス(VID=0x1004, PID=0x6326)として再認識されるように設定されている。(/lib/udev/rules.d/40-usb_modeswitch.rules参照)
この時、modprobe usbserialを実行しないとデバイスを認識しないため、モデムを認識したときにコマンドを実行するudevルールを作る。

設定ファイルを新規作成 /etc/udev/rules.d/50-l03d.rules
またデバイス名はそのままだと/dev/ttyUSB2だが、状況によって数字が変わりアクセスできなくなる可能性があるので、シンボリックリンクでmodemとして固定する。
また、モデム認識時にifupサービスを実行し、自動でネット接続できるようにしておく。今回の設定ではモデムのネットワークインターフェス名をppp0とする。
自動接続不要ならENV{SYSTEMD_WANTS}=”ifup@ppp0.service”は消してok

ACTION=="add", ATTRS{idVendor}=="1004", ATTRS{idProduct}=="6326", RUN+="/sbin/modprobe usbserial vendor=0x1004 product=0x6326"
KERNEL=="ttyUSB*", ATTRS{../idVendor}=="1004", ATTRS{../idProduct}=="6326",ATTRS{bNumEndpoints}=="03", ATTRS{bInterfaceNumber}=="02", SYMLINK+="modem", ENV{SYSTEMD_WANTS}="ifup@ppp0.service"

※最初からUSBデバイスとして認識できているものなら2行目のみでOK。
※idVendor,idProductなど緑色箇所はモデムによって異なるのでlsusbで確認し、書き換えること。

参考にしたサイト

・Raspberry Piで、起動後にUSBモデムを自動認識する
https://qiita.com/air-gh/items/93c67c175e6519129a7f
・SORACOM Interstellar – 40光年先の遠隔監視 –
https://blog.soracom.jp/blog/2017/05/02/interstellar-1/
・Raspberry PiでUSBモデム挿入時にSORACOMへ自動接続する
https://qiita.com/gimy/items/1d49f8e08210e9c9f20a

wvdialの設定

wvdialが設定しやすいのでこちらを使用します。
sudo apt-get install wvdialのあと、
設定ファイルを編集 sudo nano /etc/wvdial.conf
今回はbmobileのapnで設定

[Dialer Defaults]
Init1 = ATZ
Init2 = ATH
Init3 = AT+CGDCONT=1,"IP","bmobile.ne.jp"
Init4 = ATQ0 V1 E1 S0=0 &C1 &D2 +FCLASS=0
Dial Attempts = 3
Stupid Mode = 1
Modem Type = Analog Modem
Dial Command = ATDT
New PPPD = yes
APN = bmobile.ne.jp
Modem = /dev/modem
Baud = 460800
ISDN = 0
Phone = *99***1#
Username = bmobile@4g
Password = bmobile
Carrier Check = no
Auto Reconnect = yes

作成後、sudo wvdialで通信できる。

/etc/network/interfacesの設定

sudo nano /etc/network/interfacesでネットワークインターフェイスを登録する。

allow-hotplug ppp0
iface ppp0 inet wvdial
 pre-up sleep 10 
ほかの設定

ここまでやれば再起動して動くはず。sudo ifup ppp0またはsudo ifdown ppp0で手動ONOFFできる。
また、udevで設定した自動ifupがうまく機能しなかったので下記ページをもとにifupサービスを修正した。

・Raspbianのifup@.serviceがおかしくてUSB 3G/4G モデムが動かなかった
https://signal-flag-z.blogspot.com/2017/01/raspbianifupserviceusb-3g4g.html

備考

L-03Dは大きなファイルを送信しようとするとハングアップするので出力帯域を制限して使用します。
高度なトラフィック制御
https://wiki.archlinux.jp/index.php/高度なトラフィック制御

Token Bucket Filter (TBF)

特定のレート制限に達するまでパケットの送信を許可します。

仮想バケットを作成してバケットが満杯になったときに特定の速度でトークンを破棄することで機能します。各パッケージはバケットから仮想トークンを取得して、トークンを使って送信許可を得ます。大量のパケットが来た場合、バケットはトークンを発行することができず新しいトークンができるまで待機することになります。トークンが十分高速に到達しない場合、パケットが破棄されます。逆の場合 (送信されるパケットが少なすぎる場合)、トークンを使うことで一時的に通信速度を爆発させることができます。

上記より、インターフェイスを遅くしたい場合に役立つ qdisc です。例:

アップロードによってモデムのキューが満杯になってしまうことがあるため、巨大なファイルをアップロードしようとすると通信が破壊されます。

tc qdisc add dev ppp0 root tbf rate 220kbit latency 50ms burst 1540

コメントを残す

メールアドレスが公開されることはありません。