MQTT客户端多久检查一次新消息



我对MQTT客户端如何接收新消息有点困惑。MQTT客户端多久轮询一次新到达的消息?对于我们的应用程序,我们希望将MQTT设备连接到AWS物联网核心,并在几天内不断检查消息。但我们希望减少用于检查新消息的蜂窝数据量。比方说,我们只想每5分钟检查一次新消息。我需要更改哪个MQTT参数?

我知道MQTT客户端不使用轮询来检查新消息,但如果客户端处于联机状态,MQTT代理会将消息转发给客户端。但是在客户端接收消息时必须有某种持续的检查,我说得对吗?

我们知道,客户端在保持活动超时结束之前发送一个PINGREQ数据包,让代理知道它仍然活动。客户端是否在此ping过程中检查新消息?

首先,您必须了解MQTT使用发布-订阅消息传递模式,而不使用请求/响应。因此,在客户端,您不需要询问特定的数据,可以定义何时以及多久询问一次。相反,一旦您订阅的特定主题有更新,您就会自动得到通知。

因此,控制消息流的正确方法是在发布网站上完成的——如果你只想每5分钟发布一条消息,那么它应该只在这个时间间隔内发布。

如果你的发布客户端出于正当理由每秒发布一个主题,但你的订阅者仍然希望每5分钟检查一次,那么事情就会变得越来越困难。在这种情况下,我认为最干净的方法是取消订阅该主题,并在您想要更新时重新订阅,或者在一段时间后断开连接并重新连接。

在技术站点上,通常有一个阻塞通信线程在等待传入消息,一旦有传入消息,它就会立即调用一些回调。但是也有一些客户端实现可以让您有机会手动执行网络操作。该线程还处理发送PINGREQ和接收PINGRESP,但它会独立地注意到传入订阅(您也可以使用0的keepalive禁用ping,但仍然可以获得订阅(。

也就是说,停止/重新启动通信线程来控制消息流不是一个好主意,因为这会阻止所有包的处理,并将导致代理由于缺少PINGREQ的而断开您的客户端连接

MQTT协议已经设计用于低带宽-只要设备连接(定期发送PINGREQ(,就会通过TCP流发布新消息。客户端没有轮询新消息。只要您的蜂窝网络提供商允许您保持TCP连接打开,PINGREQ的发送频率就可以降低。

或者,可以考虑使用AWS IoT设备阴影,这是一项可以帮助实现设备虚拟表示的服务,其工作方式更接近您所描述的内容-您的设备可以独立于更新本身轮询该服务以获取状态更新。轮询可以使用MQTT或HTTP/REST来完成。

您必须进行一些实验,以找出在带宽方面哪个选项更适合您的用例。

最新更新