Protocolo MQTT - desarrollo de MQTT en IoT y más allá

En la era del Internet of Things (IoT), la comunicación eficiente entre dispositivos es fundamental. A medida que aumenta el número de dispositivos conectados, también crece la necesidad de protocolos ligeros, escalables y fiables capaces de gestionar el intercambio de datos. Uno de los protocolos que ha ganado protagonismo por su eficacia en estos entornos es el protocolo MQTT (Message Queuing Telemetry Transport).

Desarrollado originalmente para monitorizar oleoductos a través de enlaces satelitales, el protocolo MQTT se ha convertido en el estándar de facto para las comunicaciones IoT, permitiendo que los dispositivos se comuniquen con un consumo mínimo de ancho de banda y energía. A continuación encontrará una guía completa sobre el uso del protocolo MQTT, desde la comprensión de su arquitectura y conceptos básicos hasta su implementación práctica y funciones avanzadas.

¿Qué es MQTT? Comprender los fundamentos de MQTT

MQTT es un protocolo de red ligero de tipo publish-subscribe que transmite mensajes entre dispositivos. Está diseñado para ser simple y fácil de implementar, lo que lo hace ideal para entornos con recursos limitados, como dispositivos IoT con baja potencia de procesamiento y ancho de banda reducido.

  • Modelo publish-subscribe: a diferencia de los modelos tradicionales request-response, el protocolo MQTT utiliza un modelo de publicación y suscripción. Esto significa que los dispositivos pueden publicar mensajes en un tema, y otros dispositivos pueden suscribirse a ese tema para recibir los mensajes. Este enfoque separa al emisor del mensaje de los receptores, lo que genera una comunicación más flexible.
  • Broker: el broker es el centro de la red MQTT. Recibe mensajes de los publicadores y los reenvía a los suscriptores. El broker gestiona todo el enrutamiento y filtrado de mensajes en función de los temas.

Componentes básicos del protocolo MQTT

Comprender los componentes principales del protocolo MQTT es esencial para una implementación eficaz:

  1. Cliente: cualquier dispositivo o aplicación que se conecta a un broker MQTT. Los clientes pueden publicar mensajes, suscribirse a temas o hacer ambas cosas.
  2. Broker: servidor que gestiona el enrutamiento y la entrega de mensajes. Es responsable de recibir mensajes de los publicadores y enviarlos a los suscriptores adecuados.
  3. Tema: cadena que el broker utiliza para filtrar mensajes para cada cliente conectado. Los temas son jerárquicos, lo que permite un enrutamiento granular de los mensajes.
  4. Mensaje: datos transferidos entre clientes. Cada mensaje tiene un tema, un payload, un nivel de calidad de servicio (QoS) y otros parámetros opcionales.

Primeros pasos con MQTT: configuración del entorno

Antes de comenzar con la implementación de MQTT, es importante configurar correctamente el entorno. Esto incluye seleccionar el broker adecuado, instalar el software necesario y configurar la red.

Selección del broker MQTT

El broker es un elemento clave de cualquier instalación MQTT, ya que gestiona todo el enrutamiento de mensajes. Existen varios brokers populares, cada uno con sus propias características y ventajas:

  1. Mosquitto: broker MQTT open source ampliamente utilizado por su ligereza y facilidad de configuración. Es adecuado tanto para pequeños proyectos IoT como para despliegues empresariales.
  2. HiveMQ: broker MQTT comercial diseñado para alta disponibilidad y escalabilidad. Es ideal para entornos empresariales donde la fiabilidad y el rendimiento son críticos.
  3. EMQX: otro broker MQTT open source centrado en la escalabilidad y en la gestión de millones de conexiones simultáneas. Es adecuado para aplicaciones IoT a gran escala.

Instalación y configuración del broker MQTT

A continuación se muestra cómo instalar y configurar Mosquitto, uno de los brokers MQTT más populares:

1. Instalación de Mosquitto

En Ubuntu, puede instalar Mosquitto con los siguientes comandos:

sudo apt-add-repository ppa:mosquitto-dev/mosquitto-ppa
sudo apt-get update
sudo apt-get install mosquitto mosquitto-clients

En Windows, el instalador puede descargarse desde el sitio oficial de Mosquitto.

2. Configuración de Mosquitto

  • El archivo principal de configuración se encuentra en /etc/mosquitto/mosquitto.conf en Linux. Puede editarlo para personalizar ajustes como puerto, autenticación y logs.
  • Para uso básico, la configuración predeterminada suele ser suficiente. No obstante, puede configurar autenticación y controles de acceso para mayor seguridad.

3. Inicio del broker

En Linux, inicie el broker con el siguiente comando:

sudo systemctl start mosquitto

En Windows, puede ejecutar Mosquitto desde el menú Inicio o desde la línea de comandos.

4. Prueba del broker

