2019の17日目の記事です。obnizと他のシステムを連携動作させたいとき、MQTTを使うと割と楽にプログラムを作れます。MQTTを使う場合どのブローカーを使うかどのライブラリを使うかを決めなければなりません。私は今まで自分では調査せずにネット記事のコピペでその場凌ぎを続けてきました。今回一念発起して、どのようなブローカーやライブラリがあるか調べてみました。その中で、obnizで使いやすいものを紹介します。ブローカーとMQTTライブラリの紹介なので、obnizのコードは登場しません。本題に入る前に簡単にMQTTの概要を説明します。ご存知の方は読み飛ばしてください。登場人物と役割MQTTによる通信は、メッセージを中継するbrokerメッセージを送信あるいは受信するclientで行われます。clientは、送信側と受信側を区別するためにpublisher、subscriberと呼ばれる場合があります。メッセージを送信するpublisherメッセージを受信するsubscriberメッセージの配信は次のようなステップで行われます。subscriberが、メッセージを受信したいトピックをsubscribeするpublisherがトピックにメッセージをpublishするsubscriberがメッセージを受け取る2と3を繰り返すことで複数のメッセージを送信できます。1つのプログラムがpublisherとsubscriberを兼ねられるので、双方向の通信を実現できます。メッセージ配信の確実さの種類subscriberが停止していたりネットワークに障害が発生した場合、メッセージの配信がうまくいかない場合があります。QoS(サービス品質)を指定することでメッセージ配信の確実さを指定することができます。once:メッセージが配信されるかもしれないし、ネットワーク障害などで配信されないかもしれません。配信される場合は最大1回です。受信確認や再送のための処理が不要なので実装が軽量になります。メッセージは必ず配信されます。受信が確認されるまで再送を繰り返すのでメッセージが2回以上配信される場合があります。メッセージは必ず1回だけ配信されます。Testament」。「サーバがダウンしました」といったメッセージを流すのによく用いられます。メッセージをpublishした後からsubscribeした場合にsubscribe前のメッセージを配信できるように最後のメッセージを保存しておく「Retain」などがあります。本記事ではこれらの確実さの仕組みについては扱いません。通信路の種類clientとbrokerの間で通信に用いられる通信路は、TCPとWebSocketの2種類があります。WebSocketは、publisherやsubscriberがWebブラウザ上で動作する場合に用いられます。MQTTの仕様そのものでは通信路を規定していないので他の通信路を使ってMQTT通信することも可能ですが、現時点で簡単に利用できるものはTCPとWebSocketの2種類です。通信内容が外部に漏れないように、TLSで暗号化することもできます。誰がMQTTで通信できるかを限定する仕組みがあります。anonymous(認証なし。PASSWORDで認証Client証明書で認証(TLS暗号化と組み合わせて使用)MQTTのバージョンMQTTにはいくつかバージョンがあります。BrokerやMQTTライブラリが多くあります。obnizでMQTTを使うのに必要なもの例えば、obnizとM5StackをMQTT経由で通信させたい場合、構成はこうなります。(本記事では扱わない)です。Brokerは、Clientに依存していないのでMQTTの仕様を満たすものであればなんでも使えます。Libraryは、obnizのプログラムがどの言語で書かれていて、何で実行されるのかによって選択肢が変わってきます。本記事ではブラウザで実行されるJavaScriptの場合と、node.jsで実行されるJavaScriptの場合を考えます。pythonなどの他の言語の場合は扱いません。自分でBrokerを運用する方法クラウドサービスを使う方法の2種類があります。自分で運用する方法だと、全てを自分でコントロールすることが可能ですが、上手く動かない時にBrokerの設定が間違っているのかClientの書き方が間違っているのかの切り分けが難しくなります。クラウドサービスを使う場合は、Broker側に問題がある可能性は低いのでclientのデバッグに集中すれば良くなります。MQTTを使ってみるだけならクラウドサービスを利用することをお勧めします。http://mosca.io/があります。Brokerがあります。実態はmoscaのようです。mosquittomosquittoはECLIPSEのプロジェクトの1つで、MQTTのリファレンス実装の役割を担っているようです。そのため最新の仕様への対応が早いようです。対応しているMQTTバージョン、QoS、通信路は次の通りです。対応WebSocket対応WebSocket+TLS対応mosquittoのソースコードはこちらから入手できます。mosquittoのサイト:https://mosquitto.org/files/sourcegithub:https://github.com/eclipse/mosquittoバイナリーパッケージも用意されているので、お使いの環境に応じてインストール方法を選択してください。mosquittoとなります。インストール方法を紹介した記事がネット上にたくさんあるのでググって参考にしてみてください。mosquittoのインストールは簡単ですが、設定は少し難しいです。複数の通信路に対応できるように設定するところでつまずきやすいです。ネット上の記事も誤っているものが散見されます。自分で色々試してみた結果、anonymous接続ID/PW接続TCP接続WebSocket接続を全て対応してくれるように設定するには、configファイルに下記を記入すれば良いことがわかりました。正しい設定方法かどうか自信がありませんが、とりあえず動作しています。websockets(注:パスワードファイルのファイル名、パスは上記でなくてもなんでも良いです)TLSに対応するにはサーバ証明書を用意する必要があり、設定が面倒なので今回は試していません。TLSを試してみるときは、自分で運用しているBrokerを使うよりもCloudサービスを使う方がずっと簡単なので、そちらをお勧めします。npmで簡単にインストールできます。単独のMQTTサーバとして動作させることも、プログラム内のライブラリとして動作させることもできます。Brokerを手軽に動かしてみたいときは、mosquittoよりもmoscaをお勧めします。moscaを単独のMQTTサーバとして動作させたい場合は、こうします。詳しくはこちらを参照してください。-v詳しい設定はコマンドラインオプションかconfigファイルで行います。1を使うにはメッセージを保存する場所が必要になります。moscaではRedis、MongoDBなどをbackendとして使う設計になっています。これらの指定もconfigファイルで行います。node.jsのアプリケーション内にライブラリとして組み込むときは、下記のような書き方をします。この例ではbackendとしてRedisを使っています。詳しくはこちらを参照してください。running')}moscaが対応しているMQTTバージョン、QoS、通信路は次の通りです。2が必要になる場面は稀なのでmoscaで十分です。Brokerの利用MQTTのCloudサービスはたくさんあります。聞くサービスにはこんなものがあります。Brokerを使うのが手っ取り早いと思います。Cloudを使い始めるまでの手間が大きいのでお勧めしません。MQTTを試してみるだけなら、mosquittoやshiftr.ioがお勧めです。Brokerソフトであるmosquittoをクラウドサービスとして提供しているサイトです。テスト目的のサイトなので無料です。対応している通信路が豊富なのが特徴です。ユーザ登録なしに使えるサービスなので、anonymous接続のみです。利用の上で注意すべき点は、テスト目的のBrokerなんで一時的に機能の一部が使えなくなっている場合があります。この点に関してWebページに注意書きがあります。したがって、クライアントプログラムがうまく動作しない時、クライアントが悪いのか、単にBrokerのその機能が止まっているだけなのか区別がつきません。この点を頭に置いて使うのであればとても便利なサービスです。shiftr.io最近人気のMQTTサービスです。v3.1.1に準拠しています。通信路として下記が使えます。PASSWORDペア)を作成してBrokerを使う仕組みなので、anonymous接続はできません。ID,PW接続になります。shiftr.ioの大きな特徴は、Brokerに接続しているクライアントや送受されているメッセージがリアルタイムにアニメーションで見られるところです。デバッグするときにクライアントがちゃんとBrokerに接続できているか正しいトピックをsubscribeしているかメッセージが思った通りに配信されているかを目で見てリアルタイムに確認できるのでとても便利です。Libraryobnizのプログラムを書く場合、ブラウザ用のJavaScriptで書くか、node.js用のJavaScriptで書くかがほとんどなので、この2つのケースを考えます。Libraryネット上に情報が豊富な代表的ライブラリはMQTT.jspahoです。MQTT.jsMQTT.jsはブラウザとnode.jsの両方に対応しています。プログラムのわずかな変更でどちらでも動作するのでプログラムを書くときの負担が少なく便利なライブラリです。v3.1.1に準拠しています。実験的にv5.0に対応している部分もありますが、利用は推奨されていません。subscribeするプログラムを書いてみた例がこれです。});</script></body></html>上記の例では、ID,PWの指定をURL内で行なっています。'mqtt://ID文字列:PW文字列@broker.shiftr.io';optionとして外出しする方法もあります。"Browser-23"};pahopahoはpython用のライブラリとして有名ですが、JavaScript版もあります。サポートしている機能は下図の通りです。pahoのサイトに、使用例としてこのコードが記載されています。console.log("onMessageArrived:"+message.payloadString);}これを参考にしてshiftr.ioに接続するコードを書いてみたのがこちらです。shiftr.ioではID,PWによる認証が必要ですが、URLに埋め込む方式はpahoが受け付けてくれないので、optionとして渡しています。Libraryいくつか種類があるようですが、MQTT.jsが一番使いやすいと思います。MQTT.jsサポートしているMQTTの機能は、JavaScript版と同じです。下記のコード例は、shiftr.ioのトピックをsubscribeするコード例です。message.toString());});下記のコード例は、shiftr.ioのトピックにpublishするコード例です。