Exercice - MQTT - Topics et wildcards
Prérequis - 3 VM mosquito
Pour effectuer ces exercices, suivez les instructions Vagrant afin d'installer les VMs nécessaires.
Objectifs
À la fin de cet exercice, tu seras capable de :
- Comprendre la notion de topic et sa structure hiérarchique
- Utiliser le wildcard
#pour s'abonner à plusieurs niveaux de topics - Utiliser le wildcard
+pour cibler un seul niveau d'un topic - Choisir le bon filtre de souscription selon le besoin
Infrastructure de l'exercice
| VM | Rôle | IP |
|---|---|---|
| VM-Broker | Broker Mosquitto | 192.168.100.10 |
| VM-Pub | Publisher | 192.168.100.20 |
| VM-Sub | Subscriber | 192.168.100.30 |
⚠️ Les IPs des VM peuvent ne pas être identique à celles ci-dessus.
Rappel - Structure d'un topic
Un topic MQTT est une chaîne de caractères divisée en niveaux par / :
maison / salon / temperature
│ │ │
│ │ └── niveau 3 : type de donnée
│ └──────────── niveau 2 : pièce
└───────────────────── niveau 1 : lieuExemples de topics :
meteo/geneve/temperature
meteo/geneve/humidite
meteo/lausanne/temperature
ecole/salle101/temperature
ecole/salle101/humidite
ecole/salle202/temperatureÉtape 1 - Publier sur plusieurs topics
Depuis VM-Pub, publie des messages sur différents topics (pas besoin de subscriber actif pour l'instant) :
mosquitto_pub -h 192.168.100.10 -t "meteo/geneve/temperature" -m "18"
mosquitto_pub -h 192.168.100.10 -t "meteo/geneve/humidite" -m "72"
mosquitto_pub -h 192.168.100.10 -t "meteo/lausanne/temperature" -m "16"
mosquitto_pub -h 192.168.100.10 -t "meteo/lausanne/humidite" -m "68"
mosquitto_pub -h 192.168.100.10 -t "ecole/salle101/temperature" -m "22"
mosquitto_pub -h 192.168.100.10 -t "ecole/salle202/temperature" -m "21"Étape 2 - S'abonner à un topic exact
Depuis VM-Sub, abonne-toi au topic exact de la température de Genève :
mosquitto_sub -h 192.168.100.10 -t "meteo/geneve/temperature" -vDepuis VM-Pub, publie à nouveau sur plusieurs topics :
mosquitto_pub -h 192.168.100.10 -t "meteo/geneve/temperature" -m "19"
mosquitto_pub -h 192.168.100.10 -t "meteo/geneve/humidite" -m "70"
mosquitto_pub -h 192.168.100.10 -t "meteo/lausanne/temperature" -m "17"Observe : seul le message
meteo/geneve/temperatureapparaît sur VM-Sub. Les autres sont ignorés car ils ne correspondent pas exactement au topic souscrit.
Arrête le subscriber avec Ctrl+C.
Étape 3 - Wildcard # (multi-niveaux)
Le caractère # remplace zéro ou plusieurs niveaux à la fin d'un topic.
| Souscription | Correspond à |
|---|---|
meteo/# | meteo/geneve, meteo/geneve/temperature, meteo/lausanne/humidite, … |
# | absolument tous les topics du broker |
Depuis VM-Sub, abonne-toi à tout ce qui concerne la météo :
mosquitto_sub -h 192.168.100.10 -t "meteo/#" -vDepuis VM-Pub, publie sur tous les topics météo et école :
mosquitto_pub -h 192.168.100.10 -t "meteo/geneve/temperature" -m "20"
mosquitto_pub -h 192.168.100.10 -t "meteo/geneve/humidite" -m "65"
mosquitto_pub -h 192.168.100.10 -t "meteo/lausanne/temperature" -m "18"
mosquitto_pub -h 192.168.100.10 -t "ecole/salle101/temperature" -m "23"Observe : VM-Sub reçoit les 3 messages
meteo/...mais PAS le messageecole/...
Arrête le subscriber avec Ctrl+C.
Étape 4 - Wildcard + (un seul niveau)
Le caractère + remplace exactement un niveau dans le topic.
| Souscription | Correspond à | Ne correspond PAS à |
|---|---|---|
meteo/+/temperature | meteo/geneve/temperature, meteo/lausanne/temperature | meteo/geneve/humidite, meteo/geneve/capteur/temperature |
Depuis VM-Sub, abonne-toi à la température de toutes les villes :
mosquitto_sub -h 192.168.100.10 -t "meteo/+/temperature" -vDepuis VM-Pub, publie à nouveau :
mosquitto_pub -h 192.168.100.10 -t "meteo/geneve/temperature" -m "21"
mosquitto_pub -h 192.168.100.10 -t "meteo/lausanne/temperature" -m "19"
mosquitto_pub -h 192.168.100.10 -t "meteo/geneve/humidite" -m "60"
mosquitto_pub -h 192.168.100.10 -t "meteo/berne/temperature" -m "15"Observe : VM-Sub reçoit les températures de Genève, Lausanne et Berne, mais PAS l'humidité de Genève (le 3ème niveau ne correspond pas).
Arrête le subscriber avec Ctrl+C.
Étape 5 - S'abonner à tout #
Depuis VM-Sub, abonne-toi à absolument tous les messages du broker :
mosquitto_sub -h 192.168.100.10 -t "#" -vDepuis VM-Pub, publie sur n'importe quel topic :
mosquitto_pub -h 192.168.100.10 -t "meteo/geneve/temperature" -m "22"
mosquitto_pub -h 192.168.100.10 -t "ecole/salle101/co2" -m "412"
mosquitto_pub -h 192.168.100.10 -t "alarme/entree" -m "ACTIVE"
mosquitto_pub -h 192.168.100.10 -t "test" -m "hello"Observe : tous les messages arrivent sur VM-Sub. C'est utile pour déboguer un système MQTT en développement.
Arrête le subscriber avec Ctrl+C.
Questions
Réponds aux questions suivantes dans ton fichier de réponses.
Q2.1
Quelle est la différence entre le wildcard + et le wildcard # ? Donne un exemple concret pour chacun.
Q2.2
Avec le topic de souscription ecole/+/temperature, quels messages parmi les suivants seraient reçus ? Justifie ta réponse.
ecole/salle101/temperature → reçu ? oui / non
ecole/salle101/humidite → reçu ? oui / non
ecole/salle202/temperature → reçu ? oui / non
ecole/salle101/capteur/temperature → reçu ? oui / nonQ2.3
Tu veux recevoir uniquement les messages d'humidité de toutes les villes de la météo. Quel topic de souscription utilises-tu ?
Q2.4
Dans quel scénario professionnel le wildcard # serait-il utile ? Cite un exemple dans le domaine de la domotique ou de l'industrie.
Bilan
Coche les compétences acquises :
- [ ] Je sais structurer un topic en niveaux hiérarchiques
- [ ] Je sais utiliser le wildcard
#pour plusieurs niveaux - [ ] Je sais utiliser le wildcard
+pour un seul niveau - [ ] Je sais choisir le bon filtre de souscription selon le besoin
Pour aller plus loin (facultatif)
Si tu as terminé avant la fin du temps imparti, explore ces commandes :
# Publier avec QoS 1 (le broker confirme la réception)
mosquitto_pub -h 192.168.100.10 -t "test/qos" -m "message garanti" -q 1
# Publier un message retained (le broker le conserve pour les futurs subscribers)
mosquitto_pub -h 192.168.100.10 -t "meteo/geneve/temperature" -m "23" -r
# Maintenant lance un nouveau subscriber et observe qu'il reçoit immédiatement
# le message retained même sans nouvelle publication :
mosquitto_sub -h 192.168.100.10 -t "meteo/geneve/temperature" -vQuestion bonus
À quoi sert le flag -r (retained) ? Dans quel cas est-ce utile dans un système IoT réel ?