【问题标题】:Mqtt Client: get Retained Message after SubscribingMqtt 客户端:订阅后获取保留消息
【发布时间】:2019-11-13 15:16:40
【问题描述】:

我正在通过Maven 使用最新的 Paho 版本。

<dependency>
    <groupId>org.eclipse.paho</groupId>
    <artifactId>org.eclipse.paho.client.mqttv3</artifactId>
    <version>1.2.2</version>
</dependency>

我使用

创建客户端
MqttClient client = new MqttClient("tcp://localhost", MqttClient.generateClientId());
MqttConnectOptions options = new MqttConnectOptions();
options.setMaxInflight(1000);
options.setAutomaticReconnect(true);

然后我订阅一个主题如下:

    client.setCallback(new Callback());
    client.connect();
    client.subscribe(topic);

另一个 mqtt 客户端使用

发布关于该主题的消息
MqttMessage message = new MqttMessage(byteStream);
message.setRetained(true);

使用保留标志,我希望一旦我订阅,我的回调就会被调用。不幸的是,如果在订阅执行之前发送了消息,则不会调用订阅回调。 如何获得留存价值?

【问题讨论】:

    标签: java mqtt paho


    【解决方案1】:

    我认为您使用的是 QOS=0。 QOS=0 和 reserved_flag=true 时可能未保存保留消息。

    更多详情:

    Reference link:

    部分(3.3.1.3 保留):
    如果 RETAIN 标志设置为 1,在客户端发送给服务器的 PUBLISH 数据包中,服务器必须存储应用程序消息及其 QoS,以便可以将其传递给订阅匹配其主题名称的未来订阅者 [MQTT- 3.3.1-5]。建立新订阅时,必须将每个匹配主题名称上的最后保留消息(如果有)发送给订阅者 [MQTT-3.3.1-6]。

    如果服务器接收到 RETAIN 标志设置为 1 的 QoS 0 消息,它必须丢弃之前为该主题保留的任何消息。它应该将新的 QoS 0 消息存储为该主题的新保留消息,但可以选择随时丢弃它 - 如果发生这种情况,该主题将没有保留消息 [MQTT-3.3.1-7]。有关存储状态的更多信息,请参阅第 4.1 节。

    总结:
    您可以使用 QOS>0 来解决您的问题。

    【讨论】:

    • QOS 对保留的消息并没有真正的影响。保留标志设置为 true 的最后一条消息将始终在客户端订阅主题时传递给客户端,而不管 QOS。 QOS 唯一会影响的是,如果消息在客户端之前在网络上丢失,在 QOS > 0 时,代理会再次发送它。
    【解决方案2】:

    不幸的是,如果在订阅执行之前发送了消息,则不会调用订阅回调。如何获得保留值?

    在这种情况下,发布者(一个客户端)发出消息,立即断开与MQTT代理(服务器)的连接,然后订阅者(另一个客户端)连接到具有相同主题的服务器,没有最后将消息,发布的消息不可能传递给您的订阅者。

    在 paho 中会有选项来启用 last will message,方法是设置:

    • 将标记
    • 将保留标志
    • 将主题
    • 将消息(将有效负载)
    • 在 PUBLISH 控制包中保留标志(与将保留标志不同)

    当发布者发送带有主题的消息时设置所有这些,即使发布者关闭网络连接,发送的消息也会保留在MQTT代理上。稍后当任何订阅者(另一个客户端)连接到具有相同主题的代理时,保留的消息将从代理发送到订阅者。

    另外请注意,PUBLISH 控制数据包的 QoS 字段仅用于确保在 MQTT 发布者和 MQTT 代理(服务器)之间完成交付(在不同级别),而不是在 MQTT 发布者和订阅者(​​2 个客户端)之间。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多