RaspberryPiのネットワーク周りをNetworkManagerで構成する

RaspberryPiのネットワーク（Wi-Fi/PPP）をNetworkManagerを使って構成すると大変便利そうだったので、その手順のメモ。
Raspbian Jessieでの手順です。

# やること

* OS（Raspbian）をインストール
* ネットワーク設定（暫定）
* ネットワーク設定（NetworkManager）
* soracom接続

## 用意しているもの

* Raspberry Pi 2 Model B
* SDカード 16GByte
* wifiドングル （Planex GW-USNano）
* USBドングル（Docomo L-02C）
* SORACOM Air SIM
* wifiルータ（諸事情により有線LANは使っていません）

#  OS（Raspbian）をインストール

「[okuzawatsの日記](http://okuzawats.com/noobs-20150603#Noobs-2)」を参考にさせていただきました。

ただし、最後の"Raspberry Piの初期設定"は実施していません。

インストールが終わり、再起動するとGUIのデスクトップが表示されます。

## キーボードレイアウトの変更

表示の日本語化は行いませんが、日本語レイアウトのキーボードを使用するための設定を行います。

terminalから`sudo raspi-config`

1. [Internationalization Options]
2. [Change Keyboard Layout]
3. "Generic 105-key(Intl) PC"
4. "Japanese"
5. "The default for the keyboard layout"
6. "No compose key"
7. "<No>"

これで私のキーボード（NEC製のふっつーのキーボード）が刻印通りに入力されるようになりました。

## タイムゾーンの変更

terminalから`sudo raspi-config`

1. [Internationalization Options]
2. [Change Timezone]
3. "Asia"
4. "Tokyo"

## viの設定

とりあえず、編集中にカーソルキーを押すとABCDと入力されてしまうので、vimrcに対して設定を行います。

```shell-session
$vi ~/.vimrc
```

.vimrcに

```
set nocompatible
```

を追記します。ちなみに私は pi と root の.vimrcを編集しました。

# ネットワーク設定（暫定）

後からNetworkManagerをインストールしてそちらでwlanもpppも管理するのですが、NetworkManagerをインストールするためのネットワーク接続が必要になるために、一旦設定します。
なお、有線LANが使用できる場合はこの手順は不要です。

wifiドングルをUSBポートに挿すと、USBデバイスとして認識されます。

```shell-session
$ lsusb
 :
Bus 001 Device 005: ID 2019:ab28 PLANEX GW-USNAano
 :
```

接続先のSSIDとパスフレーズを確認し、以下のコマンドを実行します

```shell-session
$ wpa_passphrase 接続先のSSID 接続先のパスフレーズ
```

`wpa_passphrase`コマンドの結果を以下のように /etc/wpa_supplicant/wpa_supplicant.confに追記します。
`wpa_passphrase`コマンドの結果に`key_mgmt`と`proto`を加えています。

```
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
network={
        ssid="接続先のSSID"
        #psk="接続先のパスフレーズ"
        psk=暗号化されたパスフレーズ
        key_mgmt=WPA-PSK
        proto=WPA2
}
```

この辺はおそらくwifiドングルにより異なるので、つながらない場合は、製品名を使ってググってください。
なお、接続先がステルスモードのときはGW-USNAanoでは一筋縄ではいきませんでした。（というか挫折しました）

/etc/network/interfacesを編集し、以下のようにmanualからdhcpに変更します。

```:/etc/network/interfaces
:
allow-hotplug wlan0
iface wlan0 inet dhcp  # manual -> dhcp
:
```

この辺で再起動します。

以下のコマンドでIPアドレスが割りあたっていることを確認します。

```shell-session

$ ip address show wlan0
 :
    inet 192.168.xxx.xxx/24 brd 192.168.xxx.xxx
 :
```

これで接続できるはずなので、Webブラウザでgoogleなどを開いてみてください。

# ネットワーク設定（NetworkManager）

NetworkManagerのインストールとdhcpcd5の削除を行います。

```shell-session
$ sudo apt-get install -y network-manager
$ sudo apt-get install -y network-manager-gnome
$ sudo apt-get remove -y dhcpcd5
```

ここで一旦再起動します。まだWi-Fiには接続していません。

__apt-get install でなんか404エラーになる場合__

`apt-get install -y network-manager`を実行すると404 Notfoundが出まくりました。

/etc/apt/sources.listを何も変更せずに保存だけしてから、`apt-get update`を実行してからinstallを実行するとうまくいきました。

## Wi-Fiの設定

NetworkManagerのインストール時の最後に、今ある設定は消しなさい的なメッセージが表示されます。
/etc/network/interfacesをすべてコメントアウトし、 /etc/wpa_supplicant/wpa_supplicant.conf に追加したものをすべて削除します。

再起動後、右上のタスクトレイ（って呼ぶのかな？）からコンテキストメニューを表示し、接続したいSSIDを選択し、パスフレーズ等を設定します。

このとき、Passwordのテキストフィールドの右にあるアイコンをクリックし、"Store password for all users"を選択しておきます。
これでwifiにつながります。

# SORACOM接続設定

## L-02C用のusb_modeswitch設定を行う。

usb_modeswitchのL-02Cに対する設定はすでに/lib/udev/rules.d/40-usb_modeswitch.rules及び/usr/share/usb_modeswitch/configPack.tar.gzに含まれていますが、5秒間のWaitを入れるために設定をオーバーライドします。

/usr/share/usb_modeswitch/configPack.tar.gz の中にあるファイルのうち、対象デバイスのファイルを探します。

```sh
$ tar -tf configPack.tar.gz | grep 1004
1004:1000
1004:607f
1004:613a
1004:613f
1004:614e
1004:6156
1004:6190
1004:61aa
1004:61dd
1004:61e7
1004:61eb
1004:6327

$ dmesg | grep 1004
[ xxx.xxxxxx] usb 1-1.4: New USB device found, idVendor=1004, idProduct=61dd

```

ということで、1004:61ddがオーバーライドすべきファイルです。tarを展開して得られる1004:61ddファイルを/etc/usb_modeswitch.dにコピーします。

コピーしたファイルを編集します。

```:/etc/usb_modeswitch.d/1004:61dd
# LG L-02C LTE
TargetVendor=0x1004
TargetProduct=0x618f
StandardEject=1
WaitBefore=5
```
`WaitBefore`行を追記しています。

ここでL-02Cを接続したあと、dmesgコマンドを実行し、`GSM modem`が出力されていることを確認します。

## soracomへの接続設定

一旦GUIでNetworkManagerの設定ファイルを作成してから内容をエディタで編集します。

タスクトレイのNetworkManagerアイコンから、[New Mobile Broadband connection...]を選択します。

1. [Set up a Mobile Broadband Connection]で[Next]
2. [Choose your Provider's countory or Region]で"Japan"を選択して[Next]
3. [Choose your Provider]で[I can't find my provider〜]を選択し、Providerに"soracom"と入力します。
4. [Choose your Billing Plan]で[Selected plan APN]に"soracom.io"と入力します
5. [Confirm Mobile Broadband Settings]で[Apply]

作成されたファイルを編集します。ファイルを直接作成してもよいのですが、uuidの付与方法がわからなかったので、一旦GUIで作成しています。

```:/etc/NetworkManager/system-connections/soracom
[connection]
id=soracom
uuid=xxxxxxxxxxxxxxxxxxxxxxxx
type=gsm
autoconnect=true

[gsm]
number=*99***1#
username=sora
password=sora
apn=soracom.io

[ipv6]
method=auto

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

[serial]
baud=460800

[ipv4]
method=auto

```

この状態からRaspberryPiをshutdownし、L-02Cを接続してから起動すると、1分以内くらいでsoracomに接続されるはずです。（ログインしなくても接続されます）

接続されたら、metadataを取得して接続を確認してみましょう。

```shell-session
$curl http://metadata.soracom.io/v1/subscriber
```

次は、もうひとつ手元にあるAK-020でもsoracomに接続できるようにしよう。

# 参考にしたページ
* [あっきぃ日誌](http://akkiesoft.hatenablog.jp/entry/20160422/1461257570)：NetworkManager、usb_modeswitch
* [Aldebaranな人のブログ](http://yamaryu0508.hatenablog.com/entry/2014/08/15/001312)：wifi接続設定