Publier et s’abonner à un sujet
Le modèle publication et abonnement (en anglais publish and subscribe) sépare celui qui envoie de ceux qui reçoivent. Le capteur publie sur un sujet sans savoir qui écoute, et le courtier remet le message à chaque abonné de ce sujet.
Ainsi, on ajoute un tableau de bord ou une alarme sans toucher au capteur. Les filtres de sujets décident qui reçoit quoi.
À la fin de cette leçon
Remarque
Je peux expliquer la publication et l’abonnement et choisir le filtre de sujets qui convient.
Mots-clés
| Mot | Ce que ça veut dire | Exemple |
|---|---|---|
| Publier | envoyer un message au courtier, avec un sujet | |
| S’abonner | dire au courtier quels sujets on veut recevoir | |
| Filtre de sujets | un sujet qui peut contenir des jokers | home/+/humidity |
| Joker | un symbole qui remplace un ou plusieurs niveaux : + ou # | |
| Message conservé | le dernier message d’un sujet, gardé pour les abonnés qui arrivent plus tard |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Le courtier passe les messages aux abonnés
Un capteur ne parle jamais directement à un tableau de bord. Il publie un message. Le courtier regarde le sujet, cherche les abonnés qui l’ont demandé, et leur envoie le message.
Un abonné ne demande pas une mesure au capteur : il attend ce que le courtier lui passe.
Les filtres se testent dans le terminal
Le labo se commande avec le terminal et docker exec broker. Les sujets sont en anglais. Les valeurs dépendent de la seconde où vous appuyez sur Exécuter : seule la forme des réponses est la même pour tous.
+ remplace un niveau. # remplace tous les niveaux qui restent et se place à la fin. Les commandes ci-dessous choisissent donc des sujets différents avec un seul filtre.
Tout ce qui est sous home/kitchen
docker exec broker mosquitto_sub -t 'home/kitchen/#' -v -C 2 -W 5Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
L’humidité de n’importe quelle pièce
docker exec broker mosquitto_sub -t 'home/+/humidity' -v -C 1 -W 5Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Exemple : quels sujets passent un filtre ?
| Filtre | home/kitchen/temperature | home/livingroom/humidity | home/door/state |
|---|---|---|---|
| home/# | oui | oui | oui |
| home/+/humidity | non | oui | non |
| home/kitchen/# | oui | non | non |
| home/door/state | non | non | oui |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Un filtre de sujets en Python
# Un filtre de sujets : + remplace un niveau, # remplace tous les niveaux qui restent.
def correspond(filtre, sujet):
f = filtre.split("/")
s = sujet.split("/")
i = 0
while i < len(f):
if f[i] == "#":
return True
if i >= len(s):
return False
if f[i] != "+" and f[i] != s[i]:
return False
i = i + 1
return len(f) == len(s)
print(correspond("home/+/humidity", "home/livingroom/humidity"))
print(correspond("home/+/humidity", "home/livingroom/temperature"))
print(correspond("home/#", "home/door/state"))
# Essayez le filtre home/kitchen avec le sujet home/kitchen/temperature.
Un message conservé attend l’abonné en retard
Un abonné ne reçoit que les messages publiés après son abonnement. Si le capteur ne publie qu’une fois par minute, il attend.
Un message conservé (retained) est gardé par le courtier. Le capteur de la cuisine en publie un : à l’abonnement, la réponse est immédiate. Le message suivant sur le même sujet remplace le précédent.
Lire un message conservé
docker exec broker mosquitto_sub -t home/kitchen/temperature -v -C 1 -W 3Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Publier un message : un exemple à lire
mosquitto_pub -t home/notes/exemple -r -m 'bonjour'
# -t : le sujet. -r : le message est conservé. -m : la charge utile.
# C’est un exemple à lire : la tâche du labo vous demande d’écrire le vôtre.
Une erreur fréquente
Attention
On croit souvent que # remplace un seul niveau, comme +. Il remplace tous les niveaux qui restent, quel que soit leur nombre. Utilisez + pour un niveau précis et # pour tout le reste d’une branche.