MQTT 5.0 是MQTT协议的最新版本,相比之前的版本有了很多改进。新增功能包括:原因代码、会话过期间隔、主题别名、用户属性、订阅选项、请求/响应功能和共享订阅等。
MQTT 5.0 新特性
请求响应特性
MQTT 的发布订阅机制,使消息的发送者和接收者完全解耦,所以消息可以被异步地传递。但这也带来了一个问题,即便是使用了 QoS 1 或 2 的消息,发布端也只能确保消息到达服务端,而无法知晓订阅端最终是否收到了消息。在执行一些请求或命令时,发布端还会想要知道对端的执行结果。最直接的做法是,让订阅端为请求返回响应。
实现上述请求响应的一种方案是,设置一个请求主题和一个响应主题,订阅端收到请求消息后向响应主题发送一个响应消息,然而这种方式响应主题必须提前确定,无法灵活地变更。当存在多个不同的请求方时,由于只能订阅相同的响应主题,所以所有请求方都会收到响应,并且它们无法分辨响应是否属于自己:
为了解决以上问题,MQTT 5.0
引入了响应主题 (Response Topic
)、关联数据 (Correlation Data
) 和响应信息 (Response Information
)
响应主题
在 MQTT 5.0
中,请求方可以在请求消息中指定一个自己期望的响应主题 (Response Topic
)。响应方根据请求内容采取适当的操作后,向请求中携带的响应主题发布响应消息。如果请求方订阅了该响应主题,那么就会收到响应。这样请求方将自己的Client Id
作为响应主题的一部分,就可以有效避免响应主题的冲突
关联数据
请求方还可以在请求中携带关联数据 (Correlation Data
),响应方需要在响应中将关联数据原封不动地返回,请求方因此可以识别响应所属的原始请求。
一方面这可以避免在响应方没有按请求顺序返回响应或者由于网络连接断开导致丢失了某个响应 (
QoS 0
) 时,请求方不正确地关联响应与原始请求。另一方面,请求方可能需要与多个响应方交互,譬如我们通过手机控制家中的各种智能设备,关联数据可以让请求方仅订阅一个响应主题就能管理从多个响应方异步返回的响应。
响应信息
出于安全考虑,MQTT
服务端通常会限制客户端可以发布和订阅的主题。请求方可以指定一个随机的响应主题,但无法保证自己有订阅该主题的权限,也无法保证响应方有向该响应主题发布消息的权限。
所以MQTT 5.0
还引入了响应信息 (Response Information
) 属性,通过在CONNECT
报文中将请求响应信息(Request Response Information
) 标识符设置为 1,客户端可以请求服务端在 CONNACK
报文中返回响应信息(Response Information
)。客户端可以将响应信息的内容作为响应主题的某个特定部分,以便通过服务端的权限检查。
注意事项
需要在发送请求前订阅响应主题
借助响应信息来构建符合权限的响应主题
存在多个请求方时,需要使用不同的响应主题
存在多个响应方时,最好设置关联数据以避免响应混淆
遗嘱消息也可以使用请求响应特性,只需要在连接时为遗嘱消息设置响应主题即可。这可以帮助客户端知道在自己离线期间遗嘱消息是否被消费,以便做出适当的调整。
用户属性
用户属性允许用户想MQTT消息添加自己的元数据,传输额外的自定义信息(类似HTTP Header概念),由一个用户自定义的 UTF-8 的键/值对数组组成,并在消息属性字段中配置,只要不超过最大的消息大小,可以使用无限数量的用户属性来向 MQTT 消息添加元数据,并在发布者、MQTT 服务器和订阅者之间传递信息。常用有两者用户属性配置:
- 连接客户端的用户属性: 服务器预先定义好的属性,客户端连接成功后可以获取使用
- 消息发布的用户属性: 在客户端之间进行元数据信息的传递
- 订阅Topic时的用户属性
- 取消订阅时的用户属性
- 断开连接时的用户数属性
用户属性的应用:
可以借助用户属性传输文件:
{
"filename": "test.txt",
"content": "xxxx"
}定义资源解析方式:
{
"type": "JSON/XML"
}