¿Cuál será el resultado del siguiente escenario de conexión en una red MQTT?

7

En MQTT, es el cliente quien inicia la conexión con un mensaje CONNECT.

Parámetros del paquete MQTT Connect

El primer campo del paquete es el clientId:

El identificador de cliente (ID de cliente corto) es un identificador de cada cliente MQTT que se conecta a un intermediario MQTT. Como el identificador de la palabra ya sugiere, debe ser único por corredor. El intermediario lo utiliza para identificar al cliente y el estado actual del cliente. (La imagen y la cita se toman de aquí ).

Ahora supongamos que tengo dos clientes, el cliente X e Y en la siguiente situación.

  1. Broker lanzado, todavía no hay clientes.
  2. X se conecta con éxito al agente con client-1id, el nombre de usuario es X.
  3. Ahora, Y intenta conectarse usando client-1como id, el nombre de usuario es Y.

¿Lo que sucederá?

  1. Según el ID de cliente, el intermediario pensará que X realiza un intento de conexión repetido que es un comportamiento anormal .
  2. Nada extraordinario sucederá. Y se conecta con éxito ya que utiliza un nombre de usuario diferente .
  3. Nada extraordinario sucederá. El intermediario rechazará el intento de conexión Y ya que el ID de cliente dado ya está en uso.
Bence Kaulics
fuente

Respuestas:

6

Si clientides lo mismo, en MQTT, la especificación dice que debe considerar que son el mismo cliente. Probablemente Y debería estar conectado usando Idy Xdebería estar desconectado.

Esta parte es de la documentación:

Si la validación es exitosa, el Servidor realiza los siguientes pasos.

  1. Si el ClientId representa un Cliente ya conectado al Servidor, el Servidor DEBE desconectar el Cliente existente [MQTT-3.1.4-2].

  2. El servidor DEBE realizar el procesamiento de CleanSession que se describe en la sección 3.1.2.4 [MQTT-3.1.4-3].

  3. El servidor DEBE acusar recibo del paquete CONNECT con un paquete CONNACK que contenga un código de retorno cero [MQTT-3.1.4-4].

  4. Inicie la entrega de mensajes y mantenga la supervisión activa.

Mire esta documentación para más detalles.

ThisaruG
fuente
2
Esta parece ser la respuesta correcta, pero podría ser útil vincular y citar la parte relevante de la especificación (la parte clave es "Si el ClientId representa un Cliente ya conectado al Servidor, entonces el Servidor DEBE desconectar al Cliente existente")
Aurora0001
3
He pasado por alto esa parte de alguna manera, pero es sorprendente. ¿Un cliente dañino puede forzar al corredor a desconectar a otros clientes entonces?
Bence Kaulics