masato-ka's diary

日々思ったこととか、やったことの備忘録。

mbedとDjangoでWebSocket!

mbedを買ったので、django-websocketで作ったアプリケーションにセンサーデータをWebSocketで投げ込んでみました。全体的な構成は次の図のような感じです。

各構成要素説明

Websocket Server

Mac OS X上にDjangoフレームワークdjango-websocket 0.3.0を使ってechoサーバーを構成しています。ほぼ前々回のエントリーで紹介したアプリケーションと同じものです。django-weboskcetは前回のエントリーで紹介したRFC6455対応版です。

mbed

mbedに関しては細かい説明は省略します。知らない人はググって下さい。Arduinoとかそんな感じのラピッドプロトタイピング向けマイコンです。WebSocketのライブラリが提供(RFC6455対応)されているのでそれを使ってセンサー情報の値をサーバーに上げています。今回はセンサーとしてFRSの圧力センサーを用いています。

iPad

今回はクライアントとしてiPad*1を使いました。普通のWEBブラウザでも十分です。サーバから送られてくる値をもとにJavaScriptでグラフを描画しています。

そんなわけでYoutubeに実験動画をアップロードしてみました。

画面の一番奥がWebsocket ServerのMacBook proです。その手前にiPadを置いています。丸くぴょこっとしてるのが圧力センサになっています。この圧力センサーを指で握ると、それに合わせてiPadに表示されているグラフの表示が変わるのが解ると思います。グラフはSafari上にJavaScriptで描画しています。

最初はWebsocket通信を500ms周期でやっていたのですが、どうも途中でハングすることが多いので動画は900ms周期にしています。このあたりはDjangoの開発用サーバを使っていたり、作りが悪かったりいろいろあるのかなと。もう少し周期を短くできるといいかなと思います。
このようにWebSocketを使うと簡単にWEB上でリアルタイム通信を実現することができます。こういったマイコンからの情報をサーバに上げてWEBブラウザで可視化したいという用途や、逆にWEBブラウザからマイコンへ指示を送りたい場合にはかなり強力な仕掛けになると思います。AjaxやCommetでも良いのですが、いずれにしろタイマでの更新またはポーリング処理を行うためタイムラグが発生すると思います。(まあ、実用上問題なければ大丈夫でしょうが)またHTTPセッションを1リクエストごと(今回だと16bitのデータを一つ送るたびに)接続しなければ行けないので、多くの機器と通信したい場合はAjaxやCommetは不利になるでしょう。

とりあえず今週末はここまで!

今回は本質じゃないところで、BUFFALOのルータが無線LANと有線LAN間で通信出来ないというバグ持ちだったので、最初うまくいかずに一晩悩みました。最終的にルータのファームウェア更新で解決!

この仕組みを利用して、もうちょっとアプリケーション的なものを作ってみようかな。

*1:iPadSafariはdraft-ietf-hybi-thewebsocketprotocol-00対応のようです。前回のdjango-websocket改良を使い事で複数の使用に対応できます。