MQTTv5.0: aperçu des nouvelles fonctionnalités. Partie 2

salut!



Le matériel ci-dessous est une suite de l' article sur les fonctionnalités ajoutées dans la nouvelle version de MQTTv5.0. Si vous l'avez déjà étudié, il ne vous sera pas difficile de remarquer que la plupart des nouvelles fonctions sont basées sur le concept de propriétés qui peuvent être ajoutées au package. Dans cet article, nous les analyserons en détail.



Environ. - L'article s'adresse à ceux qui ont un intérêt ou qui ont besoin de se plonger profondément dans les subtilités de MQTT. Il n'y aura pas de photos et de digressions lyriques, seulement du hardcore !!!



Vous trouverez ci-dessous un tableau de toutes les propriétés ( voir la section 2.2.2.2 de la spécification ).



ID Nom Type de données Propriétés du package / testament
1 Indicateur de format de charge utile Octet PUBLIER, Will Properties
2 Intervalle d'expiration des messages Entier de quatre octets PUBLIER, Will Properties
3 Type de contenu Chaîne encodée UTF-8 PUBLIER, Will Properties
8 Sujet de réponse Chaîne encodée UTF-8 PUBLIER, Will Properties
neuf Données de corrélation Données binaires PUBLIER, Will Properties
Onze Identifiant d'abonnement Variable Byte Integer PUBLIER, INSCRIRE
17 Intervalle d'expiration de session Entier de quatre octets CONNECTER, CONNECTER, DÉCONNECTER
dix-huit Identificateur de client attribué Chaîne encodée UTF-8 CONNECTER
19 Serveur Keep Alive Entier à deux octets CONNECTER
21 Méthode d'authentification Chaîne encodée UTF-8 CONNECTER, CONNECTER, AUTH
22 Données d'authentification Données binaires CONNECTER, CONNECTER, AUTH
23 Demander des informations sur le problème Octet RELIER
24 Retardera l'intervalle Entier de quatre octets Will propriétés
25 Demander des informations de réponse Octet RELIER
26 Informations de réponse Chaîne encodée UTF-8 CONNECTER
28 Référence du serveur Chaîne encodée UTF-8 CONNECTER, DÉCONNECTER
31 Chaîne de raison Chaîne encodée UTF-8 CONNACK, PUBACK, PUBREC, PUBREL, PUBCOMP, SUBACK, UNSUBACK, DISCONNECT, AUTH
33 Recevoir le maximum Entier à deux octets CONNECTER, CONNECTER
34 Alias ​​de sujet maximum Entier à deux octets CONNECTER, CONNECTER
35 Alias ​​de sujet Entier à deux octets PUBLIER
36 QoS maximum Octet CONNECTER
37 Conserver disponible Octet CONNECTER
38 Propriété de l'utilisateur Paire de cordes UTF-8 CONNEXION, CONNEXION, PUBLICATION, Will Propriétés, PUBACK, PUBREC, PUBREL, PUBCOMP, SOUSCRIRE, SOUS-ACQUISITION, SE DESABONNER, DÉSABONNER, DÉCONNECTER, AUTH
39 Taille maximale des paquets Entier de quatre octets CONNECTER, CONNECTER
40 Abonnement Wildcard disponible Octet CONNECTER
41 Identifiant d'abonnement disponible Octet CONNECTER
42 Abonnement partagé disponible Octet CONNECTER




Maintenant, regardons-les de plus près.



Indicateur de format de charge utile - indicateur de format de charge utile



  • 0 - les données sont un ensemble d'octets non définis, ce qui équivaut à ne pas envoyer d'indicateur de format de charge utile,

  • 1 - les données sont des données de caractères encodées en UTF-8.



Intervalle d'expiration des messages - intervalle d'expiration des messages



Un nombre représentant l'intervalle d'expiration du message (en secondes).



Si l'intervalle d'expiration du message est écoulé et que le serveur n'a pas pu remettre le message au bon abonné, il doit supprimer le message de cet abonné.



