MQTT-Kommunikation zwischen ESP8266-Geräten

In diesem Tutorial werden wir Folgendes behandeln:

Kommunikation zwischen zwei ESP8266 NodeMCU über MQTT

Erforderliche Hardware

2×ESP8266 NodeMCU
2×Micro-USB-Kabel
1×(Empfohlen) Schraubklemmen-Erweiterungsboard für ESP8266
1×(Empfohlen) Stromverteiler für ESP8266 Typ-C

Oder Sie können die folgenden Kits kaufen:

1×DIYables Sensor-Kit (30 Sensoren/Displays)
1×DIYables Sensor-Kit (18 Sensoren/Displays)
Offenlegung: Einige der in diesem Abschnitt bereitgestellten Links sind Amazon-Affiliate-Links. Wir können eine Provision für Käufe erhalten, die über diese Links getätigt werden, ohne zusätzliche Kosten für Sie. Wir schätzen Ihre Unterstützung.

Über ESP8266 und MQTT

Wir haben hier eine detaillierte Anleitung, wie man den ESP8266 mit MQTT verwendet:

Kommunikation zwischen zwei ESP8266-Geräten über MQTT

Zwei ESP8266-Boards können miteinander über einen MQTT-Server kommunizieren. Wenn Sie eine direkte Kommunikation zwischen zwei ESP8266 bevorzugen, ohne auf einen MQTT-Server angewiesen zu sein, schauen Sie sich bitte das Tutorial zur ESP8266 zu ESP8266 TCP-Client/Server-Kommunikation an.

Wenn ESP8266 #1 und ESP8266 #2 Daten über einen MQTT-Broker austauschen:

  • Beiden ESP8266 verbinden sich mit dem MQTT-Broker.
  • Um ESP8266 #2 zu ermöglichen, Daten an ESP8266 #1 zu senden:
    • ESP8266 #1 abonniert ein Thema, z. B.: esp8266-1/data.
    • ESP8266 #2 kann Daten an ESP8266 #1 senden, indem es sie auf das Thema veröffentlicht, das ESP8266 #1 abonniert hat.
  • Ähnlich, um ESP8266 #1 zu ermöglichen, Daten an ESP8266 #2 zu senden:
    • ESP8266 #2 abonniert ein Thema, z. B.: esp8266-2/data.
    • ESP8266 #1 kann Daten an ESP8266 #2 senden, indem es sie auf das Thema veröffentlicht, das ESP8266 #2 abonniert hat.

    Indem Sie diesem Ansatz folgen, können zwei ESP8266 bidirektional Daten austauschen.

Beispiel-Anwendungsfall

Lassen Sie uns die folgende Anwendung realisieren: Ein Knopf/Schalter, der mit ESP8266 #1 verbunden ist, steuert eine LED, die über MQTT mit ESP8266 #2 verbunden ist.

Kommunikation zwischen zwei ESP8266 NodeMCU

Wie oben erwähnt gibt es einige Anwendungsprotokolle, die wir verwenden können. In diesem Beispiel, um es einfach zu halten, werden wir ein Protokoll selbst definieren (ein selbst definiertes Protokoll).

Wie es funktioniert

Lassen Sie uns ein einfaches Protokoll definieren:

  • Sowohl ESP8266 #1 als auch ESP8266 #2 verbinden sich mit einem MQTT-Broker (MQTT-Server).
  • Für ESP8266 #1:
    • ESP8266 #1 veröffentlicht eine MQTT-Nachricht zu einem bestimmten Thema, wann immer sich der Zustand eines Schalters ändert.
    • Wenn der Knopf/Schalter eingeschaltet ist, wird die Payload der MQTT-Nachricht auf 1 gesetzt.
    • Wenn der Knopf/Schalter ausgeschaltet ist, wird die Payload der MQTT-Nachricht auf 0 gesetzt.
  • Für ESP8266 #2:
    • ESP8266 #2 abonniert dasselbe Thema.
    • Wenn ESP8266 #2 eine MQTT-Nachricht mit einer Payload von 1 erhält, aktiviert es die LED.
    • Wenn ESP8266 #2 eine MQTT-Nachricht mit einer Payload von 0 erhält, deaktiviert es die LED.

    Verdrahtungsdiagramm

    • ESP8266 #1 - Schaltplan zwischen ESP8266 und Taster
    ESP8266 NodeMCU-Taster-Verdrahtungsdiagramm

    Dieses Bild wurde mit Fritzing erstellt. Klicken Sie, um das Bild zu vergrößern.

    Weitere Informationen finden Sie unter ESP8266-Pinbelegung und wie man ESP8266 und andere Komponenten mit Strom versorgt.

    • ESP8266 #2 - Verdrahtungsdiagramm zwischen ESP8266 und LED
    ESP8266 NodeMCU LED-Verdrahtungsdiagramm

    Dieses Bild wurde mit Fritzing erstellt. Klicken Sie, um das Bild zu vergrößern.

