查看: 932|回复: 0

[技术交流] MB960/860阿里云平台MQTT协议接入指导(二)MQTT AT指令接入

[复制链接]

50

主题

409

帖子

1309

积分

利尔达员工

Rank: 9Rank: 9Rank: 9

积分
1309
发表于 2021-11-26 14:00:13 | 显示全部楼层 |阅读模式
(二)MQTT AT指令接入
1、设置服务端IP或域名
AT+MQTTCFG="host",0,"host_name",1883
<host_name>:服务端的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=0AT+NCONFIG=PCO_IE_TYPE,PCO
两条AT命令开启DNS服务器,再次重启,之后才能使用域名连接。
2、设置客户端标识
AT+MQTTCFG="clientid",<Link_ID>,<client_id>
< Link_ID > 连接ID:取值0~2
<client_id> 客户端标识符:字符串类型,1~128字节字符串。
示例:
AT+MQTTCFG="clientid",0,"8677**********|securemode=2,signmethod=hmacsha1|"
实现说明
如果连接NB-IOT平台,则需根据平台规则来设置客户端标识。
3、连接服务端
AT+MQTTCONN= <Link_ID>,<ssl_enable>,<will_flag>,<username>,<password>
< Link_ID > 连接ID:取值0~2
<ssl_enable> SSL TCP连接使能:
0:不采用;
1:采用SSL TCP连接。
will_flag 遗嘱标志,取值01
0:不带遗嘱;
1CONNECT报文带有遗嘱。
<username> 用户名:0~512字节的字符串。
<password> 密码:0~512字节的字符串。
注:阿里云平台用户名及密码需用三元组生成,生成方式请参考阿里云平台提供的密码生成文档。
示例:
AT+MQTTCONN=0,0,0,"8677******&gg0*******","91C3E702****************************755*****"
实现说明
在连接前需要设置服务端ipclientid,不同的平台连接使用的用户名和密码需要根据
平台要求进行设置。如果是加密连接还需要设置证书,并使ssl_enable1。设置will_flag1时,还需要设置遗嘱。
连接失败时的<err>错误码如下:
● 0:返回正确;
● 1:未知错误;
● 2:申请内存失败;
● 3:参数检查错误;
● 80:网络连接状态错误(可是未拨号/时间不对/服务器关闭);
● 81MQTT设置版本错误;
● 82clientid错误;
● 83:服务器拒绝客户端连接;
● 84:用户名或者密码错误;
● 85:订阅失败 #订阅失败会导致断连;
● 86:取消订阅失败;
● 87:发布失败;
● 88:当前未连接;
● 89:当前已有连接又再次发起连接;
● 90:创建客户端失败;
● 91:该linkid已创建客户端又再次发起创建;
● 92:该linkid未创建客户端;
● 93:当前MQTT状态不允许执行该操作。
查询连接时的<state>状态如下:
● 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>,<packId>,<topic1>,<qos1>[,<topic2>,<qos2>][,<topic3>,<qos3>]
< Link_ID > 连接ID:取值0~2
<packId> 报文标识符:取值1~65535
<topic> 主题名:0~512字节字符串。一次最多可订阅3个主题。
<qos> 订阅消息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>,<packId>,<qos>,<retain>,<topic>,<payload>
< Link_ID > 连接ID:取值0~2
<packId> 报文标识符:取值1~65535
<qos> 发布消息QOS等级:取值0~2
<retain> 保留标志:取值0~1
<topic> 主题名:0~512字节字符串。
<payload> 有效载荷: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>,其中msgidPUB报文的信息id。当查询发布消息时,查询的结果为发
布的次数。当MQTT服务器不支持topic0字节的字符串时,如果发送0字节的
topic消息,则会导致断连。
该命令最多允许2个发布消息在重传队列中,超过2个发布消息会直接返回
ERROR,不会发送。重传队列会尝试5次重传,之后就会清除重传队列里的发布消
息。
在断连之后计数会清零。计数达到最大值建议反转,最大值4294967295
unsigned int)。
NB-IoT场景下最大的发包长度不能超过SEND_MAX_LEN(1358)字节,如果超出
长度则会发送失败。失败时会打印实际的发送长度,用户需要保证发包长度不能
超过SEND_MAX_LEN1358)字节长度。
例如:用户在非加密连接的情况下发送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,"","adebcbcbabcbdbdbdbadbabadbceebbbebfbbabbdbbefbbebebdbade
bcbcbabcbdbdbdbadbabadbceebbbebfbbabbdbbefbbebebdbadebcbcbabcbdbdbdbadbabad
bceebbbebfbbabbdbbefbbebebdbadebcbcbabcbdbdbdbadbabadbceebbbebfbbabbdbbefbbe
bebdbadebcbcbabcbdbdbdbadbabadbceebbbebfbbabbdbbefbbebebdbadebcbcbabcbdbdbd
badbabadbceebbbebfbbabbdbbefbbebebdbadebcbcbabcbdbdbdbadbabadbceebbbebfbbabb
dbbefbbebebdbadebcbcbabcbdbdbdbadbabadbceebbbebfbbabbdbbefbbebebdbadebcbcbab
cbdbdbdbadbabadbceebbbebfbbabbdbbefbbebebdbadebcbcbabcbdbdbdbadbabadbceebbb
ebfadebcbcbabcbdbdbdbadbabadbceebbbebfbbabbdbbefbbebebdbadebcbcbabcbdbdbdbad
babadbceebbbebfbbabbdbbefbbebebdbadebcbcbabcbdbdbdbadbabadbceebbbebfbbabbdb
befbbebebdbadebcbcbabcbdbdbdbadbabadbceebbbebfbbabbdbbefbbebebdbadebcbcbabcb
dbdbdbadbabadbceebbbebfbbabbdbbefbbebebdbadebcbcbabcbdbdbdbadbabadbceebbbeb
fbbabbdbbefbbebebdbadebcbcbabcbdbdbdbadbabadbceebbbebfbbabbdbbefbbebebdbadeb
cbcbabcbdbdbdbadbabadbceebbbebfbbabbdbbefbbebebdbadebcbcbabcbdbdbdbadbabadb
ceebbbebfbbabbdbbefbbebebdbadebcbcbabcbdbdbdbadbabadbceebbbebfadebcbcbabcbdb
dbdbadbabadbceebbbebfbbabbdbbefbbebebdbadebcbcbabcbdbdbdbadbabadbceebbbebfb
babbdbbefbbebebdbadebcbcbabcbdbdbdbadbabadbceebbbebfbbabbdbbefbbebebdbadebcb
cbabcbdbdbdbadbabadbceebbbebfbbabbdbbefbbebebdbadebcbcbabcbdbdbdbadbabadbce
ebbbebfbbabbdbbefbbebebdbadebcbcbabcbdbdbdbadbabadbceebbbebfbbabbdbbefbbebeb
dbadebcbcbabcbdbdbdbadbabadbceebbbebfbbabbdbbefbbebebdbadebcbcbabcbdbdbdbad
babadbceebbbebfbbabbdbbefbbebebdbadebcbcbabcbdbdbdbadbabadbceebbbebfbbabbdb
befbbebebd"
[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


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表