Bagaimana cara mengubah hanya ID Klien di pesan MQTT CONNECT?

8

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.

Tangkapan Layar Wireshark Capture

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 4dari akhir ID.

Saya pikir ini memerlukan tiga modifikasi dalam kode aktual.

  1. Menghapus byte terakhir dari array, the 0x34.
  2. Mengurangkan Remaining Lengthbidang (byte kedua dalam array) dalam pesan. Jadi dari 32 hingga 31, 0x20-> 0x1F.
  3. Mengurangi jumlah parameter byte sendfungsi. Dari 34 hingga 33. (+2 karena bidang Header Flagsdan Remaining 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 Lengthbidang membutuhkan pengkondisian khusus tetapi tidak di bawah 128.

Tabel Panjang Sisa

Apa yang saya lewatkan di sini, apa yang harus saya modifikasi di samping Remaining Lengthbidang?

Bence Kaulics
sumber
Apakah broker tidak mencatat kode kesalahan soket atau semacamnya?
Aurora0001
@ Aurora0001 Sebenarnya saya tidak memeriksa karena saya pikir logging konsol verbose akan dilakukan. Saya akan memeriksanya, saya harus menemukan file log di bawah windows.
Bence Kaulics
1
@ Aurora0001 Sebenarnya saya sangat sibuk dalam menemukan kesalahan di sisi klien, saya belum berpikir untuk mencari log server yang lebih rinci, jadi terima kasih telah menunjukkan. Saya akan memperbarui jika saya menemukan sesuatu.
Bence Kaulics
Saat ini saya tidak memiliki catatan tambahan .
Bence Kaulics
1
@ Aurora0001 Tidak, data dikirim, hanya dalam kasus ini saya tidak menerima CONACK, fungsi recv mengembalikan 0 dan program keluar. Saya akan mencoba melakukan penangkapan itu.
Bence Kaulics

Jawaban:

5

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 :

Payload Paket CONNECT berisi satu atau lebih bidang awalan panjang, yang kehadirannya ditentukan oleh bendera di header variabel. Bidang-bidang ini, jika ada, HARUS muncul dalam urutan Identifikasi Klien, Akan Topik, Akan Pesan, Nama Pengguna, Kata Sandi

Jadi satu byte lagi harus dikurangi dalam pesan. Langkah-langkah yang benar:

  1. Menghapus byte terakhir dari array, 0x34.
  2. Mengurangkan bidang Sisa Panjang (byte kedua dalam array) dalam pesan. Jadi dari 32 hingga 31, 0x20 -> 0x1F.
  3. Mengurangi byte awalan panjang ID Klien di payload. Dalam kasus saya ini adalah byte ke 16 (dihitung dari 1) 0x12---> 0x11.
  4. Mengurangi jumlah byte parameter dari fungsi kirim. Dari 34 hingga 33. (+2 karena bidang Header Flags dan Sisa Panjang)

Setelah langkah tambahan ini, broker mengirim kembali pesan CONNACK.

Bence Kaulics
sumber