IOT:速くて軽い MQTTプロトコル

こんにちは、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バイトで構成されています。

  1. 4bitでコマンドメッセージタイプを指定します。
  2. 1bitでDUP(デュプリケート、複製)
  3. 2bitでQos Level(Quality of Service Level)
  4. 1bitでRERTAIN

これで1バイトです。

次の1バイト中最大4bitを使ってRemaining Lengthを表現します。

その次にペイロード(内容)を書いていくのですが、それはまたあとでやりましょう。