增强端云交互
本文介绍云消息队列 MQTT 版支持的MQTT 5.0新特性的增强端云交互功能说明。
功能介绍
MQTT 5.0 引入了多项新特性来增强客户端与服务器(云)之间的交互,比如请求/响应模式、订阅选项以及改进的错误报告等。这些新特性旨在提高通信的灵活性、可靠性和持久性,并为不同的端到云应用场景提供更有效的解决方案。
应用场景
请求/响应交互:客户端可以向服务器请求数据或执行动作,并从服务器接收响应,就像传统的HTTP请求/响应模型一样。
服务质量(QoS)管理:订阅选项允许客户端指定最大QoS级别,并控制是否接收保留消息,确保服务质量。
状态同步:保留消息和会话过期功能能够帮助客户端在断线重连时恢复其会话状态,提高通信的持久性。
建连交互
建连交互是提供一种设备端和服务端协商的能力,客户端建连时设置配置参数,服务端回复最终支持的功能以及配置项最后的值。
建连交互 | 参数说明 | 服务端返回 |
是否支持通配订阅 |
| 1 |
是否支持订阅标志符 |
| 1 |
是否支持主题别名 |
| 1 |
支持的最高QoS |
| 2 |
连接保活时间 | 在保活时间内需要有心跳包或数据包,否则会被断开连接。 取值范围:1~8。 单位:分钟。 | 返回设备设置值。 如果超过最大取值范围8分钟,按照8分钟设置。 |
会话过期时间 | 连接断开后,会话的保留时间。 取值范围:0~2147483647。 单位:秒。 | 返回设备设置值。 如果没有设置则默认为0,断开连接会话立即过期。如果设置了过期时间则最小过期间隔不少于10分钟,小于10分钟的情况下,按照10分钟设置。 |
最大的数据包长度 | 取值范围:0~128。 单位:KB。 说明
| 固定值131072,表示128 KB。 |
最大主题别名个数 | 取值范围:0~30。 |
|
Receive Maximum
MQTT 5.0新增了Receive Maximum属性,它存在于CONNECT报文与CONNACK报文,表示客户端或服务端能够同时处理的QoS为1、QoS为2的PUBLISH报文最大数量,即对端可以使用的最大发送配额,最大值为65535,超过该数值则按照65535设置。
Receive Maximum属性提供了告诉对端发送QoS为1、QoS为2的PUBLISH的最大数量,对端发现未决PUBLISH个数等于Receive Maximum时,不能再发送QoS为1、QoS为2的PUBLISH消息了,以此来实现流量控制。
服务端主动断开
在MQTT 5.0中,服务端可以发送主动断开报文,并支持设置一个错误码及错误原因的字符串,用户可以根据返回的错误内容排查具体出错的原因。
常见错误码
十进制 | 十六进制 | 名称 | 报文 |
0 | 0x00 | 成功(Success) | CONNACK, PUBACK, PUBREC, PUBREL, PUBCOMP, UNSUBACK, AUTH |
0 | 0x00 | 正常断开连接(Normal disconnection) | DISCONNECT |
0 | 0x00 | QoS 0(Granted QoS 0) | SUBACK |
1 | 0x01 | QoS 1(Granted QoS 1) | SUBACK |
2 | 0x02 | QoS 2(Granted QoS 2) | SUBACK |
4 | 0x04 | 与遗嘱消息断连(Disconnect with Will Message) | DISCONNECT |
17 | 0x11 | 不存在订阅(No subscription existed) | UNSUBACK |
128 | 0x80 | 未指定错误(Unspecified error) | CONNACK, PUBACK, PUBREC, SUBACK, UNSUBACK, DISCONNECT |
129 | 0x81 | 畸形报文(Malformed Packet) | CONNACK, DISCONNECT |
130 | 0x82 | 协议错误(Protocol Error) | CONNACK, DISCONNECT |
131 | 0x83 | 特定实现错误(Implementation specific error) | CONNACK, PUBACK, PUBREC, SUBACK, UNSUBACK, DISCONNECT |
132 | 0x84 | 不支持的协议版本(Unsupported Protocol Version) | CONNACK |
133 | 0x85 | 客户标识符无效(Client Identifier not valid) | CONNACK |
134 | 0x86 | 用户名或密码错误(Bad User Name or Password) | CONNACK |
135 | 0x87 | 未经授权(Not authorized) | CONNACK, PUBACK, PUBREC, SUBACK, UNSUBACK, DISCONNECT |
136 | 0x88 | 服务器不可用(Server unavailable) | CONNACK |
137 | 0x89 | 服务器繁忙(Server busy) | CONNACK, DISCONNECT |
138 | 0x8A | 禁止访问(Banned) | CONNACK |
140 | 0x8C | 错误验证方法(Bad authentication method) | CONNACK, DISCONNECT |
141 | 0x8D | 保活超时(Keep Alive timeout) | DISCONNECT |
142 | 0x8E | 会话被接管(Session taken over) | DISCONNECT |
143 | 0x8F | 主题过滤无效(Topic Filter invalid) | SUBACK, UNSUBACK, DISCONNECT |
144 | 0x90 | 主题名称无效(Topic Name invalid) | CONNACK, PUBACK, PUBREC, DISCONNECT |
145 | 0x91 | 正在使用数据包标识符(Packet Identifier in use) | PUBACK, PUBREC, SUBACK, UNSUBACK |
146 | 0x92 | 找不到数据包标识符(Packet Identifier not found) | PUBREL, PUBCOMP |
147 | 0x93 | 超过接收最大值(Receive Maximum exceeded) | DISCONNECT |
148 | 0x94 | 主题别名无效(Topic Alias invalid) | DISCONNECT |
149 | 0x95 | 数据包过大(Packet too large) | CONNACK, DISCONNECT |
150 | 0x96 | 消息速率过高(Message rate too high) | DISCONNECT |
151 | 0x97 | 超出配额(Quota exceeded) | CONNACK, PUBACK, PUBREC, SUBACK, DISCONNECT |
153 | 0x99 | 有效载荷格式无效(Payload format invalid) | CONNACK, PUBACK, PUBREC, DISCONNECT |
154 | 0x9A | 不支持消息保留(Retain not supported) | CONNACK, DISCONNECT |
155 | 0x9B | 不支持的QoS(QoS not supported) | CONNACK, DISCONNECT |
158 | 0x9E | 不支持的共享订阅(Shared Subscription not supported) | SUBACK, DISCONNECT |
159 | 0x9F | 超出连接速率(Connection rate exceeded) | CONNACK, DISCONNECT |
160 | 0xA0 | 最大连接时间(Maximum connect time) | DISCONNECT |
161 | 0xA1 | 不支持订阅标识符(Subscription Identifiers not supported) | SUBACK, DISCONNECT |
162 | 0xA2 | 不支持通配符订阅(Wildcard Subscriptions not supported) | SUBACK, DISCONNECT |