如果在CONNECT期间客户端未提供clientID,VerneMQ1.10.3部署为容器的行为是什么?

问题描述

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

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

解决方法

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

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

使用空的ClientId并附带必须为CleanSession的条件-否则将拒绝连接:

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

(因为ClientId对于经纪人在会话中保持和恢复至关重要)

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