6LoWPAN Ubuntu VM Image

This is “How to use 6LoWPAN(IPv6 over Bluetooth) on VMware Player Ubuntu LTS image”. 6LoWPAN is already included in linux kernel tree(net/bluetooth/6lowpan.c), and Nordic nRF51 IoT SDK is using Raspbian kernel for Raspberry Pi Linux kernel 3.17.4 as IPv6 gateway, but hardware(RPi) is needed if want to try the 6LoWPAN. so I build lastest Linux kernel 3.18.4 for Ubuntu 14.04 LTS, and use VMware Player instead of the Raspberry Pi. Even if you don’t have RPi, can use the 6LoWPAN!!

I use Nordic nRF51822(Red bear BLE nano: ARM Cortex-M0 SoC plus Bluetooth 4.1 Low Energy), and Bluetooth USB Dongle(Bluetooth4.0+EDR/LE), nRF51 IoT SDK, like a following.

10862688_10152620809478244_1586043961207219424_o

1. download the Ubuntu Linux VM player image from my website.
Ubuntu_14.04.1_LTS_64bit_Kernel_3.18.3.zip

2. Run VMware Player
In my case, I use Windows7 VMware Player. This Ubuntu Linux 14.04.1 user and password is “ubuntu/ubuntu”. Linux Kernel is already updated to 3.18.4.

3. connect Bluetooth Dongle to the PC, check the Bluetooth dongle and VM Linux connection on VMware Player dialog.

3. config the 6lowpan and check the ping6 on VMware.

If want to build the linux kernel, check the “/boot/config-3.18.3” linux kernel build file. Maybe it’s easy to develop the linux 6lowpan kernel module by using the VM linux.

KoshianとWICEDでサクサク開発

Nordicに夢中になっていたけど、mpressionで980円で売っている、ユカイ工学さんのKonashi互換のKoshianを触り始めた。

スペックはBroadcomのBluetooth Smart SiP BCM20737(ARM Cortex M3, Bluetooth 4.1, アンテナ付き)が載っている。ぶっちゃけこれだけで、十分すぎるほど使える。めちゃ小さいし、お手頃感が半端ない。Konashiはこんな感じ。

Konashi互換という事で、JSとかSDKからも普通に触れる。小型拡張ボードとくっ付けるて、ブレッドボードに挿した感じは。

良い感じに収まりますな。これでブレッドボードを使った遊びもサクサクできるし、これはこれで便利。
ただ、Konashiの他にもBroadcom WICEDを使ってFirmwareを直接変えて使えるというのが、この子の素敵なところ。方法はこちらのGetting Startに書いてある通りで、何の問題もなく使える。

唯一センシティブなのが、debug用の端子にハンダする時は、めっちゃ小さいから上手くやる必要がある。どんどん物が小さくなってきて、手がちょっとプルプルするよwww

こんな感じでdebugの端子にはんだ付けして、自分はsparkfunの3.3V FTDIがあったからそこに挿して使える。元の拡張ボードに挿しても良い。ただ、Firmwareを上書きすると元のKonashiには引き返せなくなるという点は注意が必要。

んでWICEDのSDK(というかEclipse)を使って、直接BCM20737に書き込んで使える。コードは普通のC言語だから誰でも書けるはず。iPhoneから接続した図。LightBlue Beanのアプリが確認では便利に使えるかも。全然別の物向けだけどねw

“ipv6 over bt”って見えるのがKoshian(BCM20737)。この上でIPv6を動かす暴挙をしようと(現時点では6LoWPANをKoshianの上ではまだ動かせていないです。ipv6 over btプロジェクトを作ってみたものの、WICED 2.2 SDKにある、l2capライブラリが6lowpanのpacket flow controlに対応していないようで、なんとか自作しないと現時点ではサクッとは無理ですねぇ)。うまくいったら、Nordic側とIPv6でBluetooth上で疎通できたらオモシロという謎の事をしようとしている。まぁ、恐らくチップ間での相互互換とかどうせ発生するだろうし、発生しなくても繋げられたら面白いじゃん!!ってことで。最終的には、ケータイ(iPhone/Android)にアプリを入れて、ケータイをGatewayにしてIPv6網に抜けていく感じを想定している。Koshianと6LoWPANで疎通するのは、Nordicの時に作ったVM上のUbuntu

How to use 6LoWPAN on VMware Ubuntu Linux in MacOS

Raspberry Piを使って6LoWPANを試していたけど、ぶっちゃけRPiを持ち運ぶも面倒だし、Linux Kernel 3.18.3 とかで普通に6LoWPANは使えるから、OS上の仮想Linuxで使いたくなるのは自然の道理。