Kommunikation zwischen zwei ESP8266 über MQTT

ESP8266-Code Nr. 1

/* * Dieser ESP8266 NodeMCU Code wurde von newbiely.de entwickelt * Dieser ESP8266 NodeMCU Code wird der Öffentlichkeit ohne jegliche Einschränkung zur Verfügung gestellt. * Für vollständige Anleitungen und Schaltpläne besuchen Sie bitte: * https://newbiely.de/tutorials/esp8266/esp8266-to-esp8266-mqtt-communication */ // ESP8266 #1: CONNECTED TO A BUTTON/SWITCH, ACTED AS A MQTT PUBLISHER #include <ESP8266WiFi.h> #include <MQTTClient.h> #include <ezButton.h> #define BUTTON_PIN D7 // The ESP8266 pin connected to button const char WIFI_SSID[] = "YOUR_WIFI_SSID"; // CHANGE TO YOUR WIFI SSID const char WIFI_PASSWORD[] = "YOUR_WIFI_PASSWORD"; // CHANGE TO YOUR WIFI PASSWORD const char MQTT_BROKER_ADRRESS[] = "test.mosquitto.org"; // CHANGE TO MQTT BROKER'S ADDRESS //const char MQTT_BROKER_ADRRESS[] = "192.168.0.26"; // CHANGE TO MQTT BROKER'S IP ADDRESS const int MQTT_PORT = 1883; const char MQTT_CLIENT_ID[] = "esp8266-001"; // CHANGE IT AS YOU DESIRE const char MQTT_USERNAME[] = ""; // CHANGE IT IF REQUIRED, empty if not required const char MQTT_PASSWORD[] = ""; // CHANGE IT IF REQUIRED, empty if not required // The MQTT topics that ESP8266 should publish/subscribe const char MQTT_TOPIC[] = "esp8266/command"; // CHANGE IT AS YOU DESIRE WiFiClient network; MQTTClient mqtt = MQTTClient(256); ezButton button(BUTTON_PIN); // create ezButton that attach to pin 7 void setup() { Serial.begin(9600); button.setDebounceTime(100); // set debounce time to 100 milliseconds Serial.println("ESP8266 #1: CONNECTED TO A BUTTON/SWITCH, ACTED AS A MQTT PUBLISHER"); WiFi.begin(WIFI_SSID, WIFI_PASSWORD); Serial.println("ESP8266 - Connecting to Wi-Fi"); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.print("Connected to WiFi network with IP Address: "); Serial.println(WiFi.localIP()); connectToMQTT(); } void loop() { mqtt.loop(); button.loop(); // MUST call the loop() function first if (button.isPressed()) { Serial.println("- The button is pressed, send command: 1"); sendToMQTT('1'); } if (button.isReleased()) { Serial.println("- The button is released, send command: 0"); sendToMQTT('0'); } } void connectToMQTT() { // Connect to the MQTT broker mqtt.begin(MQTT_BROKER_ADRRESS, MQTT_PORT, network); Serial.print("ESP8266 - Connecting to MQTT broker"); while (!mqtt.connect(MQTT_CLIENT_ID, MQTT_USERNAME, MQTT_PASSWORD)) { Serial.print("."); delay(100); } Serial.println(); if (!mqtt.connected()) { Serial.println("ESP8266 - MQTT broker Timeout!"); return; } Serial.println("ESP8266 - MQTT broker Connected!"); } void sendToMQTT(char command) { char messageBuffer[1]; messageBuffer[0] = command; mqtt.publish(MQTT_TOPIC, messageBuffer); Serial.println("ESP8266 - sent to MQTT:"); Serial.print("- topic: "); Serial.println(MQTT_TOPIC); Serial.print("- payload:"); Serial.println(messageBuffer); }

ESP8266-Code Nr. 2

