M5StickCでUIFlow入門 その6 P2PとMQTTとESP-NOWで無線通信

現時点の情報です。最新情報はM5StickC非公式日本語リファレンスを確認してみてください。

概要

前回は加速度計と直接画面にグラフィック描画を行いました。今回は2台のM5StickCを利用しての無線通信を行いたいと思います。

複数のM5StickCが必要なことと、Desktop版では動作しない機能があるので注意してください。

複数台接続時の注意点

Desktop版をWindowsで実行したところ、複数起動ができませんでした。通信をする場合には基本的にはCloud版でネットに接続して行うほうがよさそうです。

UIFlowの複数台接続方法

Cloud版では、ブラウザのタブを複数開くことで、別のM5StickCに接続することができます。プログラムが同じであれば、一つのタブで接続先Api keyを変更することでも対応が可能だと思います。

NetworkのP2P通信(インターネット経由)

高度なブロックの中にある、NetworkのP2P通信を使った通信を最初にやります。最初にいっておくと、この通信はあまり使いやすくありません。

受信側

ラベルを画面に設置して、その画面にP2Pからの受信データを表示します。受信は非常に単純です。データがない場合には「None」と表示されました。

送信側

同じく画面に確認用のラベルを設置しました。送信するデータを固定値にするとシンプルですが、ボタンを押すごとにカウントアップした数値を送るようにしています。

送信先の指定は、Cloud版の接続のときに使うAPIキーを指定して送信します。このブロックで送信するとUIFlowのサーバー経由で対象のM5StickCにデータを送信することができます。

内部的にはMQTTを使っているみたいですが、P2Pブロックは基本的には使わないほうが良さそうです。同じような処理をしたいのであれば、自分でMQTTサーバーを構築したほうがいろいろやりたいことができると思います。

また、このP2Pは送信が完了するまで、処理が停止しますので、ボタンを連打しても送信が終わるまでは反応しませんので注意してください。

Desktop版の注意点

Desktop版の場合には端末がWi-Fiに接続されていませんので、上記のように自分で接続をする必要があります。ただWi-Fiに接続させているのであれば、Cloud版を使ったほうが楽なのでそもそもインターネット通信をするプログラムはDesktop版を使わないほうがよいと思います。

MQTT(インターネット経由)

MQTTとは、Message Queue Telemetry Transportの略で、メッセージをキューイングしてくれるプロトコルです。

MQTTサーバーにメッセージを送信すると、キューイングしてくれて、任意のタイミングで受信することができます。

P2Pとの違いは、自分でMQTTサーバーを準備することで、パソコンなど他のサービスからもメッセージを送受信することができます。

今回は、上記の無料で検証に利用することができるMQTTサーバーを利用させていただきました。このサーバーは検証用途で無料で使うことができます。ただし、パスワードは毎日リセットされていますので、毎日変更する必要があります。

上記がサンプルです。Setupで高度なブロックのMQTTにある「MQTTに接続するブロック」と「通信を開始する」ブロックを設置する必要があります。

「MQTTに接続するブロック」は横幅が非常に長いので、右クリックから「外部入力」を選ぶと上記のように縦に伸びて見やすくなります。クライアントIDは一意な文字列に設定する必要があります。上記のような固定値より、MACアドレスなどの方がよいのですが、UIFlowってMACアドレスとかチップIDとかの定数を提供してくれないので、ちょっと不便です。

さて、このMQTTはちょっと面倒なことがありまして、そのまま実行すると「mqtt need download…」とのエラーがでて動きません。右上のメニューからダンロードを選んで、プログラムをM5StickC内部に転送して、プログラムモードから、アプリモードへ変更して起動する必要があります。

ダウンロードボタンを押すと、自動的に転送と再起動が入るのですが、その後プログラムを更新しようとしても、更新できません。

