Arduino - MQTT

En este tutorial, aprenderemos a usar Arduino para enviar/recibir datos a un broker MQTT utilizando el protocolo MQTT. En detalle, aprenderemos:

Arduino MQTT

Exploraremos dos casos de uso diferentes:

Acerca de Arduino y MQTT

Asumiendo que ya estás familiarizado con el protocolo MQTT. Si no, por favor investiga en Internet. Este tutorial se centra en programar Arduino para enviar y recibir datos utilizando el protocolo MQTT.

A continuación se presentan los casos de uso de Arduino con MQTT:

  • Arduino se conecta a un broker MQTT en línea, por ejemplo: un broker Mosquitto en línea, AWS IoT...
  • Arduino se conecta a un broker MQTT instalado en tu PC, por ejemplo: broker Mosquitto, broker HiveMQ
  • Arduino se conecta a un broker MQTT instalado en tu Raspberry Pi, por ejemplo: broker Mosquitto
  • Arduino se conecta a un broker MQTT instalado en la nube: por ejemplo, broker Mosquitto o HiveMQ en AWS EC2

En este tutorial, comenzaremos comprobando rápidamente si Arduino puede conectarse a un broker Mosquitto en línea. Arduino publicará y se suscribirá a este broker a través de Internet.

A continuación, pasaremos a instalar el broker Mosquitto en nuestro PC. Luego conectaremos Arduino al broker MQTT instalado en nuestro PC, y continuaremos publicando y suscribiéndonos a datos a través de este broker local.

Una vez que hayas completado este tutorial, puedes seguir aprendiendo sobre Arduino con MQTT en los siguientes tutoriales:

Conecta Arduino a un broker MQTT en línea

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

Código de Arduino

El código de Arduino que se encuentra a continuación hace:

  • Conectar al broker MQTT
  • Suscribirse a un tema
  • Publicar periódicamente mensajes en el mismo tema al que se suscribe
/* * Este código de Arduino fue desarrollado por es.newbiely.com * Este código de Arduino se proporciona al público sin ninguna restricción. * Para tutoriales completos y diagramas de cableado, visite: * https://es.newbiely.com/tutorials/arduino/arduino-mqtt */ #include <WiFiS3.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-arduino-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 Arduino should publish/subscribe const char PUBLISH_TOPIC[] = "YOUR-NAME-arduino-001/loopback"; // CHANGE IT AS YOU DESIRE const char SUBSCRIBE_TOPIC[] = "YOUR-NAME-arduino-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); int status = WL_IDLE_STATUS; while (status != WL_CONNECTED) { Serial.print("Arduino - Attempting to connect to SSID: "); Serial.println(WIFI_SSID); // Connect to WPA/WPA2 network. Change this line if using open or WEP network: status = WiFi.begin(WIFI_SSID, WIFI_PASSWORD); // wait 10 seconds for connection: delay(10000); } // print your board's IP address: Serial.print("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("Arduino - 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("Arduino - MQTT broker Timeout!"); return; } // Subscribe to a topic, the incoming messages are processed by messageHandler() function if (mqtt.subscribe(SUBSCRIBE_TOPIC)) Serial.print("Arduino - Subscribed to the topic: "); else Serial.print("Arduino - Failed to subscribe to the topic: "); Serial.println(SUBSCRIBE_TOPIC); Serial.println("Arduino - 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("Arduino - sent to MQTT:"); Serial.print("- topic: "); Serial.println(PUBLISH_TOPIC); Serial.print("- payload:"); Serial.println(messageBuffer); } void messageHandler(String &topic, String &payload) { Serial.println("Arduino - received from MQTT:"); Serial.println("- topic: " + topic); Serial.println("- payload:"); Serial.println(payload); }

Pasos R\u00e1pidos

  • Si es la primera vez que usas Arduino Uno R4, consulta cómo configurar el entorno para Arduino Uno R4 en Arduino IDE.
  • Abre Arduino IDE en tu PC
  • 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 el cuadro 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 de Arduino
  • Escribe ArduinoJson en la caja de búsqueda, y luego busca la biblioteca ArduinoJson de Benoit Blanchon.
  • Haz clic en el botón Instalar para instalar la biblioteca ArduinoJson.
Biblioteca JSON de Arduino
  • 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.
  • 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 IDs de cliente MQTT y los temas son los mismos para todos.
  • Haz clic en el botón Upload en Arduino IDE para cargar el código en Arduino
  • Abre el Monitor Serial
  • Observa el resultado en el Monitor Serial.
COM6
Send
IP Address: 192.168.0.2 Arduino - Connecting to MQTT broker Arduino - Subscribed to the topic: YOUR-NAME-arduino-001/loopback Arduino - MQTT broker Connected! Arduino - sent to MQTT: - topic: YOUR-NAME-arduino-001/loopback - payload:{"timestamp":11757,"data":255} Arduino - received from MQTT: - topic: YOUR-NAME-arduino-001/loopback - payload: {"timestamp":11757,"data":255} Arduino - sent to MQTT: - topic: YOUR-NAME-arduino-001/loopback - payload:{"timestamp":16896,"data":259} Arduino - received from MQTT: - topic: YOUR-NAME-arduino-001/loopback - payload: {"timestamp":16896,"data":259}
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  