Para probar el broker, puede usar las herramientas de línea de comandos mosquitto_pub y mosquitto_sub. Por ejemplo:

mosquitto_pub -t "test/topic" -m "Hola, MQTT"

Selección del cliente MQTT

Después de configurar el broker, debe elegir los clientes MQTT que publicarán y se suscribirán a los temas. Existen clientes MQTT para una amplia gama de plataformas:

  1. Paho MQTT: el proyecto Eclipse Paho proporciona librerías cliente para varios lenguajes, incluidos Python, Java y JavaScript.
  2. MQTT.fx: herramienta gráfica popular para pruebas y depuración de mensajes MQTT. Es útil para desarrolladores que prefieren una interfaz visual.
  3. Node-RED: herramienta de desarrollo basada en flujos que incluye nodos MQTT integrados, permitiendo el desarrollo rápido de aplicaciones IoT.

Implementación del protocolo MQTT paso a paso

Ahora que el entorno está configurado, es el momento de implementar MQTT en un escenario real. Esta sección le guiará a través de una aplicación MQTT básica, incluyendo publicación de mensajes, suscripción a temas y gestión de QoS.

Publicación de mensajes

Publicar mensajes es una función básica de MQTT. A continuación se muestra cómo publicar un mensaje con Python y Paho MQTT:

1. Instalación de Paho MQTT

pip install paho-mqtt

2. Script del publicador

import paho.mqtt.client as mqtt

# Definir el broker MQTT y el puerto
broker = "localhost"
port = 1883

# Crear una nueva instancia del cliente MQTT
client = mqtt.Client()

# Conectarse al broker
client.connect(broker, port)

# Publicar un mensaje en el tema "test/topic"
client.publish("test/topic", "Hola, MQTT")

# Desconectarse del broker
client.disconnect()

3. Ejecutar el publicador

python mqtt_publisher.py

Esto publicará el mensaje "Hola, MQTT" en el tema "test/topic".

Suscripción a temas

Suscribirse a temas permite a los clientes MQTT recibir los mensajes publicados en esos temas. A continuación se muestra un ejemplo básico en Python:

1. Script del suscriptor

import paho.mqtt.client as mqtt

# Definir el broker MQTT y el puerto
broker = "localhost"
port = 1883

# Definir la función callback para recibir mensajes
def on_message(client, userdata, message):
    print(f"Mensaje recibido: {message.payload.decode()} en el tema {message.topic}")

# Crear una nueva instancia del cliente MQTT
client = mqtt.Client()

# Asignar la función callback
client.on_message = on_message

# Conectarse al broker
client.connect(broker, port)

# Suscribirse al tema "test/topic"
client.subscribe("test/topic")

# Iniciar el bucle para procesar mensajes entrantes
client.loop_forever()

2. Ejecutar el suscriptor

python mqtt_subscriber.py

El suscriptor mostrará todos los mensajes que reciba en el tema "test/topic".

Comprender la calidad de servicio (QoS)

MQTT admite tres niveles de calidad de servicio (QoS) que definen cómo se entregan los mensajes entre clientes y brokers:

  1. QoS 0: como máximo una vez
    • El mensaje se entrega como máximo una vez, sin confirmación de recepción. Es el nivel más rápido, pero existe riesgo de pérdida de mensajes.
    • Ejemplo de uso: datos de sensores no críticos.
  2. QoS 1: al menos una vez
    • El mensaje se entrega al menos una vez, con confirmación del receptor. Garantiza la recepción, aunque puede producir duplicados.
    • Ejemplo de uso: datos de facturación o transacciones.
  3. QoS 2: exactamente una vez
    • El mensaje se entrega exactamente una vez, con un proceso completo de confirmación entre emisor y receptor. Es el nivel más fiable, pero también el más lento.
    • Ejemplo de uso: alertas críticas del sistema.

Configuración de QoS en Python

client.publish("test/topic", "Hola, MQTT", qos=1)
client.subscribe("test/topic", qos=2)

Funciones avanzadas de MQTT

Una vez dominados los fundamentos, puede explorar algunas funciones avanzadas que ofrece el protocolo MQTT. Estas funciones permiten implementaciones más robustas y sofisticadas.

Mensajes retenidos

Un mensaje retenido en MQTT es un mensaje almacenado por el broker y enviado a los nuevos suscriptores que se conectan a ese tema. Esto es útil para que reciban inmediatamente el estado más reciente.

Publicar un mensaje retenido:

client.publish("test/topic", "Hola, MQTT", retain=True)

Caso de uso: especialmente útil cuando se necesita proporcionar a nuevos suscriptores información inmediata sobre el estado actual de un dispositivo o sensor.

Función LWT

La función Last Will and Testament (LWT) permite definir un mensaje que será publicado por el broker si un cliente se desconecta inesperadamente. Es útil para detectar y gestionar fallos de clientes.

Configuración de LWT:

