Ich spiele mit MQTT CONNECT-Nachrichten herum. Ich habe ein einfaches C-Programm, das einen TCP / IP-Socket für einen auf meinem Laptop laufenden Mosquitto-Broker öffnet, eine MQTT CONNECT-Nachricht sendet, (normalerweise) die 4 Byte lange CONNACK-Antwort empfängt, dann den Socket schließt und das Programm beendet.
Derzeit erstelle ich keine eigene CONNECT-Nachricht, sondern verwende eine aus einem Wireshark-Capture.
Es kann als C-Array exportiert werden, der MQTT-Teil:
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
};
Mit diesem unveränderten Array funktioniert alles einwandfrei. Hier ist die Ausgabe des Brokers:
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.
Die Probleme beginnen, wenn ich die Client-ID in der Nachricht ändern möchte. Mein einfachster Versuch ist es, das letzte Zeichen 4
vom Ende der ID zu entfernen.
Ich denke, dies erfordert drei Änderungen im eigentlichen Code.
- Löschen des letzten Bytes aus dem Array, der
0x34
. - Dekrementieren des
Remaining Length
Feldes (2. Byte im Array) in der Nachricht. Also von 32 bis 31,0x20
->0x1F
. - Dekrementieren der Anzahl der Bytes Parameter der
send
Funktion. Von 34 bis 33. (+2 wegen derHeader Flags
undRemaining Length
Felder)
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;
}
Es funktioniert nicht, hier ist die Ausgabe des Brokers:
1486239491: New connection from 192.168.1.2 on port 1883.
1486239491: Socket error on client <unknown>, disconnecting.
Ich weiß, dass das Remaining Length
Feld eine spezielle Eingabe erfordert, aber nicht unter 128.
Was habe ich hier vermisst, was sollte ich neben dem Remaining Length
Feld ändern ?
Antworten:
Ich habe meinen Fehler gefunden. Ich habe fälschlicherweise angenommen, dass die Client-ID ein Fixfeld ist, aber nur ein Teil der Nutzlast der Nachricht ist, sodass ein Längenpräfix benötigt wird. Aus den Spezifikationen :
Daher sollte ein weiteres Byte in der Nachricht dekrementiert werden. Die richtigen Schritte:
0x12
--->0x11
.Nach diesem zusätzlichen Schritt hat der Broker die CONNACK-Nachricht zurückgesendet.
quelle