Type de contenu - type de contenu



La valeur du type de contenu est déterminée par le client d'envoi et de réception.



Sujet de réponse - un sujet pour une réponse



Chaîne UTF-8 utilisée comme sujet du message de réponse.



Le destinataire du message avec le sujet spécifié pour la réponse envoie sa réponse, en utilisant ce sujet comme sujet de sa publication.



L'interaction demande / réponse dans ce cas se produit comme suit ( voir la clause 4.10.1 de la spécification ):



  1. Le client (expéditeur) publie un message de demande avec un sujet, qui spécifie le sujet de la réponse.

  2. () , , . . , .

  3. , , .

  4. . - . , .



Correlation Data —



Les données de corrélation sont utilisées par l'expéditeur du message de demande pour déterminer à quelle demande le message de réponse appartient lorsqu'il est reçu. S'il n'y a pas de données de corrélation, le demandeur n'a pas besoin de données de corrélation.



Si le message de demande contient des données de corrélation, le récepteur doit également inclure les données de corrélation en tant que propriété dans le paquet PUBLISH du message de réponse.



La valeur des données de corrélation n'a de sens que pour l'expéditeur du message de demande et le destinataire du message de réponse.



Identifiant d'abonnement - identifiant d'abonnement



Un nombre représentant l'ID d'abonnement.



Si la publication est le résultat d'une correspondance avec plus d'un abonnement, plusieurs ID d'abonnement seront spécifiés, auquel cas leur ordre n'a pas d'importance.



Un client peut également faire plusieurs abonnements correspondant à une publication donnée et utiliser le même identifiant pour plusieurs d'entre eux. Dans ce cas, le package PUBLISH contiendra plusieurs identifiants d'abonnement identiques.



L'ID d'abonnement est associé à tout abonnement créé ou modifié à la suite du package SUBSCRIBE. S'il existe un ID d'abonnement, il est enregistré avec l'abonnement. Si cette propriété n'est pas spécifiée, aucun abonnement n'est enregistré avec l'abonnement.



Les identifiants d'abonnement font partie de l'état de session sur le serveur et sont renvoyés au client recevant le paquet PUBLISH correspondant. Ils sont supprimés de l'état de session du serveur lorsque le serveur reçoit un paquet UNSUBSCRIBE, lorsque le serveur reçoit un paquet SUBSCRIBE du client pour le même filtre de rubrique mais avec un ID d'abonnement différent ou aucun ID d'abonnement, ou lorsque le serveur envoie un Session Present de 0 dans le paquet CONNACK.



Intervalle d'expiration de session - intervalle d'expiration de session



Un nombre représentant l'intervalle d'expiration de la session (en secondes).



S'il n'y a pas d'intervalle d'expiration de session, la valeur est utilisée 0. Si elle est définie sur 0 ou n'est pas présente, la session se termine lorsque la connexion réseau est fermée.



Si l'intervalle d'expiration de session est 0xFFFFFFFF (UINT_MAX), la session n'expire pas.



Le client et le serveur doivent conserver l'état de session après la fermeture de la connexion réseau si l'intervalle d'expiration de session est supérieur à 0.



Le client peut se connecter au serveur via un réseau qui fournit une connexion intermittente. Ce client peut utiliser un intervalle d'expiration de session court afin de pouvoir se reconnecter lorsque le réseau redevient disponible et continuer à livrer des messages de manière fiable. Si le client n'a pas le temps de restaurer la connexion, les messages seront perdus.



La définition de Clean Start sur 1 et l'intervalle d'expiration de 0 équivaut à définir CleanSession sur 1 dans la version 3.1.1 de la spécification MQTT. Définir Clean Start sur 0 et aucun intervalle d'expiration de session équivaut à définir CleanSession sur 0 dans la spécification MQTT version 3.1.1.



Identifiant de client attribué - identifiant de client attribué



Une chaîne qui est l'ID client attribué par le serveur. Utilisé si un identifiant client de longueur nulle a été utilisé dans le paquet CONNECT.



