一、MQTT数据包

在MQTT协议中,一个MQTT数据包由: 固定头(Fixed header)、可变头(Variable header)、消息体(payload)三部分构成。
在这里插入图片描述

二、固定报文头

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

三、可变报文头

在这里插入图片描述

四、QoS说明

MQTT发布消息服务质量保证(QoS)不是端到端的,是客户端与服务端之间的。订阅者收到MQTT消息的QoS级别,最终取决于发布消息的QoS和主题订阅的QoS

在这里插入图片描述

QoS0消息订阅(至多一次):

在这里插入图片描述

QoS1消息发布订阅(至少一次)

在这里插入图片描述

QoS2消息发布订阅(只有一次)

在这里插入图片描述

五、遗言消息

在 MQTT 中,客户端可以在连接时在服务端中注册一个遗嘱消息,与普通消息类似,我们可以设置遗嘱消息的主题、有效载荷等等。当该客户端意外断开连接,服务端就会向其他订阅了相应主题的客户端发送此遗嘱消息。这些接收者也因此可以及时地采取行动,例如向用户发送通知、切换备用设备等等。

假设我们有一个传感器监控一个很少变化的值,普通的实现是定期发布最新数值,但更好的实现是仅在数值发生变化时以保留消息的形式发送它。这使得任何新的订阅者总能立即获得当前值,而不必等待传感器再一次发布。不过订阅者也因此没有办法根据是否及时收到消息来判断传感器是否离线。借助遗嘱消息,我们可以立即得知传感器保持活动超时,而且不必总是获取传感器发布的值。

六、返回消息码Connect return code

0 - 成功连接
1 - 连接被服务端拒绝,原因是不支持客户端的MQTT协议版本
2 - 连接被服务端拒绝,原因是不支持客户端标识符的编码。
3 - 连接被服务端拒绝,原因是服务端不可用。
4 - 连接被服务端拒绝,原因是用户名或密码无效。
5 - 连接被服务端拒绝,原因是客户端未被授权连接到此服务端

七、sessionPresent

设备端登使用cleanStart=false连接后,如果服务器有持续会话,则服务器会把离线时的持续会话的内容发给客户端。

简单来说,就是服务器帮你保存离线数据,等你上线了,立马发给你

示例:

如ClientId=1, CleanStart=false, SessionExpiry=3600s, Qos=2即指定clientId=1的会话为持久会话,用户在离线后3600s的的离线消息都会被Mqtt服务器保存。

用户在离线时间不超过3600s且再次以ClientId=1重新上线时,是可以收到离线期间消息的补充推送的,同时Qos=2(exactly once)保证消息只会被客户端收到一次且一定一次。

参考

作者:admin  创建时间:2026-06-04 07:13
最后编辑:admin  更新时间:2026-06-04 07:41