利记APP科技集团股份有限公司


利记APP

【技术分享】以利记APPMB960/860模组为例,教你快速接入MQTT协议(下)
来源:利记APP科技 作者:蜂窝软件组 日期:2022-02-18 浏览量:2307

  随着5G时代的来临,万物互联的伟大构想正在成为现实。2021年全球智能物联网处于爆发式增长通道,设备数量超过250亿台。海量的设备接入和设备管理对网络带宽、通信协议以及平台服务架构都带来了很大挑战。


  通信协议作为联通物与物的桥梁,在物联网架构中起着关键作用。上周我们已经在《【技术分享】以利记APPMB960/860模组为例,教你快速接入MQTT协议(上)》一文中介绍了MQTT协议的基础知识,本周将介绍接入阿里云平台MQTT协议的具体步骤,帮助大家快速上手。


  MQTT AT指令接入


  1、设置服务端IP或域名

  AT+MQTTCFG="host",0,"host_name",1883

  :服务端的IP或域名:1~2000字节字符串。阿里云公共实例接入:a1oGs******.iot-as-mqtt.cn-shanghai.aliyuncs.com

  a1oGs******为本示例产品的productKey。

  cn-shanghai为本示例所在地域。

  示例

  AT+MQTTCFG="host",0,"gg0*******.iot-as-mqtt.cn-shanghai.aliyuncs.com",1883

  实现说明

  ● 如果设置IP无需任何操作,只需IP满足地址格式。

  ● 如果设置域名,需先使用AT+CFUN=0和AT+NCONFIG=PCO_IE_TYPE,PCO这两条AT命令开启DNS服务器,再次重启,之后才能使用域名连接。


  2、设置客户端标识

  AT+MQTTCFG="clientid",,

  < Link_ID > 连接ID:取值0~2。

  客户端标识符:字符串类型,1~128字节字符串。

  示例

  AT+MQTTCFG="clientid",0,"8677**********|securemode=2,signmethod=hmacsha1|"

  实现说明

  如果连接NB-IOT平台,则需根据平台规则来设置客户端标识。


  3、连接服务端

  AT+MQTTCONN=,,,,

  < Link_ID > 连接ID:取值0~2。

  SSL TCP连接使能:

  0:不采用;

  1:采用SSL TCP连接。

  will_flag 遗嘱标志,取值0或1:

  0:不带遗嘱;

  1:CONNECT报文带有遗嘱。

  用户名:0~512字节的字符串。

  密码:0~512字节的字符串。

  注:阿里云平台用户名及密码需用三元组生成,生成方式请参考阿里云平台提供的密码生成文档。

  示例

  AT+MQTTCONN=0,0,0,"8677******&gg0*******","91C3E702***************************755*****"

  实现说明

  在连接前需要设置服务端ip和clientid,不同的平台连接使用的用户名和密码需要根据平台要求进行设置。如果是加密连接还需要设置证书,并使ssl_enable为1。设置will_flag为1时,还需要设置遗嘱。

  连接失败时的错误码如下:

  ● 0:返回正确;

  ● 1:未知错误;

  ● 2:申请内存失败;

  ● 3:参数检查错误;

  ● 80:网络连接状态错误(可是未拨号/时间不对/服务器关闭);

  ● 81:MQTT设置版本错误;

  ● 82:clientid错误;

  ● 83:服务器拒绝客户端连接;

  ● 84:用户名或者密码错误;

  ● 85:订阅失败 #订阅失败会导致断连;

  ● 86:取消订阅失败;

  ● 87:发布失败;

  ● 88:当前未连接;

  ● 89:当前已有连接又再次发起连接;

  ● 90:创建客户端失败;

  ● 91:该linkid已创建客户端又再次发起创建;

  ● 92:该linkid未创建客户端;

  ● 93:当前MQTT状态不允许执行该操作。

  查询连接时的状态如下:

  ● state=1 MQTT is initial(未配置)

  ● state=2 MQTT is connecting

  ● state=3 MQTT is connected

  ● state=4 MQTT is disconnected

  说明:需要注意,MQTT内部实现是先使用设置的MQTT版本连接,失败之后会使用MQTT3.1版本来连接。


  4、订阅MQTT消息

  AT+MQTTSUB=,,,[,,][,,]

  < Link_ID > 连接ID:取值0~2。

  报文标识符:取值1~65535。

  主题名:0~512字节字符串。一次最多可订阅3个主题。

  订阅消息QOS等级:取值0~2。

  示例

  AT+MQTTSUB=0,1,"/gg0*******/867********/user/test",1

  收←◆+MQTTSUBACK: 0,1,0

  OK

  收←◆+MQTTRECV: 0,0,0,0,/gg0*********/867*********/user/test,qtwtewtytweyt

  实现说明

  订阅异常包括:

  ● 报文处理异常,包括非连接、网络异常状态下收到上位机下发该AT命令、报文参数异常等。

  ● 超时未收到服务端回复,包括服务端回复的报文异常。

  ● 返回85订阅失败,断连。


  5、发布一个消息

  AT+MQTTPUB=,,,,,

  < Link_ID > 连接ID:取值0~2。

  报文标识符:取值1~65535。

  发布消息QOS等级:取值0~2。

  保留标志:取值0~1。

  主题名:0~512字节字符串。

  有效载荷:0~1500字节字符串。

  示例

  AT+MQTTPUB=0,1,0,0,"/gg0*******/8677*********/user/test","this is a test"

  收←◆+MQTTPUBACK: 0,1,0

  OK

  收←◆+MQTTRECV: 0,0,0,0,/gg0********/8677*********/user/test,this is a test

  实现说明

  ●该命令用于发布时,如果在timeout时间内没有收到报文确认,则会打印ERROR。在收到一个QOS大于0的报文确认消息时,会打印+MQTTPUBACK_MSGID:,其中msgid为PUB报文的信息id。当查询发布消息时,查询的结果为发布的次数。当MQTT服务器不支持topic为0字节的字符串时,如果发送0字节的topic消息,则会导致断连。

  ●该命令最多允许2个发布消息在重传队列中,超过2个发布消息会直接返回ERROR,不会发送。重传队列会尝试5次重传,之后就会清除重传队列里的发布消息。

  ●在断连之后计数会清零。计数达到最大值建议反转,最大值4294967295(unsigned int)。在NB-IoT场景下最大的发包长度不能超过SEND_MAX_LEN(1358)字节,如果超出长度则会发送失败。失败时会打印实际的发送长度,用户需要保证发包长度不能超过SEND_MAX_LEN(1358)字节长度。

  例如:用户在非加密连接的情况下发送1500字节内容,实际包长度为包头长度和包体长度之和,为1505字节。包头长度为1505-1500=5字节,根据SEND_MAX_LEN(1358)长度限制,可以发送的包体的长度为SEND_MAX_LEN-包头长度=1358-5=1353字节.


  [15:28:41.451]→◇AT+MQTTPUB=0,1,0,0,"","adebcbcbabcbdbdbdbadbabadbceebbbebfbbabbdbbefbbebebdbadebcbcba

  bcbdbdbdbadbabadbceebbbebfbbabbdbbefbbebebdbadebcbcbabcbdbdbdbadbabadbceebbbebfbbabbdbbefbbebebd

  badebcbcbabcbdbbceebbbebfbbabbdbbefbbebebdbadebcbcbabcbdbdbdbadbabadbceebbbebfbbabbdbbefbbebebdba

  debcbcbabcbdbdbdbadbabadbceebbbebfbbabbdbbefbbebebdbadebcbcbabcbdbdbdbadbabadbceebbbebfbbabbdbbef

  bbebebdbadebcbcbabcbdbdbdbadbabadbceebbbebfbbabbdbbefbbebebdbadebcbcbabcbdbdbdbadbabadbceebbbebf

  bbabbdbbefbbebebdbadebcbcbabcbdbdbdbadbabadbceebbbebfbbabbdbbefbbebebdbadebcbcbabcbdbdbdbadbabad

  bceebbbebfadebcbcbabcbdbdbdbadbabadbceebbbebfbbabbdbbefbbebebdbadebcbcbabcbdbdbdbadbabadbceebbbeb

  fbbabbdbbefbbebebdbadebcbcbabcbdbdbdbadbabadbceebbbebfbbabbdbbefbbebebdbadebcbcbabcbdbdbdbadbaba

  dbceebbbebfbbabbdbbefbbebebdbadebcbcbabcbdbdbdbadbabadbceebbbebfbbabbdbbefbbebebdbadebcbcbabcbdbd

  bdbadbabadbceebbbebfbbabbdbbefbbebebdbadebcbcbabcbdbdbdbadbabadbceebbbebfbbabbdbbefbbebebdbadebc

  bcbabcbdbdbdbadbabadbceebbbebfbbabbdbbefbbebebdbadebcbcbabcbdbdbdbadbabadbceebbbebfbbabbdbbefbbe

  bebdbadebcbcbabcbdbdbdbadbabadbceebbbebfadebcbcbabcbdbdbdbadbabadbceebbbebfbbabbdbbefbbebebdbade

  bcbcbabcbdbdbdbadbabadbceebbbebfbbabbdbbefbbebebdbadebcbcbabcbdbdbdbadbabadbceebbbebfbbabbdbbefbb

  ebebdbadebcbcbabcbdbdbdbadbabadbceebbbebfbbabbdbbefbbebebdbadebcbcbabcbdbdbdbadbabadbceebbbebfbb

  abbdbbefbbebebdbadebcbcbabcbdbdbdbadbabadbceebbbebfbbabbdbbefbbebebdbadebcbcbabcbdbdbdbadbabadbc

  eebbbebfbbabbdbbefbbebebdbadebcbcbabcbdbdbdbadbabadbceebbbebfbbabbdbbefbbebebdbadebcbcbabcbdbdbd

  badbabadbceebbbebfbbabbdbbefbbebebd

  [15:28:41.461]收←◆

  [Error]:Please don't send a message longer than 1358 bytes. Message length which contains header and payload is 1505 bytes.

  [15:28:41.969]收←◆

  +MQTTCLOSE=0,128

  ERROR: 0,1,110

  ERROR

利记APP