MQTT の仕様
MQTT とは何か
MQTT は、Publish/Subscribe メッセージングモデルにより、非同期に 1 対多の通信ができるプロトコルです。
プロトコル仕様は、軽量かつシンプルにデザインされています。IoT(Internet of Things)や M2M(Machine to Machine)などのように、小メモリやネットワーク帯域幅が限られているような環境での利用に適しています。
Publish/Subscribe メッセージングモデル
Publish/Subscribe メッセージングモデルにより、非同期に 1 対多のメッセージ配信ができます。
メッセージを送る側とメッセージを受け取る側を共通して Consumer と呼びます。また、そのメッセージを中継するのが、MQTT Server です。MAGELLAN では、この MQTT Server の機能を提供しています。
Consumer 同士は、お互いを知ることなく、メッセージのやり取りができます。
以降は便宜上、メッセージを送る Consumer を Publisher と呼び、メッセージを受け取る側の Consumer を Subscriber と呼ぶこととします。
Publisher は、メッセージを MQTT Server へ送るとき、送ったメッセージがどの Subscriber に届くのか、何台の Subscriber に届くのかなど、一切関知しません。一方、Subscriber は、メッセージがどの Publisher から送られて来るのかを知ることなく、欲しいメッセージを受け取ります。このお互いを知らない Publisher と Subscribe を繋ぐのが MQTT Server です。
MQTT Server は、Subscriber から、どのようなメッセージが欲しいのかを事前に教えてもらいます。これを Subscribe と言います。
MQTT Server は、その Subscribe されたときの情報を元に、Publisher から送られたメッセージを仕分けして、適切に Subscriber にメッセージを送ります。この Publisher から MQTT Server にメッセージを送ったり、MQTT Server から Subscriber にメッセージを送ることを Publish と言います。
MQTT Server が、メッセージを仕分けするときにキーとするのが、Topic と呼ばれるものです。MQTT のメッセージは、Topic を持ちます。この Topic により仕分けを行い、メッセージを配信します。
メッセージと Topic
MQTT のメッセージは、/
で区切られた Topic と呼ばれるものを持ちます。
Topic は、/
区切りによって階層構造を表現します。例えば、次のような 3 種類の Topic があるとします。
foo/bar/baz
foo/bar/qux
foo/quux/foobar
この Topic の階層構造は、下図のようになります。
この Topic で、メッセージの内容を表現します。例えば、ある会社の福岡オフィス 3 階の温度を示す Topic は、次のように表現できます。
office/fukuoka/3F/temp
温度 25.8 °Cの MQTT メッセージの概念図:
また、東京オフィス 6 階の湿度を示す Topic は、次のように表現できます。
office/tokyo/6F/humid
湿度 76% の MQTT メッセージの概念図:
Topic のフィルタリング
Subscribe では、欲しいメッセージの Topic をサーバーに登録します。
例えば、次のような Topic があるとします。
Topic | 意味 |
---|---|
office/fukuoka/3F/temp | 福岡オフィス 3 階の温度情報 |
office/fukuoka/3F/humid | 福岡オフィス 3 階の湿度情報 |
office/tokyo/3F/temp | 東京オフィス 3 階の温度情報 |
office/tokyo/3F/humid | 東京オフィス 3 階の湿度情報 |
office/tokyo/4F/temp | 東京オフィス 4 階の温度情報 |
office/tokyo/4F/humid | 東京オフィス 4 階の湿度情報 |
福岡オフィス 3 階の温度情報メッセージを受け取りたい場合は、Topic office/fukuoka/3F/temp
で Subscribe します。
また、福岡オフィス 3 階の温度情報メッセージだけでなく、東京オフィス 3 階の温度情報メッセージも受け取りたい場合は、Topic office/fukuoka/3F/temp
と Topic offie/tokyo/3F/temp
で Subscribe します。
Subscribe 時の Topic 指定では、ワイルドカードと呼ばれるものを使って、1 つの指定で複数の Topic を同時に指定できます。
ワイルカードには、シングルレベル・ワイルドカードとマルチレベル・ワイルドカードがあります。それぞれ、+
記号と #
記号を使って、Topic 内で使用します。
次は、シングルレベル・ワイルドカードの例です。
+
記号が、シングルレベル・ワイルドカードです。+
記号を指定した同一階層のすべての Topic 文字列とマッチします。
office/+/3F/temp
この例の場合は、+
記号が office の次の階層に指定されているので、office の次の階層にある fukuoka
と tokyo
にマッチします。
office/fukuoka/3F/temp
office/tokyo/3F/temp
続いて、マルチレベル・ワイルドカードの例です。
#
記号が、マルチレベル・ワイルドカードです。#
記号を指定した階層以下のすべての Topic 文字列とマッチします。
office/tokyo/#
この例の場合は、#
記号が tokyo の次の階層に指定されているので、tokyo の次の階層以降にあるすべてにマッチします。
office/tokyo/3F/temp
office/tokyo/3F/humid
office/tokyo/4F/temp
office/tokyo/4F/humid
メッセージの流れ
Publish/Subscribe メッセージングモデルでのメッセージの流れを具体的に見てみます。
ここでは、Subscriber として、3 種類のデバイスが、それぞれ次表の情報を欲しているとします。
デバイス | 欲しい情報 | Subscribe する Topic |
---|---|---|
福岡オフィス 3 階の温度情報 | office/fukuoka/3F/temp |
|
全オフィス 3 階の温度情報 | office/+/3F/temp |
|
東京オフィス全階の温度と湿度情報 | office/tokyo/# |
下図は、Subscribe の様子です。
この状態で、次表の Publish を行うとどうなるかを見てみます。
デバイス | Publish 時の Topic | Publish する情報 |
---|---|---|
福岡オフィス 3 階の温度センサ | office/fukuoka/3F/temp |
25.8°C |
東京オフィス 3 階の温度センサ | office/tokyo/3F/temp |
23.6°C |
東京オフィス 4 階の湿度センサ | office/tokyo/4F/humid |
76% |
まず、「福岡オフィス 3 階の温度センサ」からの Publish です。
続いて、「東京オフィス 3 階の温度センサ」からの Publish です。
最後に、「東京オフィス 4 階の湿度センサ」からの Publish です。
このような形で、Publish/Subscribe メッセージングモデルでは、メッセージが流れます。
MQTT 関連情報
Groovenauts のエンジニアブログ でも MQTT に関する情報を掲載しています。こちらも合わせてご覧ください。
仕様
現時点での MQTT の仕様は次のとおりです。
機能 | 仕様 |
---|---|
QoS | 0 のみ |
Retain | あり |
Retain 有効期限 | 30 分 |
Will メッセージ | あり |
最大メッセージサイズ | 1 キロバイト |
メッセージ数制限 | なし |
Topic | Worker に配信する Topic は、先頭が worker で始まる必要あり例) worker/office/fukuoka/3F/temp |
QoS
メッセージの送達保証レベルを示します。現時点では、QoS 0 のみのサポートです。
QoS | 意味 |
---|---|
0 | メッセージが最高 1 回は配信されます。メッセージが送信先に確実に届くかの保証はされません。 |
1 | メッセージが最低 1 回は配信されます。メッセージが送信先に確実に届く保証はされますが、重複してメッセージが届く可能性があります。 |
2 | メッセージが正確に 1 回配信されます。メッセージが送信先に確実に届く保証がされます。重複したメッセージが届くことはありません。 |
Retain
トピック毎の最新のメッセージを保存できるかどうかを示します。現時点では、30 分間トピック毎の最新メッセージが保存できます。
Will メッセージ
予期せず接続が切断されたときに、あらかじめ指定しておいたメッセージを送信できるかどうかを示します。この Will メッセージが利用可能です。
最大メッセージサイズ
1 度に送信できるメッセージの大きさを示します。現時点では、最大 1 キロバイトのメッセージが 1 度に送信できます。
参考文献
- MQTT Version 3.1.1
- MQ Telemetry Transport (MQTT) V3.1 プロトコル仕様
- MQTT V3.1 プロトコル仕様(PDF)
- MQTT とはなんだったのか
- 「絵で見てわかるIoT/センサの仕組みと活用」(翔泳社、ISBN-13: 978-4798140629)