新连接的客户端如何在 AWS IOT 中获取旧消息

How does a newly connected client get old messages in AWS IOT

非常简单的场景。

一条消息发布在一个主题上(由主设备),当前没有客户端订阅该主题。 我希望发布的消息可以有一个自定义的到期时间。

所以说在这个到期时间内,客户端现在连接到这个主题。 该客户端将如何接收之前发布的消息?

我希望得到的答案是什么,如果可能的话,AWS IOT 提供了什么来实现同样的目标。

使用任何标准 MQTT 代理

您应该使用 clean_session 标记为 False 将客户端与代理连接,以便在此之后代理将自行维护您的状态。

参考这个:- https://www.hivemq.com/blog/mqtt-essentials-part-7-persistent-session-queuing-messages/

This document will fulfill your all queries.

注意:

根据标准 MQTT 规范,MQTT 代理应遵循上述规则,但 AWS-IoT 代理不遵循此规则。

AWS-IoT 消息代理不支持持久会话(在 cleanSession 标志设置为 false 的情况下建立的连接)。 AWS IoT 消息代理假定所有会话都是干净的会话,并且消息不会跨会话存储。如果 MQTT 客户端尝试连接到 cleanSession 设置为 false 的 AWS IoT 消息代理,客户端将断开连接。

可能的解决方案:

AWS-IoT 使用 DeviceShaddow 功能提供类似于 cleansession 标志的东西。 AWS Device Shadows

总的来说,@sanket的上述回答是正确的,有一处变化如下:

目前,AWS IoT 支持 MQTT 持久会话。请参阅以下来自 AWS 的相关片段。

“持久会话存储订阅信息和待处理的服务质量 (QoS) 1 消息,以防您的设备断开连接。当设备重新连接时,其持久会话恢复并且其订阅自动恢复。此外,任何存储的消息都交付。

此外,“持久会话的默认有效期为一小时。有效期从消息代理检测到客户端断开连接(MQTT 断开连接或超时)时开始。”

参考 -

IOT Core Message Broker 支持Persistent session expiry period. By default如果会话断开,与会话关联的消息将存储 1 小时

The duration for which the message broker stores an MQTT persistent session. The expiry period begins when the message broker detects the session has become disconnected. After the expiry period has elapsed, the message broker terminates the session and discards any associated queued messages. You can adjust this to a value from 1 hour to 7 days by using the standard limit increase process.