samedi 21 janvier 2023

[IT] MQTT

Plus connu sous l’acronyme MQTT, le protocole 'Message Queuing Telemetry Transport' est un protocole de messagerie léger adapté aux clients qui doivent utiliser peu de code et sont connectés à des réseaux peu fiables ou limités en bande passante.

1. Historique :

Créé par Andy Stanford-Clark et Arlen Nipper en 1999, MQTT est un protocole de messagerie qui, à son origine, visait à permettre aux capteurs utilisés dans l’industrie pétrolière et gazière d’envoyer leurs données à des serveurs distants. À l’époque, la seule solution pour ces cas de figure était la liaison satellite, une option extrêmement onéreuse. Les acteurs de l’industrie, qui avaient déployé des milliers de capteurs sur le terrain, avaient besoin d’un mode de communication capable de transmettre des données avec toute la fiabilité requise, tout en consommant un minimum de bande passante.

MQTT a été standardisé en tant que format ouvert par l’Organization for the Advancement of Structured Information Standards en 2013. À ce jour, l’OASIS gère encore le standard MQTT.

2. Architecture :

MQTT est un protocole de messagerie 'push-subscribe' basé sur le protocole TCP/IP. Dans l’architecture MQTT, il existe deux types de systèmes : les clients et les brokers (courtiers). 

Le broker est le serveur avec lequel les clients communiquent. Il reçoit les communications qui émanent des clients et les retransmet à d’autres clients. Ainsi, les clients ne communiquent pas directement entre eux, mais toujours par l’intermédiaire du broker. Chaque client peut être soit éditeur, soit abonné, soit les deux.

MQTT est un protocole orienté événements. Afin de minimiser le nombre de transmissions, les données ne sont envoyées ni à intervalles définis, ni en continu. Un client publie uniquement quand il a des informations à transmettre, et un broker n’envoie des informations aux abonnés que quand il reçoit de nouvelles données.

3. Architecture messages :

MQTT minimise également ses transmissions grâce à un système de messages à la construction allégée et bien cadrée. Chaque message se compose d’un en-tête fixe de 2 octets, auquel peut s’ajouter un en-tête facultatif. La charge utile des messages est, pour sa part, limitée à 256 Mo. Les trois niveaux de qualité de service laissent aux concepteurs de réseau le choix de minimiser le nombre de transmissions de données ou d’en maximiser la fiabilité. On parlera de 'QoS' (Quality of Service).

QoS 0 — c’est le niveau minimal de transmission de données. Quand on choisit ce niveau de QoS, chaque message est envoyé à l’abonné une seule fois, sans accusé de réception. Il est donc impossible de savoir si l’abonné l’a reçu. Dans ce niveau de qualité de service, les messages sont expédiés « au plus une fois ». Comme ce niveau de QoS part du principe que les messages sont systématiquement remis, ces derniers ne sont pas conservés en vue d’un envoi ultérieur aux clients qui seraient déconnectés au moment de leur transmission.

QoS 1 — le broker tente de remettre le message, puis attend un accusé de réception de la part de l’abonné. Si cet accusé n’est pas reçu dans le délai défini, le message est réexpédié. Avec cette méthode, l’abonné peut recevoir le message plus d’une fois si le broker ne reçoit pas de confirmation de réception dans le temps imparti. Dans ce niveau de QoS, les messages sont assurés d’arriver « au moins une fois ».

QoS 2 — le client et le broker utilisent deux paires de paquets pour s’assurer que le message a été remis, et pour vérifier qu’il n’a été reçu qu’une seule fois. Dans ce niveau de QoS, les messages sont assurés d’arriver « exactement une fois ».

4. Rubriques :

Sous MQTT, les messages sont publiés en tant que topics (rubriques), c’est-à-dire de structures hiérarchisées qui utilisent le caractère slash (/) comme délimiteur. Ces structures ressemblent à l’arborescence de l’explorateur Windows. 

Ainsi, une structure de type 'capteurs/PétroleetGaz/Pression/' permet à un abonné de préciser qu’il souhaite ne recevoir que les données émanant des clients publiant dans la rubrique Pression, ou peut-être, s’il souhaite élargir ses horizons, toutes les données du rubrique 'capteurs/PétroleetGaz'. 

Les rubriques ne sont pas créées sous MQTT à proprement parler : si un broker reçoit des données publiées sur une rubrique qui n’existe pas à ce moment-là, celle-ci sera automatiquement créée, après quoi les clients pourront s’y abonner.

5. Messages conservés :

Pour alléger au maximum le protocole, les messages reçus ne sont pas conservés sur le broker, sauf à ce qu’ils soient indiqués comme "conservés". On parle alors de messages conservés. Les utilisateurs qui veulent sauvegarder les messages qu’ils reçoivent devront le faire en dehors de MQTT. Il y a toutefois une exception à la règle.

6. Sécurité :

MQTT facilite le chiffrement des messages à l'aide de la couche de sécurité TLS et l'authentification des clients à l'aide de protocoles d'authentification modernes, tels que OAuth.

Certaines options de sécurité sont toutefois disponibles, au prix toutefois d’une augmentation du nombre de transmissions et du poids des données.

Sécurité réseau – Si l’on sécurise le réseau alors les transmissions de données MQTT non sécurisées est sans gravité. Dans un tel cas de figure, d’éventuels problèmes de sécurité proviendraient du réseau lui-même.

Identifiant et mot de passe — MQTT intègre un système d’identifiants et de mots de passe qui permet aux clients d’établir une connexion avec un broker. Cela étant, on déplorera que les identifiants et mots de passe soient transmis en clair.

SSL/TLS – Comme MQTT est basé sur TCP/IP, le protocole SSL/TLS apparaît comme la solution logique pour sécuriser les transmissions entre les clients et les brokers. Malheureusement, son recours alourdit nettement la charge d’un protocole dont la vocation première est de rester léger.

7. Mosquitto :

Mosquitto est le broker le plus souvent utilisé pour les projets ESP8266 (Arduino et Raspberry). Lancé en 2008, il est disponible sur toutes les plateformes (MacOS, Windows XP-10, Linux). Deux méthodes sont possibles pour l'installer : depuis le terminal d'un ordinateur, avant de le lancer depuis le terminal, ou de l'installer en utilisant putty (SSH) et en accédant au Root.

Sources MQTT_1MQTT_2MQTT_3