ESP8266 - MQTT

En este tutorial, exploraremos cómo utilizar el ESP8266 para enviar y recibir datos con un broker MQTT utilizando el protocolo MQTT. Específicamente, cubriremos lo siguiente:

ESP8266 NodeMCU MQTT

Profundizaremos en dos escenarios distintos:

Hardware Requerido

1×ESP8266 NodeMCU
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 ESP8266
1×(Recomendado) Divisor de Alimentación para ESP8266 Tipo-C

Or you can buy the following kits:

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 ESP8266 y MQTT

Si aún no estás familiarizado con el protocolo MQTT, puedes encontrar información sobre él en línea. Este tutorial se centra en usar ESP8266 para enviar y recibir datos a través de MQTT.

A continuación se presentan algunas formas en las que el ESP8266 puede usarse con MQTT:

  • Puedes conectar el ESP8266 a un broker MQTT en línea como Mosquitto o AWS IoT.
  • Alternativamente, puedes conectar el ESP8266 a un broker MQTT instalado en tu ordenador, como Mosquitto o HiveMQ.
  • Si tienes una Raspberry Pi, el ESP8266 puede conectarse a un broker MQTT que se ejecuta en ella, por ejemplo, Mosquitto.
  • Además, el ESP8266 puede conectarse a un broker MQTT basado en la nube, como Mosquitto o HiveMQ en AWS EC2.

En este tutorial, comenzaremos probando si el ESP8266 puede conectarse a un broker Mosquitto en línea. Demostraremos la capacidad del ESP8266 para enviar y recibir datos a través de este broker por Internet.

A continuación, te guiaremos a través de la configuración del broker de Mosquitto en tu ordenador. El ESP8266 se conectará entonces a este broker local, lo que te permitirá seguir enviando y recibiendo datos.

Una vez que hayas completado este tutorial, puedes profundizar explorando estos tutoriales adicionales:

Estos recursos proporcionarán una mayor comprensión de los temas relacionados.

Conectar ESP8266 a un broker MQTT en línea

En esta parte, aprenderemos cómo conectar ESP8266 a test.mosquitto.org, un broker MQTT en línea creado por Mosquitto. Tenga en cuenta que este broker debe utilizarse únicamente con fines de prueba.

Código ESP8266

El código ESP8266 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 está suscrito
/* * Este código de ESP8266 NodeMCU fue desarrollado por es.newbiely.com * Este código de ESP8266 NodeMCU se proporciona al público sin ninguna restricción. * Para tutoriales completos y diagramas de cableado, visite: * https://es.newbiely.com/tutorials/esp8266/esp8266-mqtt */ #include <ESP8266WiFi.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-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 PUBLISH_TOPIC[] = "YOUR-NAME-esp8266-001/loopback"; // CHANGE IT AS YOU DESIRE const char SUBSCRIBE_TOPIC[] = "YOUR-NAME-esp8266-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); 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(); 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("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 messageHandler() function if (mqtt.subscribe(SUBSCRIBE_TOPIC)) Serial.print("ESP8266 - Subscribed to the topic: "); else Serial.print("ESP8266 - Failed to subscribe to the topic: "); Serial.println(SUBSCRIBE_TOPIC); Serial.println("ESP8266 - 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("ESP8266 - sent to MQTT:"); Serial.print("- topic: "); Serial.println(PUBLISH_TOPIC); Serial.print("- payload:"); Serial.println(messageBuffer); } void messageHandler(String &topic, String &payload) { Serial.println("ESP8266 - received from MQTT:"); Serial.println("- topic: " + topic); Serial.println("- payload:"); Serial.println(payload); }

Pasos R\u00e1pidos

Para empezar con ESP8266 en el IDE de Arduino, siga estos pasos:

  • Consulta el tutorial cómo configurar el entorno para ESP8266 en Arduino IDE si es tu primera vez usando ESP8266.
  • Conecta la placa ESP8266 a tu computadora usando un cable USB.
  • Abre el IDE de Arduino en tu computadora.
  • Elige la placa ESP8266 correcta, como (p. ej. NodeMCU 1.0 (ESP-12E Module)), y su puerto COM correspondiente.
  • Abre el Gestor de Bibliotecas haciendo clic en el icono Gestor 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.
