MQTTv5.0: Descripción general de las nuevas funciones. Parte 2

¡Hola!



El material a continuación es una continuación del artículo sobre la funcionalidad agregada en la nueva versión de MQTTv5.0. Si ya lo ha estudiado, no le será difícil notar que la mayoría de las nuevas funciones se basan en el concepto de propiedades que se pueden agregar al paquete. En este artículo los analizaremos en detalle.



Aprox. - El artículo está dirigido a quienes tienen interés o necesitan profundizar en las complejidades de MQTT. Aquí no habrá imágenes ni digresiones líricas, solo hardcore !!!



A continuación se muestra una tabla de todas las propiedades ( consulte la sección 2.2.2.2 de la especificación ).



CARNÉ DE IDENTIDAD Nombre Tipo de datos Propiedades del paquete / testamento
1 Indicador de formato de carga útil Byte PUBLICAR, Propiedades Will
2 Intervalo de vencimiento del mensaje Entero de cuatro bytes PUBLICAR, Propiedades Will
3 Tipo de contenido Cadena codificada UTF-8 PUBLICAR, Propiedades Will
8 Tema de respuesta Cadena codificada UTF-8 PUBLICAR, Propiedades Will
nueve Datos de correlación Datos binarios PUBLICAR, Propiedades Will
once Identificador de suscripción Entero de bytes variables PUBLICAR, SUSCRIBIRSE
17 Intervalo de vencimiento de la sesión Entero de cuatro bytes CONECTAR, CONECTAR, DESCONECTAR
Dieciocho Identificador de cliente asignado Cadena codificada UTF-8 CONNACK
19 Servidor Keep Alive Entero de dos bytes CONNACK
21 método de autentificación Cadena codificada UTF-8 CONECTAR, CONECTAR, AUTORIZAR
22 Datos de autenticación Datos binarios CONECTAR, CONECTAR, AUTORIZAR
23 Solicitar información sobre problemas Byte CONECTAR
24 Retrasará el intervalo Entero de cuatro bytes Will propiedades
25 Solicitar información de respuesta Byte CONECTAR
26 Información de respuesta Cadena codificada UTF-8 CONNACK
28 Referencia del servidor Cadena codificada UTF-8 CONECTAR, DESCONECTAR
31 Cadena de motivo Cadena codificada UTF-8 CONNACK, PUBACK, PUBREC, PUBREL, PUBCOMP, SUBACK, UNSUBACK, DESCONNECT, AUTH
33 Recibir máximo Entero de dos bytes CONECTAR, CONECTAR
34 Máximo de alias de tema Entero de dos bytes CONECTAR, CONECTAR
35 Alias ​​del tema Entero de dos bytes PUBLICAR
36 QoS máxima Byte CONNACK
37 Mantener disponible Byte CONNACK
38 Propiedad del usuario Par de cuerdas UTF-8 CONNECT, CONNACK, PUBLISH, Will Properties, PUBACK, PUBREC, PUBREL, PUBCOMP, SUBSCRIBE, SUBACK, UNSUBSCRIBE, UNSUBACK, DESCONNECT, AUTH
39 Tamaño máximo de paquete Entero de cuatro bytes CONECTAR, CONECTAR
40 Suscripción comodín disponible Byte CONNACK
41 Identificador de suscripción disponible Byte CONNACK
42 Suscripción compartida disponible Byte CONNACK




Ahora echémosle un vistazo más de cerca.



Indicador de formato de carga útil: indicador de formato de carga útil



  • 0: los datos son un conjunto de bytes indefinidos, lo que equivale a no enviar un indicador de formato de carga útil,

  • 1: los datos son datos de caracteres codificados en UTF-8.



Intervalo de vencimiento del mensaje: intervalo de vencimiento del mensaje



Un número que representa el intervalo de vencimiento del mensaje (en segundos).



Si el intervalo de vencimiento del mensaje ha pasado y el servidor no pudo entregar el mensaje al suscriptor correcto, debe eliminar el mensaje para ese suscriptor.



Tipo de contenido: tipo de contenido



El significado del tipo de contenido lo determina el cliente emisor y receptor.



Tema de respuesta: un tema para una respuesta



Una cadena UTF-8 que se utiliza como tema del mensaje de respuesta.



El destinatario del mensaje con el tema especificado para la respuesta envía su respuesta, utilizando este tema como tema de su publicación.



La interacción solicitud / respuesta en este caso ocurre de la siguiente manera ( ver cláusula 4.10.1 en la especificación ):



  1. El cliente (remitente) publica un mensaje de solicitud con algún tema, que especifica el tema de la respuesta.

  2. () , , . . , .

  3. , , .

  4. . - . , .



Correlation Data —



