MQTT V5 新特性:
格式
协议上,V5 增加 Property 字段,可以支持众多的新特性。
V3 没有可以拓展的地方。
request/response 模式
MQTT 本身是 订阅/推送 模式。无 HTTP那样 请求/相应 模式。
MQTT 如何在 订阅/推送 模式下支持 request/response 模式:
例:
(1)A publish 一个消息,消息topic假设是"topicA",该消息 通过Property携带了Response Topic,假设该字段是"topicresponse"。
(2)订阅了"topicA"的接收端B(有可能有多个)收到了该消息。
(3)B处理完"topicA"后,会publish 一个 topic 名字是 “topicresponse” 的消息。该消息有可能是A订阅的,也有可能是其他人订阅的。
(4)A publish 的消息,可能还会携带Correlation Data属性,假设其值是"msgresponse",这样B发publish的消息就是(“topicresponse”, “msgresponse”)。
Server redirection
Server 可以发送connack 或 disconnect,其 reason codes 可以是0x9c 或 0x9d, 表示client 需要往另一个server发送请求。
0x9c 类似 HTTP 的 302。
0x9d 类似 HTTP 的 301。
connack 或 disconnect 可以通过 property 携带 server redirection ,其值可以告诉client往哪个server发送请求,类似HTTP 的 "Location"首部
AUTH 控制报文
MQTT 单纯通过 connetct 可能无法提供足够信息给Server进行身份认证,所以Server在收到MQTT的connect 后,回复AUTH控制报文给Client,Client接着也用AUTH包发送附加信息,Server知道认证完成后,才会发送Connack。
Topic Alias | Topic Alias Maximum
类似HTTP2的头部压缩效果。
publish消息时,需要携带 topic和message,其中topic是固定的,只需要第一次发送完整的topic,并且通过 Property 中携带 Topic Alias 告知对端下次这个publish 的topic会试用Topic Alias 中的值代替,Topic Alias 的值是一个整数类型的值。
client 通过connect 中的 Topic Alias Maximum 告知Server自己能处理的最多 topic alias 个数。
server 通过connack中 Topic Alias Maximum 告知Client 自己能处理的最多 topic alias 个数。
如果当前publish 消息的topic长度不为0, 那么接受方需要解析Topic Alias 中的值,并将topic和该值进行映射。
如果当前publish消息的topic为0,那么接收方需要解析Topic Alias 中的值,用该值去查找对应 topic。
User Property
自定义属性,可以添加两端约定的数据。
例:可以加入类似HTTP的“Header:value”信息。MQTT 本身没有类似HTTP的HOST信息,我们可以使用User Property 特性让MQTT支持。
Session Expiry Interval
之前MQTT版本,当cleansession为0时,server和client会尝试保存session信息(sub信息、publish状态等),但 server不知道需要保存session多久。MQTT 5.0在properey字段中增加Session Expiry Interval属性来告知server这个session希望被保存多久。
如果MQTT 5.0 不携带 Session Expiry Interval 或者 值为0,server 和 client 不会保存 session信息。
如果 Session Expiry Interval 值为 0xffffffff,则表示session永远不会老化。
注:需配合 Clean Start 使用,如果 Clean Start 为 1, Session Expiry Interval 设置无意义。
Maximum QoS
Server 可以发送 Maximum QoS 属性告知 Client自己支持最大的QoS是多少,Client 发送的publish的QoS 不能大于该值。
Receive Maximum
告知对方自己希望处理的最大QoS 1 或 QoS 2 publish 消息个数,默认是 65535.
作用: 流控
当处理QoS > 0的publish时,需要回复对端puback、pubrec pubcomp 等。Receive Maximum 属性提供了告诉对端发送QoS >0 的publish速率,对端发送未决publish个数等于 Receive Maximum 时,不能在发送QoS > 0 的publish消息了。
Maximum Packet Size
单个MQTT 控制报文的大小,如果不携带,表示不限制。
这个大小指整个MQTT控制报文的大小。对端如果发现发送的包大于该值,就默认丢弃,不关闭连接。如果自己收到超过自己通告的 Maximum Packet Size 需要关闭连接。
Reason Code
MQTT 3.0 只 connack 有成功/失败 的标志位,现在MQTT 5.0 所有ack 都有该标志位。
注: suback 中,MQTT 3.1.1的Granted Qos 被取代为 Reason Code , Reason Code 中有状态码表示了具体的Granted Qos.
如果Publish 成功,其 ack 的 reason code 可以不添加。
Reason String
所有ack 以及disconnect 都可以携带Reason String 属性告知对方一些特殊的信息,一般来说是ack失败的情况下会使用该属性告知对端为什么失败,可以用来弥补 reason code信息不够。
Clean Start
Clean Start 取代 MQTT 3.1.1 中 CleanSession。 语义上两者相同。
Payload Format Indicator
指定publish 消息的message部分是utf8格式的还是二进制的,接收方必须验证payload 是否是该属性定义的格式。
= 0,表示是 二进制,默认属性。
= 1,表示 utf8 编码数据。
Message Expiry Interval
指定了publish 数据在server的最长等待时间。超过这个时间,这个数据不能被publish到匹配topic的subscriber。