MQTTを使って、IOT通信環境紹介1－IOTとMQTTの基本概念


1、IOTとは何ですか？
　モノのインターネット（IoT）は、英国のRFID（Radio Frequency Identification）の分野における技術の先駆者であるKevin Ashtonによって造られた用語で、ユビキタスセンサーを介して現実の世界をインターネットに接続するシステムを考案しました。モノのインターネットはインターネットを元にに構築され、人と人がつながっているインターネットとは異なり、それはマシンとマシンの間の相互接続（M2M）に焦点を当てています。

2、IOT機器のデータ特性とネットワークアーキテクチャ
　IOTシステムは、リアルタイムで様々な端末装置からデータを受信することだけでなく、いつでも装置に制御コマンドを送信することも要求されます。これには、IOTデバイスのデータフォーマットが短くてスリムで解析しやすいことが必要です。さらに、通信プロトコル自体が軽量、スケーラブルで、ネットワークとデバイスの不安定に対処できることも必要です。
　IoTデバイスは通常、工場、病院、駅、空港などの集合箇所または自動車、石油パイプライン、風力発電などのような分散した設備に配置されます。これには、さまざまなワイヤレス（赤外線、Bluetooth、WIFI、3G、4G、5G、衛星）および有線通信技術を使用してリモートサーバーにデータを送信できることが必要です。
　IoTデバイスの密度を考慮すると、エッジコンピューティングノードを導入することで大量の生データを効果的にフィルタリングし、一次処理されたより綺麗なデータを中央ビジネス処理プラットフォームに流入することを可能にします。このようにして、中枢ネットワークのトラフィックを減少し、さらに、主処理プラットフォームの効率も向上させることもできます。

IOTネット構成図:
![image.png](https://qiita-image-store.s3.amazonaws.com/0/304588/e57ce171-9be8-8d7b-f55f-4530710b78b8.png)

4、MOTTについて
　現在のIOTプロトコルの中で、最も競争力があり、一番広く使用されている通信プロトコルは、IBM社は1999年提出したMQTTです。2011年にMOTTのオープンソースプロジェクトPahoを設立し、Eclipseソフトウェア財団に寄付しました。MQTTプロトコルは非常に軽量で拡張性が高く、上記のIOT問題を有効的に解決することができます。現在、モノのインターネット（Internet of Things）の通信規格の1つになりました。

5、MOTTプロトコルメッセージ構造
　MOTTプロトコルのメッセージ構造は、他のネットワーク通信プロトコルと比較して非常に単純で明確であり、主に次の3つの部分から構成されています。
プロトコル構造：固定ヘッダ＋可変ヘッダ＋ペイロード

MOTTプロトコル構造図:
![image.png](https://qiita-image-store.s3.amazonaws.com/0/304588/c6c79cb4-c1e1-5a43-d6e3-d744bc36c615.png)

メッセージの詳細な説明については公式文書をご参照してください。
http://docs.oasis-open.org/mqtt/mqtt/v3.1.1/mqtt-v3.1.1.html

6、MOTTプロトコルの動作原理（PUBとSUBモデル）
　MQTTプロトコルは、ネットワーク内で2つのエンティティタイプ、メッセージブローカとクライアントを定義します。ブローカは、クライアントからすべてのメッセージを受信し、それらを関連するターゲットクライアントにルーティングするサーバーです。基本的にQoS0,QoS1,QoS2など三つのサービス品質が提供できます。クライアントとは、メッセージの生産と消費する側です。クライアントは、同時に、自分で生産したメッセージも消費できます。
　クライアントがプロキシに接続します。エージェント内の任意のメッセージ「トピック」を購読できます。この接続は、機密メッセージを送信するための単純なTCP / IP接続、または暗号化されたTLS接続です。
　クライアントは、メッセージとトピックをブローカに送信することによって、トピックのメッセージを公開します。その後、ブローカはそのトピックを購読しているすべてのクライアントにメッセージを転送します。

MQTTアーキテクチャ図:
![image.png](https://qiita-image-store.s3.amazonaws.com/0/304588/3f37a40f-ed07-ec5f-b1ed-5a51dc704371.png)

6、MOTTプロトコルによって提供されるQoSモデル
■QOS 0 – Only Once
　メッセージはTCP / IPネットワークを介して送信されます。 応答はありません、そして、再送の仕組みはプロトコルで定義されません。 メッセージは一度サーバーに到着するか、まったく到着しないことがあります。

QOS-0処理図:
![image.png](https://qiita-image-store.s3.amazonaws.com/0/304588/fd60ce7f-9c38-2340-32ce-48d4142173be.png)

■QOS 1 – At Least Once
　サーバーはメッセージを受信し、PUBACKフラッグを設定することによって確認されます。伝送障害がある場合、送信者はメッセージヘッダのDUPビットを設定してからメッセージを再度送信します。 メッセージは少なくとも1回サーバーに到着することが保証されます。
クライアントがPUBACKメッセージを受信しない場合（それがアプリケーション定義のタイムアウトであるか失敗であるかにかかわらず、その後通信セッションが再開されるかどうか）、クライアントは再度PUBLISHメッセージを送信してDUPビットを設定します。クライアントから重複データを受信すると、サーバはメッセージを購読者に再送信し、新たなのPUBACKレスポンスメッセージを返信します。

QOS-1処理図:
![image.png](https://qiita-image-store.s3.amazonaws.com/0/304588/13057dcb-9cb8-44fd-a3a9-d82f6f1d41a2.png)

■QOS 2 – Only Once
　QoSレベル1で付加された処理フローは、重複メッセージが受信側に配信されないようにします。 これは最高レベルの伝送であり、重複メッセージが許可されていない場合に使用されます。 これによりネットワークトラフィックが増加しますが、メッセージの内容が重要であるため通常は許容されます。QoSレベル2では、ヘッダーにメッセージIDがあります。

QOS-2処理図
![image.png](https://qiita-image-store.s3.amazonaws.com/0/304588/af2e27f0-aac4-3890-fea8-43ec73ad055b.png)


次回は流行なオープンソースソシューションを選択して、実際のMQTTのサーバーを構築します。
興味のある方は、今回の基本概念を理解して、ぜひ、実感してみてください。
https://qiita.com/MichaelYang/items/d4d69e12c40b97bdf0ff

参考資料:
https://en.wikipedia.org/wiki/MQTT
https://thenewstack.io/mqtt-protocol-iot/
http://docs.oasis-open.org/mqtt/mqtt/v3.1.1/mqtt-v3.1.1.html
http://www.steves-internet-guide.com/mqtt-protocol-messages-overview/
https://mcxiaoke.gitbooks.io/mqtt-cn/content/mqtt/02-ControlPacketFormat.html
http://www.steves-internet-guide.com/understanding-mqtt-qos-levels-part-1/
http://www.steves-internet-guide.com/understanding-mqtt-qos-2/