web-dev-qa-db-fra.com

MQTT quel est le but ou l'utilisation de Last Will Testament?

Il me manque sûrement quelque chose sur le fonctionnement de l'ensemble du protocole MQTT, car je ne peux pas comprendre le modèle d'utilisation des messages Last Will Testament: quel est leur but?
Un exemple que je vois souvent concerne le fait d'informer qu'un appareil est hors ligne. Cela n'a pas beaucoup de sens pour moi, car il est évident que si un appareil ne publie aucune donnée, il peut être hors ligne ou il peut y avoir des problèmes de réseau.

Alors, quels sont les usages pratiques du LWT? Pourquoi a-t-il été inventé?

32

Les messages LWT ne sont pas vraiment soucieux de détecter si un client s'est déconnecté ou non (cette tâche est gérée par les messages keepAlive). Les messages LWT concernent environ ce qui se passe après que le client se soit déconnecté.

L'analogie est celle d'un réel dernier testament: si une personne décède, elle peut formuler un testament, dans lequel elle déclare quelles actions doivent être prises après qu'elle nous a quittés. Un exécuteur testamentaire tiendra compte de ces souhaits et les exécutera en son nom. L'analogie dans le monde MQTT est qu'un client peut formuler un testament, dans lequel il déclare quel message doit être envoyé en son nom par le courtier, après sa mise hors ligne.

n exemple fictif:

J'ai un capteur, qui envoie des données cruciales, mais très rarement. Il a formulé une déclaration de dernier testament sous la forme de [rubrique: '/ node/gone-offline', message: ': id'], avec: id étant un identifiant unique pour le capteur. J'ai également un abonné d'urgence pour le sujet 'node/gone-offline', qui enverra un SMS sur mon téléphone chaque fois qu'un message est publié sur cette chaîne.

Pendant le fonctionnement normal, le capteur maintiendra la connexion au courtier MQTT ouverte en envoyant des messages keepAlive périodiques entrecoupés des lectures réelles du capteur. Si le capteur se déconnecte, la connexion au courtier expirera, en raison du manque de keepAlives.

C'est là qu'intervient le LWT: si aucun LWT n'est spécifié, le courtier s'en fiche et ferme simplement la connexion. Dans notre cas cependant, le courtier exécutera le dernier testament du capteur et publiera le message LWT '/ node/gone-offline:: id'. Le message sera ensuite consommé à mon abonné d'urgence et je serai informé de l'ID du capteur via SMS donc que je peux vérifier ce qui se passe.

En bref:

Au lieu de simplement fermer la connexion après la déconnexion d'un client, les messages LWT peuvent être utilisés pour définir un message à publier par le courtier au nom du client, car le client est hors ligne et ne peut plus publier.

67
lowi

Ce n'est pas parce qu'un appareil ne publie pas qu'il n'est pas en ligne ou qu'il y a un problème de réseau.

Prenons par exemple un capteur qui surveille une valeur qui ne change que très rarement, une bonne conception dit que le capteur ne devrait publier les modifications que pour réduire l'utilisation de la bande passante, car publier périodiquement la même valeur est un gaspillage. Si la valeur est publiée en tant que valeur conservée, tout nouvel abonné obtiendra toujours la valeur actuelle sans avoir à attendre que la valeur du capteur change et il la publiera à nouveau.

Dans ce cas, le LWT est utilisé pour publier lorsque le capteur tombe en panne (ou qu'il y a un problème de réseau), nous connaissons donc le problème dès que le client reste en vie.

10
hardillb

Un article détaillé sur les messages de dernière volonté et de testament est disponible dans la série d'articles de blog MQTT Essentials: http://www.hivemq.com/mqtt-essentials-part-9-last-will- et-testament / .

Pour résumer le billet de blog:

La fonction Dernière volonté et testament est utilisée dans MQTT pour informer les autres clients d'un client déconnecté sans grâce.

MQTT est souvent utilisé dans les scénarios où les réseaux peu fiables sont très courants. Par conséquent, il est supposé que certains clients se déconnecteront de manière disgracieuse de temps en temps, car ils ont perdu la connexion, la batterie est vide ou tout autre boîtier imaginable. Il serait bon de savoir si un client connecté s'est déconnecté correctement (ce qui signifie avec un message MQTT [~ # ~] déconnecter [~ # ~] ) ou non, afin de prendre les mesures appropriées.

8
Dominik Obermaier