0

この記事を参考にして、QoS1 と QoS2 のメッセージの違いはわかると思いますが、両方を Paho MQTT クライアントとして扱う場合の違いはわかりません。

次のようなトピックにサブスクライブするとします。

MqttClient subscriber = new MqttClient(SERVER_URI, SUBSCRIBER_ID);
subscriber.subscribe(TOPIC);

そして、次のようなメッセージを公開しています。

publisher.publish(TOPIC, PAYLOAD, 1, false);

現時点では、MqttCallback インターフェースを使用して、サブスクライバーに届くメッセージを処理しています。

オーバーライドする方法があります:

public void messageArrived(String topic, MqttMessage mqttMessage) {
    if(mqttMessage.isDuplicate()) {
        // is it really the duplicate message from my perspective?
    } else {...}
}

MqttMessage で isDuplicate() メソッドを見つけることができますが、true を返す mqttMessage がサブスクライバーが受信した最初のメッセージではないことをどのように確認できますか?

QoS1 の処理方法を示すソリューションを見つけることに非常に興味がありますが、ここで何かを明確にするすべての回答をいただければ幸いです。

クラクフからよろしく!

4

1 に答える 1

2

最初のメッセージを見逃す可能性があるため、重複フラグに頼るだけでは十分ではありません。QoS 1 メッセージがべき等でない場合、重複検出を行う方法をいくつか提案します。

  • ペイロード + トピックをハッシュし、最後の X メッセージとそのハッシュを含むテーブルを用意して、そのメッセージを既に受信したかどうかを確認できるようにします
  • ペイロードに一意の ID があり、最後の X メッセージとその ID を使用できるテーブルがある
  • ペイロードにタイムスタンプがあり、最後の X メッセージとそのタイムスタンプが利用可能なテーブルがある

メッセージが 1 回だけ確実に届くようにする必要がある場合は、QoS 2 を使用できます。QoS 1 は、クライアントが重複を処理できることを意味します (重複メッセージを無視するか、メッセージがべき等であることにより)。

于 2015-07-15T11:05:49.767 に答える