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?
Réponses:
J'ai réussi à trouver mon erreur. Par erreur, j'ai supposé que l'ID client est un champ fixe, mais ce n'est qu'une partie de la charge utile du message, donc un préfixe de longueur est nécessaire. D'après les spécifications :
Un octet de plus doit donc être décrémenté dans le message. Les étapes correctes:
0x12
--->0x11
.Après cette étape supplémentaire, le courtier a renvoyé le message CONNACK.
la source