IoTの中心となるのはデバイス間の通信であり、通常は高速で断続的なデータスニペットが伴います。1つまたは2つのデバイスを相互に通信させるのは簡単ですが、その段階を過ぎると、すべてをリンクするための体系的なシステムが必要になります。
MQTTとは何ですか?
MQTT (MQ Telemetry Transport) は、セットアップが簡単で、コンピューティングのオーバーヘッドをあまりかけずに適切に動作するため、この世界では事実上の標準となっています。「MQ」はかつてはメッセージ キューイング (Message Queuing) の略でしたが、現在ではその頭字語としての地位を超えたようです。
MQTTはどのように機能しますか?
MQTTはパブリッシュ/サブスクライブ方式を採用しており、クライアントは集中ブローカー ( サーバー とも呼ばれる) を介して相互にメッセージを送受信します。クライアントはトピックと呼ばれる情報チャネルを公開およびサブスクライブし、ブローカーを介して渡されるすべてのデータにはトピック ラベルが付けられます。クライアントがブローカーのIPアドレスを指定されると、それ以上のシステム構成は必要ありません。クライアントは、トピックタグ付きデータを公開することによって、トピック (他の場所に存在してもしなくてもかまいません) にメッセージを送信するだけです。クライアントはトピックをサブスクライブすることでトピックを聞きます。
各クライアントはネットワーク上の他のクライアントについて何も知らないことに注意してください。ブローカーはデータの配布のみを処理します。これは、1つのクライアント、複数のクライアント、または実際にサブスクライブされているものがない場合は1つもサブスクライブされていないクライアントに行うことができます。クライアントが知っておく必要があるのは、ブローカー/サーバーがどこにあるかだけです。クライアントのIPアドレスが変更されたり、基盤となるシステムに他の変更があったりした場合でも、各クライアントがサーバーの場所を認識している限り、正常に機能します。
この説明がよくわからない場合は、以下に示すMQTTチュートリアルの実験を実行することを強くお勧めします。このプロトコルは単純ですが、理解する前に、どのように実行されるかを確認する必要があるかもしれません。
Raspberry PiでMosquito MQTTブローカーを設定する方法
図1. 単一のマシン上で実行されているパブリッシュ/サブスクライブ端末。-hは「localhost」またはそのIPアドレスになることに注意してください。
最初のデモとして、MQTTブローカーとクライアントの両方を1つのマシンで実行してみましょう。 ラズベリーパイ。これにより、別々のデバイスで複数のクライアントが実行されている場合と同じ方法で、データが内部的にプッシュされます。クライアントは別のRaspberry Pi、PC、 ESP8266 または ESP32 WiFiモジュールなど。ブローカーと適切に通信できる限り、各要素が何であるかは他のクライアントにとって重要ではありません。
1. Raspbian Buster Lite(ここではBalena Etcherで焼きました)の新規インストールから開始し、 sudo aptアップデート それから sudo aptアップグレード コマンドラインで、システム上で最新かつ最高のバージョンが実行されていることを確認してください。
2. オープンソースのMQTTブローカーMosquittoと、Pi上のMosquittoクライアントソフトウェアを追加します。 sudo apt-getインストールmosquitto mosquitto-clients。
3. 新しいホストアドレスはPiのIPアドレスになります。これは次のように入力することで取得できます。 ifconfig。インストールによりブローカーが起動し、起動時に起動できるようになります。の mosquittoクライアント インストールの一部では、ブローカーだけでなくマシン上でクライアントも実行できます。
4. Piターミナルで、コマンド mosquitto_sub -h localhost -t "test" を使用してテスト トピックをサブスクライブします。これにより、同じシステム上で実行されているMQTTブローカーにサブスクリプション メッセージが送信され、このトピックに送信されたすべてのメッセージをリッスンできるようになります。
5. 別のターミナルを開き、 mosquitto_pub -h localhost -t "test" -m "Hello" と入力してEnterキーを押します。すると、サブスクリプション端末に受信した「Hello」メッセージが表示されます。また、「localhost」の代わりにシステムの実際のIPアドレスを代入したり、3番目のターミナルを開いて同じ方法でサブスクライブまたは公開したりすることもできます。
6. ターミナルがトピックのアクティブなリッスンを停止する準備ができたら、 Ctrl+C を押します。
複数のMQTT Raspberry Piデバイス
図2.
1台のマシンでテストすることは学術的な演習としては興味深いものですが、MQTTの真の力は複数の 組み込みデバイス が連携して動作することで発揮されます。たまたま 、私はRaspberry Piベースの植物散水機 を持っていて、これが完璧なMQTTクライアントになる可能性があるのです。 PuTTY経由でSSHでログオンし、 sudo apt-get install mosquitto-clients と入力してMosquittoをインストールしました。これは、Mosquittoをブローカーとして使用する予定がないためでした。
シングルPiテストの元のターミナル ウィンドウを開いたままにして、テスト トピックをサブスクライブします。このメッセージを聞くためにターミナル ウィンドウを閉じている場合は、 mosquitto_sub -h localhost -t "test" を実行します。
最初のPiターミナルで mosquitto_pub -h [BROKER_IPADDRESS] -t "test" -m "your message" を実行します。ここで、[BROKER_IPADDRESS] はブローカーが実行されているアドレスです。先ほどの同じPi実験と同様に、2番目の端末に入力したメッセージがすぐに表示されます。
最終テストとして、 3Dプリンターを実行するために使用する別のPiにログインし、以前と同じようにMosquittoクライアントをセットアップして、テスト トピックに公開しました。予想通り、購読している他の端末にもすぐにメッセージが表示されました。つまり、私の側ではほとんど追加作業をすることなく、3つの個別のデバイスがリンクされたことになります。かなりクールですね。
先ほど触れたように、トピックをサブスクライブする場合、実際に誰かがそのトピックに公開する必要はありません。同様に、公開時に購読者がいない場合もあります。ブローカーには明示的な設定はなく、単に情報を渡すだけです。まるでIoTのTwitterのようです。
MQTT実世界アプリケーション
図3.
それで、この新たに発見した力で私たちは何をするのでしょうか?Keurig給水装置に再び目を向けると、装置には シンプルな水分センサー が組み込まれているので、水が必要なときにMQTT経由でメッセージを送信できるかどうか確認してみませんか?散水の開始時と終了時にメッセージを送信することもできます。
これは非常に簡単で、 water.py と buttonwater.py のコード には、これらのフィードバック メソッドが含まれています。そこに示されているように、 import os により、これらのPythonスクリプトでコマンド ライン関数を使用できるようになり、 os.system() ステートメントが使用できるようになります。行: os.system("mosquitto_pub -h [BROKER_IPADDRESS] -t \"test\" -m \"watering\"") は、以前に手動で入力したブローカー アドレス、トピック、およびメッセージ オプションを入力します。\ エスケープ文字は、内部引用符をos.systemコマンド自体の終了引用符文字として扱わないようにするために追加されます。
この自動プログラム出力は、別のMQTTシステムで監視できます。人間の介入なしにこれらのメッセージへの反応を自動化することもできます。システムは電子的な応答を送信したり、植物に水が必要であることを知らせるリモート ライトなどの何らかの物理的な出力を実装したりできます。
植物に水をやるだけでなく、この種の機能は産業環境にも応用できます。おそらく、既存のプラント ネットワークに警告灯を追加し、さらに別の警告灯を追加したいと考えるでしょう。MQTTでは問題ありません。接続して、それぞれをブローカーにポイントし、正しいトピックをサブスクライブするだけで、すぐにデータをやり取りできます。完全なホームオートメーションもこのようなシステムの優れた候補であり、この機能はオープンソースのHome Assistantソフトウェア パッケージ経由でも利用できます。Raspberry Piブローカーをセットアップし、クライアントをそれに誘導するだけで、ビジネスを始めることができます。
関連記事
3320 by Adafruit Industries | コンボワイヤレスモジュール