关于在MQTT中建立客户端-服务器连接的困惑


19

根据规范,始终应由客户端建立与服务器的连接。

客户:

使用MQTT的程序或设备。客户端始终与服务器建立网络连接。它可以

  • 发布其他客户端可能感兴趣的应用程序消息。

  • 订阅以请求有兴趣接收的应用程序消息。

  • 退订以删除对应用程序消息的请求。

  • 与服务器断开连接。

并且,如果此客户端订阅了应用程序消息,则服务器应将这些消息转发到此特定客户端。

服务器:

一种程序或设备,充当发布应用程序消息的客户端和进行订阅的客户端之间的中介。服务器

  • 接受来自客户端的网络连接。

  • 接受客户发布的应用程序消息。

  • 处理来自客户端的订阅和取消订阅请求。

  • 转发与客户端订阅匹配的应用程序消息

这是否意味着如果客户端进行预订,那么即使大部分时间没有数据流,在预订有效的情况下它仍保持与服务器的连接?

我得出这个结论是因为,如果客户端在订阅后断开连接,则服务器无法将消息转发给它,因为客户端应该建立连接。但是它不知道何时重新建立它。

Answers:


11

这是否意味着如果客户端进行预订,那么即使大部分时间没有数据流,在预订有效的情况下它仍保持与服务器的连接?

是的,一旦建立连接,客户端将等待消息,但是它还将根据keepalive值定期向服务器发送PING消息。如果服务器未收到PING消息,则可能会断开您的连接。

如果客户端在订阅后断开连接,则服务器无法向其转发消息,因为客户端应建立连接。

如果客户端断开连接,则是,它将不会收到消息,但是MQTT中的某些功能可以解决此问题。

如果客户端在“清洁会话”标志设置为false的情况下连接到服务器,则服务器将记住该客户端ID的订阅。客户端重新连接后,无需重新订阅,因为服务器会记住它。

此外,您可以使用QoS级别1或2进行订阅。使用这些QoS级别,服务器将存储消息并等待客户端重新连接后再发送消息。这样,即使客户端断开连接并重新连接,他们仍然会收到所有已发布的消息。

这个站点有一些很好的资源来解释MQTT协议。


9

这是否意味着如果客户端进行预订,那么即使大部分时间没有数据流,在预订有效的情况下它仍保持与服务器的连接?

是的,您的客户将等待消息。

...如果客户端在订阅后断开连接,则服务器无法转发消息

您必须管理断开连接(尤其是在电池供电的设备中)。这可以使用MQTT 的“ 最后遗嘱 ”功能来完成:当设备断开连接时,它将发送最后一条消息。


1

您应该区分连接和会话。

一切都由会话定义。首次向代理授权MQTT连接时,代理通常基于client-id连接参数为该连接创建会话。

在连接期间的MQTT 3.1.1协议(大多数客户机/代理中当前缺省)中,您可以指定clean = true或clean = false标志。如果clean = true,则代理将自动创建新会话,并在断开/关闭连接时将其关闭。如果clean = false,则即使客户端断开连接,代理也将维护会话并向其中传递事件(进入某种会话存储)。它是否完全允许clean = false会话以及该会话的最大ttl取决于经纪人的实现。

在MQTT 5.0协议中(非常新鲜,但是很透视),可以从客户端指定会话ttl,甚至可以在建立连接后对其进行更改。这对于不稳定的WAN连接(主要是IoT)或如上所述的状态连接非常有用。

从客户端角度来看,AFAIK当前从客户端角度来看的MQTT 5.0协议可以在python和gmqtt中使用,在javascript和mqtt.js中使用

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.