Protocolos y datos

¿Qué es MQTT? El protocolo MQTT explicado

MQTT es un protocolo de publicación y suscripción: los clientes publican en temas de un broker, que reenvía a los suscriptores. Temas, QoS, puertos.

MQTT es un protocolo de mensajería ligero basado en publicación y suscripción. Los dispositivos y las aplicaciones se conectan a un único servidor, el broker, y publican mensajes en temas con nombre como site/dub01/mdb1/main-incomer. Cualquier cliente suscrito a ese tema recibe el mensaje a través del broker. Publicadores y suscriptores nunca se dirigen unos a otros, así que un contador, un panel y una plataforma en la nube pueden compartir datos sin conocerse. MQTT funciona sobre TCP en el puerto 1883, o sobre TLS en el puerto 8883, y su cabecera fija ocupa solo dos bytes. Como cada dispositivo se conecta hacia fuera al broker y cualquier número de sistemas puede suscribirse a los mismos datos, se ha convertido en el protocolo más común para enviar telemetría de sensores y contadores por Internet.

Cómo funciona MQTT

ElementoQué haceEjemplo
BrokerAcepta conexiones, comprueba permisos y reenvía cada mensaje a los suscriptores que coincidenEclipse Mosquitto en un servidor, o un servicio IoT en la nube
ClienteCualquier dispositivo o aplicación que se conecta al broker para publicar, suscribirse o ambas cosasUna pasarela, un panel, un proceso que escribe en una base de datos
TemaUna dirección de texto con niveles separados por /site/dub01/mdb1/main-incomer
MensajeUn tema, una carga útil de hasta 256 MB y algunos indicadoresUn objeto JSON con las lecturas
SuscripciónUn filtro de tema, con comodines opcionalessite/dub01/#
QoSEl nivel de confirmación en cada tramo0, 1 o 2
SesiónLo que el broker recuerda de las suscripciones y mensajes pendientes de un clienteSe conserva al reconectar si el cliente lo pide

Un cliente abre una conexión TCP con el broker y envía CONNECT con su identificador de cliente, sus credenciales y un intervalo de keep-alive. El broker responde CONNACK. Después, un publicador envía paquetes PUBLISH; un suscriptor envía SUBSCRIBE con uno o varios filtros de tema, y desde entonces el broker le envía cada PUBLISH que coincida. Si no pasa ningún paquete durante el intervalo de keep-alive, el cliente envía PINGREQ, y el broker cierra una conexión que permanece callada durante vez y media el intervalo.

Como cada cliente abre una conexión saliente hacia el broker, la pasarela de un emplazamiento no necesita ningún puerto entrante abierto. Es la principal razón práctica por la que MQTT sustituyó a los protocolos de sondeo para sacar los datos de un emplazamiento.

Temas y comodines

Los temas son cadenas que distinguen mayúsculas y minúsculas. Un cliente no crea un tema; publica en él, y el broker dirige el mensaje a cada suscripción que coincide. Una suscripción puede usar dos comodines:

FiltroCoincide conNo coincide con
site/dub01/mdb1/+site/dub01/mdb1/main-incomer, site/dub01/mdb1/chiller-2site/dub01/mdb1/chiller-2/alarm
site/dub01/#Cualquier tema bajo site/dub01, a cualquier profundidadsite/cork02/mdb1/main-incomer
site/+/mdb1/main-incomerEse contador en todos los emplazamientosOtros contadores

+ sustituye un nivel y # todo el resto del árbol, por lo que debe ir al final. Los temas que empiezan por $ están reservados al broker, como $SYS/ para sus estadísticas, y un filtro que empieza por un comodín no los incluye.

Diseñe el árbol de temas antes de que publique el primer dispositivo, porque de él dependen todos los suscriptores y todas las reglas de acceso. Un buen árbol va del ámbito más amplio al más estrecho (organización, emplazamiento, cuadro, dispositivo y después el tipo de mensaje), sitúa cada dispositivo en un solo lugar y deja fuera los valores que cambian, como una lectura, una marca de tiempo o un número de sesión. Separe los temas de telemetría, estado y órdenes, para dar permiso de escritura solo donde haga falta.

QoS, mensajes retenidos y última voluntad

MQTT tiene tres niveles de entrega. Se aplican a un tramo cada vez: del publicador al broker y del broker a cada suscriptor.

QoSEntregaPaquetes en un tramoUso típico
0Como máximo una vezPUBLISHLecturas frecuentes, en las que una perdida se sustituye pronto
1Al menos una vez, con posibles duplicadosPUBLISH, PUBACKLecturas de contadores y eventos que tienen que llegar
2Exactamente una vez en ese tramoPUBLISH, PUBREC, PUBREL, PUBCOMPPoco habitual; cuesta cuatro paquetes por mensaje

