0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

MQTT の Will メッセージを使うシナリオ

Posted at

概要

クライアントが切断されると、関連する加入者に意志メッセージが送信されます。意志メッセージは次の場合に送信されます。

  • サーバー上で I/O エラーまたはネットワーク障害が発生しました。
  • クライアントは、定義されたハートビート期間中に接続を失います。
  • クライアントは、オフライン パケットを送信する前にネットワーク接続を閉じます。
  • サーバーは、オフライン パケットを受信する前にネットワーク接続を閉じます。

通常、Will メッセージはクライアントの接続時に指定されます。以下のように、接続時にインスタンスsetWillのメソッドを呼び出すことで設定されますMqttConnectOptions。以下のTopicを購読しているクライアントは、Will メッセージを受け取ります。

//method1 
MqttConnectOptions.setWill(MqttTopic topic, byte[] payload, int qos, boolean retained)
//method2 
MqttConnectOptions.setWill(java.lang.String topic, byte[] payload, int qos, boolean retained)

使用シナリオ

クライアント A が接続すると、Will メッセージは「オフライン」に設定され、クライアント B はこのウィル Topicにサブスクライブします。A が異常に切断すると、クライアント B はこの「オフライン」メッセージを受け取り、クライアント A がオフラインであることを知ります。

接続フラグパケットフィールド

Bit 7 6 5 4 2 1 0
User Name Flag Password Flag Will Retain Will QoS Will Flag Clean Start Reserved
byte 8 X X X X X X X

クライアントが通常どおり切断メソッドを呼び出した後は、Will メッセージは送信されません。

フラグ機能を発揮します

つまり、依頼者があらかじめ定め、異常切断時に残した最後のLast Will書(Last Will書とも呼ばれます)です。これは、クライアントによって事前に定義されたTopicおよび対応するメッセージであり、CONNECT の可変パケット ヘッダーに添付されます。クライアントの接続が異常な場合、サーバーはこのメッセージを積極的に発行します。

Will Flag のビットが 1 の場合、Will QoS と Will Retain が読み出されます。このとき、Will Topic と Will Message の具体的な内容がメッセージ本文に表示されます。それ以外の場合、Will QoS と Will Retain は無視されます。

Will Flag ビットが 0 の場合、Will Qos および Will Retain は無効になります。

コマンドラインの例

Will メッセージの例は次のとおりです。

  1. Sub 側 ClientID = sub が事前に定義されたメッセージが表示されます:

    mosquitto_sub --will-topic test --will-payload die --will-qos 2 -t topic -i sub -h 192.168.1.1
    
  2. clientid = alive は 192.168.1.1 (EMQ サーバー) で will Topicにサブスクライブします

    mosquitto_sub -t test -i alive -q 2 -h 192.168.1.1
    
  3. サブエンドがサーバー エンド (EMQ サーバー) から異常に切断され、パブ エンドが will メッセージを受信します。

高度な使用シナリオ

ここでは、Will メッセージで Retained メッセージを使用する方法を説明します。

  1. クライアントAのLast Will メッセージは「オフライン」に設定され、Last WillのTopicは A/status通常の送信状態のTopicと同じに設定されます。
  2. クライアント A が接続されたら、「オンライン」Retained メッセージをTopicA/statusに送信します。他のクライアントがTopicA/statusにサブスクライブすると、保持されたメッセージを「オンライン」として取得します。
  3. クライアント A が異常に切断すると、システムはTopicA/statusに「オフライン」メッセージを自動的に送信します。このTopicにサブスクライブする他のクライアントは、すぐに「オフライン」メッセージを受信します。Will メッセージが「Retained」に設定されており、Topicにサブスクライブしている新しいクライアントがA/statusオンラインになると、取得されるメッセージは「オフライン」になります。
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?