MQTT协议简单了解 MQTT报文解析

一、简介

MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的"轻量级"通讯协议,该协议构建于TCP/IP协议上,由IBM在1999年发布。MQTT最大优点在于,可以以极少的代码和有限的带宽,为连接远程设备提供实时可靠的消息服务。作为一种低开销、低带宽占用的即时通讯协议,使其在物联网、小型设备、移动应用等方面有较广泛的应用。

MQTT是一个基于客户端-服务器的消息发布/订阅传输协议。MQTT协议是轻量、简单、开放和易于实现的,这些特点使它适用范围非常广泛。在很多情况下,包括受限的环境中,如:机器与机器(M2M)通信和物联网(IoT)。其在,通过卫星链路通信传感器、偶尔拨号的医疗设备、智能家居、及一些小型化设备中已广泛使用。
MQTT协议简单了解 MQTT报文解析_第1张图片

二、MQTT的介绍

客户端即可以订阅服务器的主题,又可以发布消息给服务器,所以客户端既可以是订阅者也可以是发布者。

客户端

使用MQTT的程序或设备。客户端总是通过网络连接到服务端吗,有以下的功能:
发布应用消息给其它相关的客户端。

订阅以请求接受相关的应用消息

取消订阅以移除接受应用消息的请求

从服务端断开连接

服务端

一个程序或设备, 作为发送消息的客户端和请求订阅的客户端之间的中介,有以下的功能
接受来自客户端的网络连接

接受客户端发布的应用消息

处理客户端的订阅和取消订阅请求

转发应用消息给符合条件的已订阅客户端

订阅 Subscription

订阅包含一个主题过滤器( Topic Filter) 和一个最大的服务质量( QoS) 等级。 订阅与单个会话( Session) 关联。 会话可以包含多于一个的订阅。 会话的每个订阅都有一个不同的主题过
滤器。

主题名 Topic Name

附加在应用消息上的一个标签, 服务端已知且与订阅匹配。 服务端发送应用消息的一个副本给每一个匹配的客户端订阅

主题过滤器 Topic Filter

订阅中包含的一个表达式, 用于表示相关的一个或多个主题。 主题过滤器可以使用通配符

会话 Session

客户端和服务端之间的状态交互。 一些会话持续时长与网络连接一样, 另一些可以在客户端和服务端的多个连续网络连接间扩展

控制报文 MQTT Control Packet

通过网络连接发送的信息数据包。 MQTT规范定义了十四种不同类型的控制报文, 其中一个( PUBLISH报文) 用于传输应用消息

MQTT报文

MQTT有三大报文模块,分别是:固定报头、可变报头、有效载荷。每个报文模块负责自己对应的功能。下面将介绍下每个报头对应字节对应位的作用,
首先了解报文的具体内容时,我们还应该了解到QoS这个报文等级:
QoS=0时,至多一次发送,具体来说就是,发送的一方只需要发送了这个信息就不需要管了,不管对方守没收到信息,接收到的一方也不需要发送确认报文

QoS=1时,至少一次发送,具体来说就是,发送的一方发送了信息,接收方收到信息必须要发送确认报文,如果发送的一方没有收到信息,就必须重新发送信息,知道收到对方的确认报文

QoS=1时,只有一次发送,具体来说就是,发送方发送一条信息,确保信息有且只有一条信息正确发送给了对方,并接受到了确认报文。

当然在建立连接的时候发送的报文,必须要由对方的确认连接报文。

固定报头

MQTT协议简单了解 MQTT报文解析_第2张图片

控制报文类型

开始的第一个字节byte1的高四位位MQTT的控制报文的类型,既然有4位的话很明显就有16钟类型,下面我们将看看对应的类型
MQTT协议简单了解 MQTT报文解析_第3张图片
值为0是不可用的,作为保留的

值为1时为connect表示客户端要连接服务器

值为2时为connack表示客户端发送了连接请求,现在服务器收到了,服务端要进行回应一个收到客户端连接的请求,并与客户端建立连接

值为3时为punblish表示发布消息可能是客户端发布消息给服务器,也可能是客户端订阅了主题,服务器需要发送消息给客户端,所以数据报文是双向流动的

值为4时puback表示QoS 1消息发布收到确认,数据报文双向流动

值位5时PUBREC表示被发布信息方发布了发布收到的报文,数据报文双向流动

值为6时PUBREL表示发布方知道消息发送了,数据报文双向流动

值为7时PUBCOMP表示QoS 2消息发布完成,用来保证数据有且只有一次正确发送,数据报文双向流动

值为8时SUBSCRIBE表示客户端向服务器发送订阅请求,数据报文客户端流向fwq

