Mosquitto Broker部分收到数据

时间:2015-06-22 11:45:09

标签: c mqtt gprs

我正在尝试向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;
}

感谢。

2 个答案:

答案 0 :(得分:1)

您的port_write(buf)将从packet开始写packet[sizeof(fixed_header)+sizeof(var_header)]变量的数据。这是sprintf()调用复制到buf的内容,当然不是您想要的。我认为不需要同时使用packetbuf变量,只需使用其中一个,我认为这样可以简化问题。

请改为尝试:

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;没用。