Làm cách nào để sửa đổi chỉ ID khách hàng trong tin nhắn MQTT CONNECT?


8

Tôi đang chơi xung quanh với các tin nhắn MQTT CONNECT. Tôi có một chương trình C đơn giản mở ổ cắm TCP / IP cho nhà môi giới Mosquitto đang chạy trên máy tính xách tay của tôi, gửi tin nhắn MQTT CONNECT, (thông thường) nhận được phản hồi CONNACK dài 4 byte sau đó đóng ổ cắm và thoát khỏi chương trình.

Hiện tại tôi không xây dựng tin nhắn CONNECT của riêng mình mà sử dụng một tin nhắn từ bản chụp Wireshark.

Ảnh chụp màn hình Wireshark

Nó có thể được xuất dưới dạng mảng C, phần 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
};

Sử dụng mảng chưa sửa đổi này, mọi thứ đều hoạt động tốt, đây là đầu ra của 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.

Các vấn đề bắt đầu khi tôi muốn sửa đổi ID khách hàng trong tin nhắn. Nỗ lực đơn giản nhất của tôi là cắt nhân vật cuối cùng 4từ cuối ID.

Tôi nghĩ rằng điều này đòi hỏi ba sửa đổi trong mã thực tế.

  1. Xóa byte cuối cùng khỏi mảng , 0x34.
  2. Giảm Remaining Lengthtrường (byte thứ 2 trong mảng) trong thông báo. Vì vậy, từ 32 đến 31, 0x20-> 0x1F.
  3. Giảm số lượng tham số byte của sendhàm. Từ 34 đến 33. (+2 vì Header FlagsRemaining Lengthcác trường)

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;
}

Nó không hoạt động, đây là đầu ra của broker:

1486239491: New connection from 192.168.1.2 on port 1883.
1486239491: Socket error on client <unknown>, disconnecting.

Tôi biết rằng Remaining Lengthlĩnh vực này đòi hỏi đặc biệt nhưng không dưới 128.

Bảng chiều dài còn lại

Tôi đã bỏ lỡ điều gì ở đây, tôi nên sửa đổi gì bên cạnh Remaining Lengthlĩnh vực này?


Có phải nhà môi giới không đăng nhập mã lỗi ổ cắm hoặc bất cứ điều gì như vậy?
Aurora0001

@ Aurora0001 Trên thực tế tôi đã không kiểm tra vì tôi nghĩ rằng việc ghi nhật ký bảng điều khiển dài dòng sẽ làm được. Tôi sẽ kiểm tra nó, tôi phải tìm tập tin nhật ký dưới windows.
Bence Kaulics

1
@ Aurora0001 Thật ra tôi rất bận rộn trong việc tìm kiếm lỗi ở phía máy khách, tôi đã không nghĩ đến việc tìm kiếm nhật ký máy chủ chi tiết hơn nên cảm ơn vì đã chỉ ra. Tôi sẽ cập nhật nếu tôi tìm thấy.
Bence Kaulics

Hiện tại tôi không có nhật ký bổ sung có sẵn.
Bence Kaulics

1
@ Aurora0001 Không, dữ liệu được gửi, chỉ trong trường hợp này tôi không nhận được CONACK, hàm recv trả về 0 và chương trình thoát. Tôi sẽ cố gắng để làm một chụp sau đó.
Bence Kaulics

Câu trả lời:


5

Tôi đã tìm ra sai lầm của mình. Tôi đã nhầm rằng ID khách hàng là trường sửa lỗi nhưng nó chỉ là một phần của Tải trọng của thông báo do đó cần có tiền tố dài . Từ thông số kỹ thuật :

Tải trọng của Gói CONNECT chứa một hoặc nhiều trường có tiền tố dài, có sự hiện diện được xác định bởi các cờ trong tiêu đề biến. Các trường này, nếu có, PHẢI xuất hiện theo thứ tự Định danh khách hàng, Chủ đề sẽ, Tin nhắn, Tên người dùng, Mật khẩu

Vì vậy, một byte nữa nên được giảm trong tin nhắn. Các bước chính xác:

  1. Xóa byte cuối cùng khỏi mảng, 0x34.
  2. Giảm trường còn lại (byte thứ 2 trong mảng) trong tin nhắn. Vậy từ 32 đến 31, 0x20 -> 0x1F.
  3. Giảm byte tiền tố độ dài của ID khách hàng trong tải trọng. Trong trường hợp của tôi, đó là byte thứ 16 (tính từ 1) 0x12---> 0x11.
  4. Giảm số lượng tham số byte của hàm gửi. Từ 34 đến 33. (+2 vì các trường Tiêu đề và Trường độ dài còn lại)

Sau bước bổ sung này, nhà môi giới đã gửi lại tin nhắn CONNACK.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.