我正在尝试向mosquitto MQTT代理发送连接数据包。我可以与代理建立连接,但是代理没有完全接收连接数据,即wireshark没有在代理中显示MQIspd数据但是接收客户端ID。
MQTT protocl版本是v3.0。
通过SIM900 GSM / GPRS调制解调器发送数据包。
代码有什么问题?
以下是连接数据包C代码:
#define MQTTCONNECT 1<<4
#define MQTTPUBLISH 3<<4
#define KEEPALIVE 15000
int main()
{
uint8_t buf[255];
char *id="MQTT"
uint8_t var_header[] = {0x00,0x06,0x4d,0x51,0x49,0x73,0x64,0x70,0x03,0x02,0x00,KEEPALIVE/500,0x00,strlen(id);
uint8_t fixed_header[] = {MQTTCONNECT,12+strlen(id)+2};
char packet[sizeof(fixed_header)+sizeof(var_header)+strlen(id)];
memset(packet,0,sizeof(packet));
memcpy(packet,fixed_header,sizeof(fixed_header));
//memcpy(packet+sizeof(fixed_header),var_header,sizeof(var_header));
//memcpy(packet+sizeof(fixed_header)+sizeof(var_header),id,strlen(id));
//sprintf(buf,"%s\x1A",memcpy(packet+sizeof(fixed_header)+sizeof(var_header),id,strlen(id));
sprintf(buf,"%s\x1A",memcpy(packet+sizeof(fixed_header)+sizeof(var_header),id,strlen(id)));
port_write(buf); //write data into the serial port.
return 0;
}
感谢。
答案 0 :(得分:1)
您的port_write(buf)
将从packet
开始写packet[sizeof(fixed_header)+sizeof(var_header)]
变量的数据。这是sprintf()
调用复制到buf
的内容,当然不是您想要的。我认为不需要同时使用packet
和buf
变量,只需使用其中一个,我认为这样可以简化问题。
请改为尝试:
int main()
{
char *id="MQTT"
uint8_t var_header[] = {0x00, 0x06, 0x4d, 0x51, 0x49, 0x73, 0x64, 0x70, 0x03, 0x02, 0x00, KEEPALIVE/500, 0x00, strlen(id);
uint8_t fixed_header[] = {MQTTCONNECT, 12+strlen(id)+2};
char packet[sizeof(fixed_header)+sizeof(var_header)+strlen(id) + 2];
memset(packet, 0, sizeof(packet));
memcpy(packet, fixed_header, sizeof(fixed_header));
memcpy(packet+sizeof(fixed_header), var_header, sizeof(var_header));
sprintf(packet+sizeof(fixed_header)+sizeof(var_header), "%s\x1A", id);
port_write((uint8_t *)packet); //write data into the serial port.
return 0;
}
答案 1 :(得分:1)
正如@ralight所说,使用sprintf中的memcpy,你只是复制到buf消息的有效负载(你不是要复制固定的头和变量头),在这种情况下,有效负载只包含客户端ID 。 但是我同意@ralight ......两个&#34;缓冲区&#34;没用。