という事で、Virtual Box上のUbuntu Linuxから6LoWPANで物理デバイス(nRF51)と6LoWPAN(IPv6 over Bluetooth)で疎通を行うことにした。けどVirtualBoxのHost Controllerとの相性がダメなのか、仮想OSへBluetoothのつなぎが出来ない。色々と試してみたけど、どうやっても出来なかったから、VMwareを使うことに。

これでRPiを使う必要もなくなるし、VM上でサクサク6LoWPAN、IPv6の実験が出来る便利な環境になる。ルーティング・カーネルのテスト、6LoWPANもめちゃ簡単にテストできるようになるから、VM上のLinuxを使うのはお勧め。方法は簡単でカーネル取ってきてビルドするだけ。ぶっちゃけRaspberry Pi/Edison…etc とかarm向けのビルドも全部一緒のノリで出来ると思われ(全部検証したわけじゃないけど、だいたい一緒)。

カーネルの設定はこちらに載せている通りにすればOK。一応、Ubuntu Server 14.04にdpkg -i で打ち込んでバッチリ動いている。自分がビルドしたKernelパッケージはこちら。

3.18.3 Linux kernel for Ubuntu
build config

ダウンロードしてきたらインストール&再起動で最新カーネルに変えたら終了。めちゃ簡単。こんな感じ。

MacのUSBポートにはnRF51、BroadcomのBluetoothドングル(市販の普通のもの)を挿して、nRF51 BluetoothドングルがMac上のVM Linuxを介してIPv6 over Bluetoothとして疎通している。

何を思っているかというと、WiFiが使えなくてルータがない、シリアルも無くても、VMのUbuntu上でIPv6 over Bluetoothで疎通をしてネットワークを作ってテスト・開発・検証できる(Macは対応している訳じゃないからね)。VM上のLinuxを6LoWPANルータみたいな感じで使えるし、便利な環境も作れるようになる。

このイメージを配ったら、誰でもRPiとか無くてもすぐ6LoWPANを使った開発が進められるよーになると思っている。もちろん、Bluetoothの方は必要になるけどね。

ちなみに、VMのMacはYosemiteの環境で、VirtualBox上のUbuntu LinuxからBluetoothを利用・終了するときは、次のコマンドをMacOS上で行う必要がある。ただ、Host Controllerが突然dieするのは乗り越えられなかった…VMwareでは以下は不要。

# Load
sudo launchctl unload /System/Library/LaunchDaemons/com.apple.blued.plist
sudo kextunload -b com.apple.iokit.BroadcomBluetoothHostControllerUSBTransport
sudo kextunload -b com.apple.iokit.IOBluetoothHostControllerUSBTransport

# Unload
sudo kextload -b com.apple.iokit.IOBluetoothHostControllerUSBTransport
sudo kextload -b com.apple.iokit.BroadcomBluetoothHostControllerUSBTransport
sudo launchctl load /System/Library/LaunchDaemons/com.apple.blued.plist

6lowpan Linuxカーネルメモ

6lowpanのカーネル実装部分のメモ

– Bluetoothでの 6lowpan(IPv6 over bluetooth)のメイン部分
net/bluetooth/6lowpan.c
基本的にはl2capにbluetoothの足回りは依存していて、l2cap以上の上物を書けばOKという作り。l2capとIP層との繋ぎまで。l2capの実装は ”net/bluetooth/l2cap_core.c” とかを参照。
6LoWPANのRFCは現在絶賛ドラフト中。rfc7400のヘッダ圧縮も入っている。

– PAN内のPeer(Bluetooth同士)の扱い
6LoWPAN内のPeerの管理は “linux2.6/include/linux/list.h” を使った単純リスト構造。Peerの検索はlist。あれまぁDHT/Chordにしたら?とか一瞬思ったけど、そもそもBluetoothって同時接続で激しいルーティングする感じでも無いし、listでも十分と思われ。Peerはもちろん複数持ってもOK。
パケットがbt%dデバイスから送信時(ndo_start_xmit=bt_xmit)は、Peerが1個の場合はすぐに送信。2個以上の時は、OSのルーティングテーブルによろしく(bt%dが出来るから)。

– 6lowpanヘッダ処理
net/6lowpan/iphc.c
IPv6をBluetooth上に投げる時にヘッダ圧縮(rfc7400)。圧縮といってもヘッダを省く位な感じ。この時にHop Limitの処理も入る。超過したらソケットバッファからdropされる。
別のディレクトリになっているのは、必ずしもbluetoothのみを対象にする訳では無いという現れかな。

