TWE-LiteをArduinoIDEで使ってIPv6(6LoWPAN)で通信する。

[前の記事](http://qiita.com/soburi/items/0b0aa3d0c4332a5e7a4c)の続きです。
例によってクオリティはアレですが、
あまり愚図愚図寝かしておいても仕方ないんでとりあえずアウトプット。

What's new?
=============
* IPv6(6LoWPAN)に対応しました。APIはArduinoのEthernet APIとほぼ互換で使えます。
* 6lowpan対応に伴い、[Contiki](http://contiki-os.org/)に乗っかる実装に作り替えています。

改めて、これはなに？
==================
わかりづらいと定評のある(ｗ TWE-Liteの開発環境を回避して、Arduinoの開発環境でTWE-Lite(NXP JN516x)のプログラムを作成するためのArduino向けのプラグイン・パッケージです。
Contikiの開発版に[JN516x向けの実装](https://github.com/contiki-os/contiki/tree/master/platform/jn516x)が取り込まれたので、これを利用してIPv6(6LoWPAN)機能を実装しています。
(つまり、TWE-Lite向けのArduino互換実装というよりも**Contiki向けのArduino互換実装**)

インストール
==========
NXPのサイトからJN516x向けの開発環境、SDKなどをダウンロードしてインストールします。
インストール先はデフォルトのままとしてください。

* [BeyondStudio for NXP](http://cache.nxp.com/documents/other/JN-SW-4141.zip)
* [JN516x IEEE 802.15.4 SDK](http://cache.nxp.com/documents/other/JN-SW-4163.zip)
* [JN51xx Producton Flash Programmer](http://cache.nxp.com/documents/other/JN-SW-4107.zip)

Arduinoは1.6.7版以降が対象です。
ArduinoのBoardsManagerからパッケージをインストールします。

[環境設定] → [Additional Boards Manager URLs:] に
[http://soburi.github.io/JN516x-arduino-package/package_soburi_intiki_index.json](http://soburi.github.io/JN516x-arduino-package/package_soburi_intiki_index.json)
を設定。

[ツール] → [ボード]→[BoardsManager...] を開いてJN516x Boards をインストールします。

一回目のコンパイル時にパッケージの一部をダウンロードする仕掛けになっています。
初回のコンパイルで止まっても慌てないよう。
proxy越えだとハマるかもしれません。gitのsubmoduleをダウンロードしているので、
通信できない場合は、リポジトリに倣ってフォルダを構成してください。

動かしてみる
==========

基本動作
-----------
[前の記事](http://qiita.com/soburi/items/0b0aa3d0c4332a5e7a4c)がそのまま使えます。
通信(uIP)については添付のサンプルを参照ください。
ビルドやアップロードは通常のArduino相当の操作で行えます。
[TWE-LiteR](http://mono-wireless.com/jp/products/TWE-Lite-R/)はArduinoが持っているシリアル接続時の
自動リセット機能を持っていないので、この機能を持ったライターを自作すると、よりArduinoに近い使い勝手になります。

6LoWPAN, uIPについて
----------------
このパッケージではContikiのuIP(Micro-IP)を使って、6LoWPANによる通信が行えます。
6LoWPANはIPv6の通信を低帯域・低消費電力の環境で行うための通信規格で、
IPv6のパケットを適当に切り詰めて通信します。
したがって、IPv6と基本的に同じように扱えますが、パケットのペイロードのサイズ
みたいなところで扱い方に差があります。
パブリックなネットワークとはBorder-Routerが6LoWPAN <-> IPv6の変換を行って中継します。
6LoWPANはIPv6として必要な情報を保持しているので透過的に扱えます。
別の観点で言えば、6LoWPANが接続できるのはIPv6のネットワークなので、**IPv4のネットワークにはつながりません**。
(多分このソフトウェアを使う上で最大のネックになります。)

Edge-to-Edgeの通信
---------------------------
Border-Routerを置かずにTWE-Lite同士を通信させる場合は、
RPLルーターを通信の親側としてセットアップすることで実現できます。

RPLルーターは、

```
RPL.begin(prefix);
```

で起動できます。

ローカルでの名前の通知もできるので、RPLルーター側で、

```
MicroIP.setHostname("echo-server");
```

クライアント側からは

```
client.connect("echo-server.local", 7);
```

みたいな形で名前解決ができます。
あとは普通に通信すればOK.

Border-Routerのセットアップ
---------------------------------------
一般的な6LoWPANのネットワークでは外部のネットとの境界にBorder-Routerを
置いて接続します。
![border-router.png](https://qiita-image-store.s3.amazonaws.com/0/90349/f14b2e45-5c02-5f3e-6f93-745c44ded505.png)


Border-RouterはContikiのサンプルに含まれており、これを使います。
とりあえず、[バイナリ置いておきます](https://dl.dropboxusercontent.com/u/498101/border-router.jn516x.bin)。

IPv6側への接続はSLIP(!)を経由して接続します。
Linuxを使うので、Linux側のプログラムをコンパイルします。

```
cd tools
make tunslip6
```

rpl-border-routerを焼きこんだTWE-LiteをLinuxにつないで、

```
sudo ./tunslip6 -v5 -B 1000000 -s /dev/ttyUSB0 aaaa::1/64
```

とすると、Border-Routerに対してtun0を介して通信ができます。
外部のネットと通信する場合にはルーティングの設定を行う必要があります。
この辺はIPv6の一般的な設定を参照してください。

```
Server IPv6 addresses:
 aaaa::～:～:～:～
 fe80::～:～:～:～
```

のようにコンソールに表示されているのがBorder-Routerのv6-addressになります。
簡易HTTPDが動いているので、ホストからブラウザでアクセスして動作を確認
できます。

### Border-Routerのビルド

JN516x向けにContikiのrpl-border-routerをビルドするにはいくつかハマりどころがあります。

* 3ff44f77 のsleep対応が入ると動作が怪しい
* 3ff44f77  以前の版はBorder-Routerのhardware-flowcontrolの設定がおかしい。

なので、3ff44f77以前の版に[こんなパッチ](https://github.com/soburi/contiki/commit/832221d9bbd6032e46d7ac54bb197ac2818ab2d5)を当てて、

```
cd example/ipv6/rpl-border-router
make -j4 TARGET=jn516x CHIP=JN5164 JN516x_WITH_DR1174=1
```

のようにしてビルドします。

注意事項等
=========

* loop()内での無限ループ禁止!

Contikiをバックエンドとして組み込んだため、IP通信の機能を含めて、
バックグラウンドでプロセスが走っています。このため、loop()でCPUを握ってしまうと
バックグラウンドの処理が止まるので異常動作します。これを回避するためには、
ループの内でyield()を実行してください。 loop()が十分短い時間で完了する場合は
loop()の実行後にバックグラウンドプロセスにCPU時間を割り当てるので特に問題ありません。


よくありそうな質問
=================
- Q1. ちゃんと動きますか？

- A1. 現状、ドッグフード愛好家向けの提供となっております。

- Q2. Windows以外の環境は？

- A2. コンパイラがWindowsしか提供されてないんで、現状諦めモード。

* * * * * * * * * * * *

このパッケージではArduino環境から6LoWPANを使った通信が行えますが、
BLE機能付きのArduino互換機と比べるといくつかの点で特性が異なります。

特に大きいのは対向機の制約から、**スマホ連携が実質的に不可能** というのが最も
大きな違いとなります。逆に、IPv6を直接喋るので **クラウド連携は得意** になります。
元々PC周辺機器の接続から発展してきたBluetoothと、
FA用途に近いところからきている802.15.4の違いとも言えるかと思います。

また、記事中でも記載しておりますが、IPv6のネットワーク環境が必要となります。
6LoWPANはIPv6の「様々な機器が直接インターネットに接続される」という初期のヴィジョンの
直接的な実現となっているので、この点では時代がようやく追いついた感じはあるのですが、
プロバイダの対応状況などから言えば、まだ時代の3歩先を行くことになるので苦労する箇所になると思われます。

この辺の用途・適応を間違って使ってしまうと、きっと残念な結果になるかと思いますので、
ご理解いただいた上で遊んでいただけると幸いです。

内部実装などについてはまた改めて記事を起こします。