• Skip to main content
  • Skip to primary sidebar
  • Skip to footer
  • HOME
  • Arduino
    • Arduino初心者編
    • Arduino基礎編
    • Arduino応用編
    • Arduino実践編
  • Raspberry Pi
  • microbit
  • XBee
  • Scratch
  • Contact Us
  • Privacy Policy

STEMSHIP

ものづくりを通して、科学を学ぼう!

現在の場所:ホーム / Arduino / Arduino応用編 / ArduinoでSTEM教育​ 応用編:MQTTプロトコル の概要

ArduinoでSTEM教育​ 応用編:MQTTプロトコル の概要

2020年9月19日 by STEMSHIP コメントを書く

以前の記事でArduinoなどのマイコンをwebサーバーとして動作させました。この方法はマイコンでのプログラミングだけでなく、ネットワークやwebページのプログラミングについても知識が必要になります。こうした知識がなくてもIoTデバイスとコンピュータとの間で柔軟にデータ通信を行えるよう、MQTTプロトコルが開発されました。

MQTTとは

MQTT(Message Queue Telemetry Transport)の考え方は、家庭で情報交換をするコルクボードや冷蔵庫の扉に似ています。

コルクボードや冷蔵庫の扉にプリントやメモを貼って情報交換をしたり、to doリストにしたりすることがあります。コルクボードや冷蔵庫の扉は学校のこと、町内会のこと、ゴミ出しのことなどトピックが分かれていて、家族の誰もがプリントや郵便・メモなどを貼り付けられます。家族はそれぞれに他の人が貼り付けた情報を読むことができ、興味や必要のない情報は読まないという選択もできます。

MQTTでは、コルクボードや冷蔵庫の扉の役割を「MQTTブローカー」と呼ばれるサーバーが引き受けます。MQTTブローカーはすべてのクライアント(家族)からのメッセージを受信し、トピックに基づいて整理します。ブローカーはあらかじめ、どのクライアントがどのトピックの情報を必要としているか、という情報(サブスクリプションを持っているという)を知っています。新しいメッセージを受信すると、そのトピックをサブスクリプションしているクライアントに情報を転送します。

  • 図1. 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が温度のデータを送信するまでデータのない状態になります。

  • 図2. MQTTデータ通信を時系列で模式的に表した図

データパケットがネットワーク上での通信中に失われてしまい、正しく通信できない場合があります。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プラットフォームに転送して、ブラウザ上で動作させてみます。

Filed Under: Arduino応用編 関連タグ:MQTT

Reader Interactions

コメントを残す コメントをキャンセル

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください。

最初のサイドバー

CONTACT US

  • Facebook
  • Twitter
  • Youtube

More to See

Arduinoベースのセンサノード:XBeeデータ収集ノードの製作

2021年9月27日 By STEMSHIP

Arduinoベースのセンサノード:Arduinoを使った温度センサの作製

2021年9月21日 By STEMSHIP

XBeeモジュールとBMP280センサを使用してデータ収集する

2021年5月31日 By STEMSHIP

XBeeモジュールでMicroPythonを使ってセンサを読み取る

2021年5月24日 By STEMSHIP

XBeeモジュールでセンサを読み取る:センサノードの設定と測定

2021年5月17日 By STEMSHIP

カテゴリー

  • Arduino (44)
    • Arduino初心者編 (15)
    • Arduino基礎編 (11)
    • Arduino実践編 (4)
    • Arduino応用編 (11)
    • Arduino番外編 (3)
  • MakeyMakey (1)
  • microbit (11)
  • Raspberry Pi (13)
  • Scratch (6)
  • STEM教育 (5)
  • XBee (15)
  • ものづくり教育 (2)
  • 子供の教育 (2)
  • 科学 (6)
  • 算数 (5)

Tags

BLE DCモータ EEPROM ELEGOO ESP32 ESP8266 IoT LCD LED makeymakey MQTT Node-RED scratch STEM教育 WiFi XBee アニメーション オンラインゲーム カメラ クローン ゲーム コスチュームの変更 サーボモータ ステッピングモータ ステートマシン スピーカ タイマー ピンポン ブロック定義 ペン ライントレース ラジコン リスト 分数 割り込み 実験 工作 幼児 当たり判定 温度センサ 無線通信 物理 角度制御 重力 音楽

Footer

最近の投稿

  • Arduinoベースのセンサノード:スケッチ(プログラム)の作製
  • Arduinoベースのセンサノード:XBeeデータ収集ノードの製作
  • Arduinoベースのセンサノード:Arduinoを使った温度センサの作製
  • XBeeモジュールとBMP280センサを使用してデータ収集する
  • XBeeモジュールでMicroPythonを使ってセンサを読み取る

タグ

BLE DCモータ EEPROM ELEGOO ESP32 ESP8266 IoT LCD LED makeymakey MQTT Node-RED scratch STEM教育 WiFi XBee アニメーション オンラインゲーム カメラ クローン ゲーム コスチュームの変更 サーボモータ ステッピングモータ ステートマシン スピーカ タイマー ピンポン ブロック定義 ペン ライントレース ラジコン リスト 分数 割り込み 実験 工作 幼児 当たり判定 温度センサ 無線通信 物理 角度制御 重力 音楽

Search

2023年3月
月 火 水 木 金 土 日
 12345
6789101112
13141516171819
20212223242526
2728293031  
« 10月    

Copyright © 2023 · STEMSHIP.COM