Como puedes ver, Arduino publica mensajes al 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 datos. Si no quieres que Arduino reciba el mensaje que publica, simplemente haz que el tema SUBSCRIBE sea diferente del tema PUBLISH.

Conecta Arduino al broker MQTT instalado en tu PC

Instalación del broker MQTT de Mosquitto

  • Instálelo en la unidad D: en lugar de la unidad C:. Evite instalar el broker Mosquitto en la unidad C: para prevenir posibles problemas.

Ejecutar el broker MQTT de Mosquitto

Ahora, comprobemos si el broker MQTT funciona correctamente siguiendo estos pasos:

  • Vaya al directorio donde se instaló Mosquitto. Por ejemplo: D:\Draft\mosquitto>
  • Cree un nuevo archivo llamado test.conf, copie el contenido a continuación y guárdelo en ese directorio:
listener 1883 allow_anonymous true
  • Abra un símbolo del sistema como administrador en su PC. Llamémoslo Ventana del Bróker. No lo cierre hasta el final del tutorial.
Administrador del símbolo del sistema de Windows
  • Ejecuta los comandos a continuación 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 uso posterior. En el ejemplo anterior: 192.168.0.26

Probar si funciona el broker de Mosquitto

  • Abre otro Símbolo del sistema como administrador en tu PC. Llamémoslo 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:\Draft\mosquitto mosquitto_sub -h 192.168.0.26 -p 1883 -t arduino-001/send
  • Abre otro símbolo del sistema como Administrador en tu PC. Llamémosla Ventana de Publicación
  • Publica un mensaje en el mismo tema ejecutando los siguientes comandos uno a uno (reemplaza con tu dirección IP):
cd /d D:\Draft\mosquitto mosquitto_pub -h 192.168.0.26 -p 1883 -t arduino-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 arduino-001/send -m "Hello, MQTT!" D:\Draft\mosquitto>

Verás que ese mensaje se reenvía a la Ventana del Suscriptor 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 arduino-001/send Hello, MQTT!

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

Código de Arduino

El código de Arduino a continuación hace:

  • Conéctate al broker MQTT
  • Suscríbete a un tema
  • Publica periódicamente mensajes en otro tema
/* * Este código de Arduino fue desarrollado por es.newbiely.com * Este código de Arduino se proporciona al público sin ninguna restricción. * Para tutoriales completos y diagramas de cableado, visite: * https://es.newbiely.com/tutorials/arduino/arduino-mqtt */ #include <WiFiS3.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 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[] = "arduino-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 Arduino should publish/subscribe const char PUBLISH_TOPIC[] = "arduino-001/send"; // CHANGE IT AS YOU DESIRE const char SUBSCRIBE_TOPIC[] = "arduino-001/receive"; // 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); int status = WL_IDLE_STATUS; while (status != WL_CONNECTED) { Serial.print("Arduino - Attempting to connect to SSID: "); Serial.println(WIFI_SSID); // Connect to WPA/WPA2 network. Change this line if using open or WEP network: status = WiFi.begin(WIFI_SSID, WIFI_PASSWORD); // wait 10 seconds for connection: delay(10000); } // print your board's IP address: Serial.print("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("Arduino - 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("Arduino - MQTT broker Timeout!"); return; } // Subscribe to a topic, the incoming messages are processed by messageHandler() function if (mqtt.subscribe(SUBSCRIBE_TOPIC)) Serial.print("Arduino - Subscribed to the topic: "); else Serial.print("Arduino - Failed to subscribe to the topic: "); Serial.println(SUBSCRIBE_TOPIC); Serial.println("Arduino - 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("Arduino - sent to MQTT:"); Serial.print("- topic: "); Serial.println(PUBLISH_TOPIC); Serial.print("- payload:"); Serial.println(messageBuffer); } void messageHandler(String &topic, String &payload) { Serial.println("Arduino - 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 Arduino

Enviar mensaje desde Arduino a la PC vía MQTT

Los códigos de Arduino publican datos en el tema MQTT arduino-001/send, Ventana del suscriptor en la PC se suscribe a ese tema para recibir los datos.

  • Abre el Monitor Serial y verás que Arduino publica periódicamente un mensaje en un tema.
COM6
Send
IP Address: 192.168.0.2 Arduino - Connecting to MQTT broker Arduino - Subscribed to the topic: arduino-001/receive Arduino - MQTT broker Connected! Arduino - sent to MQTT: - topic: arduino-001/send - payload:{"timestamp":10708,"data":311} Arduino - sent to MQTT: - topic: arduino-001/send - payload:{"timestamp":15837,"data":298} Arduino - sent to MQTT: - topic: arduino-001/send - payload:{"timestamp":20965,"data":291} Arduino - sent to MQTT: - topic: arduino-001/send - payload:{"timestamp":26094,"data":286}
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  
  • Ver la Ventana del Suscriptor, verás que recibe el mensaje publicado por Arduino 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 arduino-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 Arduino vía MQTT

Arduino se suscribe al tema arduino-001/receive, Ventana del Publicador en la PC publica un mensaje a ese tema para enviarlo al Arduino.

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