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.
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ế.
- Xóa byte cuối cùng khỏi mảng ,
0x34. - 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. - Giảm số lượng tham số byte của
sendhàm. Từ 34 đến 33. (+2 vìHeader FlagsvàRemaining 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.
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?

