我正在从事一个涉及数千个MQTT客户端的物联网项目,这些客户端通过4G / WiFi路由器/调制解调器连接到代理(mosquitto)。不到10个客户端连接到同一台路由器,并且这些路由器来自不同的地方(不同的城市)。

目前,我们的客户端很少,它们始终连接到代理。从这次讨论中,我知道即使它们增长到1000+单元也不会有问题。

我的问题是关于4G连接的流量负载。最终用户担心在打开并不使用所有这些“通道”的情况下的数据消耗。在MQTT文档中确定。

当没有发布数据包时,我可以假设流量可以忽略不计吗?

#1 楼

MQTT规范列出了构成保持活动事务的PINGREQ和PINGRESP数据包的详细信息。

每个大小只有2个字节,因此完整的保持活动事件总共使用4个字节。由于您可以根据需要知道连接断开的速度来控制每个客户端发送保持活动数据包的频率,因此您可以完全控制没有实际发布消息时使用了多少数据。

如果要进一步减少数据负载,可以在运行10G设备所连接的4G路由器之前,先运行一个单独的代理,然后将其桥接到中央代理。这样可以将保持活动数据包的数量减少到每个4G路由器1个,而不是每个客户端1个。这样做的好处是,如果链接断开,则10个本地设备可以继续在彼此之间传递消息,并且您可以使用保留的消息/最后的遗嘱和遗嘱消息来跟踪各个客户端何时断开。

评论


使用中介经纪人是一个很好的建议,即使我担心它不适用于这种特定情况。有用,但是!

–马克
18年6月5日在6:50

无论如何,我知道PINGREQ / RESP的行为,但是我没有发现的是它们是在没有实际活动(即由用户应用程序发起)时交换的唯一数据包。我可以从您的答案中推断出这一点,但是文档似乎并未明确说明这一点。

–马克
18年6月5日在6:53

每次接收到数据包时,都会重置“保持活动状态”计时器,我不记得在规范中这是什么意思

– hardillb
18 Jun 5'在6:55



只是想指出,如果我们不谈论每条消息2个字节,但引入本地代理的建议更有意义,但是由于TCP / IP,它更像是每条消息42个字节,因此它在一个ping周期中为84个字节。

– xwoker
18年6月5日在8:08



@Mark下表后面的句子暗示了如果没有发送消息则仅发送Ping数据包这一事实:docs.oasis-open.org/mqtt/mqtt/v3.1.1/os/…

– hardillb
18年6月5日在12:09