Librería MQTT para ESP8266 NodeMCU
  • 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.
Biblioteca JSON para ESP8266 NodeMCU
  • Copie el código anterior y ábralo con el IDE de Arduino
  • Reemplace la información de WiFi (SSID y contraseña) en el código con la suya.
  • En el código, verá la palabra 'YOUR-NAME' tres veces. Reemplace esta palabra con su nombre o con caracteres aleatorios (solo caracteres alfabéticos, sin espacios). Esto es necesario porque si no realiza el cambio, puede haber varias personas ejecutando este código al mismo tiempo, lo que podría provocar conflictos porque los IDs de cliente MQTT y los temas son los mismos para todos.
  • Haga clic en el botón Subir en el IDE de Arduino para subir el código al ESP8266
  • Abra el Monitor serie
  • Vea el resultado en el Monitor serie.
COM6
Send
ESP8266 - Connecting to MQTT broker ESP8266 - Subscribed to the topic: YOUR-NAME-esp8266-001/loopback ESP8266 - MQTT broker Connected! ESP8266 - sent to MQTT: - topic: YOUR-NAME-esp8266-001/loopback - payload:{"timestamp":11757,"data":255} ESP8266 - received from MQTT: - topic: YOUR-NAME-esp8266-001/loopback - payload: {"timestamp":11757,"data":255} ESP8266 - sent to MQTT: - topic: YOUR-NAME-esp8266-001/loopback - payload:{"timestamp":16896,"data":259} ESP8266 - received from MQTT: - topic: YOUR-NAME-esp8266-001/loopback - payload: {"timestamp":16896,"data":259}
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  

Como se puede ver, ESP8266 publica mensajes en el broker MQTT y luego recibe de vuelta el mismo mensaje. Eso se debe a que el código anterior se suscribe al mismo tema al que publica los datos. Si no desea que ESP8266 reciba el mensaje que publica, simplemente haga que el tema de suscripción sea diferente del tema de publicación.

Conecta ESP8266 al broker MQTT instalado en tu PC

Instalación del 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, comprobemos si el broker MQTT está funcionando correctamente siguiendo estos pasos:

  • Ve al directorio donde se instaló Mosquitto. Por ejemplo: D:\mqtt\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émoslo Broker Window. No lo cierre hasta el final del tutorial.
Administrador del símbolo del sistema de Windows
  • Ejecute los comandos siguientes uno por uno:
cd /d D:\mqtt\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:\mqtt\mosquitto D:\mqtt\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
  • Abre otro símbolo del sistema como administrador en tu PC.
  • Encuentra la dirección IP de tu 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 . . . . . . . . . :
  • Anote la dirección IP para usarla más tarde. En el ejemplo anterior: 192.168.0.26

Prueba si funciona el broker de Mosquitto

  • Abre otro Símbolo del sistema como administrador en tu PC. Llamémosla Ventana del Suscriptor.
  • Suscríbete a un tema ejecutando los siguientes comandos uno por uno (reemplázala por tu dirección IP):
cd /d D:\mqtt\mosquitto mosquitto_sub -h 192.168.0.26 -p 1883 -t esp8266-001/send
  • Abre otro Símbolo del sistema como Administrador en tu PC. Llamémoslo Ventana del Publicador
  • Publica un mensaje en el mismo tema ejecutando, uno por uno, los comandos que se indican a continuación (reemplázala por tu dirección IP):
cd /d D:\mqtt\mosquitto mosquitto_pub -h 192.168.0.26 -p 1883 -t esp8266-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:\mqtt\mosquitto D:\mqtt\mosquitto>mosquitto_pub -h 192.168.0.26 -p 1883 -t esp8266-001/send -m "Hello, MQTT!" D:\mqtt\mosquitto>

Verá que ese 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:\mqtt\mosquitto D:\mqtt\mosquitto>mosquitto_sub -h 192.168.0.26 -p 1883 -t esp8266-001/send Hello, MQTT!

