1. Resumen

MQTT (Message Queuing Telemetry Transport, protocolo de telemetría de cola de mensajes) es un protocolo de comunicación "ligero" basado en el modelo de publicación/suscripción (publish/subscribe). Este protocolo se construye sobre el protocolo TCP/IP y fue publicado por IBM en 1999. La mayor ventaja de MQTT es que puede proporcionar servicios de mensajería en tiempo real y confiables para conectar dispositivos remotos con muy poco código y ancho de banda limitado. Como protocolo de mensajería instantánea de baja sobrecarga y bajo consumo de ancho de banda, tiene una amplia aplicación en Internet de las cosas, dispositivos pequeños, aplicaciones móviles, etc.

MQTT es un protocolo de transporte de publicación/suscripción de mensajes basado en cliente-servidor. El protocolo MQTT es ligero, simple, abierto y fácil de implementar; estas características lo hacen aplicable en una amplia gama de situaciones. En muchos casos, incluidos entornos restringidos, como la comunicación máquina a máquina (M2M) y el Internet de las cosas (IoT). Se ha utilizado ampliamente en sensores que se comunican a través de enlaces satelitales, dispositivos médicos que marcan ocasionalmente, hogares inteligentes y algunos dispositivos miniaturizados.


2. Especificaciones de diseño

Debido a que el entorno del Internet de las cosas es muy especial, MQTT sigue los siguientes principios de diseño:

  • (1) Simplificado, sin agregar funciones prescindibles;
  • (2) Modo de publicación/suscripción (Pub/Sub), para facilitar la transmisión de mensajes entre sensores;
  • (3) Permite a los usuarios crear temas dinámicamente, con costo cero de operación y mantenimiento;
  • (4) Reducir al mínimo el volumen de transmisión para mejorar la eficiencia de la transmisión;
  • (5) Tener en cuenta factores como el bajo ancho de banda, la alta latencia y las redes inestables;
  • (6) Compatibilidad con control de sesión continua;
  • (7) Comprender que la capacidad de cómputo del cliente puede ser muy baja;
  • (8) Proporcionar gestión de calidad de servicio;
  • (9) Asumir que los datos son desconocidos, no imponer el tipo ni el formato de los datos transmitidos y mantener la flexibilidad.

3. Características principales

El protocolo MQTT es un protocolo diseñado para la comunicación entre sensores remotos y dispositivos de control en redes de bajo ancho de banda y no confiables. Tiene las siguientes características principales:

  • (1) Utiliza el modelo de mensajes de publicación/suscripción, proporciona publicación de mensajes de uno a muchos y desacopla las aplicaciones.

    Esto es muy similar a XMPP, pero la redundancia de información de MQTT es mucho menor que la de XMPP, porque XMPP utiliza texto en formato XML para transmitir datos.

  • (2) Transmisión de mensajes que oculta el contenido de la carga útil.

  • (3) Usa TCP/IP para proporcionar la conexión de red.

    El MQTT convencional se basa en la conexión TCP para la entrega de datos, pero también existe una versión basada en UDP, llamada MQTT-SN. Estas dos versiones, al basarse en diferentes métodos de conexión, naturalmente tienen diferentes ventajas y desventajas.

  • (4) Hay tres niveles de calidad de servicio para la publicación de mensajes:

    "Como máximo una vez": la publicación del mensaje depende completamente de la red TCP/IP subyacente. Puede ocurrir pérdida o duplicación de mensajes. Este nivel se puede utilizar en casos como datos de sensores ambientales, donde perder un registro de lectura no importa porque pronto habrá un segundo envío. Este método se usa principalmente para notificaciones push de aplicaciones comunes. Si tu dispositivo inteligente no está conectado a la red cuando se envía la notificación, el push no se recibe y, cuando se vuelva a conectar, ya no se podrá recibir.

    "Al menos una vez": garantiza que el mensaje llegue, pero puede ocurrir duplicación de mensajes.

    "Solo una vez": garantiza que el mensaje llegue una vez. Este nivel se puede usar en algunos sistemas de facturación con requisitos estrictos. En los sistemas de facturación, la duplicación o pérdida de mensajes puede producir resultados incorrectos. Este servicio de publicación de mensajes de máxima calidad también se puede utilizar para notificaciones push de aplicaciones de mensajería instantánea, asegurando que el usuario reciba el mensaje y solo lo reciba una vez.

  • (5) Transmisión pequeña, con muy poca sobrecarga (cabecera de longitud fija de 2 bytes), intercambio de protocolo minimizado para reducir el tráfico de red.

    Es por esto que en la introducción se dice que es muy adecuado para "en el ámbito del Internet de las cosas, la comunicación entre sensores y servidores y la recopilación de información". Hay que tener en cuenta que la capacidad de cómputo y el ancho de banda de los dispositivos integrados son relativamente débiles, por lo que usar este protocolo para transmitir mensajes es lo más adecuado.

  • (6) Utiliza las características de Last Will y Testament para notificar a las partes interesadas el mecanismo de interrupción anormal del cliente.

    Last Will: es decir, el mecanismo de testamento, se utiliza para notificar a otros dispositivos bajo el mismo tema que el dispositivo que envió el testamento se ha desconectado.

    Testament: mecanismo de testamento, con función similar a Last Will.


