数据包的第一个字段是
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