L'une des composantes les plus importantes du protocole MQTT est la définition et la typologie des messages, car elles sont l'une des bases de l'agilité dans laquelle réside sa force. Chaque message est composé de trois parties :
- Correction de l'en-tête : Il occupe de 2 à 5 octets, obligatoirement. Il se compose d'un code de contrôle, qui identifie le type de message envoyé, et de la longueur du message. La longueur est codée en 1 à 4 octets, dont les 7 premiers bits sont utilisés, et le dernier est un bit de continuité.
- En-tête variable : Facultatif, il contient des informations supplémentaires qui sont nécessaires dans certains messages ou situations.
- Contenu (charge utile) : Il s'agit du contenu réel du message. Il peut avoir un maximum de 256 Mo, bien que dans les mises en œuvre réelles, le maximum soit de 2 à 4 Ko.





Comment fonctionne le protocole MQTT
Le protocole MQTT fonctionne comme un service de messagerie push avec un modèle éditeur/abonné (pub-sub). Dans ce type d'infrastructure, les clients se connectent à un serveur central appelé broker (courrier). Afin de filtrer les messages qui sont envoyés à chaque client, les messages sont classés dans des sujets organisés de manière hiérarchique. Un client peut publier un message dans un certain sujet. D'autres clients peuvent s'abonner à ce sujet, et le broker leur enverra les messages souscrits.
Les clients établissent une connexion TCP/IP avec le broker, qui garde la trace des clients connectés. Cette connexion reste ouverte jusqu'à ce que le client y mette fin. Par défaut, le protocole MQTT utilise les ports 1883 et 8883 lorsqu'il fonctionne avec TLS. Pour ce faire, le client envoie un message CONNECT contenant les informations nécessaires (nom d'utilisateur, mot de passe, identifiant du client...). Le broker répond par un message CONNACK, qui contient le résultat de la connexion (accepté, rejeté, etc.).
Pour envoyer les messages, le client utilise des messages PUBLISH, qui contiennent le sujet et la charge utile. Pour s'abonner et se désabonner, on utilise des messages SUBSCRIBE et UNSUSCRIBE, auxquels le serveur répond par SUBACK et UNSUBACK. D'autre part, pour s'assurer que la connexion est active, les clients envoient périodiquement un message PINGREQ auquel le serveur répond par un PINGRESP. Enfin, le client se déconnecte en envoyant un message DISCONNECT.