首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >ESP8266使用mqtt发送report上报信息给腾讯云mqtt服务器问题??

ESP8266使用mqtt发送report上报信息给腾讯云mqtt服务器问题??

提问于 2021-03-02 10:35:30
回答 2关注 0查看 579

最近在学习ESP8266的MQTT事,我通过MQTT连接到腾讯云MQTT服务器。现在ESP8266可以订阅并接收来自腾讯云MQTT的信息,但是在使用mqtt发布上报信息给腾讯云时出现了问题。

上报信息的JOSN格式:"{\"method\":\"report\",\"clientToken\":\"xxxxx-8gauvcWJrb\",\"params\":{\"switch_1\": 1}}"

但是腾讯云无法接收到完成的上报信息,因为我使用在线调试只能看到report_reply消息,但是无法查看到report消息。而我用MQTT.fx软件模拟时,当我只发送{"method": "report"}时会出现这样的现在。但是当我发送完整的JOSN上报信息时就不会只有report_reply消息。

MQTT.fx模拟正常的JOSN上报数据:

在线调试可以正确接收
在线调试可以正确接收

MQTT.fx模拟异常的JOSN上报数据:

在线调试只能接收到report_reply
在线调试只能接收到report_reply

目前ESP8266使用以下代码,将JOSN数据上报给腾讯云会出现和MQTT.fx模拟异常的JOSN上报数据现象。但是还有一个区别就是使用ESP8266发送report上报信息,在使用腾讯连连刷新后又可以看到界面更新。不知道是哪儿的问题。。。

#define TEST_SW1_REPORT_OFF "{"method":"report","clientToken":"MBN7N5MMO8-8gauvcWJrb","params":{"switch_1": 0}}"

void mqttDataCb(uint32_t *args, const char* topic, uint32_t topic_len, const char *data, uint32_t data_len)
{
    char *topicBuf = (char*)os_zalloc(topic_len+1),
            *dataBuf = (char*)os_zalloc(data_len+1);

    uint8_t res = 0;
    static uint8_t flag = 0;

    MQTT_Client* client = (MQTT_Client*)args;
//===========如果数据接收出现丢失,应该使用环形缓冲区来保存没有来得及处理的数据================
    os_memcpy(topicBuf, topic, topic_len);
    topicBuf[topic_len] = 0;

    os_memcpy(dataBuf, data, data_len);
    dataBuf[data_len] = 0;

    INFO("Receive topic: %s, data: %s \r\n", topicBuf, dataBuf);

    //===解析JOSN数据====
    res = Parse_Josn_data(dataBuf,&sw_status);
    if(res == JOSN_OK)        //成功获取到腾讯云发的“智能插座”MQTT的JOSN并解析
    {
        //====执行命令========
        smartSW_action.Control(sw_status);
        if(flag == 1)
        {
                flag = 0;
                MQTT_Publish(client, MQTT_UP_TOPIC, TEST_SW2_REPORT_OFF, os_strlen(TEST_SW2_REPORT_OFF) + 1, 0, 0);
                INFO("flag = 1\n");
                INFO(TEST_SW2_REPORT_OFF)
                INFO("\n");
        }
        else
        {
                flag = 1;
                MQTT_Publish(client, MQTT_UP_TOPIC, TEST_SW2_REPORT_ON, os_strlen(TEST_SW2_REPORT_ON) + 1, 0, 0);
                INFO("flag = 0\n");
                INFO(TEST_SW2_REPORT_ON)
                INFO("\n");
        }

    }

    os_free(topicBuf);
    os_free(dataBuf);
}
//====================其中这个MQTT是用的ESP8266官方的ESP8266_NONOS_SDK-3.0.4.zip中的例程。==================    
相关文章

相似问题

相关问答用户
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档