38

Last Will Testamentメッセージの使用パターンを把握できないため、MQTTプロトコル全体がどのように機能するかについて何かが欠けていることは確かです.メッセージの目的は何ですか?
私がよく目にする 1 つの例は、デバイスがオフラインになったことを通知することです。デバイスがデータを公開していない場合、デバイスがオフラインであるか、ネットワークに問題がある可能性があることは明らかなので、私にはあまり意味がありません。

では、LWT の実用的な用途にはどのようなものがあるでしょうか。それは何のために発明されたのですか?

4

3 に答える 3

88

LWT メッセージは、クライアントがオフラインになったかどうかを検出することにはあまり関心がありません (そのタスクは keepAlive メッセージによって処理されます)。LWT メッセージは、クライアントがオフラインになった後に何が起こるかについてのものです。

類推は、本当の最後の意志のそれです: 人が死んだ場合、彼女は死んだ後に取るべき行動を宣言する遺言を作成することができます. 遺言執行者は、その願いに耳を傾け、彼女に代わって執行します。MQTT の世界で例えると、クライアントは、オフラインになった後、ブローカによって代理で送信されるメッセージを宣言する証書を作成できるということです。

架空の例:

重要なデータを送信するセンサーがありますが、非常にまれです。[トピック: '/node/gone-offline', メッセージ: ':id'] の形式で最後の意志ステートメントを定式化しました。:id はセンサーの一意の ID です。また、トピック「node/gone-offline」の緊急サブスクライバーも持っています。これは、そのチャネルでメッセージが公開されるたびに、私の電話に SMS を送信します。

通常の動作中、センサーは、実際のセンサーの読み取り値が散在する定期的な keepAlive メッセージを送信することにより、MQTT ブローカーへの接続を開いたままにします。センサーがオフラインになると、キープアライブがないため、ブローカーへの接続がタイムアウトします。

ここで LWT の出番です。LWT が指定されていない場合、ブローカーは気にせず、単に接続を閉じます。ただし、この場合、ブローカーはセンサーの最後の意志を実行し、LWT メッセージ「/node/gone-offline: :id」を発行します。その後、メッセージは私の緊急サブスクライバーに消費され、SMS 経由でセンサーの ID が通知されるので、何が起こっているのかを確認できます。

要するに:

クライアントがオフラインになり、それ以上発行できないため、クライアントがオフラインになった後に単に接続を閉じる代わりに、LWT メッセージを利用して、クライアントに代わってブローカーによって発行されるメッセージを定義できます。

于 2013-06-29T22:30:43.343 に答える
11

デバイスが公開されていないからといって、デバイスがオンラインではない、またはネットワークに問題があるとは限りません。

ごくまれにしか変化しない値を監視するセンサーを例にとると、同じ値を定期的に公開するのは無駄なので、帯域幅の使用量を減らすために、センサーは変更のみを公開するように設計されています。値が保持値として公開されている場合、新しいサブスクライバーは常に現在の値を取得し、センサー値が変更されて再度公開されるのを待つ必要はありません。

この場合、LWT はセンサーに障害が発生したとき (またはネットワークの問題があるとき) に発行されるため、クライアントのキープアライブがタイムアウトするとすぐに問題を認識できます。

于 2013-06-24T08:26:50.070 に答える
8

A in-depth article about Last-Will-and-Testament messages is available in the MQTT Essentials Blog Post series: http://www.hivemq.com/mqtt-essentials-part-9-last-will-and-testament/.

To summarize the blog post:

The Last Will and Testament feature is used in MQTT to notify other clients about an ungracefully disconnected client.

MQTT is often used in scenarios were unreliable networks are very common. Therefore it is assumed that some clients will disconnect ungracefully from time to time, because they lost the connection, the battery is empty or any other imaginable case. It would be good to know if a connected client has disconnected gracefully (which means with a MQTT DISCONNECT message) or not, in order to take appropriate action.

于 2015-03-20T00:44:59.900 に答える