HomeBlog Entender el formato de protocolo MQTT

Entender MQTT Protocol Packet & Build Reliable Applications

por Ponlakshmi


MQTT Protocol Packet Format & Build Applications

MQTT Protocol (Message Queuing Telemetry Transport) es un protocolo de mensajería basado en TCP diseñado específicamente para transferir datos de telemetría desde dispositivos de borde a un servidor central. Sigue un modelo Publish/Subscribe, que permite el MQTT clientes para enviar y recibir datos eficientemente a través de un corredor central de MQTT. Desde su invención en 1999, el MQTT se ha convertido en el protocolo más adoptado para las implementaciones del IoT debido a su naturaleza ligera y fiabilidad. Por otro lado, MQTT-SN (Sensor Network) extiende el protocolo para dispositivos de borde o periférico, permitiendo comunicación entre dispositivos y portales sobre medios de conectividad de baja potencia como Bluetooth. A pesar de su potencial, MQTT-SN no ha adquirido una adopción generalizada como el protocolo básico de MQTT. Mientras que muchos MQTT en el mercado, tener una comprensión más profunda de los conceptos subyacentes es crucial. Este conocimiento te capacita para aprovechar estas implementaciones efectivamente, lo que le permite construir aplicaciones IoT de alto rendimiento y tolerante a fallas.

MQTT Protocol Packet Types

La interacción entre dispositivos MQTT y el servidor MQTT se facilita mediante un conjunto de mensajes predefinidos. Para la simplicidad, tanto los mensajes salientes como los entrantes siguen el mismo estándar. A un nivel alto, protocolo MQTT paquetes se pueden clasificar en dos tipos para una mejor comprensión


Más allá de los paquetes de protocolo MQTT, hay algunas otras especificaciones que se encargan de cómo manejar sesiones, retener el último mensaje y las desconexiones que serán cubiertas también en este artículo, ya que es muy importante para entender que para la implementación del MQTT.

Protocolo MQTT Paquetes de datos

Los paquetes de datos ayudan a transferir los datos reales entreMQTT Brokery el cliente MQTT. Publish and Subscribe son los principales paquetes de datos donde el cliente MQTT envía sus intenciones de escuchar a un tema y el servidor publica los datos basados en el requisito. Queremos añadir el paquete Connect también a esta lista, ya que se envía un conjunto de datos como parte de ella.


  • Publish- MQTT Publish packet contiene el Tema al que los datos necesitan ser publicados, los datos reales y algunos parámetros de control como la solicitud de retención de mensajes y calidad de Servicio.
  • Suscríbete- MQTT Suscripción es uno de los mensajes importantes enviados desde el Cliente al servidor indicando la lista deMQTT Filtros temáticos, el cliente está interesado en escuchar. El paquete contiene un encabezado fijo, Cabeceras variables " una carga útil.
  • Conectar- MQTT Connect Packet es más un paquete de control MQTT, pero tiene datos sobre el LastWill y Retain. Además, envía un identificador único, detalles de autenticación MQTT, y sesiones limpias bandera para decir si el período de sesiones debe persistir o no. Este paquete es enviado desde el Cliente alCloud alojada MQTT Server.

MQTT Packet Format structure for all the above three messages contains Fixed Header, Variable Header y Carga.

Paquetes de control de protocolo MQTT