もう一度プログラムモードに戻りたい場合には、Aボタンを押しながら電源ボタンを押して、モード変更画面に戻ってから、再度Aボタンを押してプログラムモードに戻ってください。

MQTTはトピックに対してメッセージを送信し、別の端末がそのトピックを受信するような動きになります。今回は別のパソコンからメッセージを送信して、M5StickCで受信できたことを確認しました。

MQTT自体は使いやすいプロトコルなのですが、ダウンロードしないと動かないのは結構面倒かもしれません。

ESP-NOW(周辺直接通信)

ESP-NOWが短距離での通信ではおすすめです。こちらはWi-Fiの電波を利用していますが、Wi-Fiアクセスポイントに接続する必要はありません。Desktop版でも非常に使いやすい通信プロトコルです。

ブロードキャスト(周辺全員に送信)

こちらは送受信で同じプログラムの例です。ボタンを押すとカウントアップして、ブロードキャストでカウントを送信します。

受信側は、高度なブロックのESP-NOWの受信ブロックを使って、2つの変数にMACアドレスと、データを受信して、それをラベルに表示するだけの処理です。

こちらはDesktop版でもCloud版でも相互の通信が可能です。無線を直接送受信しているので、非常にかんたんに通信ができます。Wi-Fiの届く範囲ですので、直接見通せる範囲ぐらいまでであれば、相互に通信が可能です。

ただし、無差別に受信するのでこのままだとちょっと使いにくいです。

相手先の指定

あまり変わっていませんが、Setupにペアの追加処理をしています。ESP-NOWはブロードキャストで周辺全員に送信する以外は、事前に相手を登録しておく必要があります。

上のサンプルでは「ff:ff:ff:ff:ff:ff」とブロードキャストのMACアドレスになっていますが、先程のブロードキャストのテストで受信したMACアドレスを入力し、送信時にペアのIDを指定すると、その相手だけに通信が送信されます。

ペアがあらかじめ決まっている場合には、この指定が好ましいと思います。

受信制限

ESP-NOWはブロードキャストで送信されると、関係ない端末の通信も受信していまいます。そのため、送信元MACアドレスで受信するかのフィルタリングを行う必要があります。

if文をたくさん並べる方法もありますが、今回はリストを利用して判定をしてみます。リストとは、複数のデータを入れておく変数です。最初に空のリストを変数に代入して、その後にリストの最後に受信を許可するMACアドレスの文字列を設定します。

上記の場合には2台を追加しました。受信時に「もし」ブロックを追加し、受信したMACアドレスがリストにあるのかを検索します。検索してなかった場合には0になりますので、0以外の場合には、受信するMACアドレスからの通信になります。

このように、少し乱暴ですが送信はブロードキャストで周辺全員に送信して、受信側でフィルタリングするのが楽かもしれません。

リストの作成は、上記のようなリストを作成で、一気に作成する方法もあります。

ESP-NOWのセキュリティについて

UIFlowのESP-NOW通信は平文で送信しています。そのため周りにいる端末が受信した内容を傍受することが可能です。そのためセキュリティ的に問題があるようなデータを送受信するのには適していませんのでご注意ください。

  • https://github.com/m5stack/UIFlow-Code/wiki/Advanced

上記を確認したところ、内部的には暗号化の仕組みはありますが、UIFlowのブロックからは設定できないようです。コードで直接指定してから、ブロックに戻ると設定項目が消えてしまうので、現状は使えないと思ったほうがよいです。

まとめ

3種類の通信方式を試しましたが、違いがなんとなく理解できましたでしょうか?

通常の直接通信はESP-NOWと使ったほうが楽だと思います。インターネットとのデータのやり取りはMQTTか、今回は取り上げなかったHTTP通信が適しています。

センサーなどの値をインターネット上にアップしたい場合には、Ambientなどのサービスを利用することをおすすめします。

上記にて、カスタムブロックの読み込み方法から、使い方まで解説があります。

続編

コメント