【俺のプログラミング話を聞いてくれ】MQTT




こんにちは、群馬事業所の茶名網(仮名)です。
新しい案件での開発でMQTTの担当になりまして、
現在、基本的なことを学びながらシステムを開発中です。
まだまだ学びの途中ですが、MQTTについて学んだことを紹介します。

マニアックな技術の紹介記事ですので、覚悟してください。

MQTTとはIoTで使われるプロトコル

Message Queuing Telemetry Transportの略称。

メッセージ指向ミドルウェアのアプリケーション層で使用される、TCP/IPによるPublish/Subscribe型データ配信モデルの軽量なデータ配信プロトコルです。

多数のIoTやM2Mデバイスの制御に向いており、
サーバ側からのデバイス管理はもちろん、IoTデバイス同士の通信も可能です。

MQTTは1999年に、IBMで開発されました。



・MQTTではデータの送受信をPublisher(送信者)、Subscriber(受信者)の2つの役割に分けて行います。
・PublisherはMQTTブローカー(処理サーバ)にデータを送信します。
・SubscribeはMQTTブローカー(処理サーバ)にデータを受信しに行きます。

この仕組みで、非同期の双方向通信を実現しています。
非同期通信のため、Publisher/Subscriberを増やすことが容易になります。
また、Publisher/SubscriberそれぞれがTopicを設定することで、MQTTブローカー(処理サーバ)はTopicごとにメッセージを振り分けて1対多の通信を可能にしています。



MQTTのシステムの基本構造


Publish/Subscribe メッセージングモデルにより、非同期に 1 対多のメッセージ配信ができます。
メッセージを送る側とメッセージを受け取る側を共通して Consumer と呼びます。
また、そのメッセージを中継するのが、MQTTサーバです。
Consumer 同士は、お互いを知ることなく、メッセージのやり取りができます。



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





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



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

MQTTのメッセージとTopic



MQTTサーバが、メッセージを仕分けするときにキーとするのが、Topic と呼ばれるものです。
Topic により仕分けを行い、メッセージを配信します。
Topic は、『/』区切りによって階層構造を表現します。

メッセージ例:
Topic_A/ Topic_B1/ Topic_C1
Topic_A/ Topic_B1/ Topic_C2
Topic_A/ Topic_B2/ Topic_C3

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

・Topicのフィルタリング
Subscribe では、欲しいメッセージの Topic をサーバーに登録します。
例えば、Topic があるとします。

群馬オフィス3階の電気代情報メッセージを受け取りたい場合は、office/gunma/3F/e_costで Subscribe します。
また、群馬オフィス3階の電気代情報メッセージだけでなく、東京オフィス3階の電気代情報メッセージも受け取りたい場合は、office/gunma/3F/e_cost と office/tokyo/3F/e_cost で Subscribe します。
Subscribe 時の Topic 指定では、ワイルドカードと呼ばれるものを使って、1 つの指定で複数の Topic を同時に指定できます。

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




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




例:
office/+/3F/e_cost
↓同じ意味
office/gunma/3F/e_cost
office/tokyo/3F/e_cost

・マルチレベル・ワイルドカードの例
『#』 記号が、マルチレベル・ワイルドカードです。
『#』 記号を指定した階層以下のすべての Topic 文字列とマッチします。
(図8)


例:
office/tokyo/#
↓同じ意味
office/tokyo/3F/e_cost
office/tokyo/3F/w_cost
office/tokyo/4F/e_cost
office/tokyo/4F/w_cost


Publish/Subscribe メッセージングモデルでのメッセージの流れ


Publish/Subscribe メッセージングモデルでのメッセージの流れを具体的に見てみます。
Subscriber として、3 種類のデバイスが、それぞれ次表の情報を欲しているとします。


それぞれのSubsrriberからserverに要求が来ます。

それに対してPublisherはserverに必要な情報を渡します。
serverがしかるべきSubscriberに情報を渡します。





以上で、MQTTの解説を終わります。
最後まで読んでいただきありがとうございました。


GITの応募ページを確認してみる!