こんにちは、Keita_Nakamori(´・ω・`)です。
みなさんIOTしていますか?
今日はIOTで流行っている通信プロトコルであるMQTTについてやっていこうと思います。
なぜMQTTか
OASISという規格団体において、軽い、公開、単純、簡単に使えるというコンセプトで設計されたプロトコルです。
従来のHTTPプロトコルは人と人がコンピューターを介してコミュニケーションを取ることが前提となっており、1つのコンテンツで多くの情報をやり取りしています。
しかし、IOTの場合は莫大な数のIOTデバイスと接続することになりますので、速くて軽いプロトコルである、”MQTTプロトコル”を使いこなしていく必要があります。
MQTTの特徴
すこし専門用語を出しますが、
MQTTはクライアント・サーバー間のpublish・subscribeメッセージをバイナリ(2進数)でやり取りするプロトコルです。
- トランスポート層ではTCPをベースとます。
- セキュリティはTLS/SSLを使用します。
- MQTTは確実なデータ発信と重複を避けることができます。
- 順序が決まっていてかつ可逆的な2進数情報をread/writeの両方向に対して適用されます。
MQTTの用語
peer:仲間という意味で、PCやIOTデバイスのようなサーバーではない端末のことです。MQTTクライアントとも言います。
Broker:サーバーのことです。Central MQTT BrokerとかLocal MQTT Brokerという使い方をします。
Publish:Brokerにデータを渡す。
Topic:Publishされたデータを格納する箱。encodingはutf-8。例えばAなら01000001という2進数8bitで表現されます。
Topic Level:トピックはツリー構造で格納されます。例えば
- mytopic/machine_001/transmission_system_001/bearing_001/temperature
というように、トピックレベルセパレーターと呼ばれるスラッシュ記号で表現します。この各ディレクトリのことをトピックレベルと呼びます。
Subscribe:Broker内のTopicのデータを送ってもらうよう申し入れをします。
QoS:サービス品質 Quality of Serviceです。
レベルの低いものから
QoS_0
Publisherがメッセージを投げたらBrokerを通してSubscriberに渡す。そして、Publisherはメッセージを消す。
QoS_1
PublisherはメッセージをBrokerに投げる前に、Publisher自身がメッセージを保持する。PublisherがメッセージをBrokerに投げたら、Broker内で一旦保持してからSubscriberにわたす。渡ったらBrokerはメッセージを消して、続いてPublisherもメッセージを消す。少し複雑になりました。
QoS_2
PublisherはメッセージをBrokerに投げる前に、Publisher自身がメッセージを保持する。PublisherはメッセージをBrokerに投げたら、Broker内で一旦保持してからSubscriberにわたす。渡ったらBrokerはPUBRECをPublisherへ渡して、PUBRELが返ってきてから、Broker内のメッセージを消す。
渡ったらBrokerはメッセージを消して、PUBCOMPを渡す。
それによって、Publiserはメッセージを消す。とても長い手順を踏むことになります。
MQTTのヘッダーフォーマット
頭にヘッダー情報をつけます。ヘッダーは2バイトで構成されています。
- 4bitでコマンドメッセージタイプを指定します。
- 1bitでDUP(デュプリケート、複製)
- 2bitでQos Level(Quality of Service Level)
- 1bitでRERTAIN
これで1バイトです。
次の1バイト中最大4bitを使ってRemaining Lengthを表現します。
その次にペイロード(内容)を書いていくのですが、それはまたあとでやりましょう。