El remitente del mensaje de solicitud utiliza los datos de correlación para determinar a qué solicitud pertenece el mensaje de respuesta cuando se recibe. Si no hay datos de correlación, el solicitante no necesita ningún dato de correlación.



Si el mensaje de solicitud contiene datos de correlación, el receptor también debe incluir los datos de correlación como una propiedad en el paquete PUBLICAR del mensaje de respuesta.



El valor de los datos de correlación solo es significativo para el remitente del mensaje de solicitud y el receptor del mensaje de respuesta.



Identificador de suscripción: identificador de suscripción



Un número que representa el ID de suscripción.



Si la publicación es el resultado de una coincidencia con más de una suscripción, se especificarán varios ID de suscripción, en cuyo caso su orden no importa.



Un cliente también puede realizar varias suscripciones que coincidan con una publicación determinada y utilizar el mismo identificador para varias de ellas. En este caso, el paquete PUBLISH contendrá varios ID de suscripción idénticos.



El ID de suscripción está asociado con cualquier suscripción creada o modificada como resultado del paquete SUBSCRIBE. Si hay un ID de suscripción, se guarda con la suscripción. Si no se especifica esta propiedad, no se guarda ninguna suscripción con la suscripción.



Los ID de suscripción son parte del estado de la sesión en el servidor y se devuelven al cliente que recibe el paquete PUBLICAR correspondiente. Se eliminan del estado de sesión del servidor cuando el servidor recibe un paquete UNSUBSCRIBE, cuando el servidor recibe un paquete SUBSCRIBE del cliente para el mismo filtro de tema pero con un ID de suscripción diferente o sin ID de suscripción, o cuando el servidor envía un Session Present de 0 en el paquete CONNACK.



Intervalo de vencimiento de la sesión: intervalo de vencimiento de la sesión



Un número que representa el intervalo para caducar la sesión (en segundos).



Si no hay un intervalo de caducidad de la sesión, se utiliza el valor 0. Si se establece en 0 o no está presente, la sesión finaliza cuando se cierra la conexión de red.



Si el intervalo de caducidad de la sesión es 0xFFFFFFFF (UINT_MAX), la sesión no caduca.



El cliente y el servidor deben mantener el estado de la sesión después de cerrar la conexión de red si el intervalo de expiración de la sesión es mayor que 0.



El cliente puede conectarse al servidor a través de una red que proporciona una conexión intermitente. Este cliente puede utilizar un intervalo de expiración de sesión corto para que pueda volver a conectarse cuando la red vuelva a estar disponible y continuar entregando mensajes de manera confiable. Si el cliente no tiene tiempo para restaurar la conexión, los mensajes se perderán.



Establecer Clean Start en 1 y el intervalo de caducidad 0 es equivalente a establecer CleanSession en 1 en la versión 3.1.1 de la especificación MQTT. Establecer Clean Start en 0 y sin intervalo de caducidad de sesión es equivalente a establecer CleanSession en 0 en la especificación MQTT versión 3.1.1.



Identificador de cliente asignado: identificador de cliente asignado



Una cadena que es el ID de cliente asignado por el servidor. Se utiliza si se utilizó un identificador de cliente de longitud cero en el paquete CONNECT.



Servidor Keep Alive - Servidor Keep Alive



Un número que define el tiempo Keep Alive asignado por el servidor. Si el servidor devuelve Server Keep Alive en un paquete CONNACK, el cliente DEBE usar ese valor en lugar del valor que envió como Keep Alive. Si el servidor no envía Server Keep Alive, DEBE usar el valor Keep Alive establecido por el cliente en el paquete CONNECT.



El uso principal de Server Keep Alive para un servidor es informar al cliente que desconectará al cliente en caso de inactividad antes de que se agote el tiempo de espera especificado por el cliente.



Método de autenticación: método de autenticación



Una cadena que contiene el nombre del método de autenticación utilizado para la autenticación extendida.



Si no hay un método de autenticación, no se realiza la autenticación extendida.



Un método de autenticación es un acuerdo entre un cliente y un servidor sobre el significado de los datos enviados en los datos de autenticación y cualquier otro campo en CONNECT, y los intercambios y procesamiento requeridos por el cliente y el servidor para completar la autenticación. El método de autenticación suele ser un mecanismo SASL.



Datos de autenticación: datos de autenticación



Datos binarios que contienen datos de autenticación. Se envía solo si se especifica un método de autenticación. El contenido de estos datos está determinado por el método de autenticación.



Solicitar información del problema: información sobre el problema de la solicitud



