MQTTは、インターネットを介してメッセージを送受信するために使用されるプロトコルです。以前は、このプロトコルをIotElectricityメーターとRaspberryPi Alexaで使用して、インターネット上でデータを公開していました。このチュートリアルでは、MQTTとそれに関連する用語について詳しく説明します。ここでは、Raspberry PiをローカルMQTTブローカーとして使用し、MQTTアプリケーションダッシュボードを介してNodeMCUESP12Eに接続されたLEDを制御します。DHT11センサーもNodeMCUに接続されているため、ローカルMQTTブローカーとしてRaspberry Piを再度使用することで、MQTTダッシュボードで温度と湿度を読み取ることができます。
それでは、MQTTとそれに関連する用語を過小評価することから始めましょう。
MQTTとは何ですか?
MQTTは、 IBMによって設計されたMessage Queue TelemetryTransportの略です。このプロトコルは、インターネットを介してメッセージを送受信するために使用されるシンプルで軽量であり、低帯域幅の使用があるデバイス向けに設計されています。現在、このプロトコルは、センサーデータを送受信するためにIoTデバイスで頻繁に使用されています。また、IoTベースのホームオートメーションシステムでは、このプロトコルはインターネットデータをあまり使用せずに簡単に使用できます。
MQTTで頻繁に使用される用語はいくつかあります。
- 購読とパブリッシュ
- メッセージ
- トピック
- ブローカ
1.サブスクライブとパブリッシュ:サブスクライブとは、他のデバイスからデータを取得することを意味し、パブリッシュとは、他のデバイスにデータを送信することを意味します。
device1がデータをdevice2に送信する場合、それはパブリッシャーと呼ばれ、別のサブスクライバーと呼ばれ、その逆も同様です。
2.メッセージ:メッセージは、私たちが送受信している情報です。データまたは任意のタイプのコマンドにすることができます。たとえば、温度データをクラウドに公開している場合、この温度データはメッセージと呼ばれます。
3.トピック:これは、受信メッセージへの関心を登録する方法、またはメッセージを公開する場所を指定する方法です。トピックは、スラッシュで区切られた文字列で表されます。MQTTを使用してトピックに関するデータが公開され、MQTTデバイスがトピックにサブスクライブしてデータを取得します。
4. MQTTブローカー:これは、パブリッシャーからすべてのメッセージを受信し、メッセージをフィルター処理してから、それらに関心のあるサブスクライバーにメッセージを公開する役割を果たします。
このブローカーがクラウドでホストされている場合、MQTTクラウドと呼ばれます。Adafruit IO、MQTT.IO、IBM bluemix、Microsoft Azureなどの多くのクラウドベースのMQTTサービスがあります。MQTTは、AmazonAWS入門チュートリアルで説明した一般的なAmazonAWSクラウドでも使用できます。
RaspberryPiを使用して独自のMQTTブローカーを作成できます。これはローカルMQTTブローカーになります。つまり、どこからでもローカルネットワーク上でのみデータを送受信できます。そこで、ここではMosquittoMQTTブローカーをRaspberryPiにインストールしてローカルMQTTブローカーにし、温度データをNodeMCUからMQTTダッシュボードアプリケーションに送信します。また、ブローカーを使用してNodeMCUに接続されたLEDを制御します。
RaspberryPiへのMosquittoMQTTBrokerのインストール
Raspberry piでターミナルを開き、次のコマンドを入力してブローカーをインストールします
sudo apt update sudo apt install -y mosquitto mosquitto-clients
インストールが完了するのを待ちます。ここで、ラズベリーパイの起動時にブローカーを起動するには、次のコマンドを入力します
sudo systemctl enable mosquitto.service
これで、MQTTブローカーを起動する準備が整いました。正しくインストールされていることを確認するには、次のコマンドを入力します
mosquitto -v
このコマンドは、MQTTブローカーのバージョンを提供します。1.4.x以上である必要があります。
Raspberry Pi MosquittoBrokerのテスト
1.以下のコマンドを使用して、バックグラウンドでMosquittoブローカーを実行します
mosquitto -d
2.次に、次のコマンドを使用してexampleTopicのトピックをサブスクライブします。
mosquitto_sub -d -t exampleTopic
3.次に、exampleTopicにメッセージを公開します
mosquitto_pub -d -t exampleTopic -m "Hello world!"
Hello world!を受け取ります。加入者端末のメッセージ。
ここで、NodeMCUとMQTTダッシュボードアプリケーションを使用している場合は、別のデバイスからデータを制御して取得するときが来ました。
- まず、アプリを使用してコマンドを送信することでLEDを制御します。この場合、NodeMCUはサブスクライバーとして動作し、アプリはパブリッシャーとして動作します。
- 次に、ESP12EにもDHT11センサーが接続されており、この温度の読み取り値がMobile MQTTアプリケーションに送信されるため、この場合、mobileがサブスクライバーになり、NodeMCUがパブリッシャーになります。そして、それぞれのトピックでこれらのメッセージを転送するために、MosquittoMQTTブローカーが使用されます。
回路図
図のように回路を接続します。ここでは、DHT11が温度の読み取りに使用されていますが、LM35温度センサーも使用できます。NodeMCUを含む多くのプロジェクトでDHT11センサーを使用して、気象観測所を構築しました。
NodeMCUがデータをサブスクライブしてパブリッシュするためのコードの記述を始めましょう。
コードと説明
ここでは、Adafruit MQTTライブラリテンプレートを使用し、コードで必要なものを変更します。同じコードを使用して、いくつかの変更を加えるだけで、データをAdafruitIOクラウドにパブリッシュおよびサブスクライブできます。このために、AdafruitMQTTライブラリをSketch- > Include Library-> ManageLibrariesからダウンロードします 。 AdafruitMQTTを検索してインストールします。ライブラリをインストールした後。 例に 移動 -> Adafruitmqttライブラリ-> mqtt_esp8266
次に、Raspberry PiのIPアドレスとWi-Fi資格情報に従って、このコードを編集します。
ESP8266WIFIおよびAdafruitMQTTの すべての ライブラリを 含めます 。
#include
次に、ESP-12eを接続するWi-FiのSSIDとパスワードを定義します。RPiとNodeMCUが同じネットワークに接続していることを確認してください。
#define WLAN_SSID "xxxxxxxx" #define WLAN_PASS "xxxxxxxxxxx"
このセクションでは、Adafruitサーバー、この場合はRaspberryPiのIPアドレスとサーバーポートを定義します。
#define AIO_SERVER "PiのIPアドレス" #define AIO_SERVERPORT 1883
Adafruitクラウドを使用していないため、以下のフィールドは空のままになります。
#define AIO_USERNAME "" #define AIO_KEY ""
次に、ESP8266 WiFiClientクラスを作成して、MQTTサーバーに接続します。
WiFiClientクライアント;
WiFiクライアントとMQTTサーバーおよびログインの詳細を渡して、MQTTクライアントクラスをセットアップします。
Adafruit_MQTT_Client mqtt(&client、AIO_SERVER、AIO_SERVERPORT、AIO_USERNAME、AIO_KEY);
温度を公開するための「Temperature」というフィードを設定します。
Adafruit_MQTT_Publish Temperature = Adafruit_MQTT_Publish(&mqtt、AIO_USERNAME "/ feeds / Temperature");
変更をサブスクライブするための「led1」というフィードを設定します。
Adafruit_MQTT_Subscribe led1 = Adafruit_MQTT_Subscribe(&mqtt、AIO_USERNAME "/ feeds / led");
では 、セットアップ 機能、我々はあなたが出力を取得したいNodeMCUのPINを宣言します。次に、NodeMCUをWi-Fiアクセスポイントに接続します。
void setup(){ Serial.begin(115200); delay(10); pinMode(LED、OUTPUT); Serial.println(F( "Adafruit MQTTデモ")); // WiFiアクセスポイントに接続します。 Serial.println(); Serial.println(); Serial.print( "接続中"); Serial.println(WLAN_SSID); WiFi.begin(WLAN_SSID、WLAN_PASS); while(WiFi.status()!= WL_CONNECTED){ …。 …。 … LEDフィードのMQTTサブスクリプションを設定します。 mqtt.subscribe(&led1); }
では ループ 機能、我々はMQTTサーバへの接続がMQTT_connect()を使って生きていることを保証します。関数。
void loop(){ MQTT_connect();
ここで、「led」フィードをサブスクライブし、MQTTブローカーから文字列を取得し、 atoi() を使用してこの文字列を数値に変換します 。 関数を作成し、 digitalWrite() を使用してこの番号をLEDピンに書き込み ます。 関数。
Adafruit_MQTT_Subscribe *サブスクリプション; while((subscription = mqtt.readSubscription(20000))){ if(subscription ==&led1){ Serial.print(F( "Got:")); Serial.println((char *)led1.lastread); int led1_State = atoi((char *)led1.lastread); digitalWrite(LED、led1_State); }
次に、変数で温度を取得し、 Temperature.publish(t) 関数を使用してこの値を公開します。
float t = dht.readTemperature(); ... ... もし(Temperature.publish(T)!){ Serial.println(F() "失敗"); } else { Serial.println(F( "OK!")); }
このチュートリアルの最後に、デモビデオを含む完全なコードを示します。コードをNodeMCUボードにアップロードし、スマートフォンにダウンロードしたMQTTダッシュボードアプリを開きます。
次のチュートリアルで学習するAdafruitIO、MQTT.IOなどのMQTTクラウドを使用して、世界中のどこからでもRaspberry PiGPIOを制御できます。