Je joue avec les messages MQTT CONNECT. J'ai un programme C simple qui ouvre un socket TCP / IP vers un courtier Mosquitto fonctionnant sur mon ordinateur portable, envoie un message MQTT CONNECT, (normalement) reçoit la réponse CONNACK de 4 octets, puis ferme le socket et quitte le programme.
Actuellement, je ne crée pas mon propre message CONNECT mais j'en utilise un à partir d'une capture Wireshark.
Il peut être exporté sous forme de tableau C, la partie 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
};
En utilisant ce tableau non modifié, tout fonctionne très bien, voici la sortie du courtier:
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.
Les problèmes commencent lorsque je souhaite modifier l'ID client dans le message. Ma tentative la plus simple consiste à couper le dernier caractère 4
de la fin de l'ID.
Je pense que cela nécessite trois modifications dans le code réel.
- Suppression du dernier octet du tableau, le
0x34
. - Décrémenter le
Remaining Length
champ (2ème octet du tableau) dans le message. Donc du 32 au 31,0x20
->0x1F
. - Décrémenter le paramètre nombre d'octets de la
send
fonction. De 34 à 33. (+2 à cause des champsHeader Flags
etRemaining 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;
}
Cela ne fonctionne pas, voici la sortie du courtier:
1486239491: New connection from 192.168.1.2 on port 1883.
1486239491: Socket error on client <unknown>, disconnecting.
Je sais que le Remaining Length
domaine nécessite une liaison spéciale mais pas inférieure à 128.
Qu'est-ce que j'ai raté ici, que dois-je modifier à côté du Remaining Length
terrain?