C语言MQTT库MQTTPacket.c使用,尤其接收

参考: https://blog.csdn.net/ai5945fei/article/details/89332928

开启订阅

bool MQTT_Subscribe(char *subscribe)
{
    int len;
    int req_qos = 0;
    u8 buf[512];
    MQTTString topicString = MQTTString_initializer;
    topicString.cstring = subscribe;
    len = MQTTSerialize_subscribe(buf, sizeof(buf), 0, MQTT_packid++, 1, &topicString, &req_qos);
    _socket.Write((char*)buf, len);
    len = _socket.Read((char*)buf, 512);
    if (len >= 5 && (memcmp("\x90\x03", buf, 2) == 0))
    {
        if ((buf[4] & 0x80) != 0x80)
        {
            return true;
        }
    }
    return false;
}

主动发出推送

bool MQTT_Publish(char *topic, char *str)
{
 
    u8 fifo[512];
    int outLen = 0;
    MQTTString topicString = MQTTString_initializer;
    topicString.cstring = topic;
    int len = MQTTSerialize_publish(fifo, 512, 0, 0, 0, MQTT_packid++, topicString, (u8*)str, strlen(str));
 
    _socket.Write((char*)fifo, len);
 
    return false;
}

接收到订阅数据

    int len = _socket.Read(rxfifo, 512);
    if (len >= 2)
    {
        if ((rxfifo[0] & 0xF0) == 0x30)//收到发布的消息
        {
            u8 dup;
            int qos;
            u8 retanined;
            u16 msgid;
            MQTTString receiveTopic;
            u8 *payload;
            int payloadLen;
            int ret = MQTTDeserialize_publish(&dup, &qos, &retanined, &msgid, &receiveTopic, &payload, &payloadLen, (u8*)rxfifo, len);
            if (ret)
            {
                char topic[100];
                char data[512];
                memcpy(topic, receiveTopic.lenstring.data, receiveTopic.lenstring.len);
                topic[receiveTopic.lenstring.len] = 0;
 
                memcpy(data, payload, payloadLen);
                data[payloadLen] = 0;
                printf_s("发序列化成功 topic[%s] payload[%s]\r\n", topic, data);
            }
        }
    }

注意:反序列化函数输出值 主题名(receiveTopic.lenstring.data)和主题的数据部分(payload)地址指向原始数据空间(rxfifo数组)中的某一个位置,结算后拷贝出来,不要对上述两个值执行写操作,以免数据破坏。