先日、テック系PodcastのRebuildで「もし世界中の人工物が壊滅した場合(人々の知識レベルはそのまま)、インターネットを復活させるには何から手を付けたらいいか」というTV(?)の話をされていました。面白そうだったのでググってはみたものの、その映像は見つけられませんでした。科学文明のつくりかた」という本を見つけたので、それを今読んでいます。「パンデミックで人口が1万人ぐらいに減少したときに再び元の社会に戻るためには何から手を付けていくべきか」というような内容で、当然ですが最初は水や食料からはじめてやがて電気やラジオといった方向に進んでいくのですが、そう考えるとインターネットを復活させるためにはずいぶん長い時間が必要なはずで、インターネットがあるこの世界は膨大な過去の遺産の積み重ねであることに気づかされて改めて驚かされます。最近話題のIoTはこのインターネットのさらに先にあるものなので、先ほどの思考実験からするとIoTによる変革の時代を肌で感じられることは幸せなことかもしれません。IoTについてはもう説明の必要はないと思いますが、自動車や産業機械、家電などからインターネット経由でデータを収集し、分析して、新たな知見を得たり、有益なアクションにつなげたりする仕組みのことです。弊社のSkyOnDemandもこのIoT分野ではよく使われています。HTTPSがよく使われますが、別案としてMQTTを使いたいというお話もいただくことがあります。MQTTについてはこのあたりが分かりやすいと思いますが、HTTPよりもヘッダーが小さいことと、QoSの考え方があるところがユニークなところではないでしょうか。MQTTには、まずブローカーと呼ばれる中継サーバーが必要です。そこに対してメッセージを投げる(Publishする)クライアントと、そのメッセージを受け取る(Subscribeする)クライアントがいますので、それらの3者が主な登場人物です。EC2上にブローカーを構築して、デバイスからのデータを、SkyOnDemandで受け取る場合にどんな感じになるかをコードを交えてご説明したいと思います。ブローカーの構築ブローカーとしては昔からある(らしい)Mosquittoを利用します。インスタンスを起動します。セキュリティグループ(やACL)の設定で、MQTTのデフォルトポートである1883を開けておく必要があります。Linuxにログインして、Mosquittoをインストールしていきましょう。ダウンロードして展開します。mosquitto-1.4.2インストール方法はINSTALLというファイル名ではなくcompiling.txtというファイル名なので少し探してしまいましたが、そこに必要なライブラリなどが書かれていますので、不足しているものを追加します。c-ares-develビルドの設定はconfig.mkで変更ができますが、今回はいじらずそのままビルドしてインストールします。installこれでMosquittoのインストールは完了です。デバイス側(Publishクライアント)の実装MQTTのクライアントはJavaで実装したいと思います。8から登場したコンパクトプロファイルにより使いやすくなりました。8が搭載されています。それでMQTTのJavaの実装としてはPahoを選択しました。最新は1.0.2でした。Publish側のサンプルコードは、こちらにあるほぼそのままです。詳細はソースコード中のコメントを参照してもらえればいいと思いますが、基本的にはブローカーに接続して「こんにちは、SkyOnDemand」というメッセージを1回投稿します。トピックはPublisherとSubscriberで同一である必要があります。QoSレベル(0〜2。デフォルトでポート1883を使う。{System.out.println(message);}}SkyOnDemand側(Subscribeクライアント)の実装SkyOnDemandにはトリガーという機構があり、指定した時刻が来たり、データを受け取ったりしたタイミングで、処理を起動することができます。MQTTのメッセージを受け取るのもトリガーにあたるのですが、トリガーのソースコードをお見せしても仕方ないので、同じくPahoを使ってトリガーがやっていることを概念的にご説明したいと思います。Pahoのgitリポジトリでorg.eclipse.paho.mqtt.java/org.eclipse.paho.sample.mqttv3app/src/main/java/org/eclipse/paho/sample/mqttv3app/Sample.javaにあるコードを参考にして作ってみました。Publish側はメッセージを投げるとすぐにexitしてしまいますが、Subscribe側はENTERキーを押すまではメッセージを待ち続けて受信するたびに、メッセージを表示するようになっています。実際はメッセージを表示するのではなく、そのメッセージを連携処理に引き渡して処理を実行することになります。トピックはPublisherとSubscriberで同一である必要があります。ブローカーに接続して指定トピックのメッセージを受信します。ENTERキーを押すまで待機し続けます。メッセージを受信したときに呼ばれるCallback。SkyOnDemandではスクリプトにメッセージを渡す処理を行う。ブローカーとの接続が失われた時に呼ばれるCallback。本来は再接続のロジックを入れる。メッセージの送信が完了したときに呼ばれるCallback。{System.out.println(message);}}実行してみるでは実行してみましょう。と打ってMosquittoを起動します。つぎにSubscribeクライアントを実行します。Mosquitto側には次のように表示され、接続されたことが確認できます。k60).次にPublishクライアントを実行します。Mosquitto側には次のように表示され、接続され、メッセージが投稿後に切断されたことが分かります。disconnected.このときSubscribeクライアントのコンソールを見てみると、ちゃんとメッセージを受信していることがわかります。今回のケースではQoSを2に設定していますので、かならず1回配信されることが保証されます。ためしにSubscribeクライアントを強制終了した状態で、Publishクライアントを起動しメッセージを送信します。再度Subscribe側を起動するとMosquittoに蓄積されていたメッセージがちゃんとSubscribeクライアントで受信できます。最後にいかがでしたでしょうか。HTTPSによるIoTデータの収集とは違った面白さを感じていただけたのなら幸いです。SkyOnDemandでのMQTTに興味がありましたら、是非お問い合わせください。~Salesforceへ大容量のファイルをアップロード関連するキーワードSkyOnDemandTerraSkyBaseについてTerraSkyBaseはクラウドサービスを手掛ける株式会社テラスカイのコンテンツプラットフォームです。