Serveur Keep Alive - Serveur Keep Alive



Un nombre qui définit le temps Keep Alive attribué par le serveur. Si le serveur renvoie Server Keep Alive dans un paquet CONNACK, le client DOIT utiliser cette valeur au lieu de la valeur qu'il a envoyée comme Keep Alive. Si le serveur n'envoie pas Server Keep Alive, il DOIT utiliser la valeur Keep Alive définie par le client dans le paquet CONNECT.



L'utilisation principale de Server Keep Alive pour un serveur est d'informer le client qu'il déconnectera le client en cas d'inactivité avant l'expiration du délai Keep Alive spécifié par le client.



Méthode d'authentification - méthode d'authentification



Une chaîne contenant le nom de la méthode d'authentification utilisée pour l'authentification étendue.



S'il n'y a pas de méthode d'authentification, l'authentification étendue n'est pas effectuée.



Une méthode d'authentification est un accord entre un client et un serveur sur la signification des données envoyées dans les données d'authentification et tous les autres champs de CONNECT, ainsi que sur les échanges et le traitement requis par le client et le serveur pour terminer l'authentification. La méthode d'authentification est généralement un mécanisme SASL.



Données d'authentification - données d'authentification



Données binaires contenant des données d'authentification. Envoyé uniquement si une méthode d'authentification est spécifiée. Le contenu de ces données est déterminé par la méthode d'authentification.



Demander des informations sur le problème - informations sur le problème de la demande



Le client utilise cette valeur pour indiquer si une chaîne de motif ou des propriétés personnalisées sont distribuées en cas d'échec.



  • 0 - le serveur peut renvoyer une chaîne de motif ou des propriétés personnalisées dans un package CONNACK ou DISCONNECT, mais ne doit pas envoyer de chaîne de motif ou de propriétés personnalisées dans un package autre que PUBLISH, CONNACK ou DISCONNECT,

  • 1 - Le serveur peut renvoyer une chaîne de motif ou des propriétés personnalisées pour n'importe quel package lorsque cela est autorisé.



Will Delay Interval - Will Message delay interval



Un nombre représentant l'intervalle du délai de Will Message (en secondes). S'il n'y a pas d'intervalle de délai, la valeur par défaut est 0 et il n'y a aucun délai avant la publication du message de volonté.



Le serveur retarde la publication du message jusqu'à ce que l'intervalle de délai expire ou que la session se termine, selon la première éventualité. Si une nouvelle connexion réseau à cette session est établie avant l'expiration de l'intervalle de délai, le serveur DEVRAIT ne pas envoyer de message Will.



Une façon de l'utiliser consiste à empêcher la publication d'un message de volonté s'il y a une déconnexion temporaire du réseau et que le client est en mesure de se reconnecter et de continuer la session avant que le message ne soit publié.



Demander des informations de réponse - demander des informations pour une réponse



Un octet avec la valeur 0 ou 1. Le client utilise cette valeur pour demander au serveur les informations de réponse CONNACK.



  • 0 - le serveur ne doit pas renvoyer les informations de réponse,

  • 1 - le serveur peut renvoyer des informations de réponse dans un paquet CONNACK, mais cela n'est pas nécessaire même si le client a demandé ces informations.



Informations de réponse - informations pour la réponse



Une chaîne UTF-8 utilisée comme base pour créer le sujet de réponse. La façon dont le client crée une rubrique de réponse à partir des informations de réponse n'est pas définie par cette spécification.



Ceci est généralement utilisé pour transmettre un sous-ensemble de sujets unique au monde qui est réservé à ce client, au moins pour la durée de vie de sa session. L'utilisation de ce mécanisme permet de faire cette configuration une fois sur le serveur plutôt que sur chaque client.



Référence du serveur - lien vers le serveur



Une chaîne qui peut être utilisée par le client pour identifier un autre serveur en cours d'utilisation. La valeur de cette chaîne est une liste de liens séparés par des espaces. Le format des liens n'est pas réglementé.



