MQTT CONNECTメッセージをいじっています。私のラップトップで実行されているMosquittoブローカーに向けてTCP / IPソケットを開き、MQTT CONNECTメッセージを送信し、(通常)4バイト長のCONNACK応答を受信してソケットを閉じ、プログラムを終了する単純なCプログラムがあります。
現在、私は自分のCONNECTメッセージを作成していませんが、Wiresharkキャプチャからのものを使用しています。
MQTTパーツであるC配列としてエクスポートできます。
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
};
この変更されていない配列を使用すると、すべてがうまく機能します。ブローカーの出力は次のとおりです。
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.
メッセージのクライアントIDを変更するときに問題が発生します。私の最も簡単な試みは4
、IDの最後から最後の文字を切り刻むことです。
これには、実際のコードに3つの変更が必要だと思います。
- 配列の最後のバイトを削除します
0x34
。 Remaining Length
メッセージのフィールド(配列の2番目のバイト)をデクリメントします。したがって、32から31まで0x20
->0x1F
。send
関数のバイト数パラメーターのデクリメント。34から33まで(+ フィールドHeader Flags
とRemaining Length
フィールドのため+2 )
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;
}
動作しません。ブローカーの出力は次のとおりです。
1486239491: New connection from 192.168.1.2 on port 1883.
1486239491: Socket error on client <unknown>, disconnecting.
私はRemaining Length
フィールドが特別なencondingを必要とすることを知っていますが、128未満ではありません。
ここで見逃したものは何Remaining Length
ですか。フィールドの横で何を変更する必要がありますか?