IoTに注目が集まるのに合わせて聞かれるようになっているのがMQTTです。MQTTはMQ Telemetry Transportの略で、TCP/IP層で使われるPub/Sub型のデータ配信モデルになります。今回はそんなMQTTの特徴について紹介します。

Pub/Sub型

Pub/Sub型というのはPub(Publisher:発行)側とSub(Subscriber:購読)側に分かれたモデルです。これまでのHTTPによる接続の場合、クライアントからサーバに対してリクエストを出してレスポンスを受け取るという形になっていました。サーバ側からクライアントに対してプッシュする仕組みは用意されておらず、Long pollingやCometなどを代替技術として使われてきました。HTML5になり、WebSocketやWebRTCといった相互通信技術が使えるようになりましたが、MQTTはWebSocketと同様にPub/Sub型で通信が可能です。

Pub/Sub型ではサーバとクライアントが直接つながる訳ではなく、間にブローカーと呼ばれる存在が必要です。そしてPublisher、Subscriberがそれぞれブローカーに接続し、topicと呼ばれる発行(購読)したい情報の種類を指定します。そして発行側はtopicを指定してデータを出力することで、同じtopicを購読しているクライアントに情報が配信されるようになっています。この時、ブローカーを間に挟んでいるため、PublisherはどれだけのSubscriberがいるのかを気にする必要がありません。同様に複数のPublisherが同じtopicを使えますので、Subscriberも情報源が一カ所とは限りません。

メッセージ品質の設定

Publisherはメッセージによって品質を決めることができます。全部で3つあり、

種類 回数 保証 再送 重複する可能性
QoS0 最高1回 × × ×
QoS1 最低1回
QoS2 1回 ×

品質から言えばQoS2が最も正確になりますが、それだけ手続きが複雑になります。閾値を超えた時のアラートについてはQoS2、それ以外の定常データ配信についてはQoS0とするなど使い分けるのが良いでしょう。

プロトコルの特徴

MQTTは主にIoTをターゲットにしていることもあり、転送されるデータ量を極力小さくしています。固定長ヘッダーは2byteしかなく、ネットワークトラフィックを減らせるようになっています。なお、メッセージ長は256MB(268,435,455byte)までとなっています。

ただしあまり大きなデータを送るとHTTPに比べてヘッダ長の小ささによるメリットがなくなりますので、小さなメッセージを送るために使うのが良いかと思います。

クライアントソフトウェア

MQTTは小型のIoTデバイスでも使われるのを想定されています。そのためC/C++、Perl、Ruby、Python、PHP、Java、C#、Objective-C、Swift、Processing、node.jsなど多数の実装があります。クライアントについては利用するマイコンに合わせて選択すれば良いでしょう。クライアントソフトウェアはPublisher、Subscriberの両方で動作します。

サーバ(ブローカー)

オープンソースの実装としてはxively/mosquitto(Ruby)emqtt/emqttd(Erlang)andsel/moquette(Java)Apache ActiveMQ ™(Java)mcollina/mosca(node.js)などの実装があります。

商用としてはニフティクラウドIBM MessageSightsangoなどがあります。


MQTTはこれまでのHTTPとは異なり、Pub/Sub型のメッセージングシステムとなっています。そのため、これまでのWebとは異なる使い方を考えるのが良いでしょう。場合によってはIoTにおいてもHTTPを使う方が良い場合もあります。

MQTTを体感し、その特性や利点をつかんでおくとよりアイディアが沸きやすくなるのではないでしょうか。ニフティクラウドではMQTTサービスが無料(β期間中)で提供されています。ぜひご利用ください!