MQTT の仕様

MQTT とは何か

MQTT は、Publish/Subscribe メッセージングモデルにより、非同期に 1 対多の通信ができるプロトコルです。

プロトコル仕様は、軽量かつシンプルにデザインされています。IoT(Internet of Things)や M2M(Machine to Machine)などのように、小メモリやネットワーク帯域幅が限られているような環境での利用に適しています。

Publish/Subscribe メッセージングモデル

Publish/Subscribe メッセージングモデルにより、非同期に 1 対多のメッセージ配信ができます。

Publish/Subscribe メッセージングモデルの Publish 概略図

メッセージを送る側とメッセージを受け取る側を共通して Consumer と呼びます。また、そのメッセージを中継するのが、MQTT Server です。MAGELLAN では、この MQTT Server の機能を提供しています。

Consumer 同士は、お互いを知ることなく、メッセージのやり取りができます。

以降は便宜上、メッセージを送る Consumer を Publisher と呼び、メッセージを受け取る側の Consumer を Subscriber と呼ぶこととします。

Publish/Subscribe メッセージングモデルの Publish 概略図(Publisher/Subscriber 版)

Publisher は、メッセージを MQTT Server へ送るとき、送ったメッセージがどの Subscriber に届くのか、何台の Subscriber に届くのかなど、一切関知しません。一方、Subscriber は、メッセージがどの Publisher から送られて来るのかを知ることなく、欲しいメッセージを受け取ります。このお互いを知らない Publisher と Subscribe を繋ぐのが MQTT Server です。

MQTT Server は、Subscriber から、どのようなメッセージが欲しいのかを事前に教えてもらいます。これを Subscribe と言います。

Publish/Subscribe メッセージングモデルの Subscribe 概略図

MQTT Server は、その Subscribe されたときの情報を元に、Publisher から送られたメッセージを仕分けして、適切に Subscriber にメッセージを送ります。この Publisher から MQTT Server にメッセージを送ったり、MQTT Server から Subscriber にメッセージを送ることを Publish と言います。

Publish/Subscribe メッセージングモデルの Publish 概略図

MQTT Server が、メッセージを仕分けするときにキーとするのが、Topic と呼ばれるものです。MQTT のメッセージは、Topic を持ちます。この Topic により仕分けを行い、メッセージを配信します。

メッセージと Topic

MQTT のメッセージは、/ で区切られた Topic と呼ばれるものを持ちます。

Topic 付きメッセージのイメージ図

Topic は、/ 区切りによって階層構造を表現します。例えば、次のような 3 種類の Topic があるとします。

foo/bar/baz
foo/bar/qux
foo/quux/foobar

この Topic の階層構造は、下図のようになります。

Topic の階層構造図

この Topic で、メッセージの内容を表現します。例えば、ある会社の福岡オフィス 3 階の温度を示す Topic は、次のように表現できます。

office/fukuoka/3F/temp

温度 25.8 °Cの MQTT メッセージの概念図:

Topic 付きメッセージ例 1 の図

また、東京オフィス 6 階の湿度を示す Topic は、次のように表現できます。

office/tokyo/6F/humid

湿度 76% の MQTT メッセージの概念図:

Topic 付きメッセージ例 2 の図

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 の様子を示した図

Subscribe 時の Topic 指定では、ワイルドカードと呼ばれるものを使って、1 つの指定で複数の Topic を同時に指定できます。

ワイルカードには、シングルレベル・ワイルドカードとマルチレベル・ワイルドカードがあります。それぞれ、+ 記号と # 記号を使って、Topic 内で使用します。

次は、シングルレベル・ワイルドカードの例です。

+ 記号が、シングルレベル・ワイルドカードです。+ 記号を指定した同一階層のすべての Topic 文字列とマッチします。

office/+/3F/temp

この例の場合は、+ 記号が office の次の階層に指定されているので、office の次の階層にある fukuokatokyo にマッチします。

シングルレベル・ワイルドカードの例を示した図

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 の様子です。

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 です。

Publish の実例図その 1

続いて、「東京オフィス 3 階の温度センサ」からの Publish です。

Publish の実例図その 2

最後に、「東京オフィス 4 階の湿度センサ」からの Publish です。

Publish の実例図その 3

このような形で、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 度に送信できます。

参考文献