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 ):
- El cliente (remitente) publica un mensaje de solicitud con algún tema, que especifica el tema de la respuesta.
- () , , . . , .
- , , .
- . - . , .
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
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 ):
- ,
a) , , ,
b) , , , .
- ,
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.