– bt%dで作成されるデバイス
 setup_netdev, netdev_setup
 ARPHRD_6LOWPAN
 IFF_POINTOPOINT

– /sys/kernel/debug/bluetooth/6lowpan_psm
 bluetoothのデバイスで、周辺のbtのlistenの開始・終了セット
 -> bt_6lowpan_listen

– /sys/kernel/debug/bluetooth/6lowpan_control
 実際のbt%dの作成とl2capで対向のBluetoothに接続
 -> lowpan_control_write

– bt%dへの読み書き
 bt_xmit -> send_pkt : Bluetooth上でl2capで送信
 chan_recv_cb -> recv_pkt : l2capからの受信

メインの構造は以上で、あとはヘッダ処理とかsetup/init系。6lowpan/bluetooth合わせても2000行程度だからサクサク読めるはず。

RPi Kernel for Nordic IoT SDK 6LoWPAN

NordicのIPv6 over Bluetoothの6LoWPAN側のrouter側(RPi)はカーネルが提供されている。6LoWPANの実装は”net/bluetooth/6lowpan.c”でIntelがコミットしていた。既にLinuxのカーネルツリーに入っていて、Nordic提供のRPi用Kernel 3.17.4ではinsmodして使える。

ただね…Nordic提供のKernelを使うと、ネットワーク周りのフィルター、具体的にはiptable NAT/masqueradeが動かなくなる。デフォのRasbianだと普通に使えるのにおかしくね?ってことで.config を見るとあれれ抜けてるよ…ということで、自分で最新のカーネルツリーを取ってきて、6lowpanとNETFILTER周りを有効にしたカーネルを作った。

具体的には6lowpanはmenuconfigの以下を有効にすればOK

作ったカーネルビルドはこちら。
config
kernel
moduleとfirmware

RaspberryPi向けの設置は、configはカーネルのビルド用、kernelはそのまんま/boot/に配置して元々のカーネルを上書きしてもconfig.txtで差し替え。moduleとfirmwareは/lib以下に展開。(バックアップはしてね)

これで普通にnetfilterのnatとかが使える。IPv6 over Bluetooth/6lowpanも動作確認済。
ちなみに、Nordicの.configは参考にしたけど、継承しないで最新のkernel 3.18.3(nordicのは3.17.4で古い)を使っている。一応、ちゃんと動いているからnordicのRaspberry Piのイメージでnetfilterでおかしいな?と思った時の参考まで。

ちなみに、恐らく予想だけど、nordicのnetfilterがおかしいのは旧カーネルのoldconfigする時に、いちいち新機能の差し替えが走るんだけど、そこで「エンター連打」をしてスッ飛ばしたからなんじゃないかと予想している。バージョン忘れたけど、どこかのカーネルのバージョンからNEWで連打ボーン!!すると、natとかがスルーされてしまう。たぶん、連打ボーンしてIPv6 over bluetoothじゃ使わないから気にしなかったんぢゃないかなーと。

とまぁ、そんなnetfilterなことより、Linuxのカーネルツリーに6LoWPAN(net/bluetooth/6lowpan.c)が既に追加されていて、普通にカーネル取ってきて自分でビルドすれば使えるというのが分かった。

IPv6 over Bluetooth

IPv6かよっwwww って声がそこはかとなく聞こえてくる気もするけど、自分の中でまたIPv6が再燃している。それは何故かというと、Bluetooth 4.2の仕様にIPv6/6LoWPANが乗ってくるというインパクトのあるニュースが、ある一部のマニア層(w)で飛び交った。

ニュース的には、”Bluetooth 4.2 発表。Bluetooth Smart で直接インターネットに接続。通信速度とセキュリティ強化“とか、Bluetooth SIGの発表はこちら

