1. Brève introduction

MQTT (Message Queuing Telemetry Transport) est un protocole de communication « léger » basé sur le mode publication/abonnement. Ce protocole est construit sur le protocole TCP/IP et a été publié par IBM en 1999. Le plus grand avantage de MQTT est qu'il peut fournir des services de messagerie en temps réel et fiables aux appareils distants connectés avec un minimum de code et une bande passante limitée. En tant que protocole de messagerie instantanée à faible surcharge et à faible utilisation de la bande passante, il est largement utilisé dans l'Internet des objets, les petits appareils, les applications mobiles et d'autres domaines.

MQTT est un protocole de transport de messages de publication/abonnement basé sur le modèle client-serveur. Le protocole MQTT est léger, simple, ouvert et facile à mettre en œuvre, ce qui le rend applicable dans un très large éventail de scénarios. Dans de nombreux cas, y compris des environnements contraints, tels que la communication machine à machine (M2M) et l'Internet des objets (IoT). Il a été largement utilisé dans les capteurs communiquant via des liaisons satellite, les dispositifs médicaux qui se connectent occasionnellement, les maisons intelligentes et certains appareils miniaturisés.


2. Spécifications de conception

Comme l'environnement IoT est très particulier, MQTT suit les principes de conception suivants :

  • (1) Épuré, sans ajouter de fonctionnalités non essentielles ;
  • (2) Mode publication/abonnement (Pub/Sub), facilitant la transmission de messages entre capteurs ;
  • (3) Permet aux utilisateurs de créer dynamiquement des sujets, avec des coûts d'exploitation et de maintenance nuls ;
  • (4) Minimiser le volume de transmission pour améliorer l'efficacité de transmission ;
  • (5) Prendre en compte des facteurs tels qu'une faible bande passante, une latence élevée et des réseaux instables ;
  • (6) Prendre en charge le contrôle continu des sessions ;
  • (7) Comprendre que la puissance de calcul du client peut être très faible ;
  • (8) Fournir une gestion de la qualité de service ;
  • (9) Supposer que les données sont inconnues, ne pas imposer le type et le format des données transmises, et conserver la flexibilité.

3. Principales fonctionnalités

