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?