ESP32-zu-ESP32 MQTT-Kommunikation

In diesem Tutorial werden wir die folgenden Themen behandeln:

Kommunikation zwischen zwei ESP32 über MQTT

Erforderliche Hardware

2×ESP32 ESP-WROOM-32 Entwicklungsmodul
2×USB-Kabel Typ-C
1×(Empfohlen) Schraubklemmen-Erweiterungsboard für ESP32
1×(Empfohlen) Breakout Expansion Board for ESP32
1×(Empfohlen) Stromverteiler für ESP32

Oder Sie können die folgenden Kits kaufen:

1×DIYables ESP32 Starter-Kit (ESP32 enthalten)
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 ESP32 und MQTT

Hier finden Sie ein detailliertes Tutorial, wie man ESP32 mit MQTT verwendet:

Kommunikation zwischen zwei ESP32 über MQTT

Zwei ESP32-Boards können über einen MQTT-Server miteinander kommunizieren. Wenn Sie möchten, dass sie direkt ohne einen MQTT-Server kommunizieren, lesen Sie bitte das Tutorial zur ESP32-zu-ESP32 TCP-Client/Server-Kommunikation.

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

  • Beide ESP32s verbinden sich mit dem MQTT-Broker.
  • Um ESP32 #2 das Senden von Daten an ESP32 #1 zu ermöglichen:
    • ESP32 #1 abonniert ein Thema, zum Beispiel: esp32-1/data.
    • ESP32 #2 kann Daten an ESP32 #1 senden, indem es die Daten auf das Thema veröffentlicht, das ESP32 #1 abonniert hat.
  • Ähnlich, damit ESP32 #1 Daten an ESP32 #2 senden kann:
    • ESP32 #2 abonniert ein Thema, zum Beispiel: esp32-2/data.
    • ESP32 #1 kann Daten an ESP32 #2 senden, indem es die Daten auf das Thema veröffentlicht, das ESP32 #2 abonniert hat.

    Mit dieser Methode können zwei ESP32s Daten bidirektional austauschen.

Beispiel-Anwendungsfall

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

Kommunikation zwischen zwei ESP32-Chips

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

Wie es funktioniert

Lassen Sie uns ein einfaches Protokoll definieren:

  • Beide ESP32 #1 und ESP32 #2 verbinden sich mit einem MQTT-Broker (MQTT-Server).
  • Für ESP32 #1:
    • Es veröffentlicht eine MQTT-Nachricht an ein bestimmtes Thema, wann immer sich der Zustand eines Schalters ändert.
    • Wenn der Knopf/Schalter eingeschaltet wird, wird die Nutzlast der MQTT-Nachricht auf 1 gesetzt.
    • Wenn der Knopf/Schalter ausgeschaltet wird, wird die Nutzlast der MQTT-Nachricht auf 0 gesetzt.
  • Für ESP32 #2:
    • Es abonniert dasselbe Thema.
    • Empfängt ESP32 #2 eine MQTT-Nachricht mit einer Nutzlast von 1, schaltet es eine LED ein.
    • Empfängt ESP32 #2 eine MQTT-Nachricht mit einer Nutzlast von 0, schaltet es die LED aus.

    Verdrahtungsschema

    • ESP32 #1 - Verdrahtungsdiagramm zwischen ESP32 und Taster
    ESP32-Taster-Verdrahtungsdiagramm

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

    Wenn Sie nicht wissen, wie Sie ESP32 und andere Komponenten mit Strom versorgen, finden Sie Anleitungen im folgenden Tutorial: Wie man ESP32 mit Strom versorgt.

    • ESP32 #2 - Schaltplan zwischen ESP32 und LED
    ESP32 LED-Schaltplan

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

Kommunikation zwischen zwei ESP32 über MQTT

ESP32-Code Nr. 1

/* * Dieser ESP32 Code wurde von newbiely.de entwickelt * Dieser ESP32 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/esp32/esp32-to-esp32-mqtt-communication */ // ESP32 #1: CONNECTED TO A BUTTON/SWITCH, ACTED AS A MQTT PUBLISHER #include <WiFi.h> #include <MQTTClient.h> #include <ezButton.h> #define BUTTON_PIN 21 // ESP32 pin GPIO21 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[] = "esp32-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 ESP32 should publish/subscribe const char MQTT_TOPIC[] = "esp32/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("ESP32 #1: CONNECTED TO A BUTTON/SWITCH, ACTED AS A MQTT PUBLISHER"); WiFi.mode(WIFI_STA); WiFi.begin(WIFI_SSID, WIFI_PASSWORD); Serial.println("ESP32 - Connecting to Wi-Fi"); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(); 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("ESP32 - 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("ESP32 - MQTT broker Timeout!"); return; } Serial.println("ESP32 - MQTT broker Connected!"); } void sendToMQTT(char command) { char messageBuffer[1]; messageBuffer[0] = command; mqtt.publish(MQTT_TOPIC, messageBuffer); Serial.println("ESP32 - sent to MQTT:"); Serial.print("- topic: "); Serial.println(MQTT_TOPIC); Serial.print("- payload:"); Serial.println(messageBuffer); }

