过关砍bug-(NB-BC66之MQTT)

        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 Command
AT+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;
					}
				}
			}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值