在 MQTT 网络中,以下连接场景会产生什么结果?

物联网 MQTT
2021-06-01 03:42:43

在 MQTT 中,客户端通过 CONNECT 消息发起连接。

MQTT 连接包参数

数据包的第一个字段是clientId

客户端标识符(简称 ClientId)是每个连接到 MQTT 代理的 MQTT 客户端的标识符。正如标识符这个词已经暗示的那样,它应该是每个经纪人唯一的。经纪人使用它来识别客户端和客户端的当前状态。(图片和引用取自这里。)

现在假设在以下情况下我有两个客户端,客户端 X 和 Y。

  1. 经纪人推出,还没有客户。
  2. X 成功连接到具有client-1id的代理,用户名是X
  3. 现在,Y 尝试使用client-1id进行连接,用户名是Y

会发生什么?

  1. Broker 会根据clientId 认为X 进行了重复的连接尝试,属于异常行为
  2. 不会发生任何非凡的事情。Y 连接成功,因为它使用了不同的 username
  3. 不会发生任何非凡的事情。券商将拒绝Ÿ连接尝试为给定的clientId已在使用。
1个回答

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

这部分来自文档:

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

  1. 如果 ClientId 代表已经连接到服务器的客户端,那么服务器必须断开现有的客户端 [MQTT-3.1.4-2]。

  2. 服务器必须执行第 3.1.2.4 节 [MQTT-3.1.4-3] 中描述的 CleanSession 处理。

  3. 服务器必须使用包含零返回码 [MQTT-3.1.4-4] 的 CONNACK 数据包确认 CONNECT 数据包。

  4. 启动消息传递并保持活动监控。

查看此文档以获取更多详细信息。