在MQTT中,客户端使用CONNECT消息启动连接。



数据包的第一个字段是clientId


客户端标识符(简称ClientId)是连接到MQTT代理的每个MQTT客户端的标识符。正如标识符一词已经暗示的那样,每个经纪人应该是唯一的。代理使用它来识别客户端和客户端的当前状态。 (图像和报价均从此处获取。)现在让我们说我有两个客户端,在以下情况下为客户端X和Y。


经纪人启动,尚无客户。
X成功连接到具有client-1 id,用户名为X的代理。
现在,Y尝试使用client-1作为id,用户名为Y进行连接。

会发生什么?


基于clientId,代理会认为X执行了一次重复连接尝试,这是异常行为。
不会发生任何异常情况。 Y使用不同的用户名成功连接。
不会发生任何异常情况。由于给定的clientId已在使用中,代理将拒绝Y连接尝试。


#1 楼

如果clientid相同,则在MQTT中,规范要求您必须将它们视为同一客户端!
可能应该使用Id连接q,并断开X

此部分来自文档:


如果验证成功,则服务器将执行以下步骤。


如果ClientId代表已经连接到的客户端服务器,然后服务器必须断开现有客户端的连接
[MQTT-3.1.4-2]。
服务器必须执行3.1.2.4 [MQTT-3.1.4]部分所述的CleanSession处理。 -3]。
服务器必须使用包含零返回码[MQTT-3.1.4-4]的CONNACK数据包确认CONNECT数据包。
开始消息传递并保持活动监视。



有关详细信息,请查阅此文档。

评论


这似乎是正确的答案,但是链接和引用规范的相关部分可能会有所帮助(关键部分是“如果ClientId代表已经连接到服务器的客户端,则服务器必须断开现有客户端的连接”)

–Aurora0001♦
16 Dec 29'9:57

我以某种方式忽略了这一部分,但这令人惊讶。有害的客户可以迫使经纪人断开与其他客户的连接吗?

– Bence Kaulics
16 Dec 29'在10:07