El cliente usa este valor para indicar si una cadena de motivo o propiedades personalizadas se envían en caso de error.



  • 0: el servidor puede devolver una cadena de motivo o propiedades personalizadas en un paquete CONNACK o DISCONNECT, pero no debe enviar una cadena de motivo o propiedades personalizadas en ningún paquete que no sea PUBLISH, CONNACK o DISCONNECT,

  • 1: el servidor puede devolver una cadena de motivo o propiedades personalizadas para cualquier paquete donde esté permitido.



Will Delay Interval - Intervalo de retraso del mensaje Will



Número que representa el intervalo del retraso del mensaje de voluntad (en segundos). Si no hay intervalo de retraso, el valor predeterminado es 0 y no hay retraso antes de que se publique el mensaje de voluntad.



El servidor retrasa la publicación del mensaje hasta que expira el tiempo de retraso o finaliza la sesión, lo que ocurra primero. Si se establece una nueva conexión de red a esta sesión antes de que expire el intervalo de demora, el servidor no enviará un mensaje de voluntad.



Una forma de utilizar esto es evitar la publicación de un mensaje de voluntad si hay una desconexión temporal de la red y el cliente puede volver a conectarse y continuar la sesión antes de que se publique el mensaje.



Solicitar información de respuesta: solicitar información para una respuesta



Un byte con el valor 0 o 1. El cliente usa este valor para solicitar al servidor la información de respuesta de CONNACK.



  • 0: el servidor no debe devolver información de respuesta,

  • 1 - El servidor puede devolver información de respuesta en un paquete CONNACK, pero esto no es necesario incluso si el cliente solicitó esta información.



Información de respuesta: información para una respuesta



Una cadena UTF-8 que se utiliza como base para crear el tema de respuesta. La forma en que el cliente crea un tema de respuesta a partir de la información de respuesta no está definida por esta especificación.



Por lo general, esto se usa para transmitir un subconjunto global único de temas que está reservado para este cliente, al menos durante la vida útil de su sesión. El uso de este mecanismo permite que esta configuración se realice una vez en el servidor en lugar de en cada cliente.



Referencia del servidor: enlace al servidor



Una cadena que el cliente puede utilizar para identificar otro servidor en uso. El valor de esta cadena es una lista de enlaces separados por espacios. El formato de los enlaces no está regulado.



El servidor puede solicitar que el cliente utilice un servidor diferente enviando un CONNACK o DESCONNECT con un código de motivo "Usar otro servidor" o "Servidor movido". Al enviar uno de estos códigos, el servidor también puede incluir una propiedad de referencia del servidor para indicar la ubicación del servidor o servidores que el cliente debe utilizar.



  • Usar un servidor diferente: el cliente debe cambiar temporalmente para usar un servidor diferente.

  • Servidor movido: el cliente siempre debe conectarse a un servidor diferente.



Se recomienda que cada enlace conste de un nombre seguido de dos puntos y un número de puerto. Si el nombre contiene dos puntos, la cadena del nombre se puede escribir entre corchetes. Un nombre entre corchetes no puede contener el carácter de corchete derecho ("]"). Se utiliza para representar una dirección IPv6 que utiliza dos puntos como separador.



El nombre en un enlace de servidor suele ser el nombre de host, el nombre DNS, el nombre SRV o la dirección IP. El valor después de los dos puntos suele ser el número de puerto decimal. Esto no es necesario si la información del puerto se toma del nombre (por ejemplo, para SRV) o es el predeterminado.



Si se proporcionan varios enlaces, se espera que el cliente seleccione uno de ellos.



Ejemplos de
myserver.xyz.org

myserver.xyz.org:8883

10.10.151.22:8883 [fe80::9610:3eff:fe1c]:1883



Cadena de motivo: la cadena de motivo



Una cadena que describe el motivo asociado con esta respuesta. El servidor utiliza este valor para proporcionar información adicional al cliente.



El uso correcto de la cadena de motivo en el cliente incluirá el uso de esta información en una excepción lanzada por el código del cliente o el registro de la cadena de motivo.



Recibir máximo: el valor máximo del número de paquetes QOS> 0



Un número que establece la cuota de envío, que se utiliza para limitar el número de paquetes PUBLISH QOS> 0 que se pueden enviar sin recibir PUBACK (para QoS 1) o PUBCOMP (para QoS 2). Es decir, este valor se utiliza para limitar el número de publicaciones de QoS 1 y QoS 2 enviadas simultáneamente. El cliente / servidor no debe enviar mensajes con QoS 1 y QoS 2 si se han enviado mensajes de recepción máxima que aún no han recibido respuestas. Cuando se alcanza el máximo de recepción, el envío de paquetes con QoS 0 también se puede pausar, pero no es obligatorio. Al mismo tiempo, no es necesario retrasar el envío de paquetes que no sean PUBLICAR.



