Como punto de inicio para este blog, me he propuesto ofrecer un enfoque práctico del protocolo de comunicaciones MQTT, una herramienta esencial en el mundo del Internet de las Cosas (IoT). Para comenzar, presentaré tres ejemplos concretos que ilustran los componentes clave del protocolo: el publicador, el suscriptor y el intermediario o ‘broker’. A continuación, encontrarás un video resumen que anticipa lo que abordaremos en detalle. Tras el video, profundizaremos en algunos conceptos teóricos para entender mejor la tecnología que estamos manejando.
¿Qué es MQTT?
El Protocolo de Cola de Mensajes Telemétricos (MQTT, por sus siglas en inglés de Message Queuing Telemetry Transport) es un protocolo de comunicación diseñado para entornos de bajo ancho de banda, alta latencia o redes inestables. Originalmente desarrollado por IBM en 1999, el MQTT ha ganado relevancia en la era del Internet de las Cosas (IoT) debido a su diseño ligero y eficiente. En este post, exploraremos los fundamentos de MQTT y veremos ejemplos de cómo se aplica en escenarios del mundo real. MQTT es un protocolo de mensajería basado en el modelo de publicación/suscripción. En este modelo, hay tres componentes principales:
- Publicador: Envía mensajes a un tema específico.
- Suscriptor: Escucha mensajes en un tema específico.
- Broker: Sirve como intermediario, recibiendo mensajes de los publicadores y enviándolos a los suscriptores.
A diferencia de otros protocolos de mensajería como HTTP, MQTT es más ligero, consume menos recursos y tiene la capacidad de mantener la conexión activa durante más tiempo, lo que lo hace ideal para dispositivos IoT.
Características Principales
- QoS (Calidad del Servicio): MQTT soporta diferentes niveles de calidad de servicio para el envío de mensajes.
- Retención de Mensajes: El broker puede retener el último mensaje en un tema para que los nuevos suscriptores puedan recibirlo inmediatamente después de suscribirse.
- Last Will and Testament (Testamento): Un mensaje que se envía cuando el cliente se desconecta inesperadamente.
- Seguridad: Aunque MQTT no define medidas de seguridad propias, se puede implementar mediante TLS/SSL.
Es importante mencionar que MQTT ofrece diferentes niveles de «Calidad de Servicio» (QoS) para el envío de mensajes:
- QoS 0: El mensaje se entrega en el mejor esfuerzo posible, pero no hay confirmación de entrega. Puede haber pérdida de mensajes.
- QoS 1: El mensaje se entrega al menos una vez, y se confirma con un mensaje PUBACK. Esto asegura la entrega, pero puede haber duplicados.
- QoS 2: El mensaje se entrega exactamente una vez al receptor. Este es el nivel más alto de QoS y utiliza un intercambio de cuatro pasos para asegurarse de que no hay pérdidas ni duplicados.
Según el nivel de QoS, el broker y el cliente pueden intercambiar mensajes adicionales para asegurar la entrega, pero una vez que la entrega se ha confirmado, el mensaje ya no se guarda en el broker (a menos, como dije antes, que se utilice la bandera «Retain»).
Entonces sí, en general, los mensajes se entregan a los clientes suscritos y luego se «borran» o no se retienen en el broker, a menos que se especifique lo contrario.
Tópicos (Topics) en MQTT
Los tópicos son una de las características más fundamentales en MQTT. Actúan como canales de mensajería a los que los clientes pueden suscribirse o en los cuales pueden publicar mensajes. Cada tópico es simplemente una cadena de texto que suele estar estructurada en niveles, separados por el carácter ‘/’. Por ejemplo, casa/sala/temperatura
podría ser un tópico utilizado para publicar la temperatura en la sala de una casa. Cuando un cliente se suscribe a un tópico, recibe todos los mensajes que se publican en ese tópico por parte de cualquier publicador (publisher). De manera similar, cualquier mensaje que un cliente publique en un tópico se enviará a todos los clientes suscritos a ese tópico.
Comodines (Wildcards) en MQTT
Los comodines son caracteres especiales que permiten a los clientes suscribirse a múltiples tópicos simultáneamente. MQTT soporta dos tipos de comodines:
- Signo más (+): Este comodín puede sustituir a un solo nivel en un tópico. Por ejemplo, si te suscribes al tópico
casa/+/temperatura
, recibirías mensajes decasa/sala/temperatura
,casa/cocina/temperatura
, etc. - Almohadilla (#): Este comodín puede sustituir a múltiples niveles en un tópico. Debe ser utilizado solo al final de un tópico. Por ejemplo,
casa/#
te suscribiría a todos los tópicos que comiencen concasa
, incluyendocasa/sala/temperatura
,casa/sala/humedad
,casa/cocina/luz
, etc.
También es posible utilizar ambos comodines en una sola suscripción. Por ejemplo, casa/+/+/estado
podría recibir mensajes de casa/sala/luz/estado
, casa/cocina/ventilador/estado
, etc.
Los tres elementos en la práctica.
En los siguientes vídeos y posts iremos viendo en detalle los tres elmentos que componen el protocolo. El publicador será un sensor de temperatura y humedad AHT20 gobernado por una placa ESP32 S3. La naturaleza del envío de mensajes va a ser síncrona y se realizará cada cierto intervalo de tiempo. Este es un ejemplo que estaría dentro del loop del framework de arduino.
long now = millis(); static long lastMsg = 0; if (now - lastMsg > 10000) { // Enviar telemetría cada 10 segundos lastMsg = now; // Aquí, pon el código para leer tu sensor float temperatura = e_temp.temperature; float humedad = e_humedad.relative_humidity; char msgt[50]; snprintf(msgt, 50, "Valor del sensor: %f", temperatura); Serial.print("Publicando mensaje: "); Serial.println(msgt); // Publicar el mensaje client.publish("esp32/temperatura", msgt); char msgh[50]; snprintf(msgh, 50, "Valor del sensor: %f", humedad); Serial.print("Publicando mensaje: "); Serial.println(msgh); // Publicar el mensaje client.publish("esp32/humedad", msgh); }
El broker, de momento, usaremos EMQX (sitio web EMQX) Nos podemos montar un servidor de pruebas con docker fácilmente. Este sería un ejemplo de Dockerfile:
# Usar la imagen oficial de EMQ X FROM emqx/emqx # Exponer los puertos MQTT, MQTT/SSL, WebSockets EXPOSE 1883 8883 8083 # Ejecutar EMQ X CMD ["emqx", "start"]
Después, construir la imagen y lanzar la instancia
docker build -t my_emqx . docker run -d --name my_emqx_instance -p 1883:1883 -p 8083:8083 -p 8883:8883 my_emqx
Si lo preferéis, podemos usar directamente:
docker run -d --name emqx -p 1883:1883 -p 8083:8083 -p 8883:8883 emqx/emqx
Estos son los puertos que expone y usa el broker. Los puertos del protocolo son los estándares.
1883
: Puerto estándar para MQTT sin cifrado.8883
: Puerto estándar para MQTT con cifrado SSL/TLS.8083
: Puerto para el protocolo MQTT sobre WebSockets sin cifrado.8084
: Puerto para el protocolo MQTT sobre WebSockets con cifrado SSL/TLS (esto es lo que añadiste en tu comando).18083
: Puerto para la interfaz de administración web de EMQ X (esto también es adicional en tu comando).
Por último, vamos a hablar del consumidor o suscriptor. La comunicación o recepción de mensajes aquí es de naturaleza asíncrona. En programación, una función de callback, recibirá los datos del mensaje una vez que nos hayamos suscrito a un tópico. La implementación del consumidor la he hecho en c# con dotnet y la librería MQTTnet https://github.com/dotnet/MQTTnet (imaginaros un servicio en la nube que analiza datos) pero también podría ser un actuador que se implentara en otra placa ESP32.
//Evento que se va a lanzar cada vez que se publique en uno de //los "topic" a los que estamos suscritos mqttClient.ApplicationMessageReceivedAsync += e => { Console.WriteLine($"Recibido mensaje. topic:{e.ApplicationMessage.Topic}"); Console.WriteLine(Encoding.ASCII.GetString(e.ApplicationMessage.PayloadSegment)); return Task.CompletedTask; };
Ejemplos de usos de MQTT y aplicaciones:
Automatización del Hogar
MQTT es ampliamente utilizado en sistemas de automatización del hogar como Home Assistant o Domoticz. Por ejemplo, un sensor de temperatura puede publicar lecturas en un tema, y un termostato puede suscribirse a ese tema para ajustar la calefacción o la refrigeración.
Monitoreo de Salud
En un hospital, los dispositivos médicos como monitores de signos vitales pueden utilizar MQTT para enviar datos en tiempo real a un sistema centralizado que los médicos puedan supervisar.
Vehículos Autónomos
Los vehículos autónomos generan grandes cantidades de datos de sensores que deben procesarse en tiempo real. MQTT puede facilitar la transmisión eficiente de estos datos a una estación central para su análisis y toma de decisiones.
Agricultura Inteligente
Sensores de humedad y temperatura en un campo agrícola pueden usar MQTT para enviar sus datos a un sistema central. Basado en estos datos, el sistema puede ajustar automáticamente el riego y la fertilización.
Logística y Seguimiento
Las empresas de logística pueden utilizar MQTT para monitorear en tiempo real la ubicación y el estado de sus vehículos y mercancías, lo que permite una mejor planificación y eficiencia en la entrega.
Conclusión
MQTT se ha establecido como un protocolo esencial para el Internet de las Cosas y otras aplicaciones donde la eficiencia, la simplicidad y la fiabilidad son cruciales. Desde la automatización del hogar hasta aplicaciones empresariales y sanitarias, las posibilidades son prácticamente infinitas. En los siguientes vídeos y ejemplos iremos desgrando cada uno de los elementos del protocolos y aprenderemos experimentando con el. Os animo a estar pendiente y a divertiros.
Referencias:
- https://mqtt.org/
- https://github.com/dotnet/MQTTnet
- https://www.emqx.io/
- https://github.com/knolleary/pubsubclient