Skip to content

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 :

  1. Comprendre la notion de topic et sa structure hiérarchique
  2. Utiliser le wildcard # pour s'abonner à plusieurs niveaux de topics
  3. Utiliser le wildcard + pour cibler un seul niveau d'un topic
  4. Choisir le bon filtre de souscription selon le besoin

Infrastructure de l'exercice

VMRôleIP
VM-BrokerBroker Mosquitto192.168.100.10
VM-PubPublisher192.168.100.20
VM-SubSubscriber192.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 : lieu

Exemples 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) :

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

bash
mosquitto_sub -h 192.168.100.10 -t "meteo/geneve/temperature" -v

Depuis VM-Pub, publie à nouveau sur plusieurs topics :

bash
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/temperature apparaî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.

SouscriptionCorrespond à
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 :

bash
mosquitto_sub -h 192.168.100.10 -t "meteo/#" -v

Depuis VM-Pub, publie sur tous les topics météo et école :

bash
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 message ecole/...

Arrête le subscriber avec Ctrl+C.


Étape 4 - Wildcard + (un seul niveau)

Le caractère + remplace exactement un niveau dans le topic.

SouscriptionCorrespond àNe correspond PAS à
meteo/+/temperaturemeteo/geneve/temperature, meteo/lausanne/temperaturemeteo/geneve/humidite, meteo/geneve/capteur/temperature

Depuis VM-Sub, abonne-toi à la température de toutes les villes :

bash
mosquitto_sub -h 192.168.100.10 -t "meteo/+/temperature" -v

Depuis VM-Pub, publie à nouveau :

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

bash
mosquitto_sub -h 192.168.100.10 -t "#" -v

Depuis VM-Pub, publie sur n'importe quel topic :

bash
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 / non

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

bash
# 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" -v

Question bonus

À quoi sert le flag -r (retained) ? Dans quel cas est-ce utile dans un système IoT réel ?