Node-RED フローエディタの出現などもあって MQTT プロトコルに新たな可能性を感じています。

MQTT といえば「IoT のプロトコル」というイメージを持っている人もいると思います。必ずしも間違いではないと思っていますが、こんな軽量で便利なプロトコルを IoT のためだけに使うのはもったいないかな、、、とも感じるようになりました。それを実感するためにちょっとしたアプリを作ってみました、という内容です。


今回紹介するための例として選んだのが投資相場情報です。個人的にもたしなむ程度には投資をやってますが、デイトレードするようなタイプの投資家からすると、リアルタイムにより近い情報が提供されるのであれば有用なはずです。ただ IoT と投資を結びつけて考えることはあまりないですよね。でも IBM IoT Foundation や Node-RED と組み合わせて投資を考えるとどうなるでしょうか?

まず、ためしに外国為替の価格情報を表示するような、こんなウェブサービスを作ってみました:
http://fx.mybluemix.net/

↑上記 URL にアクセスすると、そのタイミングでの20種類の為替情報を JSON フォーマットで返してくれます。週末とかでない限り、為替相場は24時間変化し続けます。これ自体はごく一般的な REST のウェブサービスです。(ドメインを見ればわかりますが)これは Bluemix 上で動いていますが、このサービスがどこで動いているかは関係ありません:
2015090701


この仕組をこのまま(必要な時にこの URL にアクセスして取得する形で)使うこともできますが、MQTT を使うとプッシュのような仕組みを実現することもできるようになります。別途 MQTT パブリッシャーのアプリケーションを用意して、例えば1分おきに最新の為替状況を取り出して、MQTT ブローカーへパブリッシュする、という方法です。特にパブリッシュ先の MQTT ブローカーを IBM IoT Foundation の QuickStart(quickstart.messaging.internetofthings.ibmcloud.com:1883) に指定すると、Bluemix 上の Node-RED の QuickStart からも参照できるようになるので、Node-RED を使って簡単に為替情報を取り出すことができるようになります。また取り出したデータをデータベースに格納したり、取り出した数値を元にデータフローを記述して実行することは Node-RED の機能を使って簡単に実現することができるようになります:
2015090702


実際に QuickStart の MQTT ブローカーに対してメッセージをパブリッシュするアプリケーションを Java で開発する場合の詳細はこちらを参照ください:
QuickStart MQTT ブローカーに Java からパブリッシュする


今回のアプリでは ClientID(Node-RED の QuickStart で言うところの deviceId)に "net.mybluemix.fx.mqtt.publish" という文字列を指定して quickstart.messaging.internetofthings.ibmcloud.com:1883 にパブリッシュしています。なので、Node-RED 側でも同じ deviceId を指定すれば取り出せるようになる、というものです:
2015090703


実際にこのアプリを作って、ローカルホストで動かしてみました(MQTT パブリッシャーはローカルホストだろうが、プライベートネットワーク内だろうが、MQTT ブローカーに接続できる環境下であれば動きます)。同時に Bluemix 上の Node-RED では MQTT パブリッシャーと同じ deviceId を指定して QuickStart からデータを取り出してみます:
2015090704


とりあえずは普通に Debug アウトプットノードだけを足してデプロイすると・・・
2015090705


為替情報が(この例では)30秒おきに Debug タブに表示されるようになりました!期待通りに動いてます。
2015090706


この結果を WebSocket にも送るように改良してみます:
2015090707


WebSocket に送られてくるデータを視覚化するような HTML を用意するとこんな感じ。MQTT から送られてくる為替データを元にリアルタイム為替チャートが簡単にできちゃいました:
2015090708


後は為替を売買する(業者の)API があれば、これと組み合わせて実際に売買するシステムが作れちゃいそうです。もちろん為替である必要はなく、株式でも同様のデータが取得できて、同様の売買 API があれば同じような仕組みを作ることもできそうですね。

なお、WebSocket 経由で取得したデータの視覚化方法についてはこのページの情報を参考にしています。具体的には Google Visualization API を使っています:
Node-REDを使ってセンサーデータをWebSocketで出力する


MQTT はデバイスデータやセンサーデータを扱うだけでなく、色んな応用ができそうです。アイデア勝負の世界になりそうな感じですね。


(2015/Sep/11 追記)
この中で紹介している Quickstart MQTT ブローカーに為替情報をパブリッシュする Java アプリケーションのソースコードを GitHub で公開します:
https://github.com/dotnsf/FxQuickstart