0

我们想了解当 Connect 请求中没有 clientID 并且客户端仅提供注册的用户名、密码、keepalive 会话为 0、连接超时为 60 X 60 X 1000 时 verneMQ 的行为

在这种情况下,会话是如何由 VerneMQ 管理的。如果在连接此类客户端时重新启动 VerneMQ,在客户端重新启动后,我们观察到客户端订阅的主题丢失。为什么会出现这种行为?

4

1 回答 1

1

省略ClientId连接时将使代理为该客户端生成一个唯一的 ID(如果允许)。来自 MQTT 规范:

服务器可以允许客户端提供长度为零字节的 ClientId,但是如果这样做,服务器必须将此视为特殊情况并为该客户端分配唯一的 ClientId。然后它必须处理 CONNECT 数据包,就好像客户端已经提供了唯一的 ClientId (Oasis MQTT)

使用空ClientId值的条件是它必须是CleanSession- 否则连接将被拒绝:

如果客户端提供一个零字节的 ClientId,客户端也必须将 CleanSession 设置为 1

(因为这ClientId对于代理在会话中持续和恢复至关重要)

由于代理将客户端的订阅(以及其他内容)存储在会话中,因此在使用空时您总是必须重新订阅所有主题ClientId,从而使用CleanSession=1

于 2020-08-18T10:02:46.403 回答