milkcocoaにnode.jsでアクセスする

最近のinterfaceという雑誌にIoTの特集があり、その中の記事を読んでいると「もう、MQTTサーバを自前でたてて、ちまちまとメッセージ送信しているような時代じゃないなあ。。。」とがっくり肩を落としてしまいました。
いまや、いろいろなBaaSがあって使うのに迷うほどになっています。しかし、単純なMQTTでいろいろと考えてきた身にとっては、どれもちょっと複雑で取っ付きにくい感じがします。まあ、その「めんどくささ」のおかげでセキュリティやデータの可視性が高いのですが。
で、このタイミングでBaaSに移行しないと、時代に乗り遅れるなあとも想い、冬休みの1週間を使って試してみました。
今回はmilkcocoaというサービスを使いました。

仕組み

milkcocoaは、interfaceの記事によればメッセージ送受信にフォーカスしている、ということでしたので、きっとAPIや設定方法なども比較的単純で解りやすいだろうということで選びました。
結論から言えば、だいぶ前に一度ためしたIBMのBlueMixから比べるとだいぶストレートフォワードな感じでした。webも日本語ですし。

で、その中身についてはmilkcocoaのwebが詳しく解説されているかと思います。単純にはMQTTのメーッセージングシステムをnode.jsで使えるようにAPIを整備した、というかんじでしょうか。MQTTに特有なTopicとかQoS, Willなどの概念をざっくり丸くワップしてもらって、何も考えずにとにかくメッセージを送受信できるようになっています。
C++用のAPIも用意があるようです。こちらは、phao MQTTをワップしているAPIを提供している感じでしょうか。

今回はじめてnode.jsを使ってみましたが、通信用のアプリケーションを作るのには向いているような気がしました(素人ながら)。非同期処理というか並列処理的な考え方はちょっと違和感があるかもしれませんが、私はHDLも少し噛んでいるので「ああ、そういうことね」と比較的すんなり腑に落ちました。しかしながら、コールバック関数で何でも処理する、というのは今でも混乱しています。

ポイント

特にポイントと言えるほどの難しいところは無く、サンプルコードを自分のやりたいように拡張していけばすんなりできてしまいました。
一応、作ったアプリケーションをサンプルとしておいておきます。
まったくもってエラーハンドリングしていないので、confgファイルとかで間違った設定するとチンプンカンプンになってしまうかもしれません。

node.jsのド素人の私が3日ぐらいで一応動くコードが書けたのはひとえにmilkcocoaのスタッフの皆さんが努力されたAPIの使いやすさ、JavaScriptのコードの書き方、使い方を公開していただいている方々のおかげです。感謝。感謝。

push と send

pushメソッドだとサーバの方にデータが蓄えられて、webのダッシュボードからデータを確認できたり、グラフ化(β版)のサービスが提供されていたりします。また、pushメソッドで送信したデータにはタイムスタンプがつきます。
ですので、デバイスの方でタイムスタンプをつけなくても受信側では「いつのデータ」なのかがすぐに解ります。

一方、sendメソッドだとサーバにはデータが残りません。また、sendで送られたデータはタイムスタンプもつきません。そのかわり、データ数量の制限には引っかからないようです。(実際、カウントされていません)
そのため、sendで送られるデータを見るためには事前に受信状態のノードを用意しておく必要があります。

そして、送ったデータのメソッドは読み込む側も意識する必要があります。具体的には受信時にsendイベントによる受信か、pushイベントによるものかを指定するする必要がります。
送信側もpushなのかsendなのかで使う関数がちがってきます。(MQTTのトピックがメソッドで違ってくるので致し方ないかと)

接続キー

サーバとの接続には以下の情報が必要です。

  • AppID:アプリケーションの名前です。ユーザが設定します。
  • Data Store:アプリケーションごとにいくつかのデータをストアする場所を設定します。ユーザが設定できます。(AppIDと含めてmqttのトピックのようなもの)
  • API_Key, API_Secret:接続時の認証のためのキーになります。スクリプトなど秘匿性のある場合はこのセットを、htmlのような秘匿性が無いものについてはトークン認証を使うようです。

データフォーマット

送信は自分が送りたいデータをJavaScriptのオプジェクトにして送信ファンクションを呼び出します。 受信側では、そのデータにヘッダがつきます。 sendでは

1
{"path":"データストア名","value":{"送信したデータ"}}

となります。 なので、データをパースする場合は.value以下をパースした方が解りやすいかもしれません。

pushではこれにタイムスタンプがついていたような気がしますが、よく覚えていません。 すいません。。。。

まとめ

まとめるほどの内容でもないですが、
とにかく、簡単にメッセージの送受信ができます。一度なれてしまえば瞬間にメッセージングのコードはかけるので、アプリケーションのコーディングとデバグに集中できます。

私の場合、JavaScriptの全くの素人でしたので、自分で納得いくレベルまで行くのに時間がかかってしまいました。今からはエラーハンドリングに集中してレベルアップしたいと思います。