值为9时SUBACK表示服务器收到了客户端的订阅请求,然后发送一个订阅请求确认的报文,数据报文服务器流向客户端。

值为10时UNSUBSCRIBE表示客户端向服务器发送取消某个主题的订阅的报文,数据报文客户端流向服务器

值为11时UNSUBACK表示服务器收到了客户端取消某个主题的订阅报文,然后向客户端发送一个确认报文,数据报文服务器到客户端

值为12时PINGREQ表示客户端向fwq建立心跳连接的报文,数据报文客户端到服务器

值为13时PINGRESP表示服务器接收到了客户端建立心跳连接的报文,并发送以确认报文给客户端,数据报文服务器到客户端

值为14时DISCONNECT表示客户端发送给服务器断开连接的请求,数据报文客户端到服务器

值为15禁止使用,保留。

标志 flags

MQTT协议简单了解 MQTT报文解析_第4张图片
重发标志DUP:
如果DUP标志被设置为0, 表示这是客户端或服务端第一次请求发送这个PUBLISH报文。 如果DUP标志被设置为1, 表示这可能是一个早前报文请求的重发。

客户端或服务端请求重发一个PUBLISH报文时, 必须将DUP标志设置为1 。
对于QoS 0的消息, DUP标志必须设置为0。

服务端发送PUBLISH报文给订阅者时, 收到( 入站) 的PUBLISH报文的DUP标志的值不会被传播。 发送( 出站) 的PUBLISH报文与收到( 入站) 的PUBLISH报文中的DUP标志是独立设置的, 它的值必须单独的根据发送( 出站) 的PUBLISH报文是否是一个重发来确定。

服务等级QoS
MQTT协议简单了解 MQTT报文解析_第5张图片
PUBLISH报文不能将QoS所有的位设置为1。 如果服务端或客户端收到QoS所有位都为1的PUBLISH报文, 它必须关闭网络连接

保留标志 RETAIN
保留标志位1时选择保留,为0时不保留,具体可以参考MQTT协议的参考指南。
对于发布者不定期发送状态消息这个场景, 保留消息很有用。 新的订阅者将会收到最近的状态。

######剩余长度 Remaining Length
从第二字节开始,剩余长度( Remaining Length) 表示当前报文剩余部分的字节数, 包括可变报头和负载的数据。 剩余长度不包括用于编码剩余长度字段本身的字节数。
MQTT协议简单了解 MQTT报文解析_第6张图片

可变报头

可变报头是根据固定报头来设置的,有的有有的无。有可变报头这里我们将以控制报文类型的connect报文的可变报头简单讲解
CONNECT报文的可变报头按下列次序包含四个字段:
协议名(Protocol Name)
协议级别(Protocol Level)
连接标志(Connect Flags)
保持连接(Keep Alive)
协议名是表示协议名 MQTT 的UTF-8编码的字符串。MQTT规范的后续版本不会改变这个字符串的偏移和长度。如果协议名不正确,服务端需要断开客户端的连接。
MQTT协议简单了解 MQTT报文解析_第7张图片
表示长度的有2个字节,分别时低位的LSB和高位的MSB,MQTT的长度为4,所以设置了LSB的值为4。后面的4个字节就表示MQTT的字符串。

协议级别
MQTT协议简单了解 MQTT报文解析_第8张图片
也就是协议的版本号

连接标志
连接标志字节包含一些用于指定MQTT连接行为的参数。它还指出playload字段是否存在。
MQTT协议简单了解 MQTT报文解析_第9张图片
MQTT协议简单了解 MQTT报文解析_第10张图片
Keep alive
MQTT协议简单了解 MQTT报文解析_第11张图片
保持连接( Keep Alive) 是一个以秒为单位的时间间隔, 表示为一个16位的字, 它是指在客户
端传输完成一个控制报文的时刻到发送下一个报文的时刻, 两者之间允许空闲的最大时间间
隔。 客户端负责保证控制报文发送的时间间隔不超过保持连接的值。 如果没有任何其它的控
制报文可以发送, 客户端必须发送一个PINGREQ报文

有效载荷

这个部分的报文,也就是我们要发送的信息,比如我们连接阿里云,然后向阿里云发送信息,阿里云有着严格的数据定义,必须发送的时json格式的信息,所以有效载荷的数据就是发送json的数据。

本次博客关于mqtt的一部分讲解,我们大多只了解下控制报文类型就可以了,可变头部和有效载荷不需要深入了解,了解了固定头部就能够很清楚的知道mqtt的大概工作原理了。上述所写大部分参考了MQTT协议知道手册

你可能感兴趣的:(MQTT协议简单了解 MQTT报文解析)