Mqtt 如果客户端在连接期间未提供clientID,则VerneMQ(1.10.3部署为容器)的行为是什么?

Mqtt 如果客户端在连接期间未提供clientID,则VerneMQ(1.10.3部署为容器)的行为是什么?,mqtt,mqtt-vernemq,Mqtt,Mqtt Vernemq,我们希望了解verneMQ在以下情况下的行为: 连接请求中没有clientID,客户端只提供注册的用户名、密码、保持会话为0、连接超时为60 X 60 X 1000 在此场景中,VerneMQ如何管理会话。如果在连接该cleint时重新启动VerneMQ,在客户端重新启动后,我们观察到客户端的订阅主题丢失。为什么会出现这种行为?在连接时省略ClientId将使代理为此客户端生成唯一的id(如果允许)。根据MQTT规范: 服务器可能允许客户端提供长度为零字节的ClientId,但如果这样做,服务器

我们希望了解verneMQ在以下情况下的行为: 连接请求中没有clientID,客户端只提供注册的用户名、密码、保持会话为0、连接超时为60 X 60 X 1000


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

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

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

使用空的
ClientId
时,必须使用
CleanSession
-否则将拒绝连接:

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

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


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

感谢奥德修斯提供更快的响应。是的,我们从这篇文章中的MQTT规范中了解到,VerneMQ实现行为是什么,因为它是非规范性要求。@关于您的描述,VerneMQ代理似乎遵循MQTT规范:因为您省略了
ClientId
,它必须是
CleanSession
。因此,在重新连接之前会话的所有内容(如订阅)时,都将被丢弃。也许你必须澄清什么还不清楚。