Saya bermain-main dengan pesan MQTT CONNECT. Saya memiliki program C sederhana yang membuka soket TCP / IP ke arah broker Mosquitto yang berjalan di laptop saya, mengirimkan pesan CONNECT MQTT, (biasanya) menerima balasan CONNACK 4 byte panjang kemudian menutup soket dan keluar dari program.
Saat ini saya tidak membuat pesan CONNECT saya sendiri tetapi menggunakan pesan dari penangkapan Wireshark.
Itu dapat diekspor sebagai array C, bagian 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
};
Menggunakan array yang tidak dimodifikasi ini, semuanya bekerja dengan baik, berikut adalah output 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.
Masalahnya dimulai ketika saya ingin mengubah ID Klien dalam pesan. Upaya paling sederhana saya adalah memotong karakter terakhir 4
dari akhir ID.
Saya pikir ini memerlukan tiga modifikasi dalam kode aktual.
- Menghapus byte terakhir dari array, the
0x34
. - Mengurangkan
Remaining Length
bidang (byte kedua dalam array) dalam pesan. Jadi dari 32 hingga 31,0x20
->0x1F
. - Mengurangi jumlah parameter byte
send
fungsi. Dari 34 hingga 33. (+2 karena bidangHeader Flags
danRemaining 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;
}
Ini tidak berfungsi, berikut adalah output broker:
1486239491: New connection from 192.168.1.2 on port 1883.
1486239491: Socket error on client <unknown>, disconnecting.
Saya tahu bahwa Remaining Length
bidang membutuhkan pengkondisian khusus tetapi tidak di bawah 128.
Apa yang saya lewatkan di sini, apa yang harus saya modifikasi di samping Remaining Length
bidang?
Jawaban:
Saya berhasil menemukan kesalahan saya. Secara keliru saya berasumsi bahwa ID Klien adalah bidang perbaikan tetapi itu hanya bagian dari Muatan pesan sehingga awalan panjang diperlukan. Dari spesifikasinya :
Jadi satu byte lagi harus dikurangi dalam pesan. Langkah-langkah yang benar:
0x12
--->0x11
.Setelah langkah tambahan ini, broker mengirim kembali pesan CONNACK.
sumber