client.will_set("test/status", "Cliente desconectado inesperadamente", qos=1, retain=True)

Caso de uso: útil cuando se necesita supervisar el estado de dispositivos y recibir avisos si alguno queda fuera de línea.

Comodines en temas

El protocolo MQTT admite comodines en los temas, lo que permite suscribirse a varios temas con una sola suscripción. Existen dos tipos:

  1. Comodín de un solo nivel (+): coincide con un nivel de la jerarquía del tema. Por ejemplo, home/+/temperature coincidirá con home/livingroom/temperature y home/kitchen/temperature.
  2. Comodín multinivel (#): coincide con todos los niveles restantes de la jerarquía. Por ejemplo, home/# coincidirá con home/livingroom/temperature, home/kitchen/humidity y otros subtemas.

Uso de comodines:

client.subscribe("home/+/temperature")
client.subscribe("home/#")

Caso de uso: muy útil cuando existe un gran número de dispositivos similares y se desea recibir mensajes de todos ellos mediante una sola suscripción.

Sesiones persistentes

En MQTT, una sesión persistente permite que el broker almacene información sobre la suscripción del cliente y los mensajes no entregados. Cuando el cliente se reconecta, recibe los mensajes publicados mientras estaba desconectado.

Configuración de sesión persistente:

client.connect(broker, port, clean_start=False)

Caso de uso: útil cuando desea asegurarse de que no se pierda ningún mensaje aunque el cliente se desconecte temporalmente.

Conexión entre brokers MQTT

El bridging permite conectar varios brokers MQTT para compartir mensajes entre distintas redes o ubicaciones. Es especialmente útil en despliegues grandes donde se requieren múltiples brokers.

Configuración del bridge:

connection bridge-to-remote
address remote-broker.example.com:1883
topic # both 0

Caso de uso: útil cuando es necesario conectar ubicaciones geográficas distintas o escalar la red MQTT a través de varios brokers.

Buenas prácticas de seguridad para MQTT

Aunque el protocolo MQTT está diseñado para ser ligero, es necesario implementar medidas de seguridad para proteger la red MQTT frente a accesos no autorizados y filtraciones de datos.

Transport Layer Security (TLS)

TLS es un protocolo que proporciona cifrado y comunicación segura sobre la red. Su implementación en MQTT garantiza que todos los datos transferidos entre clientes y broker estén cifrados.

Habilitar TLS:

listener 8883
cafile /etc/mosquitto/certs/ca.crt
certfile /etc/mosquitto/certs/server.crt
keyfile /etc/mosquitto/certs/server.key

Los clientes también deben configurarse para utilizar TLS:

client.tls_set(ca_certs="ca.crt", certfile="client.crt", keyfile="client.key")

Caso de uso: TLS es crucial cuando se transmiten datos sensibles, por ejemplo en aplicaciones sanitarias o financieras.

Autenticación y autorización

Los brokers MQTT pueden configurarse para exigir autenticación antes de permitir la conexión. Esta autenticación puede realizarse mediante nombre de usuario y contraseña o mediante métodos más avanzados como certificados.

Configurar autenticación:

sudo mosquitto_passwd -c /etc/mosquitto/passwd username

A continuación, actualice el archivo de configuración:

allow_anonymous false
password_file /etc/mosquitto/passwd

Caso de uso: la autenticación es necesaria en entornos multiusuario o cuando se manejan datos sensibles.

Listas de control de acceso (ACL)

Las listas de control de acceso permiten definir a qué temas puede publicar o suscribirse un cliente, proporcionando un control granular sobre la red MQTT.

Configuración de ACL:

user client1
topic read home/temperature
topic write home/temperature

Actualice después el archivo de configuración para usar ACL:

acl_file /etc/mosquitto/aclfile

Caso de uso: las ACL son útiles cuando se requieren controles de acceso estrictos, como en entornos empresariales o brokers públicos MQTT.

El futuro del protocolo MQTT

MQTT ha demostrado ser un protocolo robusto y versátil para IoT y más allá. Su naturaleza ligera, combinada con funciones como QoS, sesiones persistentes y gestión flexible de temas, lo convierte en una excelente opción para una amplia gama de aplicaciones, desde hogares inteligentes hasta automatización industrial.

A medida que el IoT evoluciona, el papel de MQTT seguirá creciendo, con nuevos desarrollos como MQTT-SN y una mejor integración con plataformas cloud. Sin embargo, como ocurre con cualquier tecnología, es fundamental aplicar buenas prácticas, especialmente en el ámbito de la seguridad, para garantizar que las implementaciones MQTT sean eficaces y seguras.

Al dominar el uso de MQTT, podrá aprovechar todo el potencial del IoT y crear sistemas eficientes, escalables y fiables. Tanto si es desarrollador, arquitecto de sistemas o entusiasta del IoT, comprender y utilizar las posibilidades del protocolo MQTT será esencial en un mundo cada vez más conectado.