• 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

microbit:画像の表示・作成・オフセット・スクロール・変数保存の方法

2021年1月13日 By STEMSHIP

microbit:文字列の長さ・結合・比較・切取・位置・数値変換の方法

2021年1月6日 By STEMSHIP

XBee無線ネットワーク:XBeeワイヤレスチャットルームを作る

2020年12月30日 By STEMSHIP

XBee無線ネットワーク:MicroPythonについて

2020年12月23日 By STEMSHIP

XBee無線ネットワーク:ターミナルソフトウェアからXBeeモジュールの設定を変更する

2020年12月16日 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 (6)
  • ものづくり教育 (2)
  • 子供の教育 (2)
  • 科学 (6)
  • 算数 (5)

Tags

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

Footer

最近の投稿

  • microbit:エッジコネクタを使用して外部入出力を制御する方法1
  • microbit:画像の表示・作成・オフセット・スクロール・変数保存の方法
  • microbit:文字列の長さ・結合・比較・切取・位置・数値変換の方法
  • XBee無線ネットワーク:XBeeワイヤレスチャットルームを作る
  • XBee無線ネットワーク:MicroPythonについて

タグ

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

Search

2021年1月
月 火 水 木 金 土 日
 123
45678910
11121314151617
18192021222324
25262728293031
« 12月    

Copyright © 2021 · STEMSHIP.COM