Comunicación MQTT de ESP32 a ESP32

En este tutorial, cubriremos los siguientes temas:

comunicación entre dos ESP32 a través de MQTT

Hardware Requerido

2×Módulo de Desarrollo ESP32 ESP-WROOM-32
2×Cable USB Tipo-C
1×(Recomendado) Placa de Expansión de Terminales de Tornillo para ESP32
1×(Recomendado) Breakout Expansion Board for ESP32
1×(Recomendado) Divisor de Alimentación para ESP32

Or you can buy the following kits:

1×DIYables ESP32 Starter Kit (ESP32 included)
1×DIYables Sensor Kit (30 sensors/displays)
1×DIYables Sensor Kit (18 sensors/displays)
Divulgación: Algunos de los enlaces proporcionados en esta sección son enlaces de afiliado de Amazon. Podemos recibir una comisión por las compras realizadas a través de estos enlaces sin costo adicional para usted. Apreciamos su apoyo.

Acerca de ESP32 y MQTT

Tenemos un tutorial detallado sobre cómo usar ESP32 con MQTT aquí:

Comunicación entre dos ESP32 mediante MQTT

Dos placas ESP32 pueden comunicarse entre sí a través de un servidor MQTT. Si desea que se comuniquen directamente sin usar un servidor MQTT, consulte el tutorial sobre la comunicación TCP entre ESP32 y ESP32 (Cliente/Servidor).

Cuando ESP32 #1 y ESP32 #2 intercambian datos a través de un broker MQTT:

  • Ambos ESP32s se conectan al broker MQTT.
  • Para permitir que ESP32 #2 envíe datos a ESP32 #1:
    • ESP32 #1 se suscribe a un tema, por ejemplo: esp32-1/data.
    • ESP32 #2 puede enviar datos a ESP32 #1 publicando los datos en el tema al que ESP32 #1 está suscrito.
  • Del mismo modo, para que ESP32 #1 envíe datos a ESP32 #2:
    • ESP32 #2 se suscribe a un tema, por ejemplo: esp32-2/data.
    • ESP32 #1 puede enviar datos a ESP32 #2 publicando los datos en el tema al que ESP32 #2 está suscrito.

    Siguiendo este método, dos ESP32 pueden intercambiar datos de forma bidireccional.

Ejemplo de caso de uso

Realicemos la siguiente aplicación: un botón/conmutador conectado a ESP32 #1 controla un LED conectado a ESP32 #2 mediante MQTT.

comunicación entre dos ESP32

Como se mencionó anteriormente, hay algunos protocolos de aplicación que podemos usar. En este ejemplo, para simplificar, definiremos un protocolo por nosotros mismos (un protocolo autodefinido).

Cómo funciona

Definamos un protocolo sencillo:

  • Tanto ESP32 #1 como ESP32 #2 se conectan a un broker MQTT (servidor MQTT).
  • Para ESP32 #1:
    • Publica un mensaje MQTT en un tema específico cada vez que cambia el estado de un interruptor.
    • Cuando el botón/interruptor se enciende, la carga útil del mensaje MQTT se establece en 1.
    • Cuando el botón/interruptor se apaga, la carga útil del mensaje MQTT se establece en 0.
  • Para ESP32 #2:
    • Se suscribe al mismo tema.
    • Si ESP32 #2 recibe un mensaje MQTT con una carga útil de 1, enciende un LED.
    • Si ESP32 #2 recibe un mensaje MQTT con una carga útil de 0, apaga el LED.

    Diagrama de cableado

    • ESP32 #1 - Diagrama de cableado entre ESP32 y botón
    Diagrama de cableado del botón ESP32

    This image is created using Fritzing. Click to enlarge image

    Si no sabe c\u00f3mo alimentar ESP32 y otros componentes, encuentre instrucciones en el siguiente tutorial: C\u00f3mo alimentar ESP32.

    • ESP32 #2 - Diagrama de cableado entre ESP32 y LED
    Diagrama de cableado de LED para ESP32

    This image is created using Fritzing. Click to enlarge image

Comunicación entre dos ESP32 mediante MQTT

Código ESP32 #1

/* * Este código de ESP32 fue desarrollado por es.newbiely.com * Este código de ESP32 se proporciona al público sin ninguna restricción. * Para tutoriales completos y diagramas de cableado, visite: * https://es.newbiely.com/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); }

Código ESP32 #2

/* * Este código de ESP32 fue desarrollado por es.newbiely.com * Este código de ESP32 se proporciona al público sin ninguna restricción. * Para tutoriales completos y diagramas de cableado, visite: * https://es.newbiely.com/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); } }

Pasos R\u00e1pidos

  • Si es la primera vez que usas ESP32, consulta cómo configurar el entorno para ESP32 en Arduino IDE.
  • Abre dos IDE de Arduino en tu PC.
  • Conecta un botón/conmutador a ESP32 #1
  • Conecta un LED a ESP32 #2
  • Abre el Administrador de Bibliotecas haciendo clic en el icono de la barra de navegación izquierda de Arduino IDE
  • Escribe MQTT en la caja de búsqueda, luego busca la biblioteca MQTT de Joel Gaehwiler.
  • Haz clic en el botón Instalar para instalar la biblioteca MQTT.
Biblioteca MQTT para ESP32
  • Escribe ezButton en la barra de búsqueda, luego encuentra la biblioteca de botones de ArduinoGetStarted
  • Haz clic en el botón Instalar para instalar la biblioteca ezButton.
Biblioteca de botones para ESP32
  • Selecciona la placa ESP32 correcta (p. ej. ESP32 Dev Module).
  • Conecta ESP32 #1 al PC mediante un cable USB y selecciona el puerto COM de ESP32 #1 en Arduino IDE #1
  • Conecta ESP32 #2 al PC mediante un cable USB y selecciona el puerto COM de ESP32 #2 en Arduino IDE #2
  • Copia el código de ESP32 #1, pégalo en Arduino IDE #1 y guárdalo (con nombre ESP32-1)
  • Copia el código de ESP32 #2, pégalo en Arduino IDE #2 y guárdalo (con nombre ESP32-2)
  • Reemplaza la información de WiFi (SSID y contraseña) en ambos códigos con la tuya.
  • Reemplaza la dirección del broker MQTT en ambos códigos (nombre de dominio o dirección IP).
  • Carga el código de ESP32 #1 a ESP32 #1
  • Carga el código de ESP32 #2 a ESP32 #2
  • Abre el Monitor Serial en Arduino IDE #1
  • Abre el Monitor Serial en Arduino IDE #2
  • Mantén presionado el botón en ESP32 #1; observa el estado del LED en ESP32 #2 (ENCENDIDO)
  • Suelta el botón en ESP32 #1; observa el estado del LED en ESP32 #2 (APAGADO)
  • Presiona, mantén presionado y suelta el botón varias veces.
  • Ver la salida en ambos Monitores Serial
    • Monitor Serial de 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  
    • Monitor de serie del 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  

※ NUESTROS MENSAJES

  • No dude en compartir el enlace de este tutorial. Sin embargo, por favor no use nuestro contenido en otros sitios web. Hemos invertido mucho esfuerzo y tiempo en crear el contenido, ¡por favor respete nuestro trabajo!