bug详述:串口有上报MATT主题(上报属性,事件),但云端收到并以AT+QMTPUB的的参数为判断是否已收到上报信息,然而这样做会出现不规律的丢包现象。
解决方法:把mqtt主题以及回响头尾补全,格式如下:
请求Topic:/sys/${productKey}/${deviceName}/thing/model/up_raw
请求数据格式:
{
"id": "123",
"version": "1.0",
"sys":{
"ack":0
},
"params": {
"Power": {
"value": "on",
"time": 1524448722000
},
"WF": {
"value": 23.6,
"time": 1524448722000
}
},
"method": "thing.event.property.post"
}
响应Topic:/sys/${productKey}/${deviceName}/thing/model/up_raw_reply
云端返回数据格式如下:
成功返回示例:
{
"code": 200,
"data": {},
"id": "123",
"message": "success",
"method": "thing.event.property.post"
"version": "1.0"
}
失败返回示例:
{
"code": 6813,
"data": {},
"id": "123",
"message": "The format of result is error!",
"method": "thing.event.property.post"
"version": "1.0"
}
ps:注意格式"",:"num";
Write CommandAT+QMTPUB=<TCP_connectID>,<m sgID>,<qos>,<retain>,"<topic>"
法1:const char AT_QMTPUB[] = "AT+QMTPUB=0,1,1,0,";//发布消息
法2:const char AT_QMTPUB[] = "AT+QMTPUB=0,";//发布消息
出于对设备端连续上报导致云端并不知道回复应答信号给那一条信息,此处应给每条消息id(msgID)给与唯一的编号。所以采用方法2制定msgid循环可变。
static char buff[]="\"{\"id\":\"%d\",\"version\":\"1.0\",\"sys\":{\"ack\":1},\"params\":{"; /*头*/
static char buff1[]="},\"method\":\"thing.event.property.post\"}\"\r"; /*尾*/
sendbuff_len=sprintf((char*)pbuf,"%s%d,1,0,\"/sys/%s/%s/thing/event/property/post\",",AT_QMTPUB,tmp_sn,ProductKey,IMEI);//%s即AT+QMTPUB,0, %d masgid %s即秘钥和IMEI
sendbuff_len += sprintf((char*)pbuf+sendbuff_len,buff,tmp_sn);//%s头 %d对应msgID 补全
ACK简介:
sys下的扩展功能字段,表示是否返回响应数据。
- 1:云端返回响应数据。
- 0:云端不返回响应数据。
数据解析:
uint8_t CmdAlanyzemqtt(char *cmdmsg, uint16_t len) /*解析*/
{
char *str;
uint32_t dat;
if((str = strstr((const char *)cmdmsg,"/thing/event/property/post_reply")) != 0)
{
if((str = strstr((const char *)cmdmsg,"code")) != 0)
{
sscanf(str,"%*[^:]:%u",&dat);
if(dat == 200)
{
gQmtpub = 0; //用code = 200 判断代替gQmtpub 作为云端ACK
//CloudAck = 1;
}
}
}