MQTT 3.1.1介绍
一、MQTT协议概述
MQTT(Message Queuing Telemetry Transport, 消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的"轻量级"通讯协议,该协议构建于TCP/IP协议上,由IBM在1999年发布。MQTT最大优点在于,可以以极少的代码和有限的带宽,为远程连接设备提过实时可靠的消息服务,作为一种低开销、低带宽占用的即时通讯协议,使其在物联网、小型设备、移动应用等方面有较广泛的应用
MQTT是一个基于客户端-服务器的消息发布/订阅传输协议。MQTT协议是轻量、简单、开放和易于实现的,这些特点使它适用范围非常广泛。在很多情况下,包括受限的环境中,如:机器与机器(M2M)通信和物联网(loT)。其在,通过卫星链路通信传感器、偶尔拨号的医疗设备、智能家居、及一些小型化设备中已广泛使用。
二、MQTT数据包结构
mqtt数据包有三部分组成,分别是固定报头、可变报头、数据载荷。固定包头每个数据包都有,里面有数据包的控制字段。可变和数据载荷有些数据包有,有些数据包没有。比如心跳数据包就没有可变报头和数据载荷
2.1 固定报头
固定包头有两个字节,第一字节的低四位为不同数据包的具体标志,高四位为数据包类型。第二字节开始为数据包剩余长度。
第一字节高四位数据包类型:
第二字节开始的剩余长度:
剩余长度字段使用一个变长度编码方案,对小于128的值它使用单字节编码,而对于更大的数值则按下面的方式处理:每个字节的低7位用于编码数据长度,最高位(bit7)用于标识剩余长度字段是否有更多的字节,且按照大端模式进行编码,因此每个字节可以编码128个数值和一个延续位,剩余长度字段最大可拥有4个字节。
- 当剩余长度使用1个字节存储时,其取值范围为0(0x00)~127(0x7f)。
- 当使用2个字节时,其取值范围为128(0x80,0x01)~16383(0Xff,0x7f)。
- 当使用3个字节时,其取值范围为16384(0x80,0x80,0x01)~2097151(0xFF,0xFF,0x7F)。
- 当使用4个字节时,其取值范围为2097152(0x80,0x80,0x80,0x01)~268435455(0xFF,0xFF,0xFF,0x7F)。
三、MQTT客户端连接服务器
mqtt客户端想要通讯第一步就是要连接服务器,连接开始有mqtt客户端向服务器发布一个connect报文,然后服务器给客户端一个 conneack应答报文。
3.1 connect报文固定报头
connect报文有“”固定报头+可变报头+数据载荷“”组成。
固定报头内容如下:
3.2 connect 报文可变报头
协议名称:固定填写“MQTT”
协议等级:如果是mqtt 3.1.1 协议的填写4
连接标志:
1、clean session:
Clean Session’设置为0,表示创建一个持久会话,在客户端断开连接时,会话仍然保持并保存离线消息,直到会话超时注销。
‘Clean Session’设置为1,表示创建一个新的临时会话,在客户端断开时,会话自动销毁
https://blog.csdn.net/weixin_42990464/article/details/127682469
2、Will Flag :遗言标志位,1表示使能遗嘱消息,0表示不使能遗嘱消息
遗嘱消息是 MQTT 为那些可能出现 意外断线 的设备提供的将 遗嘱 优雅地发送给第三方的能力。
客户端 A 遗嘱消息内容设定为 offline,该遗嘱主题与一个普通发送状态的主题设定成同一个 A/status。
当客户端 A 连接时,向主题 A/status 发送内容为 online 的 Retained 消息,其它客户端订阅主题 A/status 的时候,将获取到 Retained 消息为 online。
当客户端 A 异常断开时,系统自动向主题 A/status 发送内容为 offline 的消息,其它订阅了此主题的客户端会马上收到 offline 消息;如果遗嘱消息设置了 Will Retain,那么此时如果有新的订阅 A/status 主题的客户端上线,也将获取到内容为 offline 的遗嘱消息。
3、Will QoS: 遗言的消息质量
4、Will Retain: 遗言的保持状态
5、Password Flag:消息载体中是否包含密码
6、User Name Flag: 消息载体中是否包含用户名
心跳时长:
参考此链接http://events.jianshu.io/p/d04a8028a62d
四、MQTT客户端发布信息
mqtt发布消息的报文有“固定报头+可变报头+数据载体”组成,
4.1 固定报头
RETAIN:Retained 消息是指在 PUBLISH 数据包中 Retain 标识设为 1 的消息,Broker 收到这样的 PUBLISH 包以后,将保存这个消息,当有一个新的订阅者订阅相应主题的时候,Broker 会马上将这个消息发送给订阅者
QoS=0 代表,Sender 发送的一条消息,Receiver 最多能收到一次,也就是说 Sender 尽力向 Receiver 发送消息,如果发送失败,也就算了;
QoS=1 代表,Sender 发送的一条消息,Receiver 至少能收到一次,也就是说 Sender 向 Receiver 发送消息,如果发送失败,会继续重试,直到 Receiver 收到消息为止,但是因为重传的原因,Receiver 有可能会收到重复的消息;
QoS=2 代表,Sender 发送的一条消息,Receiver 确保能收到而且只收到一次,也就是说 Sender 尽力向 Receiver 发送消息,如果发送失败,会继续重试,直到 Receiver 收到消息为止,同时保证 Receiver 不会因为消息重传而收到重复的消息。
DUP flag: DUP=1表示是重发的包,对于Qos=1或Qos=0而言,DUP=0表示该包第一次发送
4.2 可变报头
可变报头包含了发布主题和包id
五、MQTT客户端订阅信息
5.1 订阅报文固定报头
5.2 订阅报文可变报头
订阅报文可变报头里包含了包标志符
5.3 订阅报文数据载荷
订阅报文的数据载荷包含了主题过滤器和最大qos,如下所示:
主题过滤器参考这个连接:https://tool.4xseo.com/article/185136.html
六、总结
mqtt协议是为解决多设备之间轻量级信息交互的问题,用订阅和发布机制让消息接收方和发送方解耦合。
参考资料:
https://mqtt.org/
https://mqtt.org/mqtt-specification/
https://blog.csdn.net/qq_30360351/article/details/127647832
https://github.com/jiejieTop/mqttclient/blob/master/docs/mqtt-introduction.md