Un mensaje retenido lo guarda el broker como último valor de su tema y lo envía en el acto a cada suscriptor nuevo: sirve para el estado de un dispositivo, pero puede entregar una lectura obsoleta. La última voluntad (last will) es un mensaje que el broker publica en nombre de un cliente cuya conexión se corta sin un DISCONNECT limpio; así se entera un suscriptor de que una pasarela está desconectada. La guía de QoS y mensajes retenidos MQTT trata ambos en detalle, junto con la caducidad de mensajes y las sesiones persistentes.

Puertos y seguridad de MQTT

PuertoTransporteUso
1883TCPMQTT sin cifrar: solo en una red local cerrada
8883TLS sobre TCPMQTTS: la opción normal en Internet o en una red compartida
443 (u otro)WebSocket sobre TLSNavegadores y redes que solo permiten HTTPS

MQTT por sí mismo solo tiene un campo de usuario y contraseña. El cifrado, la identidad del servidor y los certificados de cliente vienen de TLS, y el control de acceso viene de las reglas del broker sobre qué cliente puede publicar o suscribirse a qué temas. La guía de MQTTS explica los certificados, la comprobación del nombre del servidor y cómo probar una conexión TLS desde la línea de órdenes.

MQTT 3.1.1 frente a MQTT 5

MQTT se diseñó en 1999 para la telemetría de oleoductos por enlace satelital. OASIS publicó MQTT 3.1.1 como norma en 2014, que pasó a ser ISO/IEC 20922 en 2016, y MQTT 5.0 en 2019. La mayoría de los brokers admiten las dos versiones, y muchos dispositivos solo hablan la 3.1.1.

MQTT 3.1.1MQTT 5.0
ConfirmacionesÉxito o unos pocos códigos CONNACKUn código de motivo en cada confirmación, rechazos incluidos
SesiónSesión limpia sí o noIntervalo de caducidad de la sesión
Vida de un mensajeNingunaIntervalo de caducidad del mensaje
MetadatosNingunoPropiedades de usuario, tipo de contenido, indicador de formato
Reparto de cargaSegún el brokerSuscripciones compartidas ($share/group/topic)
Ancho de bandaEl tema completo cada vezLos alias de tema sustituyen un tema largo por un número
Petición y respuestaPor convenciónTema de respuesta y datos de correlación
Control de flujoNingunoReceive Maximum y tamaño máximo de paquete

Para telemetría, lo más útil de MQTT 5 son los códigos de motivo, porque el cliente ve que el broker rechazó un mensaje, y la caducidad de mensajes, porque una orden retrasada por un corte se descarta en lugar de ejecutarse tarde.

Carga útil: JSON, Sparkplug B y el contrato de datos

MQTT transporta bytes y no dice nada de su significado. La mayoría de las plataformas de energía esperan JSON, por ejemplo:

JSON
{"ts":"2026-10-28T09:15:00Z","kW":184.2,"kWh":1532871.4,"V1":231.4,"PF":0.94,"q":"good"}

El tema dice de qué contador se trata; la carga útil lleva la hora de la medida, los valores y un indicador de calidad. Las unidades y el significado de cada clave tienen que estar escritos y acordados con cada suscriptor: kW o W, energía importada o neta, la hora del contador o la hora en que la pasarela recibió el valor. Ese acuerdo, y no la compatibilidad con MQTT, es lo que hace que dos sistemas trabajen juntos. La guía de interoperabilidad enumera lo que debe fijar un contrato de datos, y la guía de hora de medida y hora de llegada explica por qué la hora de la medida debe ir en la carga útil.

Sparkplug B, una especificación de la Eclipse Foundation habitual en sistemas industriales, fija en cambio ese contrato. Los temas siguen spBv1.0/<group>/<message type>/<edge node>/<device>, la carga útil es binaria en Protocol Buffers y cada nodo edge publica un certificado de nacimiento con sus métricas y un certificado de defunción (a través de la última voluntad) cuando se desconecta. Así un suscriptor puede descubrir dispositivos y marcar los datos como obsoletos sin ningún acuerdo propio, a cambio de un formato binario que necesita un cliente compatible con Sparkplug para leerse.

Ejemplo práctico: ¿cuántos datos consume la telemetría MQTT?

Cincuenta contadores publican cada 10 segundos el mensaje JSON anterior con QoS 1. La carga útil ocupa 88 bytes y el tema 28 bytes, así que cada paquete PUBLISH tiene unos 122 bytes. TLS añade unos 22 bytes por registro y TCP e IP unos 52 bytes por segmento, de modo que cada mensaje ocupa en la línea unos 200 bytes.

Un mensaje por contadorUn mensaje por emplazamiento
Mensajes al día50 × 8640 = 432.0008640
Tamaño de cada mensaje en la líneaunos 200 bytesunos 3900 bytes (50 lecturas)
Datos enviados al díaunos 86 MBunos 34 MB
Datos al mesunos 2,6 GBaproximadamente 1 GB

El mensaje por emplazamiento lleva las 50 lecturas en una matriz JSON de unos 3650 bytes (unos 73 bytes por contador, con una sola marca de tiempo para todo el mensaje), más el tema y las cabeceras, que TCP reparte en tres segmentos.

