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.



