Fundamentos de MQTT

¿Qué es un broker MQTT? Guía para principiantes sobre mensajería publicación/suscripción

Un broker MQTT es el centro que enruta cada mensaje entre dispositivos IoT y aplicaciones. Aprende publicación/suscripción, topics y comodines, sesiones, QoS, retained messages y last will, y ponlo en práctica en minutos.

Ilustración de un broker MQTT que enruta mensajes entre sensores que publican y aplicaciones suscritas
Pruébalo en tu propio broker MQTTConsigue un broker MQTT privado y gestionado con el plan Free y empieza con ejemplos de código listos para usar.
Pruébalo gratis Ejemplos de código Sin tarjeta

Un broker MQTT es el servidor central que recibe cada mensaje MQTT y lo entrega a los clientes que lo han solicitado. En esta guía para principiantes aprenderás cómo funciona el modelo de publicación/suscripción, qué hace un broker MQTT entre bastidores, cómo se estructuran los topics y los comodines, en qué se diferencian MQTT 3.1.1 y 5.0, y cómo enviar tus primeros mensajes desde la línea de comandos y desde Python.

¿Qué es MQTT?

MQTT es un protocolo de mensajería ligero diseñado para dispositivos con ancho de banda, energía o capacidad de procesamiento limitados. Funciona sobre TCP (y sobre WebSocket para navegadores), tiene una cabecera fija diminuta de solo dos bytes y mantiene abierta una única conexión de larga duración en lugar de hacer sondeos. Eso lo convierte en la opción natural para sensores, gateways, vehículos, contadores inteligentes y máquinas industriales, y resulta igual de útil para los paneles y servicios backend que consumen sus datos.

MQTT es un estándar abierto de OASIS; la web oficial del protocolo es mqtt.org.

El modelo de publicación/suscripción

En un sistema clásico de petición/respuesta como HTTP, un cliente llama a un servidor concreto y espera la respuesta. MQTT usa en cambio publicación/suscripción:

  • Un publicador envía un mensaje a un topic, por ejemplo home/livingroom/temperature.
  • Un suscriptor indica al broker qué topics le interesan.
  • El broker se sitúa en medio y reenvía cada mensaje a todos los suscriptores cuya suscripción coincide con el topic.

Este es el flujo descrito en texto:

[Temperature sensor] --PUBLISH home/livingroom/temperature 22.5--> [MQTT broker]
[MQTT broker] --deliver--> [Mobile app]       (subscribed to home/+/temperature)
[MQTT broker] --deliver--> [Analytics service] (subscribed to home/#)

Tres tipos de desacoplamiento hacen que esto sea tan potente:

  • Espacio: el sensor no conoce la dirección de la aplicación y la aplicación no conoce la del sensor. Ambos solo conocen el broker.
  • Tiempo: con sesiones persistentes y retained messages, un suscriptor no tiene que estar conectado en el momento exacto en que se publica un mensaje.
  • Escala: añadir un décimo o un milésimo suscriptor no cambia nada en el publicador.

¿Qué hace un broker MQTT?

El broker MQTT es mucho más que un simple repetidor. Se encarga de varias tareas a la vez.

Gestión de conexiones

Cada cliente abre una conexión TCP, TLS o WebSocket y envía un paquete CONNECT con un client ID, un usuario y contraseña opcionales, un intervalo de keep-alive y flags de sesión. El broker autentica al cliente, responde con CONNACK y después vigila la conexión con PINGREQ/PINGRESP para detectar clientes caídos.

Mantenimiento de sesiones

Una sesión contiene las suscripciones de un cliente y los mensajes encolados mientras estaba desconectado. Con una sesión limpia (clean session), el estado se descarta al desconectarse. Con una sesión persistente, el broker lo conserva, de modo que un dispositivo que pierde la red móvil recibe lo que se perdió cuando vuelve. MQTT 5 sustituye el antiguo flag de activado/desactivado por un intervalo de expiración de sesión medido en segundos.

Enrutamiento por topic

Cada PUBLISH entrante se compara con todas las suscripciones activas, incluidos los filtros con comodines, y se entrega a los clientes que coinciden. El enrutamiento es el corazón del broker MQTT, y por eso el diseño de topics es tan importante.

Retained messages

Un publicador puede activar el flag retain. El broker guarda el último retained message de cada topic y lo envía de inmediato a cualquier nuevo suscriptor. Es ideal para estados como device/42/status = online o la configuración más reciente: un panel que se abre más tarde ve igualmente el valor actual sin esperar a la siguiente actualización.

Last Will and Testament

Al conectarse, un cliente puede registrar un mensaje de «última voluntad», por ejemplo device/42/status = offline. Si el cliente desaparece sin un DISCONNECT limpio (corte de alimentación, fallo de red, expiración del keep-alive), el broker publica ese mensaje en su nombre. Combinado con un mensaje online retenido, esto te ofrece una detección de presencia fiable.

Calidad de servicio (QoS)

MQTT define tres garantías de entrega, y el broker las aplica en los dos tramos del recorrido (del publicador al broker y del broker al suscriptor):

QoS Nombre Garantía Uso típico
0 At most once (como máximo una vez) Enviar y olvidar, sin confirmación Lecturas de sensores frecuentes en las que perder una muestra no importa
1 At least once (al menos una vez) Confirmado con PUBACK, puede duplicarse La mayor parte de la telemetría y los eventos
2 Exactly once (exactamente una vez) Handshake en cuatro pasos, sin duplicados Facturación, comandos que no deben repetirse

El QoS efectivo para un suscriptor es el menor entre el QoS de la publicación y el de la suscripción. Para profundizar, lee Niveles de QoS en MQTT explicados.

Topics y comodines en MQTT

Los topics son cadenas UTF-8 divididas en niveles mediante una barra (/). Se crean sobre la marcha: no hay que declarar nada por adelantado.

factory1/line1/cnc1/temperature
factory1/line1/cnc1/spindle_rpm
factory1/line2/press3/status
home/kitchen/light/state

Un buen diseño de topics va de lo general a lo específico, evita las barras iniciales y los espacios y no incluye datos sensibles en los nombres. Los topics que empiezan por $ están reservados para el broker; por ejemplo, ConnectMQ publica $SYS/broker/connection/{clientId}/state.

Comodín de un nivel: +

El signo más coincide exactamente con un nivel.

Filtro de suscripción Coincide con No coincide con
factory1/+/cnc1/temperature factory1/line1/cnc1/temperature factory1/line1/cell2/cnc1/temperature
home/+/light/state home/kitchen/light/state home/light/state

Comodín multinivel:

La almohadilla coincide con cualquier número de niveles, incluido cero, y debe ser el último carácter del filtro.

Filtro de suscripción Coincide con
factory1/# factory1, factory1/line1/cnc1/temperature, factory1/line2/press3/status
factory1/line1/# Todo lo que cuelga de factory1/line1
# Todos los topics que no empiezan por $ y que el cliente tiene permiso para ver

Los comodines solo pueden usarse al suscribirse; siempre se publica en un topic concreto. En proyectos industriales, una jerarquía coherente como ISA-95 (empresa, planta, área, línea, celda) se convierte en un Unified Namespace; consulta MQTT Sparkplug B y Unified Namespace para conocer ese patrón.

MQTT 3.1.1 frente a MQTT 5.0

Hoy la mayoría de los brokers y librerías admiten ambas versiones. MQTT 5.0 mantiene el mismo modelo y añade funciones que facilitan la operación de despliegues grandes.

Capacidad MQTT 3.1.1 MQTT 5.0
Información de errores Códigos de retorno limitados Reason codes en la mayoría de las confirmaciones (por ejemplo 0x97 Quota exceeded)
Duración de la sesión Clean session activada/desactivada Intervalo de expiración de sesión
Duración del mensaje No disponible Intervalo de expiración de mensaje
Balanceo de carga No está en el estándar Suscripciones compartidas $share/{group}/{filter}
Ahorro de ancho de banda Topic completo cada vez Topic aliases
Petición/respuesta Convenciones ad hoc Response topic y correlation data
Límites del broker Implícitos Anunciados en el CONNACK (Maximum QoS, Receive Maximum, etc.)
Metadatos Solo payload User properties

Si empiezas un proyecto nuevo, usa MQTT 5.0 salvo que la librería de algún dispositivo solo admita 3.1.1. La especificación completa la publica OASIS en docs.oasis-open.org, y nuestro resumen de las características de MQTT 5 recoge lo más destacado en la práctica.

Práctica: prueba un broker MQTT en cinco minutos

La forma más rápida de entender un broker MQTT es usar uno. broker.connectmq.com, el servidor MQTT público gratuito de ConnectMQ, ofrece un área pública para pruebas anónimas.

Protocolo Puerto URL
MQTT (TCP) 1883 mqtt://broker.connectmq.com:1883
MQTT sobre TLS 8883 mqtts://broker.connectmq.com:8883
WebSocket 8083 ws://broker.connectmq.com:8083/mqtt
WebSocket seguro 8084 wss://broker.connectmq.com:8084/mqtt

Reglas del área pública: conéctate sin usuario ni contraseña, usa un client ID único y no vacío (uno vacío se rechaza) y recuerda que todo lo que publiques puede leerlo cualquiera. Elige un prefijo aleatorio como connectmq/demo/<your-random-id>/ y nunca envíes datos personales o sensibles. Los límites son 64 KB por mensaje, 10 mensajes por segundo y 10 suscripciones por cliente, y hasta 8 niveles de topic.

Suscribirse y publicar con mosquitto

Instala los clientes de línea de comandos de Eclipse Mosquitto, abre una terminal y suscríbete con un comodín. Sustituye k9x2 por tu propia cadena aleatoria:

mosquitto_sub -h broker.connectmq.com -p 1883 -i sub-k9x2 \
  -t "connectmq/demo/k9x2/#" -v

En una segunda terminal, publica una lectura:

mosquitto_pub -h broker.connectmq.com -p 1883 -i pub-k9x2 \
  -t "connectmq/demo/k9x2/room1/temp" -m '{"temp":22.5}' -q 1

La primera terminal muestra:

connectmq/demo/k9x2/room1/temp {"temp":22.5}

Ahora prueba un retained message. Publica un estado con -r y después inicia un suscriptor nuevo que solo use el comodín de un nivel:

mosquitto_pub -h broker.connectmq.com -p 1883 -i pub-k9x2 \
  -t "connectmq/demo/k9x2/room1/status" -m "online" -r

mosquitto_sub -h broker.connectmq.com -p 1883 -i sub2-k9x2 \
  -t "connectmq/demo/k9x2/+/status" -v -C 1

El nuevo suscriptor recibe online inmediatamente, aunque se haya conectado después de enviarse el mensaje. Es el broker guardando y reenviando el valor retenido. Para borrarlo, publica un retained message vacío con -r -n.

Para tráfico cifrado, cambia al puerto 8883 y apunta el cliente a los certificados de CA de tu sistema (por ejemplo --capath /etc/ssl/certs en Linux), y añade -V mqttv5 para hablar MQTT 5.0.

Ejemplo en Python con last will

Instala paho-mqtt 2.x con pip install paho-mqtt y ejecuta:

import json
import uuid
import paho.mqtt.client as mqtt

BROKER = "broker.connectmq.com"
PREFIX = f"connectmq/demo/{uuid.uuid4().hex[:8]}"
CLIENT_ID = f"py-{uuid.uuid4().hex[:8]}"


def on_connect(client, userdata, flags, reason_code, properties):
    print("Connected:", reason_code)
    client.subscribe(f"{PREFIX}/#", qos=1)
    client.publish(f"{PREFIX}/sensor1/status", "online", qos=1, retain=True)
    client.publish(f"{PREFIX}/sensor1/temp", json.dumps({"temp": 21.8}), qos=1)


def on_message(client, userdata, msg):
    print(f"{msg.topic} -> {msg.payload.decode()}")


client = mqtt.Client(
    mqtt.CallbackAPIVersion.VERSION2,
    client_id=CLIENT_ID,
    protocol=mqtt.MQTTv5,
)
client.will_set(f"{PREFIX}/sensor1/status", "offline", qos=1, retain=True)
client.on_connect = on_connect
client.on_message = on_message

client.connect(BROKER, 1883, keepalive=30)
client.loop_forever()

El script registra un last will, se anuncia como online con un retained message y publica una lectura de temperatura que recibe de vuelta a través de su propia suscripción con comodín. Si matas el proceso de golpe, el broker publica offline en el topic de estado cuando expira el keep-alive.

¿Prefieres usar el navegador? El mismo broker acepta conexiones WebSocket en los puertos 8083 y 8084; consulta MQTT sobre WebSocket.

Del servidor público gratuito a producción

El servidor MQTT público gratuito es perfecto para aprender y hacer prototipos, pero producción necesita credenciales privadas, TLS y aislamiento respecto a otros usuarios. ConnectMQ opera el broker por ti: crea uno en el portal, recibe un usuario, una contraseña y un client ID, y conéctate por mqtts:// en el puerto 8883. Tus topics permanecen aislados de otros inquilinos y del área pública, y el portal te ofrece un explorador de topics en tiempo real, paneles y reglas de alerta. Lee ¿Qué es un broker MQTT gestionado? para comparar opciones de alojamiento.

Empieza con ConnectMQ

Regístrate en app.connectmq.com para crear tu propio broker MQTT con el plan Serverless gratuito, sin tarjeta de crédito. En pocos minutos estarás enviando mensajes por TLS con los mismos comandos que acabas de probar.

Preguntas frecuentes

¿Qué es un broker MQTT, explicado de forma sencilla?

Un broker MQTT es un servidor que recibe mensajes de los clientes que publican y los reenvía a todos los clientes suscritos a un topic coincidente. Los dispositivos nunca se comunican directamente entre sí; solo hablan con el broker.

¿Qué diferencia hay entre un broker MQTT y un cliente MQTT?

Un cliente es cualquier dispositivo o aplicación que publica o se suscribe, como un sensor o un panel. El broker es el servidor intermedio que autentica a los clientes, mantiene las sesiones y enruta los mensajes entre ellos.

¿Qué puerto usa un broker MQTT?

Los puertos estándar son el 1883 para MQTT sin cifrar y el 8883 para MQTT sobre TLS. Las conexiones WebSocket suelen usar puertos aparte; en broker.connectmq.com son el 8083 y el 8084 con la ruta /mqtt.

¿Hay algún broker MQTT gratuito para hacer pruebas?

Sí. broker.connectmq.com, el servidor MQTT público gratuito de ConnectMQ, tiene un área pública anónima para pruebas, y el plan Serverless gratuito de ConnectMQ te da un broker privado con credenciales y TLS.

¿Debo usar MQTT 3.1.1 o MQTT 5.0?

Usa MQTT 5.0 en proyectos nuevos, porque añade reason codes, expiración de sesión y de mensaje, suscripciones compartidas y topic aliases. Recurre a 3.1.1 solo cuando la librería de un dispositivo no admita la versión 5.

Artículos relacionados

¿Quién inventó MQTT? La historia, de los oleoductos al IoT

MQTT lo inventaron en 1999 Andy Stanford-Clark, de IBM, y Arlen Nipper, de Arcom, para monitorizar oleoductos vía satélite. Sigue su camino hacia el open source, OASIS, ISO y los brokers MQTT gestionados en la nube de hoy.

8 min de lectura

Por qué tu cliente MQTT se desconecta constantemente (y cómo solucionarlo)

Los bucles de reconexión son uno de los problemas más habituales de MQTT. Conoce las cinco causas típicas, desde los client ID duplicados hasta los timeouts de keep alive y los paquetes demasiado grandes, y sigue un flujo de diagnóstico que localiza la tuya.

9 min de lectura

Todos los artículos →

Tu broker MQTT privado, a unos pocos clics

Crea una cuenta, obtén las credenciales de tu broker y conecta tu primer dispositivo, sin servidores que instalar, parchear ni escalar.