Le protocole MQTT est conçu pour la communication entre capteurs distants et dispositifs de contrôle sur des réseaux à faible bande passante et peu fiables. Il présente les principales caractéristiques suivantes :

  • (1) Utilise le modèle de messages publication/abonnement pour fournir une publication de messages de un à plusieurs, découplant les applications.

    Ceci est très similaire à XMPP, mais MQTT présente bien moins de redondance d'informations que XMPP, car XMPP utilise du texte au format XML pour transmettre les données.

  • (2) Transmission de messages transparente vis-à-vis du contenu de la charge utile.

  • (3) Utilise TCP/IP pour fournir des connexions réseau.

    Le MQTT courant utilise des connexions TCP pour le push de données, mais il existe également des versions basées sur UDP, appelées MQTT-SN. Comme ces deux versions reposent sur des méthodes de connexion différentes, leurs avantages et inconvénients diffèrent naturellement.

  • (4) Il existe trois niveaux de qualité de service pour la publication de messages :

    « Au plus une fois » : la publication de messages repose entièrement sur le réseau TCP/IP sous-jacent. Une perte ou une duplication de message peut se produire. Ce niveau peut être utilisé dans des situations telles que les données de capteurs environnementaux ; perdre une mesure n'a pas d'importance car un second envoi se produira bientôt. Cette méthode est principalement utilisée pour les notifications push dans les applications ordinaires. Si votre appareil intelligent n'est pas en ligne lorsqu'un message est poussé, la notification ne sera pas reçue, et elle ne sera pas reçue non plus lorsqu'il reviendra en ligne.

    « Au moins une fois » : garantit la livraison du message, mais une duplication de message peut se produire.

    « Exactement une fois » : garantit que le message arrive exactement une fois. Ce niveau peut être utilisé dans certains systèmes de facturation à exigences strictes. Dans les systèmes de facturation, des messages dupliqués ou perdus peuvent conduire à des résultats incorrects. Ce service de publication de messages de la plus haute qualité peut également être utilisé pour les notifications push dans les applications de messagerie instantanée, garantissant que les utilisateurs reçoivent le message exactement une fois.

  • (5) Transmissions de petite taille avec une surcharge minimale (l'en-tête de longueur fixe est de 2 octets), minimisant les échanges de protocole afin de réduire le trafic réseau.

    C'est pourquoi l'introduction indique qu'il est très adapté à la « communication entre capteurs et serveurs, et à la collecte d'informations dans le domaine de l'IdO. » Vous devez savoir que la puissance de calcul et la bande passante des appareils embarqués sont relativement faibles, donc utiliser ce protocole pour transmettre des messages est parfaitement adapté.

  • (6) Utilise la fonctionnalité Last Will and Testament pour notifier aux parties concernées une déconnexion anormale du client.

    Last Will : c'est-à-dire le mécanisme de testament, utilisé pour notifier aux autres appareils sous le même topic que l'appareil qui a envoyé le testament s'est déconnecté.

    Testament : le mécanisme de testament, dont la fonction est similaire à Last Will.


4. Principes du protocole MQTT

4.1 Méthode de mise en œuvre du protocole MQTT

La mise en œuvre du protocole MQTT nécessite une communication entre le client et le serveur. Pendant la communication, il y a trois rôles dans le protocole MQTT : Éditeur, Courtier (serveur) et Abonné. Parmi eux, l'éditeur et l'abonné sont tous deux des clients, le courtier de messages est le serveur, et un éditeur peut aussi être un abonné en même temps.

Les messages transmis par MQTT sont divisés en deux parties : Topic et Payload.

  • (1) Topic peut être compris comme le type de message. Après qu'un abonné s'abonne, il recevra le contenu du message (payload) de ce topic.
  • (2) Payload peut être compris comme le contenu du message, se référant au contenu spécifique que l'abonné utilisera.

4.2 Transmission réseau et messages applicatifs

MQTT construit la transmission réseau sous-jacente : il établit une connexion du client au serveur, fournissant une transmission bidirectionnelle ordonnée, sans perte et basée sur un flux d'octets entre les deux.

Lorsque des données d'application sont envoyées via le réseau MQTT, MQTT y associe la qualité de service (QoS) et le nom du topic correspondants.

4.3 Client MQTT

Une application ou un appareil qui utilise le protocole MQTT établit toujours une connexion réseau au serveur. Un client peut :

  • (1) Publier des informations auxquelles d'autres clients peuvent s'abonner ;
  • (2) S'abonner aux messages publiés par d'autres clients ;
  • (3) Se désabonner ou supprimer des messages d'application ;
  • (4) Se déconnecter du serveur.

4.4 Serveur MQTT

Le serveur MQTT est aussi appelé « courtier de messages » (Broker). Il peut être une application ou un appareil. Il se situe entre l'éditeur de messages et les abonnés, et il peut :

  • (1) Accepter les connexions réseau des clients ;
  • (2) Accepter les informations d'application publiées par les clients ;
  • (3) Traiter les demandes d'abonnement et de désabonnement des clients ;
  • (4) Transférer les messages d'application aux clients abonnés.

4.5 Abonnements, sujets et sessions dans le protocole MQTT

1. Abonnement

Un abonnement contient un filtre de sujet et une qualité de service (QoS) maximale. Un abonnement est associé à une session. Une session peut contenir plusieurs abonnements. Chaque abonnement dans chaque session a un filtre de sujet différent.

2. Session

Une fois que chaque client a établi une connexion avec le serveur, il devient une session, avec une interaction d'état entre le client et le serveur. Une session existe sur un réseau et peut aussi s'étendre sur plusieurs connexions réseau consécutives entre le client et le serveur.

3. Nom du sujet

Une étiquette attachée à un message d'application qui correspond aux abonnements sur le serveur. Le serveur envoie le message à chaque client dont l'abonnement correspond à l'étiquette.

4. Filtre de sujet

Un filtre à caractères génériques pour les noms de sujets, utilisé dans les expressions d'abonnement, représentant plusieurs sujets auxquels l'abonnement correspond.

5. Charge utile

Le contenu spécifique reçu par l'abonné au message.

4.6 Méthodes dans le protocole MQTT

Le protocole MQTT définit certaines méthodes (aussi appelées actions) pour représenter des opérations sur certaines ressources. Cette ressource peut représenter des données préexistantes ou générées dynamiquement, selon l'implémentation du serveur. En général, les ressources font référence à des fichiers ou des sorties sur le serveur. Les principales méthodes sont :

  • (1) Connect. Attendre l'établissement d'une connexion avec le serveur.
  • (2) Disconnect. Attendre que le client MQTT termine son travail et déconnecte la session TCP/IP avec le serveur.
  • (3) Subscribe. Attendre que l'abonnement soit terminé.
  • (4) UnSubscribe. Attendre que le serveur annule l'abonnement du client à un ou plusieurs sujets.
  • (5) Publish. Le client MQTT envoie une demande de message et retourne au thread applicatif une fois l'envoi terminé.

5. Structure des paquets du protocole MQTT

Dans le protocole MQTT, un paquet MQTT se compose de trois parties : l'en-tête fixe, l'en-tête variable et la charge utile. La structure du paquet MQTT est la suivante :

  • (1) En-tête fixe. Présent dans tous les paquets MQTT, indiquant le type de paquet et l'identifiant de classe de groupe du paquet.
  • (2) En-tête variable. Présent dans certains paquets MQTT. Le type de paquet détermine si l'en-tête variable existe et son contenu spécifique.
  • (3) Charge utile. Présente dans certains paquets MQTT, représentant le contenu spécifique reçu par le client.

5.1 En-tête fixe MQTT

L'en-tête fixe existe dans tous les paquets MQTT, et sa structure est la suivante :

5.1.1 Type de paquet MQTT

Emplacement : bits 7-4 dans Byte 1.

Il s'agit d'une valeur non signée de 4 bits. Les types, valeurs et descriptions sont les suivants :

5.1.2 Drapeaux

Emplacement : bits 3-0 dans Byte 1.

Dans les types de messages qui n'utilisent pas de drapeaux, les drapeaux sont traités comme des bits réservés. Si un drapeau non valide est reçu, le récepteur doit fermer la connexion réseau :

(1) DUP : Duplicata d'un message publié. Utilisé pour garantir une transmission fiable des messages. S'il est défini sur 1, le MessageId est ajouté dans l'en-tête variable ci-dessous, et une réponse d'accusé de réception est requise pour garantir que la transmission du message est terminée, mais il ne peut pas être utilisé pour détecter l'envoi de messages en double.

(2) QoS : Qualité de service pour les messages publiés, c'est-à-dire le nombre de fois que la livraison du message est garantie.

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

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

Ø10:一次,即:=1

Ø11:预留

(3) RETAIN : Indicateur de rétention de publication. Indique que le serveur doit conserver cette information poussée. Si un nouvel abonné apparaît, pousser ce message vers lui ; s'il n'est pas défini, le libérer après l'avoir poussé à l'abonné actuel.

5.1.3 Longueur restante

Emplacement : Byte 2.

Le deuxième octet de l'en-tête fixe est utilisé pour stocker la taille totale de l'en-tête variable et de la charge utile, mais il n'est pas stocké directement. Cet octet est extensible. Son mécanisme de stockage : les 7 premiers bits sont utilisés pour stocker la longueur, et le dernier bit est utilisé comme identifiant. Lorsque le dernier bit vaut 1, cela signifie que la longueur est insuffisante, et un second octet est nécessaire pour continuer le stockage. Par exemple : si la taille suivante calculée est 0

5.2 En-tête variable MQTT

Un paquet MQTT contient un en-tête variable, qui se situe entre l'en-tête fixe et la charge utile. Le contenu de l'en-tête variable varie selon le type de paquet. Une application plus courante consiste à l'utiliser comme identifiant de paquet :

De nombreux types de paquets incluent un champ identifiant de paquet de 2 octets. Ces types de paquets incluent : PUBLISH (QoS > 0), PUBACK, PUBREC, PUBREL, PUBCOMP, SUBSCRIBE, SUBACK, UNSUBSCRIBE, UNSUBACK.

5.3 Corps du message de la charge utile

Le corps du message de la charge utile est la troisième partie d'un paquet MQTT, contenant des messages de quatre types : CONNECT, SUBSCRIBE, SUBACK, UNSUBSCRIBE :

  • (1) CONNECT : le corps du message contient principalement le ClientID du client, le Topic d'abonnement, le message, ainsi que le nom d'utilisateur et le mot de passe.
  • (2) SUBSCRIBE : le corps du message contient une série de sujets auxquels s'abonner et la QoS.
  • (3) SUBACK : le corps du message est la confirmation et la réponse du serveur aux sujets et aux QoS demandés par SUBSCRIBE.
  • (4) UNSUBSCRIBE : le corps du message contient les sujets à désabonner.

Plus de contenu

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