/* * Dieser ESP8266 NodeMCU Code wurde von newbiely.de entwickelt * Dieser ESP8266 NodeMCU Code wird der Öffentlichkeit ohne jegliche Einschränkung zur Verfügung gestellt. * Für vollständige Anleitungen und Schaltpläne besuchen Sie bitte: * https://newbiely.de/tutorials/esp8266/esp8266-to-esp8266-mqtt-communication */ // ESP8266 #2: CONNECTED TO A LED, ACTED AS A MQTT SUBSCRIBER #include <ESP8266WiFi.h> #include <MQTTClient.h> #define LED_PIN D6 // The ESP8266 pin connected to LED const char WIFI_SSID[] = "YOUR_WIFI_SSID"; // CHANGE TO YOUR WIFI SSID const char WIFI_PASSWORD[] = "YOUR_WIFI_PASSWORD"; // CHANGE TO YOUR WIFI PASSWORD const char MQTT_BROKER_ADRRESS[] = "test.mosquitto.org"; // CHANGE TO MQTT BROKER'S ADDRESS //const char MQTT_BROKER_ADRRESS[] = "192.168.0.26"; // CHANGE TO MQTT BROKER'S IP ADDRESS const int MQTT_PORT = 1883; const char MQTT_CLIENT_ID[] = "esp8266-002"; // CHANGE IT AS YOU DESIRE const char MQTT_USERNAME[] = ""; // CHANGE IT IF REQUIRED, empty if not required const char MQTT_PASSWORD[] = ""; // CHANGE IT IF REQUIRED, empty if not required // The MQTT topics that ESP8266 should publish/subscribe const char MQTT_TOPIC[] = "esp8266/command"; // CHANGE IT AS YOU DESIRE WiFiClient network; MQTTClient mqtt = MQTTClient(256); void setup() { Serial.begin(9600); pinMode(LED_PIN, OUTPUT); Serial.println("ESP8266 #2: CONNECTED TO A LED, ACTED AS A MQTT SUBSCRIBER"); WiFi.begin(WIFI_SSID, WIFI_PASSWORD); Serial.println("ESP8266 - Connecting to Wi-Fi"); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.print("Connected to WiFi network with IP Address: "); Serial.println(WiFi.localIP()); connectToMQTT(); } void loop() { mqtt.loop(); } void connectToMQTT() { // Connect to the MQTT broker mqtt.begin(MQTT_BROKER_ADRRESS, MQTT_PORT, network); // Create a handler for incoming messages mqtt.onMessage(messageReceived); Serial.print("ESP8266 - Connecting to MQTT broker"); while (!mqtt.connect(MQTT_CLIENT_ID, MQTT_USERNAME, MQTT_PASSWORD)) { Serial.print("."); delay(100); } Serial.println(); if (!mqtt.connected()) { Serial.println("ESP8266 - MQTT broker Timeout!"); return; } // Subscribe to a topic, the incoming messages are processed by messageReceived() function if (mqtt.subscribe(MQTT_TOPIC)) Serial.print("ESP8266 - Subscribed to the topic: "); else Serial.print("ESP8266 - Failed to subscribe to the topic: "); Serial.println(MQTT_TOPIC); Serial.println("ESP8266 - MQTT broker Connected!"); } void messageReceived(String &topic, String &payload) { Serial.println("ESP8266 - received from MQTT:"); Serial.println("- topic: " + topic); Serial.print("- payload: "); Serial.println(payload); char command = payload[0]; if (command == '1') { Serial.print("- Received command: "); Serial.print(command); Serial.println(" => Turned LED on"); digitalWrite(LED_PIN, HIGH); // Turn LED on } else if (command == '0') { Serial.print("- Received command: "); Serial.print(command); Serial.println(" => Turned LED off"); digitalWrite(LED_PIN, LOW); // Turn LED off } else { Serial.print("- Received an unsupported command: "); Serial.println(command); } }

Schnelle Schritte

