イラストで理解するMQTT

IoT関連の技術にMQTTというプロトコルが存在します。 今回はIoT初心者の私がMQTTについて知識0の状態から学んだことを記事にします。
2023.12.04

はじめに

皆さんはMQTTというプロトコルを聞いたことがありますか?
私はありませんでした。

MQTTは主にIoTの分野で使用されるプロトコルです。
なぜIoTではこのMQTTが使われているのか?何がいいのか?
図を用いて学習したことを記事にしていきたいと思います。

IoTの通信に必要なこと

MQTTを知る前に、まずはIoTデバイスに必要な環境を想像してみましょう。
IoTといえば最近では家電のIoT化など、身近にIoT製品が増えてきました。

しかし、IoTデバイスが設置されるのはそんな優しい環境だけではありません。
工場や室外など、過酷な環境に設置されるIoTデバイスもたくさんあります。

ネットワーク環境も必ずしもいいとは限りません。
低帯域のネットワークや、不安定なネットワークもあります。
IoTデバイスは直接電源を供給できないケースもあります、そういったデバイスは低電力で動作する必要があります。

IoTデバイスは数が非常に多いです、時には数千個のデバイスに対応する必要があります。
また、それぞれのデバイスとセキュアに通信する必要もあります。

IoTの通信では、こんなにたくさんの要望を満たす必要があります。
そして、それができるプロトコルが今回紹介するMQTTです。

用語

ではMQTTのすごいところを説明する前に、まずはMQTTを学ぶ際に出てくる用語を紹介します。
まずは全体像です。

では、一つずつ見ていきましょう。

MQTTクライアント

MQTTクライアントはMQTTを使用してメッセージを送受信するものを表します。
メッセージを送信するデバイス, メッセージを受け取って表示するアプリケーション、送信側も受信側もMQTTクライアントです。

ブローカー

ブローカーは受け取ったメッセージを適切なMQTTクライアントに渡す仲介役です。
このブローカーを挟んで、送信側、受信側が疎結合な状態で通信を行う方式をパブリッシュ/サブスクライブ(Pub/Sub)と言います。

ブローカーはデバイスではなくソフトウェアで、受信したメッセージを適切な受信者にルーティングします。
OSSのMQTTブローカーもあります。

パブリッシュ/サブスクライブ

MQTTクライアントがメッセージを送信することをパブリッシュと言います。
そして、メッセージをパブリッシュするやつをパブリッシャーと言います。

逆にMQTTクライアントがメッセージを受け取ることをサブスクライブと言います。
そして、メッセージをサブスクライブするやつをサブスクライバーと言います。
え、ややこしい。ということで図にするとこんな感じです。

MQTTクライアントはメッセージを送受信するコンポーネント全体を指します。
パブリッシャーとサブスクライバーは、メッセージの送信者、受信者を指します。

トピック

パブリッシャーはブローカーにメッセージを送る際、何に関するメッセージかを知らせる必要があります。
それがトピックです。

トピックは受け取ったメッセージを入れる箱のようなものです。

トピックには「家/温度計/温度計の番号」というように"/"で区切られた階層構造の目印がついています。
実際の表記だとこんな感じになると思います。

myhome/temperature/livingroom

各階層には"+"や"#"といったワイルドカードを使用することもできます。
「家/温度計/+」とすることで、家の全ての温度計トピックからデータを取得することができます。

このトピックをサブスクライバーはサブスクライブ(定期購読)します。
ブローカーはどのサブスクライバーがどのトピックに紐づいているかを整理して、転送しているだけです。
あくまでもどのメッセージを取得するかはサブスクライバー側が選択します。

MQTTのここがすごい

では、用語も分ってきたのでMQTTは何がすごいのか、一つずつ見ていきましょう。

低帯域での通信

MQTTはシンプルなデータ構造をしており、ヘッダーは必要最小限のみとなっています。
そのため低帯域でも通信が可能です。