Si tanto el cliente como el servidor han establecido el Máximo de recepción en 1, se aseguran de que no haya más de un mensaje "en curso" al mismo tiempo.



El valor especificado se aplica solo a la conexión de red actual y se reinicia en la reconexión.



Si no se especifica, el valor predeterminado es 65.535.



Máximo de alias de tema: el valor máximo del alias de tema



Número que representa el valor máximo de un alias de tema.



Este valor indica el valor más grande que se acepta como alias de tema. Se utiliza para limitar el número de alias de temas que deben almacenarse en esta conexión.



Alias ​​de tema - alias de tema



Para reducir el tamaño del paquete PUBLICAR, el remitente puede usar un alias de tema. Este es un valor entero que se usa para identificar el tema en lugar de usar el nombre del tema. Esta técnica reduce el tamaño del paquete PUBLISH y es útil cuando los nombres de los temas son largos y el mismo nombre a menudo se reutiliza en una conexión de red.



Por el lado del receptor, al recibir un alias para un tema, se establece la correspondencia necesaria entre el tema y su alias.



Si el paquete PUBLISH contiene un alias de tema, el receptor lo procesa de la siguiente manera ( consulte la sección 3.3.4 de la especificación ):



  1. ,

    a) , , ,

    b) , , , .

  2. ,

    a) ,

    b) , .



Maximum QoS — QoS



Puede ser 0 o 1. Si no hay QoS máxima, el cliente usa la QoS máxima de 2.



Si el servidor no admite paquetes PUBLISH QoS 1 o QoS 2, DEBE enviar la QoS máxima en un paquete CONNACK que indique la QoS más alta que admite.



Si el Cliente recibe la QoS máxima del Servidor, no debería enviar paquetes PUBLICAR con un nivel de QoS que exceda el máximo especificado.



Retener disponible: el ahorro está disponible



  • 0: los mensajes guardados no son compatibles,

  • 1 - los mensajes guardados son compatibles.



Un cliente que recibe un valor de retención disponible de 0 del servidor NO DEBE enviar un paquete PUBLICAR con el indicador RETAIN establecido en 1.



Propiedad de usuario - propiedad de usuario



Es un par de cadenas "nombre" - "valor". Esta propiedad, a diferencia de otras, puede aparecer varias veces. El mismo nombre se puede utilizar para varias propiedades.



Esta propiedad se puede utilizar para proporcionar diagnósticos adicionales u otra información.



El significado de estas propiedades no se especifica en la especificación, su significado e interpretación son conocidos solo por los clientes emisores y receptores.



Tamaño máximo de paquete: tamaño máximo de paquete



Un número que especifica el tamaño máximo de paquete que el cliente / servidor está dispuesto a aceptar. El tamaño del paquete es el número total de bytes en el paquete MQTT. Esta propiedad se utiliza para indicar que los paquetes que superen este límite no se procesarán.



Si no hay un tamaño máximo de paquete, no se impone ningún límite de tamaño de paquete.



Es responsabilidad de la aplicación seleccionar un valor de tamaño de paquete máximo apropiado si elige limitar el tamaño del paquete.



Suscripción comodín disponible - Suscripción comodín disponible



  • 0: las suscripciones con comodines no son compatibles,

  • 1: se admiten estas suscripciones.



Si falta la propiedad, se admiten las suscripciones con comodines.



Si el servidor admite suscripciones con comodines, aún puede rechazar una solicitud de suscripción específica que contenga una suscripción con comodines.



Identificador de suscripción disponible: el identificador de suscripción está disponible



  • 0: no se admiten los ID de suscripción,

  • 1 - Se admiten los ID de suscripción.



Si falta la propiedad, se admiten los ID de suscripción.



Suscripción compartida disponible - Suscripción compartida disponible



  • 0: las suscripciones generales no son compatibles,

  • 1: se admiten suscripciones generales.



Si falta la propiedad, se admiten suscripciones generales.



Conclusión



Permítanme recordarles que el artículo nació mientras trabajaba en la integración de la funcionalidad emergente descrita anteriormente en el servicio de la plataforma de IoT. También me pareció que es bastante conveniente mostrar la visualización de las propiedades recibidas del cliente en la interfaz del objeto ( puede leer más sobre los objetos aquí >>> ). Puede ocultar propiedades que no sean interesantes y puede agregar propiedades personalizadas adicionales para mostrar. En general, se ve así. Eso, quizás, es todo. Para probar la funcionalidad, encontré este proyecto redboltz / mqtt_cpp bastante conveniente y claro . Me alegraría mucho si en los comentarios compartiera otros proyectos de código abierto de clientes MQTT (con o sin GUI) que admiten la versión 5.0.
















All Articles