Um mit dem ESP8266 in der Arduino-IDE zu beginnen, befolgen Sie die folgenden Schritte:

  • Schauen Sie sich das Tutorial zur Einrichtung der ESP8266-Umgebung in der Arduino IDE an, falls dies Ihre erste Verwendung des ESP8266 ist.
  • Verbinden Sie die Bauteile wie in der Abbildung gezeigt.
  • Verbinden Sie das ESP8266-Board mit Ihrem Computer über ein USB-Kabel.
  • Öffnen Sie die Arduino IDE auf Ihrem Computer.
  • Wählen Sie das richtige ESP8266-Board aus, z. B. NodeMCU 1.0 (ESP-12E-Modul), sowie den jeweiligen COM-Port.
  • Schließen Sie einen Knopf/Schalter an ESP8266 #1 an.
  • Schließen Sie eine LED an ESP8266 #2 an.
  • Öffnen Sie die Arduino IDE (auch Arduino IDE #1 genannt).
  • Öffnen Sie ein weiteres Arduino IDE-Fenster (genannt Arduino IDE #2) durch Klicken auf das Arduino IDE-Symbol auf Ihrem PC (wichtig!()).
  • Öffnen Sie den Library Manager, indem Sie auf das Library Manager-Symbol in der linken Navigationsleiste der Arduino IDE klicken.
  • Geben Sie MQTT in das Suchfeld ein, suchen Sie dann nach der MQTT-Bibliothek von Joel Gaehwiler.
  • Klicken Sie auf die Schaltfläche Install, um die MQTT-Bibliothek zu installieren.
ESP8266 NodeMCU-MQTT-Bibliothek
  • Geben Sie ezButton in das Suchfeld ein, suchen Sie anschließend die Button-Bibliothek von ArduinoGetStarted.
  • Klicken Sie auf die Install-Schaltfläche, um die ezButton-Bibliothek zu installieren.
ESP8266 NodeMCU-Tasterbibliothek
  • Schließe ESP8266 #1 über ein USB-Kabel an den PC an und wähle in der Arduino IDE #1 den COM-Port von ESP8266 #1
  • Schließe ESP8266 #2 über ein USB-Kabel an den PC an und wähle in der Arduino IDE #2 den COM-Port von ESP8266 #2
  • Kopiere den ESP8266 #1-Code, füge ihn in die Arduino IDE #1 ein und speichere ihn (benannt ESP8266-1)
  • Kopiere den ESP8266 #2-Code, füge ihn in die Arduino IDE #2 ein und speichere ihn (benannt ESP8266-2)
  • Ersetze die WiFi-Informationen (SSID und Passwort) in beiden Codes durch deine eigenen.
  • Ersetze die MQTT-Broker-Adresse in beiden Codes (Domainname oder IP-Adresse).
  • Lade den ESP8266 #1-Code auf ESP8266 #1 hoch
  • Lade den ESP8266 #2-Code auf ESP8266 #2 hoch
  • Öffne den seriellen Monitor in der Arduino IDE #1
  • Öffne den seriellen Monitor in der Arduino IDE #2
  • Drücke und halte den Knopf an ESP8266 #1 → sieh den Zustand der LED am ESP8266 #2 (AN)
  • Lass den Knopf an ESP8266 #1 los → sieh den Zustand der LED am ESP8266 #2 (AUS)
  • Drücke, halte gedrückt und lasse den Knopf mehrmals los.
  • Sieh die Ausgaben auf beiden seriellen Monitoren
    • Serieller Monitor von ESP8266 #1
    COM6
    Send
    ESP8266 #1: CONNECTED TO A BUTTON/SWITCH, ACTED AS A MQTT PUBLISHER ESP8266 - Attempting to connect to SSID: YOUR_WIFI_SSID ESP8266 - Connecting to MQTT broker ESP8266 - MQTT broker Connected! - The button is pressed, send command: 1 ESP8266 - sent to MQTT: - topic: esp8266/command - payload:1 - The button is released, send command: 0 ESP8266 - sent to MQTT: - topic: esp8266/command - payload:0
    Autoscroll Show timestamp
    Clear output
    9600 baud  
    Newline  
    • Serieller Monitor des ESP8266 #2
    COM6
    Send
    ESP8266 #2: CONNECTED TO A LED, ACTED AS A MQTT SUBSCRIBER ESP8266 - Attempting to connect to SSID: YOUR_WIFI_SSID ESP8266 - Connecting to MQTT broker ESP8266 - Subscribed to the topic: esp8266/command ESP8266 - MQTT broker Connected! ESP8266 - received from MQTT: - topic: esp8266/command - payload: 1 - Received command: 1 => Turned LED on ESP8266 - received from MQTT: - topic: esp8266/command - payload: 0 - Received command: 0 => Turned LED off
    Autoscroll Show timestamp
    Clear output
    9600 baud  
    Newline  

※ UNSERE NACHRICHTEN

  • Sie können gerne den Link zu diesem Tutorial teilen. Bitte verwenden Sie jedoch unsere Inhalte nicht auf anderen Websites. Wir haben viel Mühe und Zeit in die Erstellung der Inhalte investiert, bitte respektieren Sie unsere Arbeit!