Comment un capteur prévient-il un téléphone ?
Un capteur de porte, un thermomètre et ton téléphone sont trois appareils différents. Le capteur n'a pas à savoir que ton téléphone existe, et le téléphone n'a pas à demander sans cesse. Un petit système de messagerie, MQTT, règle cela : les appareils déposent leurs messages chez un intermédiaire, et ceux que cela intéresse viennent les prendre.
À la fin de cette leçon
Remarque
Je peux lire les messages que des appareils publient sur un courtier MQTT, grâce aux sujets.
Mots clés
- Courtier (broker) : l'intermédiaire qui reçoit chaque message et le transmet.
- Publier : envoyer un message au courtier, avec un sujet comme étiquette.
- S'abonner : dire au courtier quels sujets tu veux entendre.
- Sujet (topic) : l'étiquette d'un message, écrite comme un chemin, par exemple
home/door/state. - Message retenu (retained) : le dernier message d'un sujet, que le courtier garde et donne à qui s'abonne plus tard.
- Joker (wildcard) : un symbole d'abonnement qui correspond à plusieurs sujets.
Pour commencer : ce que tu sais déjà
Remarque
Réponds dans ta tête. 1. De quoi est fait le chemin /home/kim/notes.txt ? 2. Quand tu postes une lettre, as-tu besoin de savoir qui la lira ? 3. Que représente le * dans *.txt quand tu listes des fichiers ? Tu vas retrouver ces trois idées dans cette leçon. Réponses : des noms de dossiers et un fichier, séparés par des barres obliques ; non, il suffit de l'adresse ; n'importe quels caractères.
Avant de commencer
Remarque
Appuie sur Démarrer le lab dans la barre en haut de la leçon et attends qu'il indique qu'il est en marche. Il y a deux conteneurs : sensors, qui publie sans arrêt, et broker, qui transmet les messages. Rien ne s'ouvre dans un navigateur, alors sers-toi du terminal, où docker exec broker lance une commande à l'intérieur du courtier. Chaque bouton Exécuter ci-dessous tape sa commande dans le terminal de ton lab, l'une après l'autre, dans la même session. Pour suivre les commandes ou taper les tiennes, appuie sur Ouvrir le terminal (nouvel onglet) dans la barre.
Un abonné entend ce qui est publié
Cette commande s'abonne à home/#, c'est-à-dire à tous les sujets sous home. -v affiche le sujet avant chaque message, -C 8 s'arrête après 8 messages et -W 10 après 10 secondes : elle se termine donc toujours. Chaque ligne est un sujet, une espace et une valeur. Tu verras les quatre sujets des capteurs : les deux températures et l'humidité sont des nombres entiers, et l'état de la porte est open ou closed. Les premières lignes à arriver sont des messages retenus, dont tu verras la raison plus bas. Les nombres exacts dépendent de la seconde où tu as appuyé sur Exécuter : les tiens seront différents.
docker exec broker mosquitto_sub -t 'home/#' -v -C 8 -W 10Affiché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.
Un sujet est un chemin, et un joker en désigne une partie
Les sujets s'écrivent niveau par niveau, comme des dossiers. # correspond à tous les niveaux en dessous, comme tu viens de le faire. + correspond à exactement un niveau. Ainsi home/+/temperature correspond à la température de n'importe quelle pièce : trois lignes, chacune commençant par home/kitchen/temperature ou home/livingroom/temperature et finissant par un nombre entier. L'humidité et la porte ne s'affichent pas, car elles ne correspondent pas au motif.
docker exec broker mosquitto_sub -t 'home/+/temperature' -v -C 3 -W 10Affiché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.
Un message retenu attend l'abonné en retard
Celle-ci écoute la porte et ne veut qu'un message. Elle répond tout de suite, une ligne, home/door/state suivi de open ou de closed, parce que le capteur de porte marque ses messages comme retenus : le courtier garde le dernier et le donne à quiconque s'abonne. Compare maintenant avec l'humidité, qui n'est pas retenue. Un nouvel abonné n'entend rien tant que le capteur n'a pas publié de nouveau : la réponse peut donc prendre jusqu'à une seconde de plus, puis c'est une ligne avec un nombre entier.
docker exec broker mosquitto_sub -t home/door/state -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.
docker exec broker mosquitto_sub -t home/livingroom/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.
Vérifie
Astuce
Pourquoi la porte a-t-elle répondu tout de suite alors que l'humidité a attendu ? Réponse : les messages de la porte sont retenus, donc le courtier détenait déjà le dernier, alors que l'humidité n'est transmise qu'au moment où elle est publiée.
Toi aussi, tu peux publier
Quiconque peut joindre le courtier peut publier. Cette commande publie hello from me sur un sujet à toi, home/notes/first, et -r le rend retenu. Elle n'affiche rien. Relis-le ensuite : la réponse est exactement home/notes/first hello from me, à chaque fois, parce que le tien est le dernier message de ce sujet.
docker exec broker mosquitto_pub -t home/notes/first -r -m 'hello from me'Affiché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.
docker exec broker mosquitto_sub -t home/notes/first -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.
Une erreur fréquente
Attention
Beaucoup pensent qu'un abonné demande une mesure au capteur. Ce n'est pas le cas. Le capteur publie quand il veut, et le courtier ne transmet le message qu'à ceux qui sont abonnés à ce moment-là : c'est la raison d'être du message retenu. Et « retenu » ne veut pas dire « gardé pour toujours » : le message suivant sur ce sujet le remplace, et le courtier de ce lab oublie tout quand il s'arrête.
Ce que ce lab laisse de côté
Un vrai appareil se connecte à un courtier à travers un réseau. Il s'identifie avec un nom et un mot de passe ou un certificat, et la connexion est chiffrée, pour que personne en chemin ne puisse lire ou modifier les messages. Ce lab laisse tout cela de côté : le courtier laisse n'importe qui, dans ta copie, tout lire et tout écrire. C'est sans danger ici uniquement parce que rien en dehors de ta copie ne peut l'atteindre. N'installe pas un vrai courtier de cette façon.
Vérification finale
Astuce
Réponds sans revenir en arrière. 1. À qui un capteur envoie-t-il son message ? 2. Qu'est-ce qu'un sujet ? 3. Que désigne home/+/temperature, et que désigne home/# ? 4. Que fait un message retenu ? Réponses : au courtier, jamais directement à un abonné ; l'étiquette d'un message, écrite comme un chemin ; la température d'une seule pièce quelconque, et tous les sujets sous home ; le courtier garde le dernier et le donne à qui s'abonne plus tard.
Pour les enseignants
Astuce
Cette leçon est un petit exemple de leçon travaillée dans un lab : les étapes et les boutons Exécuter sont la leçon, et le lab est la copie de chaque élève. Le lab est fait de deux conteneurs sur un même réseau, un courtier MQTT standard et un script de capteurs imaginaires, et rien ici ne se corrige tout seul : l'élève rend les commandes qu'il a lancées avec ce qu'elles ont affiché, et une phrase sur l'utilité d'un message retenu. Points clés : 1. Un courtier se place entre ceux qui publient et ceux qui s'abonnent. 2. Un sujet est un chemin, et + et # sont des jokers. 3. Un message retenu est le dernier, gardé pour les abonnés tardifs. Erreur fréquente : croire qu'un abonné demande une valeur au capteur. Matériel : le lab et son terminal. Conseil : demandez aux élèves de prévoir combien de lignes un joker affichera avant de lancer la commande. Les mesures suivent un cycle fixe, mais où il en est dépend du moment où l'élève appuie sur Exécuter : deux élèves voient donc des nombres différents. Le lab laisse de côté l'identification et le chiffrement qu'exige un vrai réseau, ce qui fait une bonne question à poser à la classe.