¿Cómo modificar solo la ID de cliente en un mensaje MQTT CONNECT?

8

Estoy jugando con los mensajes MQTT CONNECT. Tengo un programa C simple que abre un socket TCP / IP hacia un agente de Mosquitto que se ejecuta en mi computadora portátil, envía un mensaje MQTT CONNECT, (normalmente) recibe la respuesta CONNACK de 4 bytes de longitud, luego cierra el socket y sale del programa.

Actualmente no construyo mi propio mensaje CONNECT pero uso uno de una captura de Wireshark.

Captura de pantalla de captura de Wireshark

Se puede exportar como una matriz C, la parte MQTT:

char packet_bytes[] = {
  0x10, 0x20, 0x00, 0x06, 0x4d, 0x51, 0x49, 0x73,
  0x64, 0x70, 0x03, 0x02, 0x00, 0x3c, 0x00, 0x12,
  0x72, 0x6f, 0x6f, 0x74, 0x2e, 0x31, 0x34, 0x38,
  0x35, 0x38, 0x39, 0x30, 0x38, 0x35, 0x37, 0x31,
  0x39, 0x34
};

Al usar esta matriz no modificada, todo funciona bien, aquí está la salida del corredor:

1486237905: New connection from 192.168.1.2 on port 1883.
1486237905: New client connected from 192.168.1.2 as root.1485890857194 (c1, k60).
1486237905: Sending CONNACK to root.1485890857194 (0, 0)
1486237905: Socket error on client root.1485890857194, disconnecting.

Los problemas comienzan cuando quiero modificar la ID del cliente en el mensaje. Mi intento más simple es cortar el último personaje 4desde el final de la identificación.

Creo que esto requiere tres modificaciones en el código real.

  1. Eliminando el último byte de la matriz, el 0x34.
  2. Disminuyendo el Remaining Lengthcampo (segundo byte en la matriz) en el mensaje. Entonces del 32 al 31, 0x20-> 0x1F.
  3. Disminución del parámetro número de bytes de la sendfunción. De 34 a 33. (+2 debido a los campos Header Flagsy Remaining Length)

char packet_bytes[] = {
  0x10, 0x1F, 0x00, 0x06, 0x4d, 0x51, 0x49, 0x73,
  0x64, 0x70, 0x03, 0x02, 0x00, 0x3c, 0x00, 0x12,
  0x72, 0x6f, 0x6f, 0x74, 0x2e, 0x31, 0x34, 0x38,
  0x35, 0x38, 0x39, 0x30, 0x38, 0x35, 0x37, 0x31,
  0x39
};


if( send(s , packet_bytes , 33, 0) < 0)
{
    puts("Send failed");
    return 1;
}

No funciona, aquí está la salida del corredor:

1486239491: New connection from 192.168.1.2 on port 1883.
1486239491: Socket error on client <unknown>, disconnecting.

Sé que el Remaining Lengthcampo requiere un reconocimiento especial pero no inferior a 128.

Tabla de longitud restante

¿Qué me perdí aquí, qué debo modificar al lado del Remaining Lengthcampo?

Bence Kaulics
fuente
¿El corredor no registra el código de error del socket o algo así?
Aurora0001
@ Aurora0001 En realidad no verifiqué, ya que pensé que un registro detallado de la consola funcionaría. Lo comprobaré, tengo que encontrar archivos de registro en Windows.
Bence Kaulics
1
@ Aurora0001 En realidad, estaba tan ocupado en encontrar el error en el lado del cliente que no he pensado en buscar registros de servidor más detallados, así que gracias por señalarlo. Actualizaré si encuentro algo.
Bence Kaulics
Actualmente no tengo registros adicionales disponibles.
Bence Kaulics
1
@ Aurora0001 No, los datos se envían, solo en este caso no recibo CONACK, la función de recepción devuelve 0 y el programa se cierra. Intentaré hacer una captura entonces.
Bence Kaulics

Respuestas:

5

Me las arreglé para encontrar mi error. Erróneamente supuse que la ID del cliente es un campo fijo pero es solo una parte de la Carga útil del mensaje, por lo que se necesita un prefijo de longitud . De las especificaciones :

La carga útil del paquete CONNECT contiene uno o más campos con prefijo de longitud, cuya presencia está determinada por las banderas en el encabezado variable. Estos campos, si están presentes, DEBEN aparecer en el orden Identificador del cliente, Tema, Mensaje, Nombre de usuario, Contraseña

Entonces, un byte más debe ser decrementado en el mensaje. Los pasos correctos:

  1. Eliminando el último byte de la matriz, el 0x34.
  2. Disminuyendo el campo Longitud restante (segundo byte en la matriz) en el mensaje. Entonces, del 32 al 31, 0x20 -> 0x1F.
  3. Disminuir el byte de prefijo de longitud del ID de cliente en la carga útil. En mi caso es el byte 16 (contando desde 1) 0x12---> 0x11.
  4. Disminución del parámetro número de bytes de la función de envío. De 34 a 33. (+2 debido a los campos Banderas de encabezado y Longitud restante)

Después de este paso adicional, el corredor envió el mensaje CONNACK.

Bence Kaulics
fuente