Nervesのネットワーク環境を整えた

# 概要

ラズパイ3にNervesをインストールして、このようなネットワーク構成を作りました。
NervesのAdvent Calendar差し替えようかなぁー(笑)

`#NervesJP Advent Calendar 2019 9日目`
[ElixirでラズパイのLEDをチカ〜RaspbianOSインストールから〜](https://qiita.com/nishiuchikazuma/items/cce6152430467cffba56)

```
Mac OSX：
- 有線LAN→メンテナンス用、固定IPアドレス（192.168.88.1/24）

ラズパイ：
- 有線LAN（eth0）→メンテナンス用、固定IPアドレス（192.168.88.2/24）
- 無線LAN（wlan0）→インターネット接続用、DHCP
```

#追記（2020.01.21）
ネットワークやSSHの設定は`config`ディレクトリにある`config.exs`と`target.exs`どちらに記述しても問題なさそうです（記述方法も同じ）。今回は`config/config.exs`に記載することとします。

```
config/
  config.exs  ←今回はこちらに設定を記述
  target.exs
```


# 環境
- RaspberryPi 3
- Nerves


# やったこと
（注意）シェルはFishを使ってます。

```shell
~> mix nerves.new hello_nerves
~> cd hello_nerves
~> set -x MIX_TARGET rpi3
```

`mix.exs`に以下の設定を追記します。
`targets: @all_targets`がないとMacの環境でも構築しようとしてしまうようで`mix deps.get`した時にエラーが出るので注意です。

```elixir:mix.exs
 defp deps do
    [
      （略）
      # 追加
      {:nerves_network, "~> 0.5", targets: @all_targets},
    ]
  end
```

次に`config/config.exs`に以下の設定を追記します。

```elixir:config/config.exs
#
# ネットワーク設定
#
settings = [
  networks: [
    [ssid: "ここにSSIDを書く", psk: "ここに共通鍵を書く", key_mgmt: :"WPA-PSK", priority: 0,
      ipv4_address_method: :dhcp,
      nameservers: ["8.8.8.8", "8.8.4.4"]
    ]
  ]
]

config :nerves_network, default: [
  wlan0: settings,
  eth0: [
    ipv4_address_method: :static,
    ipv4_address: "192.168.88.2",
    ipv4_subnet_mask: "255.255.255.0"
  ]
]
```

設定が完了したらSDカードにイメージを焼きます。

```shell
~> mix deps.get
~> mix firmware
~> mix firmware.burn
```

ラズパイにマイクロSDを入れて起動します。
SSHの設定が完了していたらSSHでログインできます。

```shell
~> ssh 192.168.88.2

iex> Nerves.NetworkInterface.interfaces()
["lo", "eth0", "wlan0"]

iex> Nerves.NetworkInterface.settings("lo")
{:error, :einval}

iex> Nerves.NetworkInterface.settings("eth0")
{:ok,
 %{
   ipv4_address: "192.168.88.2",
   ipv4_broadcast: "192.168.88.255",
   ipv4_gateway: "",
   ipv4_subnet_mask: "255.255.255.0",
   mac_address: "b8:27:eb:86:17:d4"
 }}

iex> Nerves.NetworkInterface.settings("wlan0")
{:ok,
 %{
   ipv4_address: "192.168.46.18",
   ipv4_broadcast: "192.168.46.255",
   ipv4_gateway: "192.168.46.1",
   ipv4_subnet_mask: "255.255.255.0",
   mac_address: "b8:27:eb:d3:42:81"
 }}

iex> ping "192.168.88.1"
Press enter to stop
Response from 192.168.88.1 (192.168.88.1): time=0.977ms
Response from 192.168.88.1 (192.168.88.1): time=1.121ms
Response from 192.168.88.1 (192.168.88.1): time=0.942ms
Response from 192.168.88.1 (192.168.88.1): time=1.304ms

iex> ping "192.168.46.1"
Press enter to stop
Response from 192.168.46.1 (192.168.46.1): time=5.279ms
Response from 192.168.46.1 (192.168.46.1): time=4.923ms
Response from 192.168.46.1 (192.168.46.1): time=101.018ms
Response from 192.168.46.1 (192.168.46.1): time=4.867ms

iex> ping "www.yahoo.co.jp"
Press enter to stop
Response from www.yahoo.co.jp (182.22.25.124): time=1088.845ms
Response from www.yahoo.co.jp (182.22.25.124): time=68.058ms
Response from www.yahoo.co.jp (182.22.25.124): time=58.258ms
Response from www.yahoo.co.jp (182.22.25.124): time=65.927ms

iex> ping "www.google.co.jp"
Press enter to stop
Response from www.google.co.jp (172.217.31.131): time=54.336ms
Response from www.google.co.jp (172.217.31.131): time=69.777ms
Response from www.google.co.jp (172.217.31.131): time=61.431ms
Response from www.google.co.jp (172.217.31.131): time=63.747ms


名前引きはできているのに、なぜか"8.8.8.8"にはpingの応答がありませんでした。
iex> ping "8.8.8.8"
Press enter to stop
```


# まとめ
ラズパイにNervesをインストールして、有線LANはメンテナンス用として固定IPアドレスを設定、無線LANは運用系としてDHCPを設定してインターネット接続を確認できました。

実運用とメンテナンス用でネットワークを分けたい場合は参考になるのではないかと思います。

次はこの環境で、`mix firmware.gen.script`してできる`upload.sh`を使ってSSH経由のファームウェア更新をしてみます。


# 参考URL
[nerves-project/nerves_network - WiFi Networking Priority](https://github.com/nerves-project/nerves_network#wifi-networking-priority)