Intel Edisonでad-hoc Wi-Fiメッシュネットワークを構築する

Intel Edisonはチップ上にデュアルチャネルのWi-Fiモジュールを内蔵している。
通常はWi-Fiアクセスポイントにぶら下がる"infrastructureモード"が用いられるが、Wi-Fiアクセスポイントを介さずにWi-Fi機器どうしが直接通信する"ad-hocモード"で動作させることもできる。

このad-hocモードを用いて、複数のEdisonが参加するメッシュネットワークを構築し、適切なルーティング制御を行えば、Wi-Fiアクセスポイントが無くとも複数のEdisonが通信できる閉じたネットワークを構成することができる。

今回はメッシュネットワークの制御に[batman-adv](http://www.open-mesh.org/projects/batman-adv/wiki)を用いて、Edisonのad-hoc Wi-Fiメッシュネットワークの検証を行った。

# batman-advを導入したカーネルのビルド

以下の手順を参考に、batman-advを導入したカーネルをビルドする。
https://software.intel.com/en-us/blogs/2015/02/27/intel-edison-adding-kernel-modules-to-yocto-example-batman
（ビルドサーバのCPUとディスクI/O速度、及びネットワーク速度にもよるが、今回用いたビルドサーバではフルビルドに6時間程度要した）

ベースとなるカーネルコードは、2015/05/09時点で最新の**Intel Edison® Board Firmware Software Release 2.1**を用いる（[ココ](https://software.intel.com/en-us/iot/hardware/edison/downloads)を参照）。

## ビルドサーバの準備

| |バージョン|
|:--|:--|
|CPU|Intel(R) Core(TM)2 Duo CPU     E8500  @ 3.16GHz|
|Memory|7983MiB|
|Distribution|Ubuntu 15.04|
|Kernel|3.19.0-16-generic|

```text:必要なパッケージのインストール
nmatsui@develop:~$ sudo apt-get install build-essential git diffstat gawk chrpath texinfo libtool gcc-multilib u-boot-tools -y
```

```text:Edison用yoctoPJのソースコード取得
nmatsui@develop:~$ wget http://downloadmirror.intel.com/24910/eng/edison-src-ww18-15.tgz
nmatsui@develop:~$ tar xvfz edison-src-ww18-15.tgz 
nmatsui@develop:~$ cd edison-src/
```

## ビルド環境のセットアップ

`--bb_number_thread`と`--parallel_make`は、ビルドサーバのCPUコア数×2ぐらいを指定すると良い。
> `./meta-intel-edison/setup.sh`の内部で必要なモジュールをgit cloneしているため、Proxy環境下だと動作しない可能性がある。

```text:ビルド環境のセットアップ
nmatsui@develop:~/edison-src$ mkdir dl
nmatsui@develop:~/edison-src$ mkdir sst
nmatsui@develop:~/edison-src$ ./meta-intel-edison/setup.sh --dl_dir=./dl --sstate_dir=./sst --bb_number_thread=4 --parallel_make=4
nmatsui@develop:~/edison-src$ source poky/oe-init-build-env
```

## カーネルモジュールの選択

```text:BATMANの設定
nmatsui@develop:~/edison-src/build$ bitbake -c menuconfig virtual/kernel
```

上記コマンドを実行すると、別ウィンドウでカーネルモジュールの選択メニューが開く。
※ 別ウィンドウが開くまで少し時間がかかる

Networking support ---> Networking options ---> B.A.T.M.A.N. Advanced Meshing Protocol と遷移する。

![edison_kernel_build_01.png](https://qiita-image-store.s3.amazonaws.com/0/37648/4ccfc422-7f46-bf3d-9537-cebb8eb6aee4.png)
![edison_kernel_build_02.png](https://qiita-image-store.s3.amazonaws.com/0/37648/4dde92d4-6916-73be-252f-22a5df906906.png)
![edison_kernel_build_03.png](https://qiita-image-store.s3.amazonaws.com/0/37648/fe20ecbb-e9a8-5e34-205b-f19994d89cf3.png)

batman-advをローダブルモジュールとして組み込む。

* B.A.T.M.A.N. Advanced Meshing Protocolを`<M>`にする
    * Bridge Loop Avoidanceを`[*]`にする
    * Distributed ARP Tableを`[*]`にする
    * Network Codingを`[*]`にする
    * B.A.T.M.A.N. debuggingを`[*]`にする

※ `<M>`はローダブルモジュールとして組み込まれるという意味

![edison_kernel_build_04.png](https://qiita-image-store.s3.amazonaws.com/0/37648/a754c5fa-bbad-894a-f7d2-a6bf731cd31a.png)

< SAVE > で.configに上書き保存した後、3回 < Exit > するとメニューが終了する。

![edison_kernel_build_05.png](https://qiita-image-store.s3.amazonaws.com/0/37648/0ae941d2-35ac-81d1-0da8-8c7f28a1a5d8.png)
![edison_kernel_build_06.png](https://qiita-image-store.s3.amazonaws.com/0/37648/96876a40-c8fd-f717-6105-17765f2f9eb1.png)

`./tmp/work/edison-poky-linux/linux-yocto/<your current kernel>/linux-edison-standard-build/`以下の.config.oldと.configのdiffを取ると、メニュー画面で設定したbatman-advの設定項目が変更されていることがわかる。

```diff
--- .config.old	2015-05-08 22:35:47.828091117 +0900
+++ .config	2015-05-08 22:45:47.654645792 +0900
@@ -925,7 +925,11 @@
 CONFIG_NET_SCH_FIFO=y
 # CONFIG_DCB is not set
 CONFIG_DNS_RESOLVER=y
-# CONFIG_BATMAN_ADV is not set
+CONFIG_BATMAN_ADV=m
+CONFIG_BATMAN_ADV_BLA=y
+CONFIG_BATMAN_ADV_DAT=y
+CONFIG_BATMAN_ADV_NC=y
+CONFIG_BATMAN_ADV_DEBUG=y
 # CONFIG_OPENVSWITCH is not set
 # CONFIG_VSOCKETS is not set
 # CONFIG_NETLINK_MMAP is not set
```

## カーネルモジュールのビルド

Edisonのカーネルモジュールをビルドする。

```text:.configをrecipes-kernelのdefconfigコピー
nmatsui@develop:~/edison-src/build$ mv ../meta-intel-edison/meta-intel-edison-bsp/recipes-kernel/linux/files/defconfig ../meta-intel-edison/meta-intel-edison-bsp/recipes-kernel/linux/files/defconfig.old
nmatsui@develop:~/edison-src/build$ cp tmp/work/edison-poky-linux/linux-yocto/3.10.17+gitAUTOINC+6ad20f049a_c03195ed6e-r0/linux-edison-standard-build/.config ../meta-intel-edison/meta-intel-edison-bsp/recipes-kernel/linux/files/defconfig
```

```text:カーネルモジュールのビルド
nmatsui@develop:~/edison-src/build$ bitbake -c compile_kernelmodules virtual/kernel
```

## batctlのインストールパッケージのビルド

batman-advのコマンドラインユーティリティ`batctl`はopkgでインストールできないため、[ココ](
https://github.com/openembedded/openembedded/blob/master/recipes/batctl/batctl.inc)で公開されているrecipeを元に、 http://www.open-mesh.org で公開されているbatctlのソースを取得してEdison用にビルドするrecipeを作成する。

recipeの名前から取得するモジュールのバージョンが決まる。2015/05/09時点で最新のbatctlは`batctl-2015.0.tar.gz`なので、recipeの名前を`batctl_2015.0.bb`にする。

```text:recipeのディレクトリ作成
nmatsui@develop:~/edison-src/build$ mkdir ../meta-intel-edison/meta-intel-edison-distro/recipes-support/batman/
```
```text:batctlのrecipe作成
nmatsui@develop:~/edison-src/build$ vi ../meta-intel-edison/meta-intel-edison-distro/recipes-support/batman/batctl_2015.0.bb
```

```bash:batctl_2015.0.bb
DESCRIPTION = "Control application for B.A.T.M.A.N. routing protocol kernel module for multi-hop ad-hoc mesh networks."
HOMEPAGE = "http://www.open-mesh.net/"
SECTION = "console/network"
PRIORITY = "optional"

LICENSE = "GPLv2+"
LIC_FILES_CHKSUM = "file://../license-destdir/${PN}/generic_GPLv2;md5=801f80980d171dd6425610833a22dbe6"

RDEPENDS_${PN} = "kernel-module-batman-adv"
DEPENDS = "libnl"

SRC_URI = "http://downloads.open-mesh.net/batman/stable/sources/batctl/batctl-${PV}.tar.gz\
     file://patch.patch"
SRC_URI[md5sum] = "d28ad89d71888ad6b99a1f6b30c9d47c"
SRC_URI[sha256sum] = "634d91189f96bda6d4ce6179dce90ad578566f29d3111b49d6e775d4f3591f04"

EXTRA_OEMAKE = 'STAGING_INC="${STAGING_INC}"'

do_compile() {
  oe_runmake
}

do_install() {
  install -d ${D}${bindir}
  install -m 0755 batctl ${D}${bindir}
}
```

ただしopen-mesh.orgで公開されているソースコードそのままでは、Edison用にビルドできないため、Makefileのpatchも作成しておく。

```text:recipeのディレクトリ作成
nmatsui@develop:~/edison-src/build$ mkdir ../meta-intel-edison/meta-intel-edison-distro/recipes-support/batman/files
```
```text:batctlのMakefileのpatch作成
nmatsui@develop:~/edison-src/build$ vi ../meta-intel-edison/meta-intel-edison-distro/recipes-support/batman/files/patch.patch
```

```diff:patch.patch
--- a/Makefile	2015-05-08 23:26:31.973042073 +0900
+++ b/Makefile	2015-05-08 23:27:21.456806172 +0900
@@ -29,7 +29,7 @@
 MANPAGE = man/batctl.8
 
 # batctl flags and options
-CFLAGS += -Wall -W -std=gnu99 -fno-strict-aliasing -MD -MP
+CFLAGS += -Wall -W -std=gnu99 -fno-strict-aliasing -MD -MP -I${STAGING_INC}/libnl3
 CPPFLAGS += -D_GNU_SOURCE
 LDLIBS += -lm
 
```
※ patch.patchの末尾に空白行が1行入っていることに注意。

次のコマンドでパッケージをビルドすると、`tmp/deploy/ipk/core2-32/batctl_2015.0-r0_core2-32.ipk`としてbatctlのインストールパッケージが生成される。

```text:batctlパッケージのビルド
nmatsui@develop:~/edison-src/build$ bitbake batctl
```

## Edisonのカーネルイメージのビルド

次に、Edisonに焼きこむカーネルイメージ全体をビルドする。
※ 非常に時間がかかるので注意

```text:Edisonのカーネルイメージをビルド
nmatsui@develop:~/edison-src/build$ bitbake edison-image
```

なお自動的にFetchできないモジュールがあった場合、以下のようなエラーが表示される。

```text:Fetch失敗時のエラーメッセージ
ERROR: Function failed: Fetcher failure for URL: 'http://downloads.sourceforge.net/swig/swig-3.0.5.tar.gz'. Unable to fetch URL from any source.
```

この場合、以下のように当該ファイルを事前Fetchしておくことでエラーを回避できる。

1. 当該ファイルをマニュアルでダウンロードする
2. ビルド環境のセットアップ（`./meta-intel-edison/setup.sh`）時に`--dl_dir`で指定したディレクトリに配置する
3. 同じディレクトリにダウンロード完了ファイル（*.done）をtouchする

## Edisonへ焼き込むカーネルイメージの準備

最後に、ビルドしたカーネルイメージをtoFlashディレクトリにまとめる。

```text:カーネルイメージの準備
nmatsui@develop:~/edison-src/build$ ../meta-intel-edison/utils/flash/postBuild.sh
```

`toFlash/package-list.txt`を見れば、カーネルモジュールにbatman-advが含まれていることが確認できる。

```text:batman-advがカーネルモジュールに含まれていることを確認
nmatsui@develop:~/edison-src/build$ grep "batman-adv" toFlash/package-list.txt 
kernel-module-batman-adv 3.10.17+git0+6ad20f049a_c03195ed6e-r0
```

# Edisonの準備

ad-hoc Wi-Fiメッシュネットワークを組むすべてのEdisonで、この章の作業を行う。

## カーネルの焼き込み

Edisonの給電USBポートをビルドサーバーに接続すると、Edisonのmass-storageが`/media/<user name>/Edison`にマウントされる。toFlashディレクトリの中身すべてを、マウントされたディレクトリへコピーする。
※ 過去に転送したカーネルイメージがある場合、事前にすべて削除する

```text:カーネルイメージの転送
nmatsui@develop:~/edison-src/build$ rm -rf /media/nmatsui/Edison/*
nmatsui@develop:~/edison-src/build$ cp -r ./toFlash/* /media/nmatsui/Edison/
```

リモートコンソールUSBポート経由でEdisonにシリアル接続し、転送したカーネルイメージをEdisonへ焼き込む。

```text:カーネルイメージの焼き込み
nmatsui@develop:~$ sudo screen /dev/ttyUSB0 115200
root@edison:~# reboot ota
```

## ビルドサーバのusb0デバイスの準備

給電USBポート経由でSCPできるように、ビルドサーバのusb0デバイスにEdisonのusb0デバイスと同じネットワーク（192.168.2.0/24）に所属するIPアドレスを与える。

```text:usb0デバイスの設定
nmatsui@develop:~/edison-src/build$ sudo ip addr add 192.168.2.2/24 dev usb0
nmatsui@develop:~/edison-src/build$ sudo ip addr show usb0
14: usb0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN group default qlen 1000
    link/ether b6:04:bc:f9:d0:e8 brd ff:ff:ff:ff:ff:ff
    inet 192.168.2.2/24 scope global usb0
       valid_lft forever preferred_lft forever
    inet6 fe80::b404:bcff:fef9:d0e8/64 scope link 
       valid_lft forever preferred_lft forever
```

## Edisonの初期設定

### パスワード・ホスト名・Wi-Fiの設定
パスワード、ホスト名、及びWi-Fiを設定する。
ad-hoc Wi-Fiメッシュネットワークに参加するすべてのEdisonで、ホスト名が重複しないように注意すること。

```text:edisonの初期設定
root@edison:~# configure_edison --setup
```

### パッケージアップデート

インターネットに接続できるWi-Fiアクセスポイントに接続しているうちに、Edisonのパッケージをアップデートする。

```text:base-feedを設定
root@edison:~# echo 'src/gz all http://repo.opkg.net/edison/repo/all' >> /etc/opkg/base-feeds.conf 
root@edison:~# echo 'src/gz edison http://repo.opkg.net/edison/repo/edison' >> /etc/opkg/base-feeds.conf 
root@edison:~# echo 'src/gz core2-32 http://repo.opkg.net/edison/repo/core2-32' >> /etc/opkg/base-feeds.conf
```

```text:パッケージアップデート
root@edison:~# opkg update
root@edison:~# opkg upgrade
```

### batctlのインストール

ビルドサーバからusb0経由でbatctlパッケージをSCPし、インストールする。

```text:Edisonのusb0デバイスのIPアドレス確認
root@edison:~# ip addr show usb0
4: usb0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000
    link/ether 02:00:86:93:53:62 brd ff:ff:ff:ff:ff:ff
    inet 192.168.2.15/24 brd 192.168.2.255 scope global usb0
       valid_lft forever preferred_lft forever
    inet6 fe80::86ff:fe93:5362/64 scope link 
       valid_lft forever preferred_lft forever
```

```text:ビルドサーバからipkをSCP
nmatsui@develop:~/edison-src/build$ scp ./tmp/deploy/ipk/core2-32/batctl_2015.0-r0_core2-32.ipk root@192.168.2.15:/tmp
```

```text:batctlインストール
root@edison:~# opkg install /tmp/batctl_2015.0-r0_core2-32.ipk 
```

## Edisonの停止

Edisonを停止し、ビルドサーバから給電USBポートとリモートコンソールUSBポートの接続を外す。以降、給電USBポートはビルドサーバへ接続する必要はなく、電池などから給電すれば良い。

```text:reboot
root@edison:~# shutdown -h now
```

# ad-hoc Wi-Fiメッシュネットワークの構築

Edisonを起動してシリアル接続し、ad-hoc Wi-Fiメッシュネットワークの設定を行う。

今回はArduino BoardのEdison（edison01）とBreakout BoardのEdison（edison02）という2台のEdisonで実験した。
※ Edisonチップに内蔵されたWi-Fiモジュールを利用しているだけなので、Boardの差異に意味はない

|ホスト名|batman-advが与えたIPv6アドレス|自分で与えたIPv4アドレス|
|:--|:--|:--|
|edison01|fe80::7400:b5ff:fed4:7b91/64|10.0.0.1/24|
|edison02|fe80::0430:58ff:feeb:3415/64|10.0.0.2/24|

## batman-advカーネルモジュールをロード

```text:batman-advをロード
root@edison01:~# lsmod | grep batman
root@edison01:~# modprobe batman-adv
root@edison01:~# lsmod | grep batman
batman_adv            145288  0 
root@edison01:~# modinfo batman-adv
filename:       /lib/modules/3.10.17-yocto-standard/kernel/net/batman-adv/batman-adv.ko
version:        2013.2.0
description:    B.A.T.M.A.N. advanced
author:         Marek Lindner <lindner_marek@yahoo.de>, Simon Wunderlich <siwu@hrz.tu-chemnitz.de>
license:        GPL
srcversion:     66711903985B5CAAE0DAF30
depends:        
intree:         Y
vermagic:       3.10.17-yocto-standard SMP preempt mod_unload ATOM 
```

> modinfoで表示されるバージョン番号や、lsmodで表示される"batman_adv"というアンダーバーになっているモジュール名がどこから来たのかは謎。。。

## Wi-Fiをad-hocモードに変更

EdisonのWi-Fiをad-hocモードに変更する。
周波数帯とssidを一致させ、modeをad-hocにし、公開APかつ認証無しという設定にしなければ、ad-hoc接続できない。
（EdisonのWi-Fiモジュールの詳細は、[Intel edison Wi-Fi Guide](http://download.intel.com/support/edison/sb/edison_wifi_331438001.pdf)を参照）

```text:再起動直後の状態
root@edison01:~# ip addr show wlan0
3: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000
    link/ether 78:4b:87:a0:18:fd brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.9/24 scope global wlan0
       valid_lft forever preferred_lft forever

root@edison01:~# wpa_cli status
Selected interface 'wlan0'
bssid=1c:b1:7f:e2:de:96
ssid=XXXXXXXX
id=0
mode=station
pairwise_cipher=CCMP
group_cipher=CCMP
key_mgmt=WPA2-PSK
wpa_state=COMPLETED
ip_address=192.168.0.9
p2p_device_address=7a:4b:87:a0:18:fd
address=78:4b:87:a0:18:fd
```

```text:Wi-Fi(wlan0)の設定変更
root@edison01:~# wpa_cli -iwlan0 disconnect
OK
root@edison01:~# wpa_cli -iwlan0 remove_network all
OK
root@edison01:~# wpa_cli -iwlan0 add_network
0
root@edison01:~# wpa_cli -iwlan0 set_network 0 frequency 2412
OK
root@edison01:~# wpa_cli -iwlan0 set_network 0 mode 1
OK
root@edison01:~# wpa_cli -iwlan0 set_network 0 ssid \"batman\"
OK
root@edison01:~# wpa_cli -iwlan0 set_network 0 auth_alg OPEN
OK
root@edison01:~# wpa_cli -iwlan0 set_network 0 key_mgmt NONE
OK
root@edison01:~# wpa_cli -iwlan0 set_network 0 scan_ssid 1
OK
root@edison01:~# wpa_cli -iwlan0 select_network 0
OK
root@edison01:~# wpa_cli -iwlan0 enable_network 0
OK
```

```text:Wi-Fiをad-hocにした状態
root@edison01:~# ip addr show wlan0
3: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000
    link/ether 78:4b:87:a0:18:fd brd ff:ff:ff:ff:ff:ff

root@edison01:~# wpa_cli status
Selected interface 'wlan0'
bssid=02:6f:13:7a:9b:d3
ssid=batman
id=0
mode=IBSS
pairwise_cipher=NONE
group_cipher=NONE
key_mgmt=NONE
wpa_state=COMPLETED
p2p_device_address=7a:4b:87:a0:18:fd
address=78:4b:87:a0:18:fd
```

## メッシュネットワーク構築

batctlを用い、wlan0のad-hocネットワーク上にメッシュネットワークを構築する。

```text:batman-adv起動
root@edison01:~# batctl if add wlan0
root@edison01:~# ip link set dev bat0 up
```

```text:batman-advを起動した状態
root@edison01:~# ip addr show bat0
5: bat0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue 
    link/ether 76:00:b5:d4:7b:91 brd ff:ff:ff:ff:ff:ff
    inet6 fe80::7400:b5ff:fed4:7b91/64 scope link 
       valid_lft forever preferred_lft forever
```

上記の作業を1台目のEdison（edison01）で実行すると、batman-advにより仮想デバイス **bat0** が構成され、リンクローカルのIPv6アドレス **fe80::7400:b5ff:fed4:7b91/64** が自動的に与えらた。

ただしbatman-advはIPv4アドレスを自動で与えないため、今回は手作業で**10.0.0.1/24**のIPv4アドレスを与えた。

```text:IPv4アドレスの付与
root@edison01:~# ip addr add 10.0.0.1/24 dev bat0
root@edison01:~# ip addr show bat0
5: bat0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue 
    link/ether 76:00:b5:d4:7b:91 brd ff:ff:ff:ff:ff:ff
    inet 10.0.0.1/24 scope global bat0
       valid_lft forever preferred_lft forever
    inet6 fe80::7400:b5ff:fed4:7b91/64 scope link 
       valid_lft forever preferred_lft forever
```

同様の作業を2台目のEdison（edison02）でも実行し、ad-hoc Wi-Fiメッシュネットワーク上で**fe80::0430:58ff:feeb:3415/64**と**10.0.0.2/24**のアドレスが与えられた。

# 接続検証

ここまでで、ad-hoc Wi-Fiメッシュネットワークにedison01とedison02が接続されたので、接続確認を行う。

## edison01
### 自身のbat0 IPv6アドレスへping

```text
root@edison01:~# ping -c 3 fe80::7400:b5ff:fed4:7b91
PING fe80::7400:b5ff:fed4:7b91 (fe80::7400:b5ff:fed4:7b91): 56 data bytes
64 bytes from fe80::7400:b5ff:fed4:7b91: seq=0 ttl=64 time=0.260 ms
64 bytes from fe80::7400:b5ff:fed4:7b91: seq=1 ttl=64 time=0.274 ms
64 bytes from fe80::7400:b5ff:fed4:7b91: seq=2 ttl=64 time=0.271 ms

--- fe80::7400:b5ff:fed4:7b91 ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 0.260/0.268/0.274 ms
```

### 自身のbat0 IPv4アドレスへping

```text
root@edison01:~# ping -c 3 10.0.0.1
PING 10.0.0.1 (10.0.0.1): 56 data bytes
64 bytes from 10.0.0.1: seq=0 ttl=64 time=0.252 ms
64 bytes from 10.0.0.1: seq=1 ttl=64 time=0.226 ms
64 bytes from 10.0.0.1: seq=2 ttl=64 time=0.227 ms

--- 10.0.0.1 ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 0.226/0.235/0.252 ms
```

### 自身のmulticast DNS名にping

Intel Edison Board Firmware Software Release 2.1のカーネルは、デフォルトでmulticst DNSが動作するため、<ホスト名>.localでも各Edisonに接続できるはず。

```text
root@edison01:~# ping -c 3 edison01.local
PING edison01.local (10.0.0.1): 56 data bytes
64 bytes from 10.0.0.1: seq=0 ttl=64 time=0.211 ms
64 bytes from 10.0.0.1: seq=1 ttl=64 time=0.227 ms
64 bytes from 10.0.0.1: seq=2 ttl=64 time=0.230 ms

--- edison01.local ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 0.211/0.222/0.230 ms
```

### edison02のbat0 IPv6アドレスへping

```text
root@edison01:~# ping -c 3 fe80::0430:58ff:feeb:3415
PING fe80::0430:58ff:feeb:3415 (fe80::430:58ff:feeb:3415): 56 data bytes
64 bytes from fe80::430:58ff:feeb:3415: seq=0 ttl=64 time=22.225 ms
64 bytes from fe80::430:58ff:feeb:3415: seq=1 ttl=64 time=21.356 ms
64 bytes from fe80::430:58ff:feeb:3415: seq=2 ttl=64 time=30.626 ms

--- fe80::0430:58ff:feeb:3415 ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 21.356/24.735/30.626 ms 
```

### edison02のbat0 IPv4アドレスへping

```text
root@edison01:~# ping -c 3 10.0.0.2 
PING 10.0.0.2 (10.0.0.2): 56 data bytes
64 bytes from 10.0.0.2: seq=0 ttl=64 time=9.282 ms
64 bytes from 10.0.0.2: seq=1 ttl=64 time=8.884 ms
64 bytes from 10.0.0.2: seq=2 ttl=64 time=18.188 ms

--- 10.0.0.2 ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 8.884/12.118/18.188 ms
```

### edison02のmulticast DNS名にping

```text
root@edison01:~# ping -c 3 edison02.local
PING edison02.local (10.0.0.2): 56 data bytes
64 bytes from 10.0.0.2: seq=0 ttl=64 time=42.641 ms
64 bytes from 10.0.0.2: seq=1 ttl=64 time=37.797 ms
64 bytes from 10.0.0.2: seq=2 ttl=64 time=41.481 ms

--- edison02.local ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 37.797/40.639/42.641 ms
```

## edison02
### 自身のbat0 IPv6アドレスへping

```text
root@edison02:~# ping -c 3 fe80::0430:58ff:feeb:3415
PING fe80::0430:58ff:feeb:3415 (fe80::430:58ff:feeb:3415): 56 data bytes
64 bytes from fe80::430:58ff:feeb:3415: seq=0 ttl=64 time=0.261 ms
64 bytes from fe80::430:58ff:feeb:3415: seq=1 ttl=64 time=0.273 ms
64 bytes from fe80::430:58ff:feeb:3415: seq=2 ttl=64 time=0.273 ms

--- fe80::0430:58ff:feeb:3415 ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 0.261/0.269/0.273 ms
```

### 自身のbat0 IPv4アドレスへping

```text
root@edison02:~# ping -c 3 10.0.0.2
PING 10.0.0.2 (10.0.0.2): 56 data bytes
64 bytes from 10.0.0.2: seq=0 ttl=64 time=0.255 ms
64 bytes from 10.0.0.2: seq=1 ttl=64 time=0.227 ms
64 bytes from 10.0.0.2: seq=2 ttl=64 time=0.228 ms

--- 10.0.0.2 ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 0.227/0.236/0.255 ms
```

### 自身のmulticast DNS名にping

```text
root@edison02:~# ping -c 3 edison02.local
PING edison02.local (10.0.0.2): 56 data bytes
64 bytes from 10.0.0.2: seq=0 ttl=64 time=0.193 ms
64 bytes from 10.0.0.2: seq=1 ttl=64 time=0.227 ms
64 bytes from 10.0.0.2: seq=2 ttl=64 time=0.225 ms

--- edison02.local ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 0.193/0.215/0.227 ms
```

### edison01のbat0 IPv6アドレスへping

```text
root@edison02:~# ping -c 3 fe80::7400:b5ff:fed4:7b91
PING fe80::7400:b5ff:fed4:7b91 (fe80::7400:b5ff:fed4:7b91): 56 data bytes
64 bytes from fe80::7400:b5ff:fed4:7b91: seq=0 ttl=64 time=42.838 ms
64 bytes from fe80::7400:b5ff:fed4:7b91: seq=1 ttl=64 time=17.808 ms
64 bytes from fe80::7400:b5ff:fed4:7b91: seq=2 ttl=64 time=50.349 ms

--- fe80::7400:b5ff:fed4:7b91 ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 17.808/36.998/50.349 ms
```

### edison01のbat0 IPv4アドレスへping

```text
root@edison02:~# ping -c 3 10.0.0.1
PING 10.0.0.1 (10.0.0.1): 56 data bytes
64 bytes from 10.0.0.1: seq=0 ttl=64 time=40.028 ms
64 bytes from 10.0.0.1: seq=1 ttl=64 time=39.172 ms
64 bytes from 10.0.0.1: seq=2 ttl=64 time=38.162 ms

--- 10.0.0.1 ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 38.162/39.120/40.028 ms
```

### edison01のmulticast DNS名にping

```text
root@edison02:~# ping -c 3 edison01.local
PING edison01.local (10.0.0.1): 56 data bytes
64 bytes from 10.0.0.1: seq=0 ttl=64 time=32.154 ms
64 bytes from 10.0.0.1: seq=1 ttl=64 time=3.124 ms
64 bytes from 10.0.0.1: seq=2 ttl=64 time=16.178 ms

--- edison01.local ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 3.124/17.152/32.154 ms
```

# まとめ

Intel EdisonのWi-Fiモジュールをad-hocモードで動作させ、batman-advを用いることで、ad-hoc Wi-Fiメッシュネットワークを動作させることができた。

> 本来は4台以上のEdisonでメッシュネットワークを構築し、Wi-Fiが直接届かない両端のEdison間でも問題なく接続できることや、途中のEdisonに障害が起きても適切にルーティングされることなども検証したいのだが、そんなにたくさんのEdisonが手元に無い・・・

この技術をうまく活用すれば、Wi-Fiアクセスポイントの維持管理に煩わさせられることなく、Intel EdisonをIPネットワーク化し活用することができると思われる。