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.

synoptique app

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 :

  1. Prendre connaissance du document Le protocole MQTT

💻 Travail n° 2 1ère mise en œuvre de MQTT

🎯 Travail à faire :

  1. 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.

  2. 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 suivant

    listener 1883
    allow_anonymous true

    🕮 Sources :


  3. (Re)Démarrer/Activer au démarrage le service proposé par le broker Mosquitto avec systemctl.

  4. Utiliser les applications clientes mosquitto_pub et mosquitto_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” (→ ‘+’, ‘#’)

  5. 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.

  6. 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 :

  1. Lancer Wireshark sur Windows

  2. Mettre en place un filtre de capture avec le broker MQTT (→ host <ip>) et un filtre d’affichage sur le protocole MQTT_ (→ mqtt)

  3. Lancer la capture de trames

  4. Depuis MQTT.fx publier des messages sur le broker MQTT avec les différentes qualités de service (→ QoS)

    mqtt fx qos
  5. 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

    mqtt qos

💻 Travail n° 4 Codage de clients MQTT en Python

🎯 Travail à faire :

  1. S’inspirer des scripts Python fournis dans l’article MQTT in Python with Paho Client: Beginner’s Guide 2024 link 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

  2. Tester leur bon fonctionnement

💻 Travail n° 5 Codage de clients MQTT en Qt/C++

🎯 Travail à faire :

  1. Lancer QtCreator

  2. Se rendre dans les exemples de la page d’accueil

  3. Lancer l’exemple intitulé “Simple MQTT client Example

  4. 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 module network) :

    QT += core gui network mqtt

💻 Travail n° 6 Codage de l’application finale

🎯 Travail à faire :

  1. Expérimenter les commandes Linux free et mpstat qui permettent respectivement d’avoir des informations sur le taux d’utilisation de la mémoire et des cœurs du microprocesseur

  2. 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 topic lab/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

  3. 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

  4. 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”)

    ihm sample
    Exemple d’IHM
  5. 🔥 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.

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 link)

  • 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 :

  1. Installer Grafana sur la VM en suivant les indications de Install Grafana on Raspberry Pi link

  2. 🔥 Compiler et installer le plugin MQTT de Grafana.

    Le post Building and installing the MQTT plugin link 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.

  3. Créer un dashboard permettant de visualiser l’évolution des taux d’utilisation de la mémoire et des cœurs du microprocesseur.

🞄  🞄  🞄