Le serveur peut demander que le client utilise un serveur différent en envoyant un CONNACK ou DISCONNECT avec le code raison «Utiliser un autre serveur» ou «Serveur déplacé». Lors de l'envoi de l'un de ces codes, le serveur peut également inclure une propriété de référence de serveur pour indiquer l'emplacement du ou des serveurs que le client doit utiliser.



  • Utiliser un serveur différent - Le client doit temporairement basculer pour utiliser un serveur différent.

  • Serveur déplacé - Le client doit toujours se connecter à un autre serveur.



Il est recommandé que chaque lien se compose d'un nom suivi de deux points et d'un numéro de port. Si le nom contient deux points, la chaîne de nom peut être placée entre crochets. Un nom entre crochets ne peut pas contenir le caractère de crochet droit ("]"). Ceci est utilisé pour représenter une adresse IPv6 qui utilise un signe deux-points comme séparateur.



Le nom d'un lien serveur est généralement le nom d'hôte, le nom DNS, le nom SRV ou l'adresse IP. La valeur après les deux points est généralement le numéro de port décimal. Cela n'est pas nécessaire si les informations de port sont extraites du nom (par exemple, pour SRV) ou sont la valeur par défaut.



Si plusieurs liens sont fournis, le client doit en sélectionner un.



Exemples de
myserver.xyz.org

myserver.xyz.org:8883

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



Chaîne de raison - la chaîne de raison



Une chaîne décrivant la raison associée à cette réponse. Le serveur utilise cette valeur pour fournir des informations supplémentaires au client.



L'utilisation correcte de la chaîne de motif dans le client inclura l'utilisation de ces informations dans une exception levée par le code client ou la journalisation de la chaîne de motif.



Receive Maximum - la valeur maximale du nombre de paquets QOS> 0



Un nombre qui définit le quota d'envoi, qui est utilisé pour limiter le nombre de paquets PUBLISH QOS> 0 qui peuvent être envoyés sans recevoir PUBACK (pour QoS 1) ou PUBCOMP (pour QoS 2). Autrement dit, cette valeur est utilisée pour limiter le nombre de publications QoS 1 et QoS 2 envoyées simultanément. Le client / serveur ne doit pas envoyer de messages avec QoS 1 et QoS 2 s'il y a des messages de réception maximum envoyés qui n'ont pas encore reçu de réponses. Lorsque le maximum de réception est atteint, l'envoi de paquets avec QoS 0 peut également être suspendu, mais pas obligatoire. En même temps, il n'est pas nécessaire de retarder l'envoi de paquets autres que PUBLISH.



Si le client et le serveur ont défini le maximum de réception sur 1, ils s'assurent qu'il n'y a pas plus d'un message «en vol» en même temps.



La valeur spécifiée s'applique uniquement à la connexion réseau actuelle et est réinitialisée lors de la reconnexion.



S'il n'est pas spécifié, la valeur par défaut est 65 535.



Topic Alias ​​Maximum - la valeur maximale de l'alias de rubrique



Nombre qui représente la valeur maximale d'un alias de rubrique.



Cette valeur indique la plus grande valeur acceptée comme alias de rubrique. Il est utilisé pour limiter le nombre d'alias de rubrique qui doivent être stockés dans cette connexion.



Alias ​​de sujet - alias de sujet



Pour réduire la taille du paquet PUBLISH, l'expéditeur peut utiliser un alias de rubrique. Il s'agit d'une valeur entière utilisée pour identifier le sujet au lieu d'utiliser le nom du sujet. Cette technique réduit la taille du paquet PUBLISH et est utile lorsque les noms de rubrique sont longs et que le même nom est souvent réutilisé sur une connexion réseau.



Du côté du destinataire, lors de la réception d'un alias pour un sujet, la correspondance nécessaire est établie entre le sujet et son alias.



