8.4 Comunicación IoT con MQTT¶
Este proyecto se centra en el uso de MQTT, un protocolo de comunicación popular en el dominio de Internet de las Cosas (IoT). MQTT permite a los dispositivos IoT intercambiar datos mediante un modelo de publicación/suscripción, donde los dispositivos comunican a través de temas.
En este proyecto, exploramos la implementación de MQTT construyendo un circuito que incluye un LED, un botón y un termistor. Se utiliza el microcontrolador ESP32-WROOM-32E para establecer una conexión WiFi y comunicarse con un broker MQTT. El código permite al microcontrolador suscribirse a temas específicos, recibir mensajes y controlar el LED basado en la información recibida. Adicionalmente, el proyecto demuestra la publicación de datos de temperatura del termistor a un tema designado cuando se presiona el botón.
Componentes Necesarios
En este proyecto, necesitamos los siguientes componentes.
Es definitivamente conveniente comprar un kit completo, aquí está el enlace:
Nombre |
ARTÍCULOS EN ESTE KIT |
ENLACE |
---|---|---|
Kit de Inicio ESP32 |
320+ |
También puedes comprarlos por separado desde los siguientes enlaces.
INTRODUCCIÓN DEL COMPONENTE |
ENLACE DE COMPRA |
---|---|
- |
|
Carga del Código
Construye el circuito.
Nota
Al establecer una conexión WiFi, solo se pueden emplear los pines 36, 39, 34, 35, 32, 33 para la lectura analógica. Por favor, asegúrate de que el termistor esté conectado a estos pines designados.
Luego, conecta el ESP32-WROOM-32E al computador usando el cable USB.
Abre el código.
Abre el archivo
iot_4_mqtt.ino
ubicado en el directorioesp32-starter-kit-main\c\codes\iot_4_mqtt
, o copia el código en el IDE de Arduino.Después de seleccionar la placa (ESP32 Dev Module) y el puerto apropiado, haz clic en el botón Upload.
Aquí se utiliza la biblioteca
PubSubClient
, la puedes instalar desde el Administrador de Bibliotecas.
Localiza las siguientes líneas y modifícalas con tu
<SSID>
y<PASSWORD>
.// Replace the next variables with your SSID/Password combination const char* ssid = "<SSID>"; const char* password = "<PASSWORD>";
Encuentra la siguiente línea y modifica tu
unique_identifier
. Asegúrate de que tuidentificador_único
sea realmente único ya que cualquier ID que sea idéntico intentando iniciar sesión en el mismo broker MQTT puede resultar en un fallo de inicio de sesión.// Add your MQTT Broker address, example: const char* mqtt_server = "broker.hivemq.com"; const char* unique_identifier = "sunfounder-client-sdgvsda";
Suscripción a Temas
Para evitar interferencias de mensajes enviados por otros participantes, puedes configurarlo como una cadena oscura o poco común. Simplemente reemplaza el tema actual
SF/LED
con el nombre de tema que desees.Nota
Tienes la libertad de establecer el Tema con cualquier carácter que desees. Cualquier dispositivo MQTT que se haya suscrito al mismo Tema podrá recibir el mismo mensaje. También puedes suscribirte simultáneamente a múltiples Temas.
void reconnect() { // Loop until we're reconnected while (!client.connected()) { Serial.print("Attempting MQTT connection..."); // Attempt to connect if (client.connect(unique_identifier)) { Serial.println("connected"); // Subscribe client.subscribe("SF/LED"); } else { Serial.print("failed, rc="); Serial.print(client.state()); Serial.println(" try again in 5 seconds"); // Wait 5 seconds before retrying delay(5000); } } }
Modifica la funcionalidad para responder al tema suscrito. En el código proporcionado, si se recibe un mensaje en el tema
SF/LED
, verifica si el mensaje eson
ooff
. Dependiendo del mensaje recibido, cambia el estado de salida para controlar el estado de encendido o apagado del LED.Nota
Puedes modificarlo para cualquier tema al que estés suscrito, y puedes escribir múltiples declaraciones if para responder a múltiples temas.
void callback(char* topic, byte* message, unsigned int length) { Serial.print("Message arrived on topic: "); Serial.print(topic); Serial.print(". Message: "); String messageTemp; for (int i = 0; i < length; i++) { Serial.print((char)message[i]); messageTemp += (char)message[i]; } Serial.println(); // If a message is received on the topic "SF/LED", you check if the message is either "on" or "off". // Changes the output state according to the message if (String(topic) == "SF/LED") { Serial.print("Changing state to "); if (messageTemp == "on") { Serial.println("on"); digitalWrite(ledPin, HIGH); } else if (messageTemp == "off") { Serial.println("off"); digitalWrite(ledPin, LOW); } } }
Tras seleccionar la placa correcta (ESP32 Dev Module) y puerto, haz clic en el botón Subir.
Abre el monitor serial y si se imprime la siguiente información, indica una conexión exitosa al servidor MQTT.
WiFi connected IP address: 192.168.18.77 Attempting MQTT connection...connected
Publicación de Mensajes via HiveMQ
HiveMQ es una plataforma de mensajería que funciona como un broker MQTT, facilitando la transferencia de datos rápida, eficiente y fiable a dispositivos IoT.
Nuestro código utiliza específicamente el broker MQTT proporcionado por HiveMQ. Hemos incluido la dirección del broker MQTT de HiveMQ en el código de la siguiente manera:
// Add your MQTT Broker address, example: const char* mqtt_server = "broker.hivemq.com";
Actualmente, abre el HiveMQ Web Client en tu navegador web.
Conecta el cliente al proxy público predeterminado.
Publica un mensaje en el Tema al que te has suscrito. En este proyecto, puedes publicar
on
ooff
para controlar tu LED.
Publicación de Mensajes a MQTT
También podemos utilizar el código para publicar información en el Tema. En esta demostración, hemos codificado una característica que envía la temperatura medida por el termistor al Tema cuando presionas el botón.
Haz clic en Añadir Nueva Suscripción al Tema.
Rellena los temas que deseas seguir y haz clic en Suscribirse. En el código, enviamos información de la temperatura al tema
SF/TEMP
.void loop() { if (!client.connected()) { reconnect(); } client.loop(); // if the button pressed, publish the temperature to topic "SF/TEMP" if (digitalRead(buttonPin)) { long now = millis(); if (now - lastMsg > 5000) { lastMsg = now; char tempString[8]; dtostrf(thermistor(), 1, 2, tempString); client.publish("SF/TEMP", tempString); } } }
Por lo tanto, podemos monitorear este Tema en HiveMQ, permitiéndonos ver la información que has publicado.