Sto giocando con i messaggi MQTT CONNECT. Ho un semplice programma C che apre un socket TCP / IP verso un broker Mosquitto in esecuzione sul mio laptop, invia un messaggio MQTT CONNECT, (normalmente) riceve la risposta CONNACK lunga 4 byte, quindi chiude il socket ed esce dal programma.
Attualmente non costruisco il mio messaggio CONNECT ma ne utilizzo uno da una cattura Wireshark.
Può essere esportato come un array 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
};
Utilizzando questo array non modificato tutto funziona bene, ecco l'output del broker:
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.
I problemi iniziano quando voglio modificare l'ID client nel messaggio. Il mio tentativo più semplice è quello di tagliare l'ultimo personaggio 4
dalla fine dell'ID.
Penso che ciò richieda tre modifiche nel codice attuale.
- Eliminando l'ultimo byte dall'array, il
0x34
. - Decrementando il
Remaining Length
campo (2 ° byte nell'array) nel messaggio. Quindi da 32 a 31,0x20
->0x1F
. - Decremento del parametro numero di byte della
send
funzione. Da 34 a 33. (+2 a causa dei campiHeader Flags
eRemaining 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;
}
Non funziona, ecco l'output del broker:
1486239491: New connection from 192.168.1.2 on port 1883.
1486239491: Socket error on client <unknown>, disconnecting.
So che il Remaining Length
campo richiede una codifica speciale ma non inferiore a 128.
Cosa mi sono perso qui, cosa devo modificare accanto al Remaining Length
campo?