4. Principios del protocolo MQTT

4.1 Método de implementación del protocolo MQTT

La implementación del protocolo MQTT requiere la comunicación entre el cliente y el servidor. Durante el proceso de comunicación, hay tres roles en el protocolo MQTT: publicador (Publish), broker (Broker) (servidor) y suscriptor (Subscribe). Entre ellos, el publicador y el suscriptor de mensajes son clientes, el broker de mensajes es el servidor, y el publicador de mensajes también puede ser suscriptor.

Los mensajes transmitidos por MQTT se dividen en dos partes: tema (Topic) y carga útil (payload):

  • (1) Topic, puede entenderse como el tipo de mensaje. Después de que el suscriptor se suscribe (Subscribe), recibirá el contenido del mensaje (payload) de ese tema;
  • (2) payload, puede entenderse como el contenido del mensaje, es decir, el contenido específico que el suscriptor va a utilizar.

4.2 Transmisión de red y mensajes de aplicación

MQTT construye la transmisión de red subyacente: establece una conexión del cliente al servidor, proporcionando una transmisión bidireccional ordenada, sin pérdidas y basada en flujo de bytes entre ambos.

Cuando los datos de la aplicación se envían a través de la red MQTT, MQTT asocia la calidad de servicio (QoS) relacionada y el nombre del tema (Topic).

4.3 Cliente MQTT

Una aplicación o dispositivo que usa el protocolo MQTT siempre establece una conexión de red al servidor. El cliente puede:

  • (1) Publicar información que otros clientes puedan suscribirse;
  • (2) Suscribirse a mensajes publicados por otros clientes;
  • (3) Cancelar la suscripción o eliminar mensajes de la aplicación;
  • (4) Desconectarse del servidor.

4.4 Servidor MQTT

El servidor MQTT también se llama "broker de mensajes" (Broker). Puede ser una aplicación o un dispositivo. Se encuentra entre el publicador y el suscriptor de mensajes. Puede:

  • (1) Aceptar conexiones de red de los clientes;
  • (2) Aceptar información de aplicación publicada por los clientes;
  • (3) Procesar solicitudes de suscripción y cancelación de suscripción de los clientes;
  • (4) Reenviar mensajes de aplicación a los clientes suscritos.

4.5 Suscripciones, temas y sesiones en el protocolo MQTT

1. Suscripción (Subscription)

La suscripción incluye un filtro de temas (Topic Filter) y la calidad de servicio (QoS) máxima. La suscripción se asocia con una sesión (Session). Una sesión puede contener múltiples suscripciones. Cada suscripción en cada sesión tiene un filtro de temas diferente.

2. Sesión (Session)

Cada cliente establece una sesión después de conectarse al servidor, y hay una interacción de estado entre el cliente y el servidor. La sesión existe dentro de una red y también puede abarcar múltiples conexiones de red consecutivas entre el cliente y el servidor.

3. Nombre del tema (Topic Name)

Una etiqueta conectada a un mensaje de aplicación, que coincide con las suscripciones del servidor. El servidor enviará el mensaje a cada cliente cuya suscripción coincida con la etiqueta.

4. Filtro de temas (Topic Filter)

Un filtro de comodines para nombres de temas, usado en expresiones de suscripción, que representa los múltiples temas que coinciden con la suscripción.

5. Carga útil (Payload)

El contenido específico que recibe el suscriptor del mensaje.

4.6 Métodos en el protocolo MQTT

El protocolo MQTT define algunos métodos (también llamados acciones) para representar operaciones sobre ciertos recursos. Este recurso puede representar datos preexistentes o datos generados dinámicamente, dependiendo de la implementación del servidor. Generalmente, el recurso se refiere a un archivo o salida en el servidor. Los métodos principales son:

  • (1) Connect. Espera a establecer la conexión con el servidor.
  • (2) Disconnect. Espera a que el cliente MQTT complete el trabajo realizado y desconecte la sesión TCP/IP con el servidor.
  • (3) Subscribe. Espera a que se complete la suscripción.
  • (4) UnSubscribe. Espera a que el servidor cancele la suscripción de uno o más topics del cliente.
  • (5) Publish. El cliente MQTT envía una solicitud de mensaje y, una vez completado el envío, devuelve el hilo de la aplicación.

