MQTT (Message Queuing Telemetry Transport) est un protocole de messagerie publication-souscription basé sur le protocole TCP/IP
Le schéma à droite montre le principe de fonctionnement de MQTT. A gauche figurent les “publieurs”. Ce sont des machines (Arduino, ESP8266, Raspberry Pi…) qui captent des valeurs (température, humidité, pression, consommation électrique, consommation d’eau…) et les envoient à un serveur appelé “Broker”. Des clients “souscripteurs” sont connectés au “Broker”. Ils ont sollicité l’envoi de certaines données. Lorsque le Broker reçoit ces données, il les retransmet aux clients qui se sont abonnés à ce flux de données. Par exemple un des clients souscripteurs recevra la température et l’humidité pour en faire un graphe en temps réel. L’autre client recevra la consommation d’eau et déclenchera une alerte si elle dépasse une valeur déterminée. |
![]() https://www.framboise314.fr/utiliser-le-protocole-mqtt-pour-communiquer-des-donnees-entre-2-raspberry-pi/#Le_protocole_MQTT |
Les clients MQTT s’enregistrent auprès du broker sur des topics, des sortes de chemins d’accès à une ressource.
Ces chemins commencent par le caractère " / " et sont composés d’une liste de mots eux mêmes séparés par les " / "
Exemple : /sensor/1/temperature
N.B : Surtout pas d’espaces dans les mots et pas de caractères accentués
Les clients publieurs publient sur un topic donné
Les clients souscripteurs demandent à être notifiés lorsque quelqu’un publie sur ces topics.
Cela peut être un topic de température par exemple : /sensor/1/temperature.
On peut souscrire à un ensemble de topics en utilisant des wildcards # ou +.
Par exemple, si un client publie sur les topics :
/sensor/1/temperature
et
/sensor/1/humidity
Un autre client peut écouter ces deux topics à la fois :
/sensor/1/#
Si plusieurs clients publient leurs températures et humidités en intercalant leur numéro de client sur leurs topics, un autre client peut écouter toutes les températures ainsi : /sensor/+/temperature
Il recevra alors les températures du client 1 : (/sensor/1/temperature) et du client 2 : (/sensor/2/temperature), etc.
Pour l’envoi des informations on peut avoir deux possibilités d’usage :
1 seul topic pour une information typée élémentaire.
Exemple : int, float, string
1 topic pour un ensemble d’information liées.
Exemple : un int, un float et un string dans un objet (liste, structure de données…) qui vont être échangés sur un topic.
Il est alors nécessaire de sérialiser l'objet d'où l'utilisation de JSON ou de XML
Soit l’ensemble d’informations à transmettre ci-dessous :
Lieu
Lieu de la prise de mesure
Temperature
Température ambiante
Pression
Pression atmosphérique
/Application/Sensor/Lieu/Temperature
/Application/Sensor/Lieu/Pression
Exemple : Le capteur de "Lille" relevant une température de 22,5° et une pression de 720 mm de mercure transmettra donc la valeur 22.5 sur le topic /Application/Sensor/Lille/Temperature et la valeur 720 sur le topic /Application/Sensor/Lille/Pression.
Remarque : La température est liée au lieu qui identifie le capteur, de même la pression est liée au lieu. A chaque fois que l'on transmet une température ou une pression, il faut donc indiquer le lieu. Or, on a choisi ici de ne transmettre qu'une seule valeur dans le message MQTT. C'est pourquoi, on place l'identification du capteur (c'est à dire le lieu) dans le topic.
/Application/Sensor
On sérialise le triplet {Lieu,Température,Pression} en JSON et dans le cas de notre exemple, on obtient la chaîne de caractères : {"Lieu":"Lille","Temperature":22.5,"Pression":720}
Remarque : Par cette méthode, on ne peut pas s'abonner uniquement à une sélection de lieux, puisque le broker MQTT permet de filtrer sur les topics mais pas sur le contenu des messages. Pour pallier à ce problème, on peut choisir d'utiliser le topic /Application/Sensor/Lieu. Bien que l'information de lieu soit répétée dans le topic et dans le message, cela peut être la solution. Sinon, on retire le lieu du message JSON et on pourra l'extraire du topic, pour le récupérer à réception du message.