Si le package PUBLISH contient un alias de rubrique, le récepteur le traite comme suit ( voir la section 3.3.4 de la spécification ):



  1. ,

    a) , , ,

    b) , , , .

  2. ,

    a) ,

    b) , .



Maximum QoS — QoS



Peut être 0 ou 1. S'il n'y a pas de QoS maximum, le client utilise la QoS maximum de 2.



Si le serveur ne prend pas en charge les paquets PUBLISH QoS 1 ou QoS 2, il DOIT envoyer la QoS maximum dans un paquet CONNACK indiquant la QoS la plus élevée qu'il prend en charge.



Si le client reçoit la qualité de service maximale du serveur, il ne doit pas envoyer de paquets PUBLIÉS avec un niveau de qualité de service supérieur au maximum spécifié.



Conserver disponible - l'enregistrement est disponible



  • 0 - les messages enregistrés ne sont pas pris en charge,

  • 1 - les messages enregistrés sont pris en charge.



Un client recevant une valeur Retain Available de 0 du serveur NE DOIT PAS envoyer un paquet PUBLISH avec l'indicateur RETAIN mis à 1.



Propriété utilisateur - propriété utilisateur



Il s'agit d'une paire de chaînes «nom» - «valeur». Cette propriété, contrairement à d'autres, peut apparaître plusieurs fois. Le même nom peut être utilisé pour plusieurs propriétés.



Cette propriété peut être utilisée pour fournir un diagnostic supplémentaire ou d'autres informations.



La signification de ces propriétés n'est pas spécifiée dans la spécification, leur signification et leur interprétation ne sont connues que des clients émetteurs et récepteurs.



Taille maximale des paquets - taille maximale des paquets



Un nombre qui spécifie la taille maximale de paquet que le client / serveur est prêt à accepter. La taille du paquet est le nombre total d'octets dans le paquet MQTT. Cette propriété est utilisée pour indiquer que les paquets dépassant cette limite ne seront pas traités.



S'il n'y a pas de taille de paquet maximale, aucune limite de taille de paquet n'est imposée.



Il est de la responsabilité de l'application de sélectionner une valeur de taille de paquet maximale appropriée si elle choisit de limiter la taille de paquet.



Abonnement Wildcard disponible - Abonnement Wildcard disponible



  • 0 - les abonnements génériques ne sont pas pris en charge,

  • 1 - ces abonnements sont pris en charge.



Si la propriété est manquante, les abonnements génériques sont pris en charge.



Si le serveur prend en charge les abonnements génériques, il peut toujours rejeter une demande d'abonnement spécifique contenant un abonnement générique.



Identificateur d'abonnement disponible - l'identifiant d'abonnement est disponible



  • 0 - les identifiants d'abonnement ne sont pas pris en charge,

  • 1 - Les identifiants d'abonnement sont pris en charge.



Si la propriété est manquante, les ID d'abonnement sont pris en charge.



Abonnement partagé disponible - Abonnement partagé disponible



  • 0 - les abonnements généraux ne sont pas pris en charge,

  • 1 - les abonnements généraux sont pris en charge.



Si la propriété est manquante, les abonnements généraux sont pris en charge.



Conclusion



Permettez-moi de vous rappeler que l'article est né en travaillant sur l'intégration de la fonctionnalité émergente décrite ci-dessus au service de la plateforme IoT. Il m'a également semblé qu'il était assez pratique d'afficher l'affichage des propriétés reçues du client dans l'interface objet ( vous pouvez en savoir plus sur les objets ici >>> ). Vous pouvez masquer les propriétés sans intérêt et ajouter des propriétés personnalisées supplémentaires à afficher. En général, cela ressemble à ceci. C'est probablement tout. Pour tester la fonctionnalité, j'ai trouvé ce projet redboltz / mqtt_cpp assez pratique et clair . Je serais très heureux si, dans les commentaires, vous partagiez d'autres projets open-source de clients MQTT (avec et sans interface graphique) qui prennent en charge la version 5.0.
















All Articles