MQTTは通信に必要な接続を可能な限り維持します。
HTTPのように通信の度にコネクションを作る必要も、ヘッダーに宛先のメタデータを付ける必要もありません。

低電力

また、データサイズが小さいということはコンピュータの処理量が少ないということになります。
そして、処理が少ないということはCPUなどのリソースは少ない動作で済みます。
つまり低電力で動作するということになります。

信頼性

MQTTはデータの送信側、受信側、その仲介と3つのフェーズに分かれています。
それぞれの通信でQoS(Quality of Service)レベルという規格が定められており、データの損失リスクを下げるような仕組みがあります。

QoSは0~2までのレベルがあります。

QoSレベル0
最大1回のメッセージが送信されます。
1回はメッセージが送信されますが、到達することは保証されていません。
そのためデータが損失しても大きな問題が起きないような場合に利用されます。

温度センサーのように変化の少ない連続したメッセージに使用されることが多いようです。

QoSレベル1
最低1回のメッセージが到達することが保証されます。
送信者が送信したメッセージは受信者に届き、受信者はメッセージが届いたことを送信者に通知します。
これによりメッセージが到達することが保証されます。

ただし、メッセージが重複する可能性があります。
受信者が受け取ったというメッセージが送信者に届かなかった場合、送信者は再度メッセージを送ります。
この場合はメッセージの重複が発生します。

IoT家電のように、重複してもいいから1回はメッセージが届いてくれればそれでいい。というようなケースで使用されることが多いようです。

QoSレベル2
正確に1回メッセージが到達することが保証されます。
メッセージの重複や損失が発生しないように2回のやり取りを行う仕組みです。

1回目のやりとり
送信側はメッセージを送信します。
また、この時送信するメッセージを一時的に保存します。
受信側はメッセージを受け取り一時保存します。そしてメッセージを受け取ったことを通知します。
送信側はメッセージを受け取り、メッセージが届いたことが確認できると一時保存したメッセージを破棄します。

2回目のやりとり
送信側はメッセージの処理を許可することを受信側に通知します。
受信側がブローカの場合はサブスクライバーへメッセージを送信します。
受信側がサブスクライバーの場合は、アプリケーションにメッセージを渡します。
最後に受信側はメッセージを処理したことを送信側へ通知します。

このように、2回のやり取りを行うことでメッセージの重複と損失を避けるような仕組みになっています。
金融システムなど、1つのメッセージが重要なシステムで使用されます。

システムの性質によって、メッセージの通信方法を柔軟に変化できるのもMQTTの良いところです。
また、このQoSはパブリッシャー<=>ブローカー<=>サブスクライバーのそれぞれの通信において、別々のQoSレベルを設定することができます。

1対Nの通信

ブローカーを通さずにパブリッシャーとサブスクライバーが1:1の関係の場合、とんでもないコネクション数になってしまいます。

MQTTはブローカーを挟んだPub/Sub方式なので、パブリッシャーから受け取った1つのメッセージを、複数のサブスクライバーへサブスクライブすることができます。
IoTデバイスは日に日に数が増えているので、こういった拡張性も必要とされます。

セキュアな通信

MQTTはTCP/IPの上で動作しています。そして、TLS/SSL暗号化をサポートしているためメッセージを暗号化して送信することができます。
また、MQTTクライアントからブローカーへ接続する際、ユーザー名とパスワードによる認証機能を使うこともできます。

所感

パブリッシャー、ブローカー、サブスクライバーなど、あまり耳馴染みのない単語が多く出てきました。
最近はサブスクリプションという言葉が流行っているので、定期購読はなんとなくイメージが付きやすいかもしれませんね。  

折角クラスメソッドにジョインしたので、以前から興味のあったIoTに入門してみたい!ということで今回の記事を書きました。
これからもIoT関連のサービスや技術について書いていくつもりなので、IoT興味あるけどなかなかキャッチアップできないという方は是非私と一緒に学んでいきましょう!!