Ahora ha instalado con éxito el broker MQTT de Mosquitto en su PC. Por favor, NO cierre las tres ventanas: Ventana del broker, Ventana del suscriptor, y Ventana del publicador. Las usaremos a continuación.

Código ESP8266

El código ESP8266 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 ESP8266 NodeMCU fue desarrollado por es.newbiely.com * Este código de ESP8266 NodeMCU se proporciona al público sin ninguna restricción. * Para tutoriales completos y diagramas de cableado, visite: * https://es.newbiely.com/tutorials/esp8266/esp8266-mqtt */ #include <ESP8266WiFi.h> #include <MQTTClient.h> #include <ArduinoJson.h> #define CLIENT_ID "ESP8266-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 "esp8266-001/send" #define SUBSCRIBE_TOPIC "esp8266-001/receive" #define PUBLISH_INTERVAL 5000 // 4 seconds WiFiClient network; MQTTClient mqtt = MQTTClient(256); unsigned long lastPublishTime = 0; void setup() { Serial.begin(9600); 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(); 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("ESP8266 - Connecting to MQTT broker"); while (!mqtt.connect(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 messageHandler() function if (mqtt.subscribe(SUBSCRIBE_TOPIC)) Serial.print("ESP8266 - Subscribed to the topic: "); else Serial.print("ESP8266 - Failed to subscribe to the topic: "); Serial.println(SUBSCRIBE_TOPIC); Serial.println("ESP8266 - 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("ESP8266 - sent to MQTT:"); Serial.print("- topic: "); Serial.println(PUBLISH_TOPIC); Serial.print("- payload:"); Serial.println(messageBuffer); } void messageHandler(String &topic, String &payload) { Serial.println("ESP8266 - 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

  • Copie el código anterior y ábralo con el IDE de Arduino.
  • Reemplace la información de WiFi (SSID y contraseña) en el código con la suya.
  • Reemplace la dirección del broker MQTT en el código (nombre de dominio o dirección IP).
  • Haga clic en el botón Subir en el IDE de Arduino para cargar el código al ESP8266.

Enviar mensaje desde ESP8266 a la PC vía MQTT

Los códigos ESP8266 publican datos en el tema MQTT esp8266-001/send, Ventana del Suscriptor en la PC; suscríbete a ese tema para recibir los datos.

  • Abre el Monitor Serial, verás que el ESP8266 publica periódicamente un mensaje en un tema.
COM6
Send
ESP8266 - Connecting to MQTT broker ESP8266 - Subscribed to the topic: esp8266-001/receive ESP8266 - MQTT broker Connected! ESP8266 - sent to MQTT: - topic: esp8266-001/send - payload:{"timestamp":10708,"data":311} ESP8266 - sent to MQTT: - topic: esp8266-001/send - payload:{"timestamp":15837,"data":298} ESP8266 - sent to MQTT: - topic: esp8266-001/send - payload:{"timestamp":20965,"data":291} ESP8266 - sent to MQTT: - topic: esp8266-001/send - payload:{"timestamp":26094,"data":286}
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  
  • Revisa la Ventana de Suscripción, verás que recibe el mensaje publicado por ESP8266 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:\mqtt\mosquitto D:\mqtt\mosquitto>mosquitto_sub -h 192.168.0.26 -p 1883 -t esp8266-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 a ESP8266 vía MQTT

El ESP8266 se suscribe al tema esp8266-001/receive, Ventana del Publicador en la PC publica un mensaje en ese tema para enviarlo al ESP8266.

  • Publica un mensaje en el tema al que se suscribió el ESP8266 ejecutando el siguiente comando en Ventana del Publicador:
mosquitto_pub -h 192.168.0.26 -p 1883 -t esp8266-001/receive -m "Hello, ESP8266!"
  • Verás que este mensaje es recibido por el ESP8266 en el Monitor Serial como se muestra a continuación:
COM6
Send
ESP8266 - received from MQTT: - topic: esp8266-001/receive - payload: Hello, ESP8266!
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!