IPv4は抜きで、まさかのIPv6/6LoWPANっすよ。一瞬、何の冗談だよ(w)って思えたけど、マヂでBluetoothにIPv6が乗ってくる。IPv6とかイマサラ感&使えねーだろ!!とか言っても乗ってくる。2015年(今年)にはBluetooth 4.2に対応した物が出荷され始めるとのことで、IPv6の再燃か!?まさかBluetoothからやってくるとは、誰も思わなかったと思われ(www

物自体は2015年からという事で、まだ先だろうなぁ…と思っていたら、既にNordicさんがIoT SDKのベータ版という事で出していた。CES 2015でも(何故か日本じゃニュースに出てないけど)デモをしていたようで。ということで、早速やってみることに。構成は次のような感じ、

端末 : Nordic nRF51
IPv6 Router : Raspberry PI/radvd/BroadcomのBluetooth dongle
上流は無し。

バッチリできたー!! 6lowpanでの端末のLED制御もできるし、link localでのIPv6の疎通もバッチリ。すっげー楽しい!!
64bit prefixをどこからか持ってきてradvdに食わせると、サクッと上流もできてGlobal IPv6でネット側から疎通ができる。Nordicのスタックを見ると、まさかのLwIPが全力で使われていた。軽め&既存物だし、ライセンスもBSDだからサクッと作ったものと思われ。簡単だもんね。けど、10年ぶり位にLwIPに遭遇するとは全く思ってもみなかったw
次はKoshian(Broadom)の環境でやってみようかなと。WICEDのSDKでFWを書き換えて使える所も確認しているし、スタック載せればサクッと動くはず。

そしてTIさんの6lowpanのサイトから絵をちょっとコピって、Bluetooth 4.2が出始める頃に出来上がると想定されるNWな絵はこちら。TIさんもIPv6 over Bluetoothをそのうち出してくるのかなー。

エッジルータは据え置き物がすぐ考えられるけど、iPhone/Androidのアプリ(Bluetoothと疎通して上流のIPv6をのコネクティビティを担保)が出てくる。というか作ろうと思っている。すると、絵の通りだけど。

1. Bluetoothだけで6lowpan(IPv6)での疎通ができる。
2. エッジとしてスマートフォンを使うと、Bluetoothの端末・ガジェットにIPv6でダイレクトに疎通できる。

こんな事ができる。ただし、問題点としては今・そしてすぐ上流がIPv6いっぱーい!!という事にはならないから、GlobalからアクセスしようとするとIPv6 over IPv4のトンネルといった事も必要になる。これはサーバサイドもちょっとした物が必要になってくるんだけど、この辺もいつものノリでやれば出来ると思われ。IPv6ダイレクト接続でIPv6 64bit prefixが振ってきたり、VolTEではIPv6が使われていて将来的にはトンネルとか不要になると思うけどね。
何故かスタックとか、ネットワーク周辺で興奮するんだけど、IoTというかモノとネットワーク間は凄く面白いところになってくる予感。

あと今すぐIPv6がBluetoothに乗ってくる訳じゃない。いまだに上流やサーバ/NW側のIPv6が進んでいない事、Bluetooth端末にダイレクトにGlobalからアクセスする時に間違いなく必要になるセキュリティが真っ先に考えられる。ただ、6lowpanでNWを構成してGlobal側は使わないという方法もあったりするし、この辺はこれから考えればまだ十分だと思うし、何にしてもBluetooth 4.2でIPv6が出始めるというのは、今からアプローチしておいた方が間違いなく良い所かな。

かまくらプロジェクション

お正月休みで実家の雪積もる岩手に帰ってきている。ただ実家でぐーたらするのも面白く無いと思って、雪を使ってプロジェクターで投影しか無いべ!!と思って、つい最近買ったP2Eを持ってきた。

雪の壁とかに投影したらわりと楽しかったから、かまくらの中に投影することに。雪とプロジェクタを使った物だと、雪の造型物とか壁に投影する物は見た事はあったけど、かまくらの中に投影している物は見た事が無かったのもあって、レッツかまくらプロジェクション!!ってことでoFで適当にプログラムを組んで遊ぶことに。

まずはかまくら作り…久々に雪と格闘すること1時間…

とりあえず大人3人くらいは入れる穴ができた。夜になるとこんな感じ。

まずは単色で投影したりすると…こんな感じに。思ったより幻想的な雰囲気が出て良い感じ。

雪というか氷が光をより際立たせてくれている感じがする。実家の子供達に見せてみたら、ワーキャー楽しんでくれて良い感じだった。

あとで単純なパーティクルを投影して、かまくらの中でグルグル動かすと割と面白いかしら?という事で、これも適当にやってみたら意外とたのしい。

位置合わせと素材を調整すればもっと面白いと思われ。
大変だったのが、かまくら作り。家の前に積もっていた雪にひたすら穴をあける作業はわりと疲れた…
あと、投影するからには夜だろうという事だけど、氷点下の中で設置したり位置合わせ、ちょっとしたプログラムの修正を外でするのは大変というか…とにかく寒い、寒すぎる。Macbook Airが氷のように冷たい中での作業で、とにかく寒い。けど、子供達に遊んで楽しんでもらえてよかったかな。