Los paquetes de control son cruciales para garantizar el éxito de la transferencia de datos en el protocolo MQTT. Una comprensión clara de paquetes de control yMQTT Calidad del servicio (QoS) niveleses esencial para la aplicación efectiva. Mientras que la mayoría de los paquetes de control se gestionan en la capa de implementación central dependiendo del cliente o servidor MQTT uso, tareas como almacenar estados de entrega, manejar los reconocimientos y reenviar mensajes deben ser gestionados a nivel de aplicación.


  • CONNACK– Este paquete reconoce la solicitud de conexión y sólo contiene el Cabeza fija en el MQTT 3. MQTT 5 tiene opciones para enviar un código de razones para el rechazo de la conexión. CONNACK enviado en conexión exitosa incluye la divulgación de las capacidades del servidor como disponibilidad retened, Suscripciones de tarjetas silvestres, suscripciones compartidas, identificadores de suscripción y máximo QoS compatibles, máximo tamaño del paquete, y el servidor mantener vivo para que el cliente se comunique eficientemente.
  • SUBSCRIBE- MQTT Suscripción es uno de los mensajes importantes enviados desde el Cliente al servidor indicando la lista de los filtros Tópicos MQTT, el cliente está interesado en escuchar a. El paquete contiene un encabezado fijo, un encabezado variable y una carga útil.
  • SUBACK– Este paquete se envía en respuesta al mensaje de suscripción del MQTT Cliente para elFiltro(s) Tépico MQTT. Este paquete contiene los encabezados fijos y la carga útil.
  • UNSUBSCRIBE– Este paquete es enviado desde el cliente al servidor para instruir el servidor para dejar de enviar mensajes adicionales para un tema particular. El mensaje contiene un encabezado fijo, Cabeza y carga variable.
  • UNSUBACK– Al recibir la suscripción para un filtro de tema de un cliente, el servidor debe eliminar ese filtro de tema de la lista de filtros de tema que ha almacenado como suscripciones para ese cliente. El unsuback contiene Header fijo, Header variable y Payload.
  • DISCONNECT– Una vezMQTT Plataformarecibe esta solicitud del dispositivo MQTT, debe desconectar al cliente y cerrar la conexión. El parámetro de sesión limpio establecido durante la conexión determinará si el cliente futuros mensajes de suscripción se almacenan o descartan. La voluntad El mensaje debe ser eliminado. El paquete contiene sólo el encabezado fijo. En MQTT 5, el servidor también puede enviar DESCONECTO a un cliente si ese cliente no se ajusta al protocolo.
  • PUBACK– Este paquete puede ser enviado por el cliente o servidor como un reconocimiento a el paquete PUBLISH que ha recibido en QoS Level 1. Si el PUBACK no es recibido, el remitente debe reenviar el mensaje con el conjunto de la bandera DUP mientras se reenvia. El remitente puede quitar el mensaje de la cola después de recibir este reconocimiento. El paquete contiene un encabezado fijo " Variable Header.
  • PUBREC, PUBREL & PUBCOMP-MQTT QoS nivel 2garantiza exactamente una entrega de paquete MQTT PUBLISH. Estos paquetes de control se intercambian en una serie predefinida para garantizar esta entrega QoS Level 2. Esta serie de los flujos de paquetes es seguido por el cliente y el servidor. Cuando el receptor recibe un paquete PUBLISHed, envía un PUBREC como reconocimiento. El remitente del paquete PUBLISHed ahora debe enviar un paquete PUBREL respuesta a PUBREC. El receptor envía PUBCOMP en respuesta a PUBREC. Todos estos paquetes de control contienen Corregido " Cabeza variable.
  • PINGREQ, PINGRESP- Estos paquetes se utilizan para mantener la conexión viva y trabajo basado en el conjunto MQTT Keep Alive durante la solicitud de conexión. Es responsabilidad del MQTT Cliente para enviar el paquete PingREQ a un intervalo de tiempo vivo. ElServidor estándar MQTTdebe enviar de nuevo Paquete PingRESP como el reconocimiento. El servidor desconectará la conexión del cliente si el PingReq no es recibido. En general, un tiempo de espera 2x el tiempo de mantener vivo es considerado antes de la desconexión. Estos paquetes sólo tienen un encabezado fijo.

Formato de paquete de protocolo MQTT & Tamaños

MQTT Los paquetes pueden dividirse ampliamente en tres partes: Cabeza fija, Cabeza variable y carga útil. Si tú están empezando su implementación sobre unaestándar Clientes MQTT, entonces esta información puede no ser muy necesaria. Sin embargo, para comprender cómo utilizar las API adecuadas para utilizar el cliente, puede tener este práctico. El campo de cabecera fija comprende el control banderas; el encabezado variable contiene la longitud del paquete; la carga útil será igual a la longitud fijada en el cabezal variable. El tamaño mínimo de un campo de longitud de paquete es de 1 byte, que es para mensajes menos de 127 bytes.


El tamaño mínimo del paquete es de 2 bytes, que sólo tiene el campo de control y un campo de longitud de paquete único, mientras el tamaño máximo del paquete es de 256 MB. Los paquetes más pequeños menos de 127 bytes tienen un campo de longitud de 1 byte. El Los paquetes superiores a 127 y menos de 16383 usan 2 bytes, etc. 7-bits que se utilizan con el octavo bit es la continuación bit.


MQTT Protocol packet size - Explained

Campo de control

El campo de control de 8 bits es el byte principal de la cabecera fija de 2 bytes. Se divide en dos 4 bits campos y contiene todos protocolo comandos y respuestas. Los primeros cuatro bits más importantes son el comando o campo tipo de mensaje, mientras que el resto 4 bits se utilizan como banderas de control.

MQTT control field structure

Banderas de control

Si bien hay 16 posibles banderas, todavía se utilizan un conjunto limitado de bits. El mensaje Publish hace el mayor uso de estas banderas.


  • La bandera duplicada se utiliza cuando un mensaje se repite para QoS 1 o 2.
  • Las banderas QoS se utilizan cuando se publica para indicar un nivel QoS de 0,1,2.
  • ElMQTT retener mensajeLa bandera también se utiliza cuando publica un mensaje.

Duración restante

