zoukankan      html  css  js  c++  java
  • 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("x90x03", 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]
    ", topic, data);
                }
            }
        }

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

  • 相关阅读:
    定时器工厂
    无聊js画了个菱形
    盒模型之滚动条
    无聊,纯css写了个评分鼠标移入的效果
    json属性名为什么要双引号?
    原生js写的一个简单slider
    D2 前端技术论坛总结(上)
    第一天,入坑 —— 2014.10.24
    获取div相对文档的位置
    我们平时是怎么写html和css的?
  • 原文地址:https://www.cnblogs.com/qinlongqiang/p/12450542.html
Copyright © 2011-2022 走看看