[Mise à jour le 9/7/2024]
client1), serveur 2), broker MQTT3), subscriber4), publisher5), topic MQTT6), payload7)(charge utile), joker8), sécurité, QoS9).
Pour répondre à la problématique du nombre grandissant d’objets connectés qui vont faire leur apparition sur la toile (selon une étude Gartner : près de 26 milliards d’objets connectés seront sur Internet d’ici 2020), l’IoT (Internet Of Things), s’est doté d’un nouveau standard : MQTT (Message Queuing Telemetry Transport).
Pourquoi MQTT et pas un autre ?
MQTT est ouvert, simple, léger et facile à mettre en œuvre. Il est idéal pour répondre aux besoins suivants :
Le protocole MQTT (MQ Telemetry Transport) trouve ses origines en 1999 dans les travaux de Andy Standford-Clark et Arlen Nipper, alors qu'ils travaillaient pour IBM au développement d'un protocole pour une utilisation industrielle de télémétrie en lien avec l'industrie pétrolière.
Le serveur ou courtier, nommé broker, va collecter des informations que les éditeurs (publishers) vont lui transmettre. Certaines informations collectées par le broker seront renvoyées à certains abonnés (subscribers) ayant préalablement fait la demande au broker. Un client peut être à la fois éditeur et abonné.
Le principe d’échange est très proche de celui de Twitter. Les messages sont envoyés par les éditeurs sur un canal d'information appelé topic. Ces messages peuvent être lus par les abonnés. Les topics peuvent avoir une hiérarchie qui permet de sélectionner finement les informations que l’on désire.
Résumé
Exemple
Le topic “maison/salon/temperature” communiquera la température du salon (la sonde de température présente dans le salon publiera régulièrement la température relevée sur ce topic).
Les trois clients établissent une connexion TCP avec le broker. Les clients B et C souscrivent au topic temperature. | Le Client A publie sur le topic temperature une valeur de 22,5°. Le broker propage le message à tous les clients ayant préalablement souscrit au topic Temperature. |
Le caractère joker +
+ est le joker pour un unique niveau hiérarchique. Un client souscrivant à “maison/+/temp” recevra les messages adressés par d'autres clients aux topics :
mais pas :
Le caractère joker #
Le # est un joker multiniveau s'utilisant toujours après un / et en dernier caractère. Il est destiné à remplacer n'importe quel niveau supérieur dans le topic.
“maison/#” correspondra aux topics :
mais pas :
Le caractère joker $
Le joker $ ne peut pas être utilisé pour publier. Il précède les topics concernant les statistiques internes du broker. Son utilisation est illustrée au paragraphe Le broker Mosquitto.
Les données IoT échangées peuvent s’avérer très critiques, c’est pourquoi il est possible de sécuriser les échanges à plusieurs niveaux :
MQTT intègre en natif la notion de QoS. En effet, le publisher à la possibilité de définir la qualité de son message.
Trois niveaux sont possibles :
Le format de paquet ou de message MQTT se compose d'un en-tête fixe de 2 octets (toujours présent) + en-tête variable (pas toujours présent) + charge utile (pas toujours présent).
Eclipse Mosquitto est un courtier de messages (broker) open source (sous licence EPL / EDL) qui implémente les versions 5.0, 3.1.1 et 3.1 du protocole MQTT. Mosquitto est léger et convient à une utilisation sur tous les appareils, des ordinateurs monocarte basse consommation aux serveurs complets.
Le protocole MQTT fournit une méthode légère pour effectuer la messagerie en utilisant un modèle de publication / abonnement. Cela le rend approprié pour la messagerie Internet of Things, par exemple avec des capteurs de faible puissance ou des appareils mobiles tels que des téléphones, des ordinateurs intégrés ou des microcontrôleurs.
Le projet Mosquitto fournit également une bibliothèque C pour l’implémentation des clients MQTT, ainsi que les très populaires clients MQTT mosquitto_pub et mosquitto_sub.
Mosquitto fait partie de la Fondation Eclipse et est un projet de iot.eclipse.org.
sudo apt update && sudo apt upgrade -y
sudo apt install mosquitto -y
sudo apt install mosquitto-clients -y
mosquitto_sub -v -h localhost -t '$SYS/broker/version' # Exemple de résultat attendu $SYS/broker/version mosquitto version 2.0.11
“$SYS/broker/clients/connected” | Le nombre de clients connectés au broker. |
“$SYS/broker/clients/maximum” | Le nombre maximum de clients connectés ayant été atteint. |
“$SYS/broker/messages/received” | Le nombre total de messages reçus depuis que le broker a été démarré. |
“$SYS/broker/uptime” | Le nombre de secondes écoulées depuis le démarrage. |
“$SYS/broker/version” | La version du broker. |
sudo systemctl stop mosquitto.service sudo systemctl start mosquitto.service sudo systemctl restart mosquitto.service
Pour tester le bon fonctionnement du broker, nous allons publier le message (payload) “Bonjour” sur le canal d'information (topic) test/val à l'aide d'un client mosquitto_pub. Ce message sera reçu par un client mosquitto_sub abonné à test/val.
mosquitto_sub -v -h localhost -t test/val
mosquitto_pub -h localhost -t test/val -m "Bonjour"
Résultat attendu
Le fichier mosquitto.conf original contient le code suivant.
# Place your local configuration in /etc/mosquitto/conf.d/ # # A full description of the configuration file is at # /usr/share/doc/mosquitto/examples/mosquitto.conf.example pid_file /run/mosquitto/mosquitto.pid persistence true persistence_location /var/lib/mosquitto/ log_dest file /var/log/mosquitto/mosquitto.log include_dir /etc/mosquitto/conf.d # Position du fichier d'extension
# Exemple # Créer/ouvrir le fichier mon_mosquitto.conf sudo nano /etc/mosquitto/conf.d/mon_mosquitto.conf
Ajouter les lignes ci-dessous dans mon_mosquitto.conf
allow_anonymous true # A modifier : false -> true listener 1883
Tests réalisés entre un RaspBerry pi et un smartphone Consulter la page Wiki Réseau - Test d'un broker Mosquitto avec MyMQTT (Android App) pour la mise en oeuvre du test.
Voir ce lien pour installer le broker Mosquitto sous Windows,
Le fichier mosquitto.conf se situe dans le dossier /usr/local/mosquitto/var. Se connecter en ssh. Ouvrir mosquitto.conf avec nano et le compléter comme ci-dessous :
# Write process id to a file. protocol websockets # A ajouter pid_file /var/packages/mosquitto/target/var/mosquitto.pid # ================================================================= # Default listener # ================================================================= # Port to use for the default listener. port 1883 listener 9001 # A ajouter
Ce paragraphe illustre la mise en sécurité de l'installation étudiée dans la partie “Découverte” de la page Mise en oeuvre d'un client MQTT sur un ESP8266 feather Huzzah. La mise en sécurité de cette installation passe par la mise en place d'une authentification. Les clients MQTT doivent s'authentifier avec un identifiant / mot de passe. La mise en place de cette authentification doit se faire côté Mosquitto (traitée ci-dessous) et côté client (voir Mise en oeuvre d'un client MQTT sur un ESP8266 feather Huzzah)
Fichier de configuration de Mosquitto
# Place your local configuration in /etc/mosquitto/conf.d/ # # A full description of the configuration file is at # /usr/share/doc/mosquitto/examples/mosquitto.conf.example pid_file /var/run/mosquitto.pid persistence true persistence_location /var/lib/mosquitto/ log_dest file /var/log/mosquitto/mosquitto.log include_dir /etc/mosquitto/conf.d # ------------------------------------------- # A ajouter à partir de la version 2 # ------------------------------------------- listener localhost # actif par défaut mais à ajouter listener @IP1 # si ajout d'@IP(s) listener @IP2 # etc.
Étape 1. Création d'un fichier de mots de passe
Pour créer un fichier de mots de passe, le paquet mosquitto fournit l'outil mosquitto_passwd.
Exemple : création du fichier passwd contenant l'identifiant sondes associé à mot2passe
Entrer la commande ci-dessous :
sudo mosquitto_passwd -c /etc/mosquitto/passwd sondes
-c crée le fichier
Le Raspberry pi demande ensuite un mot de passe. Entrer mot2passe.
En supprimant -c de la commande ci-dessus, il est possible :
Étape 2. Création d'un fichier d'authentification auth.conf
sudo touch /etc/mosquitto/conf.d/auth.conf
sudo nano /etc/mosquitto/conf.d/auth.conf
password_file /etc/mosquitto/passwd allow_anonymous false # Connexions sans mot de passe non autorisées # password_file permet de spécifier le fichier de mots de passe à utiliser # allow-anonymous autorise (**true**) ou non (**false**) les connexions anonymes (sans mot de passe)
sudo systemctl restart mosquitto.service
Étape 3. Tests
Les tests ci-dessous sont à réaliser lorsque le croquis clientmqttesp8266.ino décrit à la page Mise en oeuvre d'un client MQTT sur un ESP8266 feather Huzzah a été modifié pour assurer l'authentification de la connexion.
La commande de la LED de la carte ESP8266 peut se faire comme ci-dessous :
mosquitto_pub -h localhost -u "sondes" -P "mot2passe" -t ctrlled -m 1
ou
mosquitto_pub -h localhost -u "sondes" -P "mot2passe" -t ctrlled -m 0
L'affichage dans une console sur le Raspberry Pi de la valeur envoyée par l'ESP8266 toutes les 5s peut se faire comme ci-dessous :
mosquitto_sub -v -h localhost -u "sondes" -P "mot2passe" -t maison/+/valeur
A faire
Le navigateur Web peut devenir l'INTERFACE pour afficher les données MQTT. Le support JavaScript de MQTT Websocket pour les navigateurs Web est fourni par le client JavaScript.
Dans le cas de MQTT sur Websockets, la connexion websockets constitue un canal externe pour le protocole MQTT. Le courtier MQTT place le paquet MQTT dans un paquet websockets et l'envoie au client. Le client extrait le paquet MQTT du paquet websockets puis le traite comme un paquet MQTT normal.
MQTT sur Websockets utilise généralement le port 9001 mais il n'est pas fixé.
# Place your local configuration in /etc/mosquitto/conf.d/ # # A full description of the configuration file is at # /usr/share/doc/mosquitto/examples/mosquitto.conf.example port 1883 # A ajouter listener 9001 # A ajouter protocol websockets # A ajouter pid_file /var/run/mosquitto.pid
Cela crée un écouteur supplémentaire à l'aide de websockets et du port 9001.
sudo systemctl restart mosquitto.service
Pour tester les websockets, nous avons besoin d'un client prenant en charge les websockets. Nous utiliserons le client Javascript Paho décrit sur la page Créer un client MQTT avec Eclipse Paho.
En installant un client pour Androïd sur un smartphone tel que MyMQTT , on pourra facilement vérifier la capacité du broker à recevoir ou à émettre des messages.
Consulter la page Wiki Réseau - Test d'un broker Mosquitto avec MyMQTT (Android App) pour sa mise en oeuvre.
MQTTlens est une application Google Chrome, qui se connecte à un courtier MQTT et peut s'abonner et publier sur des sujets MQTT.
Consulter la page Wiki Réseau - Test d'un broker Mosquitto avec MQTTlens pour sa mise en oeuvre.