5. Estructura de los paquetes de datos del protocolo MQTT

En el protocolo MQTT, un paquete MQTT consta de tres partes: cabecera fija (Fixed header), cabecera variable (Variable header) y cuerpo del mensaje (payload). La estructura del paquete MQTT es la siguiente:

  • (1) Cabecera fija (Fixed header). Está presente en todos los paquetes MQTT e indica el tipo de paquete y el identificador de clase de agrupación del paquete.
  • (2) Cabecera variable (Variable header). Está presente en algunos paquetes MQTT; el tipo de paquete determina si existe la cabecera variable y su contenido específico.
  • (3) Cuerpo del mensaje (Payload). Está presente en algunos paquetes MQTT y representa el contenido específico que recibe el cliente.

5.1 Cabecera fija de MQTT

La cabecera fija está presente en todos los paquetes MQTT y su estructura es la siguiente:

5.1.1 Tipo de paquete MQTT

Posición: bits 7-4 del Byte 1.

Equivale a un valor sin signo de 4 bits. Los tipos, valores y descripciones son los siguientes:

5.1.2 Bits de indicadores (flags)

Posición: bits 3-0 del Byte 1.

En los tipos de mensaje que no usan bits de indicadores, estos se tratan como bits reservados. Si se recibe un indicador no válido, el receptor debe cerrar la conexión de red:

(1) DUP: Duplicado del mensaje publicado. Se utiliza para garantizar la transmisión fiable del mensaje. Si se establece en 1, se añade el MessageId en la cabecera variable siguiente y se requiere una confirmación de respuesta para asegurar que la transmisión del mensaje se completa, pero no se puede utilizar para detectar el envío duplicado de mensajes.

(2) QoS: Calidad de servicio del mensaje publicado, es decir, el número de veces que se garantiza la entrega del mensaje.

Ø00:最多一次,即:<=1

Ø01:至少一次,即:>=1

Ø10:一次,即:=1

Ø11:预留

(3) RETAIN: Indicador de retención de publicación. Indica que el servidor debe conservar la información de este push. Si aparece un nuevo suscriptor, se le envía este mensaje; si no está establecido, se libera después de enviarlo al suscriptor actual.

5.1.3 Longitud restante (Remaining Length)

Dirección: Byte 2.

El segundo byte de la cabecera fija se utiliza para almacenar el tamaño total de la cabecera variable y del cuerpo del mensaje, pero no se almacena directamente. Este byte es extensible; su mecanismo de almacenamiento es: los primeros 7 bits se usan para almacenar la longitud, y el último bit se usa como indicador. Cuando el último bit es 1, indica que la longitud es insuficiente y se necesita un segundo byte para continuar almacenándola. Por ejemplo: si se calcula que el tamaño posterior es 0

5.2 Cabecera variable de MQTT

El paquete MQTT contiene una cabecera variable, que se encuentra entre la cabecera fija y la carga útil. El contenido de la cabecera variable varía según el tipo de paquete; una aplicación común es como identificador del paquete:

Muchos tipos de paquetes incluyen un campo de identificador de paquete de 2 bytes. Estos tipos de paquetes son: PUBLISH (QoS > 0), PUBACK, PUBREC, PUBREL, PUBCOMP, SUBSCRIBE, SUBACK, UNSUBSCRIBE, UNSUBACK.

5.3 Cuerpo del mensaje Payload

El cuerpo del mensaje (Payload) es la tercera parte del paquete MQTT y contiene mensajes de cuatro tipos: CONNECT, SUBSCRIBE, SUBACK, UNSUBSCRIBE.

  • (1) CONNECT: el contenido del cuerpo del mensaje es principalmente: ClientID del cliente, Topic suscrito, Message, así como nombre de usuario y contraseña.
  • (2) SUBSCRIBE: el contenido del cuerpo del mensaje es una serie de temas a suscribir y QoS.
  • (3) SUBACK: el contenido del cuerpo del mensaje es la confirmación y respuesta del servidor a los temas y QoS solicitados por SUBSCRIBE.
  • (4) UNSUBSCRIBE: el contenido del cuerpo del mensaje son los temas de los que se desea cancelar la suscripción.

Más contenido

Enlace original: https://blog.csdn.net/qq_28877125/article/details/78325003