ESP32-Code Nr. 2

/* * Dieser ESP32 Code wurde von newbiely.de entwickelt * Dieser ESP32 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/esp32/esp32-to-esp32-mqtt-communication */ // ESP32 #2: CONNECTED TO A LED, ACTED AS A MQTT SUBSCRIBER #include <WiFi.h> #include <MQTTClient.h> #define LED_PIN 18 // ESP32 pin GPIO18 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[] = "esp32-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 ESP32 should publish/subscribe const char MQTT_TOPIC[] = "esp32/command"; // CHANGE IT AS YOU DESIRE WiFiClient network; MQTTClient mqtt = MQTTClient(256); void setup() { Serial.begin(9600); pinMode(LED_PIN, OUTPUT); Serial.println("ESP32 #2: CONNECTED TO A LED, ACTED AS A MQTT SUBSCRIBER"); WiFi.mode(WIFI_STA); WiFi.begin(WIFI_SSID, WIFI_PASSWORD); Serial.println("ESP32 - Connecting to Wi-Fi"); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(); 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("ESP32 - 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("ESP32 - MQTT broker Timeout!"); return; } // Subscribe to a topic, the incoming messages are processed by messageReceived() function if (mqtt.subscribe(MQTT_TOPIC)) Serial.print("ESP32 - Subscribed to the topic: "); else Serial.print("ESP32 - Failed to subscribe to the topic: "); Serial.println(MQTT_TOPIC); Serial.println("ESP32 - MQTT broker Connected!"); } void messageReceived(String &topic, String &payload) { Serial.println("ESP32 - 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

  • Wenn dies das erste Mal ist, dass Sie ESP32 verwenden, sehen Sie sich an, wie man die Umgebung für ESP32 in der Arduino IDE einrichtet.
  • Öffnen Sie zwei Arduino-IDE-Fenster auf Ihrem PC.
  • Verbinden Sie einen Knopf/Schalter mit ESP32 #1
  • Verbinden Sie eine LED an ESP32 #2
  • Öffnen Sie den Bibliotheks-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.
ESP32-MQTT-Bibliothek
  • Geben Sie ezButton in das Suchfeld ein, suchen Sie anschließend die Button-Bibliothek von ArduinoGetStarted
  • Klicken Sie auf die Schaltfläche Install, um die ezButton-Bibliothek zu installieren
ESP32-Tastenbibliothek
  • Wähle das richtige ESP32-Board aus (z. B. ESP32 Dev Module).
  • Verbinde ESP32 #1 mit dem PC über ein USB-Kabel und wähle den COM-Port von ESP32 #1 in der Arduino IDE #1.
  • Verbinde ESP32 #2 mit dem PC über ein USB-Kabel und wähle den COM-Port von ESP32 #2 in der Arduino IDE #2.
  • Kopiere den ESP32 #1-Code, füge ihn in die Arduino IDE #1 ein und speichere ihn (benannt ESP32-1).
  • Kopiere den ESP32 #2-Code, füge ihn in die Arduino IDE #2 ein und speichere ihn (benannt ESP32-2).
  • Ersetze die WiFi-Informationen (SSID und Passwort) in beiden Codes durch deine eigenen.
  • Ersetze die MQTT-Brokeradresse in beiden Codes (Domänenname oder IP-Adresse).
  • Lade den ESP32 #1-Code auf ESP32 #1 hoch.
  • Lade den ESP32 #2-Code auf ESP32 #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 ESP32 #1 → sieh dir den LED-Zustand bei ESP32 #2 an (AN).
  • Lass den Knopf an ESP32 #1 los → sieh dir den LED-Zustand bei ESP32 #2 an (AUS).
  • Drücke, halte gedrückt und lasse den Knopf mehrmals los.
  • Sieh die Ausgaben in beiden Seriellen Monitoren.
    • Serieller Monitor von ESP32 #1
    COM6
    Send
    ESP32 #1: CONNECTED TO A BUTTON/SWITCH, ACTED AS A MQTT PUBLISHER ESP32 - Attempting to connect to SSID: YOUR_WIFI_SSID ESP32 - Connecting to MQTT broker ESP32 - MQTT broker Connected! - The button is pressed, send command: 1 ESP32 - sent to MQTT: - topic: esp32/command - payload:1 - The button is released, send command: 0 ESP32 - sent to MQTT: - topic: esp32/command - payload:0
    Autoscroll Show timestamp
    Clear output
    9600 baud  
    Newline  
    • Serienmonitor von ESP32 #2
    COM6
    Send
    ESP32 #2: CONNECTED TO A LED, ACTED AS A MQTT SUBSCRIBER ESP32 - Attempting to connect to SSID: YOUR_WIFI_SSID ESP32 - Connecting to MQTT broker ESP32 - Subscribed to the topic: esp32/command ESP32 - MQTT broker Connected! ESP32 - received from MQTT: - topic: esp32/command - payload: 1 - Received command: 1 => Turned LED on ESP32 - received from MQTT: - topic: esp32/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!