Mise en œuvre d’une solution MQTT
Cahier des charges
On vous demande de concevoir une solution informatique qui trace le taux d’utilisation de la mémoire ainsi que des cœurs du microprocesseur d’une Raspberry Pi.
Cette solution sera architecturée autour du broker MQTT Mosquitto qui se chargera de récolter les données fournies par 2 clients MQTT (publishers) :
-
1 client chargé de renseigner sur l’utilisation de la mémoire
-
1 client chargé de renseigner sur l’utilisation des cœurs du microprocesseur
Le broker délivrera ces données à un autre client MQTT (subscriber) ayant souscrit aux topics adéquats. Son rôle consistera à afficher sous forme de courbes les données qui lui auront été délivrées.
Le broker et les clients MQTT seront déployés sur la même machine (→ localhost).
Le subscriber sera une application Qt/C++ utilisant le module QtCharts pour tracer les courbes.
Les publishers seront codés, aux choix, en Python, Qt/C++ ou en script shell.
✎ Travail n° 1 Introduction théorique à MQTT
🎯 Travail à faire :
-
Prendre connaissance du document Le protocole MQTT
💻 Travail n° 2 1ère mise en œuvre de MQTT
🎯 Travail à faire :
-
Importer la machine virtuelle Raspberry Pi OS (Bullseye) fournie dans Virtual Box après l’avoir téléchargée depuis le NAS du labo.
Cette VM a été préconfigurée et dispose de la majorité des logiciels nécessaires de cet atelier.
-
Configurer le broker Mosquitto pour accepter les accès non authentifiés sur le port 1883 (port par défaut de MQTT) en créant un fichier
/etc/mosquitto/conf.d/lab-mqtt.conf
avec le contenu suivantlistener 1883 allow_anonymous true
-
(Re)Démarrer/Activer au démarrage le service proposé par le broker Mosquitto avec
systemctl
. -
Utiliser les applications clientes
mosquitto_pub
etmosquitto_sub
pour publier des messages sur des topics et y souscrire.Se référer aux pages de manuel de ces 2 commandes pour des exemples d’utilisation.
Pour se rapprocher de ce qui est demandé dans le cahier des charges, publiez des données dans les topics :
-
lab/mqtt/ram
-
lab/mqtt/cpu/core0
-
lab/mqtt/cpu/core1
Souscrire à chacun de ces topics d’abord de manière individuelle puis en utilisant les caractères “joker” (→ ‘+’, ‘#’)
-
-
Installer sur Windows le client graphique MQTT.fx disponible sur le NAS du labo et l’expérimenter en publiant sur le broker de la VM des messages dans les mêmes topics que précédemment.
Vérifier que tous les clients MQTT (
mosquitto_pub
,mosquitto_sub
, MQTT.fx) parviennent à dialoguer entre eux à travers le broker Mosquitto de la VM. -
Expérimenter la fonctionnalité “Last Will & Testament (LWT)” de MQTT.
Pour cela :
-
connecter un client via la commande
mosquitto_sub
en indiquant via ses options :-
le topic auquel il veut souscrire (ex.
lab/mqtt
) -
le contenu de sa “dernière volonté & testament” (→ options
--will-topic
,--will-payload
,--will-qos
) -
le nombre de messages reçus à partir duquel le client se déconnectera normalement (→ option
-C
suivi d’un nombre plus grand que 1)
-
-
souscrire au topic de “dernière volonté & testament” depuis d’autres client MQTT (
mosquitto_sub
ou MQTT.fx) -
tuer sans ménage le client ayant rédigé ses “dernière volonté & testament” (→
sudo kill -9 <pid-client-mqtt>
) -
S’assurer que les clients ayant souscrit au topic de “dernière volonté & testament” reçoivent bien l’avis de “décés”.
-
💻 Travail n° 3 Analyse réseau
🎯 Travail à faire :
-
Lancer Wireshark sur Windows
-
Mettre en place un filtre de capture avec le broker MQTT (→
host <ip>
) et un filtre d’affichage sur le protocole MQTT_ (→mqtt
) -
Lancer la capture de trames
-
Depuis MQTT.fx publier des messages sur le broker MQTT avec les différentes qualités de service (→ QoS)
-
Analyser les échanges dans Wireshark pour distinguer les différences, en termes de trames, entre les 3 qualités de service proposées par le protocole MQTT
💻 Travail n° 4 Codage de clients MQTT en Python
🎯 Travail à faire :
-
S’inspirer des scripts Python fournis dans l’article MQTT in Python with Paho Client: Beginner’s Guide 2024
pour coder :
-
1 client publisher dans un script
paho-publisher.py
qui publie un message sur un topic qui sont définis chacun par l’utilisateur au lancement du script -
1 client subscriber dans un cript
paho-subscriber.py
qui affiche les message reçus sur le topic renseigné par l’utilisateur au lancement du script
-
-
Tester leur bon fonctionnement
💻 Travail n° 5 Codage de clients MQTT en Qt/C++
🎯 Travail à faire :
-
Lancer QtCreator
-
Se rendre dans les exemples de la page d’accueil
-
Lancer l’exemple intitulé “Simple MQTT client Example”
-
Analyser le code source
Remarquer que pour pouvoir accéder aux fonctions du module Qt
mqtt
, il faut le spécifier dans le fichier .pro du projet (ainsi que le modulenetwork
) :QT += core gui network mqtt
💻 Travail n° 6 Codage de l’application finale
🎯 Travail à faire :
-
Expérimenter les commandes Linux
free
etmpstat
qui permettent respectivement d’avoir des informations sur le taux d’utilisation de la mémoire et des cœurs du microprocesseur -
Coder un publisher avec le langage de votre choix (shell bash, Python, Qt/C++) qui exploite les informations renvoyées par
free
pour publier sur le broker le taux d’utilisation de la mémoire à un instant donné (→ nécessité d’un horodatage ou timestamp) dans le topiclab/mqtt/ram
-
Vous pouvez filtrer l’affichage de la commande
free
pour extraire la/les valeur(s) désirée(s) en la chaînant par un pipe avec d’autre scommandes Linux et aussi en utilisant les expressions régulières -
Si vous choisissez de coder le publisher en shell bash, il suffit d’appeler la commande
mosquitto_pub
depuis le script pour publier les valeurs sur le broker
-
-
Coder un publisher avec le langage de votre choix (shell bash, Python, Qt/C++) qui exploite les informations renvoyées par
mpstat
pour publier sur le broker le taux d’utilisation des cœurs du microprocesseur à un instant donné (→ nécessité d’un horodatage ou timestamp)En ce qui concerne le topic de publication, vous avez le choix entre utiliser :
-
un seul topic qui regroupera l’ensemble des valeurs ainsi que leur horodatage dans un message au format JSON. Exemple :
topic message lab/mqtt/cpu
{ "timestamp": 1730651409 (1) "core0": 1.20 "core1": 5.05 }
1 Horodatage au format Unix (nombre de secondes écoulées depuis le 01/01/1970). Ici, 1730651409 correspond à la date du 03/11/2024 à 16:30:09 -
un topic par cœur avec l’horodatage spécifié par l’intitulé du topic parent. Exemple :
topic message lab/mqtt/cpu/1730651409/core0
1.20
lab/mqtt/cpu/1730651409/core1
5.05
-
-
Coder un subscriber Qt/C++ qui affiche, dans un premier temps, les valeurs publiées sur les topics sous forme de barres de progression (→ widget Qt : “progess bar”)
-
🔥 Coder une application Qt/C++ qui affiche désormais l’évolution des taux d’utilisation de la mémoire et des cœurs de microprocesseurs sous forme de courbes.
Vous pouvez vous baser sur l’exemple “DateTimeAxis Example” qui propose le tracé d’une courbe sur un axe temporel.
💻 Travail n° 7 Pour aller plus loin…
Le tracé de courbes depuis Qt étant plutôt compliqué, il existe une autre solution Open Source pour visualiser et analyser des données plutôt simplement en temps réel.
Cette solution se nomme Grafana.
Parmi les fonctionnalités clés offertes par cette solution, on peut citer :
-
la visualisation de données : Grafana permet de créer des tableaux de bord interactifs et personnalisables pour visualiser des données provenant de diverses sources
-
l'Analyse en temps réel : La plateforme offre des capacités d’analyse et de monitoring des données système en temps réel
-
l'Intégration de multiples sources : Grafana peut se connecter à de nombreuses sources de données différentes comme Prometheus, Graphite, InfluxDB, Elasticsearch, MySQL, PostgreSQL, … mais aussi MQTT grâce à un plugin qui permet de visualiser les données MQTT en streaming (Voir MQTT data source for Grafana
)
-
la personnalisation : Les tableaux de bord et visualisations sont hautement configurables selon les besoins spécifiques
-
les alertes : Possibilité de configurer des alertes basées sur des seuils prédéfinis
🎯 Travail à faire :
-
Installer Grafana sur la VM en suivant les indications de Install Grafana on Raspberry Pi
-
🔥 Compiler et installer le plugin MQTT de Grafana.
Le post Building and installing the MQTT plugin
sur le dépôt Github de ce même plugin apporte une aide inestimable sur la procédure à suivre pour le compiler et l’installer.
-
Créer un dashboard permettant de visualiser l’évolution des taux d’utilisation de la mémoire et des cœurs du microprocesseur.
🞄 🞄 🞄