このサイトはアフィリエイト広告(Amazonアソシエイト含む)を掲載しています。 M5Stack

UIFlow2:MQTTでデータを送信しよう(基本編)

M5Stackを使ってIoT機器を作るうえで、欠かせないのがデータを送信する仕組みです。

本記事では、UIFlowを使ってM5StackからMQTTプロトコルでデータを送信(Publish)する方法をわかりやすく解説します。

これは、M5StackでIoTを始めるために必須の基礎知識です。

ぜひこの記事でしっかりマスターしましょう。

MQTTの基本

MQTT通信の仕組み

MQTTは、IoTでよく使われる軽量な通信プロトコルです。

センサーやデバイスが安定してデータをやりとりできるため、M5Stackなどのマイコンと非常に相性がよいのが特徴です。

MQTTの3つの主な役割

MQTT通信では、次の3つの役割が登場します。

役割説明
Publisherデータを送る側
MQTT Broker中継するサーバー
Subscriberデータを受け取る側

通信の流れは以下のようになります。

Publisher(M5Stackなど) → MQTT Broker → Subscriber(PCや他のデバイス)

M5Stackが送るデータは、一旦 MQTT Brokerに届けられ、そのデータを受け取りたい人(Subscriber)が購読していれば、ブローカー経由でデータが配信されます。

トピックとは?メッセージとは?

MQTTでは「どんな種類のデータなのか?」を分類するためにトピック(topic)という名前の宛先を使います。

例えば、M5Stackが温度センサーの値を送信するときに、次のようなトピックを使うことができます。

home/livingroom/temperature

このトピックに対してSubscriberが購読(Subscribe)していれば、M5Stackが送った温度データをリアルタイムで受け取ることができます。

実際にトピックを通して送る中身のデータがメッセージです。

これはテキストでも数値でもOK。

たとえば、

JSON
25.6

または、JSON形式でも送れます。

JSON
{"temp":25.6, "unit":"度"}

MQTTの仕組みはシンプルですがとても強力です。

UIFlowを使えば、とても簡単にMQTTでデータ送信ができますよ。

MQTT Publishフローの概要

では、UIFlowで実際にMQTT Publish(データ送信)を作っていきましょう。

ここでは1秒毎にカウントアップするタイマーを作って、その値をPublishしてみます。

MQTT Publishのフロー

フローの完成形を示します。

プログラムの流れは次の通り。

  • 変数を定義(関数:SetVariables)
  • WiFiに接続(関数:ConnectWiFi)
  • MQTT Publisherの設定
  • カウント値をカウントアップ(関数:CountUp)
  • MQTT Publish
  • 1秒タイマー

MQTT Publishフローの詳細

MQTTの準備

デフォルトの状態では、MQTTを使うためのブロックがありません。

まずは、MQTTを使うための設定を行います。

①Sofftwareをクリック

UIFlowの画面左側、ResourcesSoftwareをクリック。

②ソフトウェアモジュールを追加する

Software 追加のダイアログが開きます。
MQTTを選択して、Confirmをクリック。

③追加したモジュールの確認

MQTTブロックが追加されました。

Setupブロックの詳細

ネットワーク関連の変数に初期値を設定します。

実際は、ご自身の環境に合わせて設定してください。

WiFiに接続する処理を実行します。

このフローの詳細についてはこちらの記事を参考にしてください。

関連記事
UIFLow2:固定IPでWiFi接続する

MQTTの初期設定を行います。

arrow_circle_rightスクロールできます
Set MQTT client idクライアントID(このM5Stackの識別名)
serverMQTTブローカーのIPアドレス(自分のサーバーやLAN内ブローカーなど)
port通信に使うポート番号(標準は1883)
userMQTTブローカーにログインするためのユーザー名とパスワード(今回はなし)
password
keep alive接続の「生存確認」タイマー(0は無効、通常は60などが多い)

作成したクライアントで、実際にMQTTブローカーと接続します。

引数は通常は"true"にしておきます。
これは、セッション情報を毎回リセットするかどうかのパラメータで、"true"にすると「新規接続」として扱われます。

Loopブロックの詳細

Loopブロックでは、変数 count を1秒に1ずつカウントアップしていった後、MQTT. publishで MQTTブローカーにデータを送信します。

この関数では、変数 count を1増やして

その値を payload_map(辞書型)に格納し、

それをJSON形式に変換して payload_json に代入するという処理を行っています。

変数の値の例

payload_map(辞書型) = { 'count' : 5 }

payload_json(JSON文字列) = { "count" : 5 }

Map 辞書型 についての解説はこちらの記事を参考にしてください。

関連記事
UIFlow2:データ構造 変数、リスト(List)、マップ(辞書・Map)の使い方

このブロックでM5StackからMQTTブローカーにデータを送信(publish)します。

payload_jsonというJSON文字列を m5/count というトピックに送っています。

引数の意味と役割

arrow_circle_rightスクロールできます
m5/countトピック名:この宛先(チャネル)にメッセージが送信される
payload_json実際に送信されるメッセージ内容 例:{ "count": 5 } などのJSON文字列
port通信に使うポート番号(標準は1883)
qos = 0QoS(Quality of Service)レベル。通信の信頼度を設定します。

QoSとは?

QoSはメッセージの配信保証レベルを設定する仕組みです。

MQTTでは3つのレベルが用意されています。

UIFlowでは "0" または "1" が設定可能で、IoTの実際では軽量な"0"がよく使われます。

arrow_circle_rightスクロールできます
QoS名前保証内容通信の重さ主な用途例
0At most
once
届くかもしれない
(保証なし)
最軽量センサーデータなど、多少の欠落が許されるデータ
1At least
once
少なくとも1回は届く
(重複の可能性あり)
通知、アラート、ログデータなど
2Exactly
once
1回だけ届く
(完全保証)
最重重要な制御命令や決済データなど。重複不可の通信。

MQTT Publishの実行結果

Node-REDのMQTT Brokerでデータを受信して、トピック m5/count を subscribe(データ受信)します。

1秒毎にリアルタイムでカウント値を受信していることがわかります。

MQTTを使えば手軽にデータを送受信できるね!

「MQTTでデータ通信しよう」のまとめ

この記事では、UIFlowを使ってMQTT送信をする方法について解説しました。

M5StackをIoT機器として使う時に、センサなどで取得したデータを送信することが必須となります。

MQTTを使うと簡単にデータ通信することができますので、ぜひ実際にトライしてみてください。

-M5Stack