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.
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 4
desde el final de la identificación.
Creo que esto requiere tres modificaciones en el código real.
- Eliminando el último byte de la matriz, el
0x34
. - Disminuyendo el
Remaining Length
campo (segundo byte en la matriz) en el mensaje. Entonces del 32 al 31,0x20
->0x1F
. - Disminución del parámetro número de bytes de la
send
función. De 34 a 33. (+2 debido a los camposHeader Flags
yRemaining 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 Length
campo requiere un reconocimiento especial pero no inferior a 128.
¿Qué me perdí aquí, qué debo modificar al lado del Remaining Length
campo?
Respuestas:
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 :
Entonces, un byte más debe ser decrementado en el mensaje. Los pasos correctos:
0x12
--->0x11
.Después de este paso adicional, el corredor envió el mensaje CONNACK.
fuente