以前の記事でArduinoなどのマイコンをwebサーバーとして動作させました。この方法はマイコンでのプログラミングだけでなく、ネットワークやwebページのプログラミングについても知識が必要になります。こうした知識がなくてもIoTデバイスとコンピュータとの間で柔軟にデータ通信を行えるよう、MQTTプロトコルが開発されました。
MQTTとは
MQTT(Message Queue Telemetry Transport)の考え方は、家庭で情報交換をするコルクボードや冷蔵庫の扉に似ています。
コルクボードや冷蔵庫の扉にプリントやメモを貼って情報交換をしたり、to doリストにしたりすることがあります。コルクボードや冷蔵庫の扉は学校のこと、町内会のこと、ゴミ出しのことなどトピックが分かれていて、家族の誰もがプリントや郵便・メモなどを貼り付けられます。家族はそれぞれに他の人が貼り付けた情報を読むことができ、興味や必要のない情報は読まないという選択もできます。
MQTTでは、コルクボードや冷蔵庫の扉の役割を「MQTTブローカー」と呼ばれるサーバーが引き受けます。MQTTブローカーはすべてのクライアント(家族)からのメッセージを受信し、トピックに基づいて整理します。ブローカーはあらかじめ、どのクライアントがどのトピックの情報を必要としているか、という情報(サブスクリプションを持っているという)を知っています。新しいメッセージを受信すると、そのトピックをサブスクリプションしているクライアントに情報を転送します。
家庭内のIoTデバイスからのメッセージの一例です。
メッセージ①:“So_25D7” Topic「浴室」「温度」 内容「23.0℃」
メッセージ②:“So_25D7” Topic「浴室」「湿度」 内容「37%」
メッセージ③:“So_25D7” Topic「リビング」「照明」 内容「OFF」
メッセージ④:“So_25D7” Topic「リビング」「温度」 内容「21.8℃」
ブローカーにとっては、トピックもメッセージの内容も単なる文字列でしかなく、一切処理は行わずに、情報を必要とするクライアントに転送します。クライアントが必要な情報をブローカーに通知するサブスクリプションは階層構造をなしています。(パソコンのフォルダのような構造をしています)
サブスクリプションする階層の指定には「ワイルドカード」も使用できます。
「#」は「この階層のすべてのトピックとその下位のすべてのトピック」を表し、
「+」は「この階層のすべてのトピック」を表します。
先ほどの例では、
「“So_25D7”」「浴室/温度」のサブスクリプションを持っているクライアント
→メッセージ①のみを受信します
「浴室/#」のサブスクリプションを持っているクライアント
→メッセージ①と②を受信します
「#」のサブスクリプションを持っているクライアント
→すべてのメッセージを受信します
「+/温度」のサブスクリプションを持っているクライアント
→メッセージ①と④を受信します
「玄関/温度」のサブスクリプションを持っているクライアント
→すべてのメッセージを受信しません。(サブスクリプションする階層名が違う)
各クライアントは、必要に応じてサブスクリプションを作成・削除できます。同様に任意のトピックに対してメッセージを送信(公開)できます。アプリケーションに応じて一貫性のあるトピックの階層を設定することがプログラマーの仕事です。
通常のメッセージはブローカーが受け取り、必要なクライアントに送信した後すぐに消去されますが、「リテイナー」という目印をつけておくことで、関連するトピックの新しいメッセージを受け取るまでメッセージを保持しておくことができます。
先ほどの例の3つ目のリビングの照明についてのメッセージを、例えばリビングのテレビが照明のON/OFFの情報をサブスクリプションしていたとします。照明がON/OFFされたときにだけメッセージが送信されていたとしても、リテイナーでメッセージを保持しておけば、最後に送ったメッセージをいつでもテレビは受け取ることができます。
図2では、「リビング/照明」のデータをリテイナーで保存していたのでクライアントAは最後のメッセージ「OFF」を受け取ることができます。一方で、「リビング/温度」のデータはリテイナーで保存されていないため、次にクライアントBが温度のデータを送信するまでデータのない状態になります。
データパケットがネットワーク上での通信中に失われてしまい、正しく通信できない場合があります。MQTT通信ではメッセージにQoSマーカーを実装して通信の信頼性を向上させることができます。QoSとはQuality of Serviceの略で、サービスの品質のことです。ここでは通信の信頼性を意味します。
QoSはその信頼性によってQoS 0~2のレベルがあります。
QoS 0ではメッセージを応答のあるなしにかかわらず1度だけ送信します。
QoS 1ではクライアントが「受信したよ」と返事をするまで送信を続けます。
一見これで問題なく通信できそうですが、アプリケーションによっては誤動作を引き起こすかもしれません。クライアントの「受信したよ」という返事を送信側が受け取れなかった場合、同じメッセージを何度も送り続けることになるからです。
QoS 2にすると、クライアントがメッセージを「一度だけ、しかも確実に受信した」ことの確認ができるまで通信を行います。もちろん、最も信頼性が高いのはQoS 2の場合です。
とはいえ、通常、家庭で使用するアプリケーションであればQoS 0で十分といえます。安全や防犯に直結する、例えばドアロックやガレージのシャッターなどではQoSの高い通信を利用するべきですが、こうした用途の場合はもっと他にも考慮しなくてはならないことがありますので、D.I.Y.ではなく販売されているサービス・製品を利用する方が良いでしょう。(通信の暗号化、ネットワークの不正アクセスへの対処など安全・セキュリティ面で考えることはたくさんあります)
次回は、可変抵抗とLEDを使用したIoTの例をMQTTプラットフォームに転送して、ブラウザ上で動作させてみます。
コメントを残す