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 4
từ 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 Length
trườ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
send
hàm. Từ 34 đến 33. (+2 vìHeader Flags
vàRemaining Length
cá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 Length
lĩ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 Length
lĩnh vực này?