最近在学习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上报数据:
目前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中的例程。==================
相似问题