En el primer caso, los PUBACK de vuelta suman otros 30 MB al día aproximadamente. En una línea fija nada de esto importa; con una SIM móvil decide la tarifa de datos. Agrupar las lecturas de un emplazamiento en un solo mensaje, o enviar solo los cambios, reduce la sobrecarga. La calculadora de demanda por intervalo ayuda a elegir un intervalo que siga respondiendo a la pregunta para la que sirven los datos.

MQTT comparado con otros protocolos

MQTTHTTP (REST)Modbus TCPOPC UA
PatrónPublicación y suscripción a través de un brokerPetición y respuestaPetición y respuesta, el cliente sondeaCliente y servidor, con suscripciones; también un modo de publicación y suscripción
Quién se conectaCada cliente se conecta hacia fuera al brokerCliente al servidorCliente a cada dispositivoCliente a cada servidor
Modelo de datosNinguno: la carga útil es libreNinguno: lo define la APIRegistros numeradosNodos tipados con unidades y estado
Uso típicoDel emplazamiento a la nube, del dispositivo a la plataformaEnvíos ocasionales, API webContadores y controladores en el emplazamientoSistemas de planta y SCADA

MQTT suele ser el enlace entre un emplazamiento y una plataforma, mientras que Modbus, BACnet y OPC UA leen los dispositivos del emplazamiento. La comparación entre OPC UA, Modbus y MQTT los enfrenta para proyectos industriales, y ¿Qué es Modbus? explica el lado del sondeo.

MQTT con EpiSensor

Edge, en la Gateway ZGW-20, lee los dispositivos Zigbee, Modbus, BACnet y LoRaWAN del emplazamiento, registra cada lectura con su hora de medida y publica en el broker de una plataforma como cliente MQTT, normalmente por MQTTS en el puerto 8883 con un certificado de cliente. Publica con QoS 1 y guarda las entregas fallidas en una cola local, que reenvía con sus marcas de tiempo originales cuando el broker vuelve a estar disponible. Los temas y la carga útil siguen el contrato de la plataforma, y Conectar Edge con su plataforma muestra las formas en que Edge envía los datos.

Preguntas frecuentes

¿Para qué se usa MQTT?

MQTT transporta mensajes pequeños y frecuentes entre dispositivos y aplicaciones: lecturas de sensores y contadores, cambios de estado y órdenes. Se usa en la monitorización energética de edificios, la telemetría industrial, el seguimiento de vehículos y la domótica, porque basta una conexión por dispositivo y la sobrecarga del protocolo es de pocos bytes por mensaje.

¿Qué es un broker MQTT?

El broker es el servidor central de MQTT. Los clientes se conectan a él, publican mensajes en temas y se suscriben a temas. El broker comprueba los permisos de cada cliente, mantiene las sesiones y los mensajes retenidos, y reenvía cada mensaje a todos los clientes con una suscripción que coincida. Eclipse Mosquitto, EMQX y HiveMQ son brokers habituales, y los grandes servicios IoT en la nube incluyen uno.

¿Qué puerto usa MQTT?

El puerto TCP 1883 para MQTT sin cifrar y el puerto TCP 8883 para MQTT sobre TLS (MQTTS). Ambos están registrados en la IANA. MQTT sobre WebSockets no tiene un puerto fijo; suele ir por el 443 detrás de un servidor web, lo que ayuda cuando un cortafuegos solo permite HTTPS.

¿MQTT usa TCP o UDP?

MQTT funciona sobre TCP, o sobre otro transporte que entregue los bytes en orden y sin pérdidas, como TLS o WebSockets. Un protocolo aparte, MQTT-SN, está pensado para redes de sensores y puede funcionar sobre UDP.

¿Qué diferencia hay entre MQTT y HTTP?

HTTP funciona por petición y respuesta: un cliente pregunta a un servidor y espera la respuesta, y cada dato exige una petición nueva. MQTT mantiene una conexión abierta y el broker empuja cada mensaje a los suscriptores en cuanto llega. Para lecturas pequeñas y frecuentes, MQTT gasta menos ancho de banda y entrega los cambios antes; HTTP es más sencillo para envíos ocasionales y para sistemas que solo ofrecen una API REST.

¿Qué diferencia hay entre MQTT 3.1.1 y MQTT 5?

MQTT 5 mantiene el mismo modelo y añade códigos de motivo en cada confirmación, caducidad de mensajes y sesiones, propiedades de usuario, suscripciones compartidas, alias de tema y temas de respuesta. Un broker con MQTT 5 sigue aceptando clientes MQTT 3.1.1, así que ambos conviven a menudo.

¿Qué es Sparkplug B?

Sparkplug es una especificación de la Eclipse Foundation que añade a MQTT un espacio de nombres de temas fijo, una carga útil binaria y mensajes de nacimiento y defunción. Así un suscriptor puede descubrir las métricas de cada nodo edge y saber cuándo sus datos están obsoletos. MQTT por sí solo no define nada de esto.