ESP32 - MQTT

En este tutorial, exploraremos cómo utilizar el ESP32 para enviar y recibir datos hacia y desde un broker MQTT utilizando el protocolo MQTT. Específicamente, cubriremos:

ESP32 MQTT

Profundizaremos en dos escenarios distintos:

Hardware Requerido

1×Módulo de Desarrollo ESP32 ESP-WROOM-32
1×Cable USB Tipo-A a Tipo-C (para PC USB-A)
1×Cable USB Tipo-C a Tipo-C (para PC USB-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

Si ya estás familiarizado con el protocolo MQTT, ¡genial! Si no, puedes buscarlo en línea. Este tutorial se centra en usar ESP32 para enviar y recibir datos mediante MQTT.

Aquí hay algunas formas en que el ESP32 puede trabajar con MQTT:

  • Conecta ESP32 a un broker MQTT en línea como Mosquitto o AWS IoT.
  • Conecta ESP32 a un broker MQTT instalado en tu ordenador, como Mosquitto o HiveMQ.
  • Conecta ESP32 a un broker MQTT que se ejecuta en tu Raspberry Pi, por ejemplo, Mosquitto.
  • Conecta ESP32 a un broker MQTT basado en la nube, como Mosquitto o HiveMQ en AWS EC2.

En este tutorial, empezaremos comprobando si el ESP32 puede conectarse a un broker Mosquitto en línea. Haremos que el ESP32 envíe y reciba datos a través de este broker en Internet.

Luego, configuraremos el broker Mosquitto en nuestra computadora. Conectaremos el ESP32 a este broker local y continuaremos enviando y recibiendo datos.

Una vez que hayas terminado este tutorial, puedes explorar más revisando estos otros tutoriales:

Estos enlaces proporcionarán más orientación sobre temas relacionados.

Conectar ESP32 a un broker MQTT en línea

En esta parte, aprenderemos cómo conectar el ESP32 a test.mosquitto.org, un broker MQTT en línea creado por Mosquitto. Tenga en cuenta que este broker debe usarse solo para fines de prueba.

Código ESP32

El código ESP32 que se muestra a continuación hace:

  • Conectarse al broker MQTT
  • Suscribirse a un tema
  • Publicar periódicamente mensajes en el mismo tema al que se suscribe
/* * 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-mqtt */ #include <WiFi.h> #include <MQTTClient.h> #include <ArduinoJson.h> 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 int MQTT_PORT = 1883; const char MQTT_CLIENT_ID[] = "YOUR-NAME-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 PUBLISH_TOPIC[] = "YOUR-NAME-esp32-001/loopback"; // CHANGE IT AS YOU DESIRE const char SUBSCRIBE_TOPIC[] = "YOUR-NAME-esp32-001/loopback"; // CHANGE IT AS YOU DESIRE const int PUBLISH_INTERVAL = 5000; // 5 seconds WiFiClient network; MQTTClient mqtt = MQTTClient(256); unsigned long lastPublishTime = 0; void setup() { Serial.begin(9600); // set the ADC attenuation to 11 dB (up to ~3.3V input) analogSetAttenuation(ADC_11db); 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(); if (millis() - lastPublishTime > PUBLISH_INTERVAL) { sendToMQTT(); lastPublishTime = millis(); } } void connectToMQTT() { // Connect to the MQTT broker mqtt.begin(MQTT_BROKER_ADRRESS, MQTT_PORT, network); // Create a handler for incoming messages mqtt.onMessage(messageHandler); 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 messageHandler() function if (mqtt.subscribe(SUBSCRIBE_TOPIC)) Serial.print("ESP32 - Subscribed to the topic: "); else Serial.print("ESP32 - Failed to subscribe to the topic: "); Serial.println(SUBSCRIBE_TOPIC); Serial.println("ESP32 - MQTT broker Connected!"); } void sendToMQTT() { StaticJsonDocument<200> message; message["timestamp"] = millis(); message["data"] = analogRead(0); // Or you can read data from other sensors char messageBuffer[512]; serializeJson(message, messageBuffer); mqtt.publish(PUBLISH_TOPIC, messageBuffer); Serial.println("ESP32 - sent to MQTT:"); Serial.print("- topic: "); Serial.println(PUBLISH_TOPIC); Serial.print("- payload:"); Serial.println(messageBuffer); } void messageHandler(String &topic, String &payload) { Serial.println("ESP32 - received from MQTT:"); Serial.println("- topic: " + topic); Serial.println("- payload:"); Serial.println(payload); }

Pasos R\u00e1pidos

  • Si es la primera vez que usas ESP32, consulta cómo configurar el entorno para ESP32 en Arduino IDE.
  • Realiza el cableado como en la imagen anterior.
  • Conecta la placa ESP32 a tu PC mediante un cable USB.
  • Abre Arduino IDE en tu PC.
  • Selecciona la placa ESP32 adecuada (p. ej. ESP32 Dev Module) y el puerto COM.
  • Abre Arduino IDE en tu PC.
  • Abre el Administrador de Bibliotecas haciendo clic en el icono Administrador de Bibliotecas en 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 ArduinoJson en la caja de búsqueda, luego busca la biblioteca ArduinoJson de Benoit Blanchon.
  • Haz clic en el botón Instalar para instalar la biblioteca ArduinoJson.
Librería JSON para ESP32
  • Copia el código anterior y ábrelo con Arduino IDE
  • Reemplaza la información de WiFi (SSID y contraseña) en el código con la tuya.
  • En el código, verás la palabra 'YOUR-NAME' tres veces. Reemplaza esta palabra con tu nombre o caracteres aleatorios (solo caracteres alfabéticos, sin espacios). Esto es necesario porque si no haces el cambio, puede haber varias personas ejecutando este código al mismo tiempo, lo que podría provocar conflictos porque los identificadores de cliente MQTT y los temas son los mismos para todos.
  • Haz clic en el botón Subir en Arduino IDE para cargar el código en ESP32
  • Abre el Monitor Serial
  • Consulta el resultado en el Monitor Serial.
COM6
Send
ESP32 - Connecting to MQTT broker ESP32 - Subscribed to the topic: YOUR-NAME-esp32-001/loopback ESP32 - MQTT broker Connected! ESP32 - sent to MQTT: - topic: YOUR-NAME-esp32-001/loopback - payload:{"timestamp":11757,"data":255} ESP32 - received from MQTT: - topic: YOUR-NAME-esp32-001/loopback - payload: {"timestamp":11757,"data":255} ESP32 - sent to MQTT: - topic: YOUR-NAME-esp32-001/loopback - payload:{"timestamp":16896,"data":259} ESP32 - received from MQTT: - topic: YOUR-NAME-esp32-001/loopback - payload: {"timestamp":16896,"data":259}
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  

Como puedes observar, el ESP32 publica mensajes en el broker MQTT y luego recibe el mismo mensaje de vuelta. Esto ocurre porque el código proporcionado se suscribe al mismo tema al que publica los datos. Si prefieres que el ESP32 no reciba el mensaje que publica, puedes lograrlo fácilmente haciendo que el tema de suscripción sea diferente del tema de publicación.

Conecta el ESP32 al broker MQTT instalado en tu PC

Instalando el broker MQTT de Mosquitto

  • Instálalo en la unidad D: en lugar de la unidad C:. Evita instalar el broker Mosquitto en la unidad C: para evitar posibles problemas.

Ejecutar el broker MQTT de Mosquitto

Ahora, vamos a verificar si el broker MQTT está funcionando correctamente siguiendo estos pasos:

  • Ve al directorio donde se instaló Mosquitto. Por ejemplo: D:\Draft\mosquitto>
  • Crea un nuevo archivo llamado test.conf, copia el contenido a continuación y guárdalo en ese directorio:
listener 1883 allow_anonymous true
  • Ejecute un Símbolo del sistema como administrador en su PC. Llamémosla Broker Window. No la cierre hasta el final del tutorial.
Administrador del símbolo del sistema de Windows
  • Ejecuta los siguientes comandos uno por uno:
cd /d D:\Draft\mosquitto mosquitto -v -c test.conf
  • Verás:
Command Prompt
Microsoft Windows [Version 10.0.19045.3930] (c) Microsoft Corporation. All rights reserved. C:\WINDOWS\system32>cd /d D:\Draft\mosquitto D:\Draft\mosquitto>mosquitto -v -c test.conf 1710918939: mosquitto version 2.0.18 starting 1710918939: Config loaded from test.conf. 1710918939: Opening ipv6 listen socket on port 1883. 1710918939: Opening ipv4 listen socket on port 1883. 1710918939: mosquitto version 2.0.18 running
  • Abra otro Símbolo del sistema como administrador en su PC.
  • Encuentre la dirección IP de su PC ejecutando el siguiente comando:
ipconfig
Command Prompt
C:\WINDOWS\system32>ipconfig Windows IP Configuration Ethernet adapter: Subnet Mask . . . . . . . . . . . : 255.0.0.0 IPv4 Address. . . . . . . . . . . : 192.168.0.26 Subnet Mask . . . . . . . . . . . : 255.255.255.0 Default Gateway . . . . . . . . . :
  • Anota la dirección IP para su uso posterior. En el ejemplo anterior: 192.168.0.26

Comprobar si funciona el broker Mosquitto

  • Abre otro Símbolo del sistema como administrador en tu PC. Llamémoslo Ventana de suscripción
  • Suscríbete a un tema ejecutando los comandos que se indican a continuación, uno por uno (reemplázala por tu dirección IP):
cd /d D:\Draft\mosquitto mosquitto_sub -h 192.168.0.26 -p 1883 -t esp32-001/send
  • Abre otro símbolo del sistema como administrador en tu PC. Llamémoslo Publisher Window
  • Publica un mensaje en el mismo tema ejecutando los comandos siguientes uno por uno (reemplázalo por tu dirección IP):
cd /d D:\Draft\mosquitto mosquitto_pub -h 192.168.0.26 -p 1883 -t esp32-001/send -m "Hello, MQTT!"
  • Verás:
Command Prompt
Microsoft Windows [Version 10.0.19045.3930] (c) Microsoft Corporation. All rights reserved. C:\WINDOWS\system32>cd /d D:\Draft\mosquitto D:\Draft\mosquitto>mosquitto_pub -h 192.168.0.26 -p 1883 -t esp32-001/send -m "Hello, MQTT!" D:\Draft\mosquitto>

Podrá ver que el mensaje se reenvía a la Ventana del Suscriptor de la siguiente manera:

Command Prompt
Microsoft Windows [Version 10.0.19045.3930] (c) Microsoft Corporation. All rights reserved. C:\WINDOWS\system32>cd /d D:\Draft\mosquitto D:\Draft\mosquitto>mosquitto_sub -h 192.168.0.26 -p 1883 -t esp32-001/send Hello, MQTT!

Ahora has instalado con éxito el broker MQTT de Mosquitto en tu PC. Por favor, NO cierres las tres ventanas: Ventana del broker, Ventana del suscriptor, y Ventana del publicador. Los utilizaremos a continuación.

Código ESP32

El código ESP32 que se muestra a continuación hace:

  • Conectar al broker MQTT
  • Suscribirse a un tema
  • Publicar periódicamente mensajes en otro tema
/* * 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-mqtt */ #include <WiFi.h> #include <MQTTClient.h> #include <ArduinoJson.h> #define CLIENT_ID "ESP32-001" // CHANGE IT AS YOU DESIRE 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[] = "192.168.0.26"; // CHANGE TO MQTT BROKER'S IP ADDRESS const int MQTT_PORT = 1883; const char MQTT_USERNAME[] = ""; // CHANGE IT IF REQUIRED const char MQTT_PASSWORD[] = ""; // CHANGE IT IF REQUIRED // The MQTT topics that this device should publish/subscribe #define PUBLISH_TOPIC "esp32-001/send" #define SUBSCRIBE_TOPIC "esp32-001/receive" #define PUBLISH_INTERVAL 5000 // 4 seconds WiFiClient network; MQTTClient mqtt = MQTTClient(256); unsigned long lastPublishTime = 0; void setup() { Serial.begin(9600); // set the ADC attenuation to 11 dB (up to ~3.3V input) analogSetAttenuation(ADC_11db); 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(); if (millis() - lastPublishTime > PUBLISH_INTERVAL) { sendToMQTT(); lastPublishTime = millis(); } } void connectToMQTT() { // Connect to the MQTT broker mqtt.begin(MQTT_BROKER_ADRRESS, MQTT_PORT, network); // Create a handler for incoming messages mqtt.onMessage(messageHandler); Serial.print("ESP32 - Connecting to MQTT broker"); while (!mqtt.connect(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 messageHandler() function if (mqtt.subscribe(SUBSCRIBE_TOPIC)) Serial.print("ESP32 - Subscribed to the topic: "); else Serial.print("ESP32 - Failed to subscribe to the topic: "); Serial.println(SUBSCRIBE_TOPIC); Serial.println("ESP32 - MQTT broker Connected!"); } void sendToMQTT() { StaticJsonDocument<200> message; message["timestamp"] = millis(); message["data"] = analogRead(0); // Or you can read data from other sensors char messageBuffer[512]; serializeJson(message, messageBuffer); mqtt.publish(PUBLISH_TOPIC, messageBuffer); Serial.println("ESP32 - sent to MQTT:"); Serial.print("- topic: "); Serial.println(PUBLISH_TOPIC); Serial.print("- payload:"); Serial.println(messageBuffer); } void messageHandler(String &topic, String &payload) { Serial.println("ESP32 - received from MQTT:"); Serial.println("- topic: " + topic); Serial.println("- payload:"); Serial.println(payload); // You can process the incoming data as json object, then control something /* StaticJsonDocument<200> doc; deserializeJson(doc, payload); const char* message = doc["message"]; */ }

Pasos R\u00e1pidos

  • Copia el código anterior y ábrelo con Arduino IDE
  • Reemplaza la información de WiFi (SSID y contraseña) en el código por la tuya.
  • Reemplaza la dirección del broker MQTT en el código (nombre de dominio o dirección IP).
  • Haz clic en el botón Subir en Arduino IDE para cargar el código en ESP32

Enviar mensaje desde ESP32 a la PC a través de MQTT

El código ESP32 publica datos en el tema MQTT esp32-001/send, Ventana del Suscriptor en PC se suscribe a ese tema para recibir los datos.

  • Abre el Monitor Serial; verás que el ESP32 publica periódicamente un mensaje en un tema.
COM6
Send
ESP32 - Connecting to MQTT broker ESP32 - Subscribed to the topic: esp32-001/receive ESP32 - MQTT broker Connected! ESP32 - sent to MQTT: - topic: esp32-001/send - payload:{"timestamp":10708,"data":311} ESP32 - sent to MQTT: - topic: esp32-001/send - payload:{"timestamp":15837,"data":298} ESP32 - sent to MQTT: - topic: esp32-001/send - payload:{"timestamp":20965,"data":291} ESP32 - sent to MQTT: - topic: esp32-001/send - payload:{"timestamp":26094,"data":286}
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  
  • Verifica la Ventana del Suscriptor, verás que recibe el mensaje publicado por ESP32 como se muestra a continuación:
Command Prompt
Microsoft Windows [Version 10.0.19045.3930] (c) Microsoft Corporation. All rights reserved. C:\WINDOWS\system32>cd /d D:\Draft\mosquitto D:\Draft\mosquitto>mosquitto_sub -h 192.168.0.26 -p 1883 -t esp32-001/send Hello, MQTT! {"timestamp":10708,"data":311} {"timestamp":15837,"data":298} {"timestamp":20965,"data":291} {"timestamp":26094,"data":286}

Enviar mensaje desde la PC al ESP32 vía MQTT

ESP32 se suscribe al tema esp32-001/receive, Ventana de Publicación en la PC publica un mensaje a ese tema para enviarlo al ESP32.

  • Publica un mensaje en el tema al que se suscribió el ESP32 ejecutando el siguiente comando en Ventana del Publicador:
mosquitto_pub -h 192.168.0.26 -p 1883 -t esp32-001/receive -m "Hello, ESP32!"
  • Verá que este mensaje es recibido por el ESP32 en el Monitor Serial como se muestra a continuación:
COM6
Send
ESP32 - received from MQTT: - topic: esp32-001/receive - payload: Hello, ESP32!
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  

Video Tutorial

Estamos considerando crear tutoriales en video. Si considera que los tutoriales en video son importantes, suscríbase a nuestro canal de YouTube para motivarnos a crear los videos.

※ 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!