ESP32-to-ESP32 MQTT Communication

In this tutorial, we will cover the following topics:

communication between two esp32 via MQTT

Hardware Used In This Tutorial

2×ESP-WROOM-32 Dev Module
2×USB Cable Type-C
1×(Recommended) Screw Terminal Expansion Board for ESP32
1×(Recommended) Power Splitter For ESP32

Or you can buy the following sensor kits:

1×DIYables Sensor Kit (30 sensors/displays)
1×DIYables Sensor Kit (18 sensors/displays)
Disclosure: Some of the links in this section are Amazon affiliate links, meaning we may earn a commission at no additional cost to you if you make a purchase through them. Additionally, some links direct you to products from our own brand, DIYables.

Introduction to ESP32 and MQTT

We have a detailed tutorial on how to use ESP32 with MQTT here:

Communication between two ESP32 via MQTT

Two ESP32 boards can communicate with each other through an MQTT server. If you want them to communicate directly without using an MQTT server, please refer to the tutorial on ESP32 to ESP32 TCP Client/Server communication.

When ESP32 #1 and ESP32 #2 exchange data via an MQTT broker:

  • Both ESP32s connect to the MQTT broker.
  • To enable ESP32 #2 to send data to ESP32 #1:
    • ESP32 #1 subscribes to a topic, for example: esp32-1/data.
    • ESP32 #2 can send data to ESP32 #1 by publishing the data to the topic that ESP32 #1 is subscribed to.
  • Similarly, for ESP32 #1 to send data to ESP32 #2:
    • ESP32 #2 subscribes to a topic, such as: esp32-2/data.
    • ESP32 #1 can send data to ESP32 #2 by publishing the data to the topic that ESP32 #2 is subscribed to.

    Following this method, two ESP32s can exchange data bidirectionally.

Example Use Case

Let's realize the following application: A button/switch connected to ESP32 #1 controls an LED connected to ESP32 #2 via MQTT.

communication between two esp32

As mentioned above, there are some application protocols we can use. In this example, to make it simple, we will define a protocol by ourself (a self-defined protocol)

How It Works

Let's define a simple protocol:

  • Both ESP32 #1 and ESP32 #2 connect to an MQTT Broker (MQTT server).
  • For ESP32 #1:
    • It publishes an MQTT message to a specific topic whenever the state of a switch changes.
    • When the button/switch is turned on, the MQTT message payload is set to 1.
    • When the button/switch is turned off, the MQTT message payload is set to 0.
  • For ESP32 #2:
    • It subscribes to the same topic.
    • If ESP32 #2 receives an MQTT message with a payload of 1, it turns on an LED.
    • If ESP32 #2 receives an MQTT message with a payload of 0, it turns off the LED.

    Wiring Diagram

    • ESP32 #1 - Wiring diagram between ESP32 and button
    ESP32 Button Wiring Diagram

    This image is created using Fritzing. Click to enlarge image

    • ESP32 #2 - Wiring diagram between ESP32 and LED
    ESP32 LED Wiring Diagram

    This image is created using Fritzing. Click to enlarge image

    If you're unfamiliar with how to supply power to the ESP32 and other components, you can find guidance in the following tutorial: How to Power ESP32.

Communication between two ESP32 via MQTT

ESP32 Code #1

/* * This ESP32 code is created by esp32io.com * * This ESP32 code is released in the public domain * * For more detail (instruction and wiring diagram), visit https://esp32io.com/tutorials/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 #2

/* * This ESP32 code is created by esp32io.com * * This ESP32 code is released in the public domain * * For more detail (instruction and wiring diagram), visit https://esp32io.com/tutorials/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); } }

Quick Instructions

  • If this is the first time you use ESP32, see how to setup environment for ESP32 on Arduino IDE.
  • Open two Arduino IDE on your PC.
  • Wire a button/switch to ESP32 #1
  • Wire an LED to ESP32 #2
  • Open the Library Manager by clicking on the Library Manager icon on the left navigation bar of Arduino IDE
  • Type MQTT on the search box, then look for the MQTT library by Joel Gaehwiler.
  • Click Install button to install MQTT library.
ESP32 MQTT library
  • Type ezButton on the search box, then find the button library by ESP32GetStarted
  • Click Install button to install ezButton library.
ESP32 button library
  • Select the right ESP32 board (e.g. ESP32 Dev Module).
  • Connect ESP32 #1 to PC via USB cable and select COM port of ESP32 #1 on Arduino IDE #1
  • Connect ESP32 #2 to PC via USB cable and select COM port of ESP32 #2 on Arduino IDE #2
  • Copy ESP32 #1 code, paste to Arduino IDE #1 and save it (named ESP32-1)
  • Copy ESP32 #2 code, paste to Arduino IDE #2 and save it (named ESP32-2)
  • Replace the WiFi information (SSID and password) in both codes with your own.
  • Replace the MQTT broker address in both codes (domain name or IP address).
  • Upload ESP32 #1 code to ESP32 #1
  • Upload ESP32 #2 code to ESP32 #2
  • Open Serial Monitor on Arduino IDE #1
  • Open Serial Monitor on Arduino IDE #2
  • Press and hold the button on ESP32 #1 → see LED's state on ESP32 #2 (ON)
  • Release button on ESP32 #1 → see LED's state on ESP32 #2 (OFF)
  • Press, hold, and release the button several times.
  • See output on both Serial Monitors
    • Serial Monitor of 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  
    • Serial Monitor of 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  

※ OUR MESSAGES