Mqtt客户端:订阅后获得保留的消息

我正在通过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);

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

yegenting2 回答:Mqtt客户端:订阅后获得保留的消息

我认为您正在使用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 解决问题。

,
  

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

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

paho中有一些选项可以通过设置来启用最后的消息

  • 将标记
  • 将保留标志
  • 意志主题
  • 遗嘱消息(遗留有效载荷)
  • 在发布控制包中保留标志(与将保留标志不同)

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

还请注意,PUBLISH控制包的QoS字段仅用于确保在MQTT发布者和MQTT代理(服务器)之间完成传递(在不同级别),而不是在MQTT发布者和订户(两个客户端)之间进行传递。

本文链接:https://www.f2er.com/3108926.html

大家都在问