Come modificare solo l'ID client in un messaggio MQTT CONNECT?


8

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.

Screenshot di Wireshark Capture

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 4dalla fine dell'ID.

Penso che ciò richieda tre modifiche nel codice attuale.

  1. Eliminando l'ultimo byte dall'array, il 0x34.
  2. Decrementando il Remaining Lengthcampo (2 ° byte nell'array) nel messaggio. Quindi da 32 a 31, 0x20-> 0x1F.
  3. Decremento del parametro numero di byte della sendfunzione. Da 34 a 33. (+2 a causa dei campi Header Flagse 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;
}

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 Lengthcampo richiede una codifica speciale ma non inferiore a 128.

Tabella delle lunghezze rimanenti

Cosa mi sono perso qui, cosa devo modificare accanto al Remaining Lengthcampo?


Il broker non registra il codice di errore del socket o qualcosa del genere?
Aurora0001

@ Aurora0001 In realtà non ho verificato come pensavo che potesse fare una registrazione dettagliata della console. Lo controllerò, devo trovare i file di registro in Windows.
Bence Kaulics,

1
@ Aurora0001 In realtà ero così impegnato a trovare l'errore sul lato client, non ho pensato di cercare registri del server più dettagliati, quindi grazie per aver sottolineato. Aggiornerò se trovo qualcosa.
Bence Kaulics,

Attualmente non ho altri registri disponibili.
Bence Kaulics,

1
@ Aurora0001 No, i dati vengono inviati, solo in questo caso non ricevo CONACK, la funzione recv restituisce 0 e il programma esce. Proverò a fare una cattura allora.
Bence Kaulics,

Risposte:


5

Sono riuscito a trovare il mio errore. In modo errato ho assunto che l'ID client sia un campo fisso ma è solo una parte del payload del messaggio, pertanto è necessario un prefisso di lunghezza . Dalle specifiche :

Il payload del pacchetto CONNECT contiene uno o più campi con prefisso di lunghezza, la cui presenza è determinata dai flag nell'intestazione della variabile. Questi campi, se presenti, DEVONO comparire nell'ordine Identificatore cliente, Argomento, Messaggio, Nome utente, Password

Quindi un altro byte dovrebbe essere decrementato nel messaggio. I passaggi corretti:

  1. Eliminazione dell'ultimo byte dall'array, lo 0x34.
  2. Decrementando il campo Lunghezza rimanente (2 ° byte nell'array) nel messaggio. Quindi da 32 a 31, 0x20 -> 0x1F.
  3. Decremento del byte prefisso lunghezza dell'ID client nel payload. Nel mio caso è il sedicesimo byte (contando da 1) 0x12---> 0x11.
  4. Decremento del parametro numero di byte della funzione di invio. Da 34 a 33. (+2 a causa dei campi Flag di intestazione e Lunghezza rimanente)

Dopo questo passaggio aggiuntivo il broker ha rispedito il messaggio CONNACK.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.