あっきぃ日誌

鉄道ブログのような技術系ブログのようななにか

Raspberry PiでのモバイルインターネットをNetworkManagerで自動接続にする

去年買って遊んだあとに放置していたUSBモデムのL-05Aですが、最近は雑誌にSIMがついていて「手軽にIoTで遊んでみましょう!」みたいなのが話題のようなので、私も久しぶりに引っ張り出してみました。前に書いたやつはこれです。

USBモデムL-05AにIIJmioのSIMを突っ込んでRaspberry Piで使ってみる - あっきぃ日誌

最近だとSoftware DesignがSORACOM SIMをつけていますね。会社の定期購読のやつにもついていました。

しかしこれ、私の前の記事とか、Software Designの記事とかは、手動でモバイルインターネット接続する方法で書かれています。起動時にいちいちコマンドを叩くのは面倒なので、NetworkManagerで自動接続・ホットプラグに対応しました。これなら屋外に置くときとかでも、電源を入れるだけでスタートできます。

f:id:Akkiesoft:20160422014027j:plain

前提環境はRaspberry Piで、OSはもちろんRaspbian Jissieです。

やること

やることは以下の2点です。

  • USB_ModeSwitchの設定を置いてデフォルトの設定をオーバーライド
  • NetworkManagerでPPP接続

USB_ModeSwitchは、無効化して手動でEjectみたいな記事を見たりしましたが、調べた結果パラメータを1個追加するだけで正しく動作したので、そうします。

PPP接続は、pppもwxdialも使わず、NetworkManagerだけでやります。Wi-Fiのとき以来ですね。

NetworkManagerを無効にせずにGUIがない無線LAN環境で使う - あっきぃ日誌

USB_ModeSwitchの設定

USB_ModeSwitchの設定は、/etc/usb_modeswitch.d/1004:613aと言うファイルを作成して、以下の内容を記述します。

# LG L-05A
TargetVendor=0x1004
TargetProduct=0x6124
StandardEject=1
WaitBefore=2

オリジナルの設定ファイルが/usr/share/usb_modeswitch/configPack.tar.gzの中にあって、そこから読んでいるようです。/etc/usb_modeswitch.dにファイルを配置することで、オリジナルの設定がオーバーライドできます。オリジナルからの変更点は、WaitBefore=2の1行を追加しただけです。

USB_ModeSwitchがうまく動作しないのは、CD-ROMモードのL-05AをEjectするタイミングが早すぎるのが原因だったようで、たとえば5秒待つようにすればイケるよ、というのがフォーラムにありました。L-05Aの場合は2秒でも大丈夫のようでした。

USB_ModeSwitch • View topic - modeswitch not working on bootup for MF691

/etc/usb_modeswitch.confのログ出力を有効にして、/var/log/usb_modeswitch_*を見ると、動作の様子がわかります。

なお、設定ファイルを配置するだけでOKで、次にL-05Aを接続した時から有効になります。

NetworkManagerの設定

ひとまずNetworkManagerを入れて、デフォルトでインストールされているdhcpcd5をアンインストールします。

sudo apt-get install -y network-manager
sudo apt-get remove -y dhcpcd5

(デスクトップ環境の人はGUI管理ツールも入れとくといいです)
sudo apt-get install -y network-manager-gnome

あと、/etc/network/interfacesをエディタで開いて、全部コメントアウトします。ここで再起動しておきましょう。

NetworkManagerの接続設定を記述します。IIJmioの場合を例として、/etc/NetworkManager/system-connections/IIJmioを以下のとおり作成します。接続先の情報はほとんどは下記にありますので、そのまま書きますね。

IIJmio:高速モバイル/D

[connection]
id=IIJmio
uuid=7be1947e-6709-54ba-8e74-59dba1f8a520
type=gsm
autoconnect=true

[ppp]
refuse-eap=true
refuse-mschap=true
refuse-mschapv2=true

[ipv6]
method=auto

[ipv4]
method=auto

[serial]
baud=460800

[gsm]
number=*99***1#
username=mio@iij
password=iij
apn=iijmio.jp

接続先の番号(number)とシリアルのボーレート(baud)は、先述の去年書いた記事の方法で得たものを利用します。

設定ファイルの書き方について、ググってもなかなか出てこないのですが、今回はデスクトップ環境のNetworkManagerのGUIで作りこんでから、下記の設定パラメータ一覧を参考にパラメータをいじりました。

Network Configuration Setting Specification: NetworkManager Reference Manual

デスクトップ環境では、NetworkManagerの設定追加ウィザードを進めると(USB ModeSwitchの設定が済んでいれば)L-05Aを認識していたり、接続先もdocomoとかb-Mobileとかが予め用意されていたりして、至れり尽くせりな感じでした。IIJmioなので手動設定でしたが。こちらも別途手順を書きたいですね。スクリーンショットはとったので。

接続

L-05AをRaspberry Piに接続して、デバイスの初期化が済むと、電波ランプが青で数秒点滅したあとで点灯に切り替わるのがわかります。

ipコマンドで見るとこうなります。ちゃんとアドレスを拾っていますね。

pi@raspberrypi:~ $ ip a show ppp0
4: ppp0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN group default qlen 3
    link/ppp 
    inet 100.94.xxx.xxx peer 10.64.64.64/32 scope global ppp0
       valid_lft forever preferred_lft forever

Raspberry Piを再起動しても同じように自動で接続されればバッチリです。

まとめと見せかけた余談

自動接続は、途中までudevルールだけで実現しようとしていました。次の2つでイケると考えました。

  1. CD-ROMモードのL-05Aを認識したらEjectする
  2. モデムモードのL-05Aを認識したらPPP接続する

ただ、2つ目のPPP接続がどうも途中でぶっつり切断されてしまい、うまく動作しませんでした。ググるとどうも昔から確認されている現象で、かつ修正された様子もなかったので、実現が難しい方法っぽいです。

会社でそれを相談したら、NetworkManagerは?とのコメントをもらってハッとして試したら、今回の方法でうまくいったのでした。

さて、Raspberry Piで電源を入れるだけでUSBモデムからインターネットに繋がるようになってしまったので、こいつをCD-ROMドライブに埋め込んで野外Ejectとしゃれ込みましょうかね……?

ところで、SDを見てやる気になったので、ツイッターで調子に乗って「SORACOM SIMで野外Ejectに向けて頑張るか…」って書いたら中の人から期待されてしまいました。

ヽ('ω')ノ三ヽ('ω')ノもうしわけねぇもうしわけねぇ。野外Ejectの本番は、会社のSoftware Design定期購読についてたSORACOM SIMをガメてきてやりましょうかね……。

Ansible playbookもつくった

手順としてはあっさりですが(こう見えて結構調べ物しましたからね!)、こんなのいちいちやりたくないので、例によってAnsible playbookに書き起こしました。

GitHub - Akkiesoft/RPi-tools: Raspberry Piで使える感じの細々としたスクリプトとか

host_varsあたりにこんな感じの設定を書いて、l-05a.ymlを実行したら構築できます。ちゃんと動くかわからないですが、複数書けるようにしたので、後からSORACOM SIMが増えても書き足して再度playbookを実行すればいけるはずです。

mobile_network:
  - name: "IIJmio"      ←NetworkManagerの接続名
    number: "*99***1#"  ↓以下は接続先情報
    username: "mio@iij"
    password: "iij"
    apn: "iijmio.jp"