La longitud restante es el número de bytes que quedan en el paquete actual, incluyendo el encabezado variable y datos de carga útil. La longitud restante excluye los bytes utilizados para codificar la longitud restante. La duración restante es codificado mediante un esquema de codificación de longitud variable que utiliza un byte para valores arriba a 127. Los siete menos bits importantes de cada byte codifican los datos, y el bit más importante se utiliza para indicar que hay bytes siguientes en los representación. Así, cada byte codifica 128 valores y un “ bit de continuidad”. El mayor número de bytes in the remaining campo de longitud es cuatro.


MQTT Packet Format Remaining length in Fixed Header

Cabecera variable

Algunos tipos de paquetes de control MQTT tienen un componente de encabezado variable. Los campos de cabecera de longitud variable son no siempre presente en MQTT mensajes. Algunos tipos o comandos de mensajes MQTT requieren que este campo lleve información adicional de control. Queda entre el encabezado fijo y la carga útil. El encabezado variable variará dependiendo del tipo de paquete.

MQTT Formato de paquete Ejemplo: Conecte la estructura del mensaje

Como ejemplo, echemos un vistazo a los detalles de losMQTT Client CONNECTMensaje.


Después de establecer la conexión de nivel TCP con una plataforma MQTT, el primer paquete debe ser un Paquete CONNECT. El CONNECT El paquete sólo necesita ser enviado una vez por la conexión de red. El segundo paquete CONNECT enviado por el MQTT cliente es ignorado y desconectado.

Cabecera fija


MQTT Packet - fixed header

Cabecera variable

La cabecera variable se sienta junto a la cabecera fija y tiene cuatro partes principales como parte de la cabecera. Ellos son el protocolo nombre bytes, nivel de protocolo, conectar banderas, y mantener-alive. Cada una de estas partes tiene un predefinido byte size and the order in which they are present.


Nombre del Protocolo

Estos bytes almacenan el nombre del Protocolo. El nombre del protocolo se almacena comoMQTTen 4 bytes. Cualquier otro personaje en cualquiera de estos campos llevará a la desconexión del cliente desde el servidor.


MQTT Packet - Variable Header - protocol name bytes

Nivel de Protocolo

Esto define la versión del protocolo. El nivel de protocolo para el corredor de MQTT es 4 para el MQTT 3.1/3.1.1 y 5 para elVersión MQTT 5. Enviar otro los valores conducirán a la desconexión. El MQTT Broker también puede desconectar al cliente basándose en la versión que soporta.


MQTT protocol Packet version level Explained

Conectar banderas

Este es un campo único de byte y representa la presencia o ausencia de datos en la carga útilMQTT Autenticación (nombre de usuario y contraseña)Mensaje de Will. Los otros campos como Will conservan y limpian la sesión serán verdadero o falso y El campo QoS especifica el nivel QoS para ser seguido para Mensaje WILL.


MQTT Protocol format - connect flags Explained

MQTT Mantener Alive

MQTT Mantener vivo es un paquete de 2 bytes, y el tiempo máximo que se puede fijar para el mantener vivo es de 65535 segundos (18 Horas). Sin embargo, es mejor mantenerlo alrededor de 30 segundos o un minuto basado en sus requisitos. El MQTT cliente debe enviar el paquete de control (PINGREQ) a un intervalo que no exceda el valor de la Mantén definida Vivo. El Mantén El valor activo depende de la duración de la transmisión del paquete de control por el cliente.


keep alive

Formato de carga útil de protocolo MQTT

La carga útil contiene el cliente MQTT credenciales (nombre de usuario y contraseña). El ID del cliente debe ser único para cada cliente. El broker responde con un ID de cliente único para cada cliente si el cliente no especifica un ID de cliente. Si Usted envía un ID de cliente en un campo vacío, el cliente será rechazado. Los campos deben rellenarse en el siguiente orden: ID de cliente, Will Topic,Mensaje, nombre de usuario y contraseña.


Todos los campos del paquete Connect deben estar en formato de cadena. Después de establecer el nivel TCP conexión, el cliente debe enviar el MQTT Connect dentro de un tiempo razonable. Si el paquete de conexión no es recibido, el MQTT Broker desconectará al cliente. Después validación exitosa, el corredor o responder con un paquete CONNACK con carga útil cero o con la desconexión si hay algunos errores en Conexión. Después de una conexión exitosa, el corredor añadirá al nuevo cliente a la lista conectada, y la sesión se mantendrá y supervisará para el paquetes de datos así como el mantener vivo.


Si estás construyendo desde cero, sigue elGuía completa de desarrolladores de clientes MQTTy las especificaciones para entender y aplicar mejor.

Aplicación del MQTT - lectura relacionada

Para una aplicación MQTT muy exitosa, leer artículo adicional más allá del Protocolo MQTT.


Despliegue listo para usar aplicaciones MQTT

Jumpstart your IoT Implementation

Secure MQTT Broker con paneles construidos - Sobre la premisa & Cloud