繁体   English   中英

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

[英]Mqtt Client: get Retained Message after Subscribing

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

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

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

更多细节:

参考链接:

部分(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]。 有关存储 state 的更多信息,请参见第 4.1 节。

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

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

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

paho 中会有选项通过设置启用最后遗嘱消息

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM