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

posted @ 2023-02-17 15:55  YYFaGe  阅读(499)  评论(0编辑  收藏  举报