客户端:
使用MQTT的程序或设备。客户端始终与服务器建立网络连接。它可以
发布其他客户端可能感兴趣的应用消息。
订阅以请求对接收有兴趣的应用消息。
br />退订以删除对应用程序消息的请求。
与服务器断开连接。
如果此客户端订阅了应用程序消息,则服务器应该将这些消息转发到此特定客户端。
服务器:
充当中介之间发布程序消息的客户端的程序或设备。以及已订阅
的客户。服务器
接受客户端的网络连接。
接受客户端发布的应用程序消息。
处理客户端的订阅和取消订阅请求。
转发应用程序消息与客户端
订阅匹配的内容。大部分时间没有数据流吗?
我得出这个结论,因为如果客户端在订阅后断开连接,则服务器将无法转发消息给它,因为客户端应该建立连接。但是它不知道何时重新建立它。
#1 楼
这是否意味着如果客户端进行订阅,那么即使大多数时间没有数据流,订阅仍有效时,客户端仍会连接到服务器?
是的,一旦建立连接,客户端将等待消息,但是它还将根据keepalive值定期向服务器发送PING消息。如果服务器未收到PING消息,则它可能会断开您的连接。
如果客户端在订阅后断开连接,则服务器无法将消息转发给它,因为客户端应该建立连接。
如果客户端断开连接,是的,它将不会收到消息,但是MQTT中的某些功能可以解决此问题。
如果客户端通过将“清洁会话”标志设置为false连接到服务器,则服务器将记住该客户端ID的订阅。客户端重新连接后,无需重新订阅,因为服务器会记住它。
此外,您可以使用QoS级别1或2进行订阅。使用这些QoS级别,服务器将存储消息,并等待客户端重新连接后再发送。这样,即使客户端断开连接并重新连接,它们仍将收到所有已发布的消息。
该站点有一些很好的资源来解释MQTT协议。
#2 楼
这是否意味着如果客户端进行预订,那么即使大部分时间没有数据流,在订阅有效的情况下它仍保持与服务器的连接?是的,您的客户端将等待消息。
...如果客户端在订阅后断开连接,则服务器将无法转发消息
您必须管理断开连接(尤其是在电池供电的设备中)。这可以使用MQTT的“遗嘱”功能来完成:当设备断开连接时,它将发送一条最后一条消息。
#3 楼
您应该区分连接和会话。一切都由会话定义。首次向代理授权MQTT连接时,代理通常根据客户端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协议可以在带有gmqtt的python和带有mqtt.js的javascript中使用。