mqtt协议_物联网(IoT)常用通信协议全详解——MQTT协议

什么是MQTT协议?

MQTT协议是构建于tcp/ip协议的一种应用层协议,它的全称是(Message Queuing Telemetry Transport)。我们常见的http就是一种应用层协议。MQTT协议的优点在于可以使用极少的代码和有限的带宽去传输信息,因为其低开销,低带宽占用的及时通讯特点使其在物联网,小型设备直接的通讯等中十分常见。

当用户使用mqtt协议进行通讯时,会先和服务器进行连接也就是订阅,成功连接后就会展开会话环节,在会话时我们会产生一个主题的概念,我们会告诉服务器我们的主题,服务器也会通过主题来给我们发送信息。

8b1d6f22623a1d728f2feefe54e90fd2.png

MQTT协议

MQTT协议的格式

每条MQTT的消息都包含一个固定的报头,有些消息会携带一个可变报文头和一个负荷。

MQTT协议分为三部分:固定头,可变头和负载。其中固定头是必须包含的,可变头与负载视使用者的情况而定。

固定头和可变头的主要作用有为设置消息的类型,用户只会接收到想接收到的消息,负载则为确切的信息。

a983f1aaeda829d0bba7de0dae7989ea.png

物联网

固定头

固定头顾名思义就是每个mqtt消息头部都要包含的头部,它最少可为两字节。

cf1d9bd4d3d353c8772445d4d25e03c4.png

固定头格式

上表为我们展示了固定头的格式。


字节一:

讯息类型占了第一个字节中的第7位到第4位,

72aa9d709ec863aff5c9aca09839c84f.png

讯息类型

DUP标志占字节一中的第3位。

当客户端或服务器尝试重新传递PUBLISH,PUBREL, SUBSCRIBE或UNSUBSCRIBE消息时,将设置此标志。这适用于QoS值大于零(0)且需要确认的消息。当DUP位置1时,变量头包括消息ID。

接收者应将此标志视为有关消息是否先前已被接收的提示。不应依靠它来检测重复项。

QoS等级占了第2到第1位,它表示了此PUBLISH消息传递的服务质量。

d3ed75c3b01d85e06161ba82f73dc121.png

Qos等级

保留位于第0位,如果用户在发送给服务端的信息中将该位置“1”,服务器就会保留发给给客户端的信息。


字节二:

此字节表示当前消息中剩余的字节数,包括变量头和有效载荷中的数据。

一个字节可最多表示127个字节的消息,这里可能就有人问了一个字节最大是1111 1111按道理来说应该是256才对啊?但因为mqtt协议最多可以以4字节的形式来表示剩余消息中的字节数,所以每个字节的第8位数字表示是否需要再使用一个字节来表示剩下消息中的字节数,如果在第8位置“1”就表示再使用一个字节,置“0”就表示不调用。

可变头

下表显示了变量头的格式示例:

b92483b89db53ae226545bc46230cddc.png

可变头

协议名称(Protocol Name)

协议名称位于MQTT CONNECT消息的变量标头中 。此字段是UTF编码的字符串。

协议版本(Protocol Version Number)

该字段是一个8位无符号值,表示客户端使用的协议的修订级别。

连接标志(Connect Flags)

Clean session,Will,Will QoS和保留标志存在于CONNECT消息的变量标头中。

清理会话标志(Clean Session)

位置:连接标志字节的位1。

如果设置为(0),则服务器必须在断开连接后存储客户端的订阅。这包括继续存储已订阅主题的QoS 1和QoS 2消息,以便在客户端重新连接时可以传递它们。服务器还必须在连接断开时保持正在传送的运行中消息的状态。在客户端重新连接之前,必须保留此信息。

如果设置为(1),则服务器必须丢弃有关客户端的任何先前维护的信息,并将连接视为“干净”。当客户端断开连接时,服务器还必须放弃任何状态。

预设置标志(Will flag)

位置:连接标志字节的位2。

Will消息定义当服务器在与客户端通信期间遇到I / O错误,或者客户端无法在Keep Alive计时器计划内进行通信时,服务器将代表客户端发布消息。服务器从客户端接收到DISCONNECT消息后,不会触发发送Will消息的操作。

如果设置了Will标志,则Will QoS和Will Retain字段必须出现在Connect标志字节中,而Will Topic和Will Message字段必须出现在有效负载中。

QoS

位置:连接标志字节的第4位和第3位。

如果客户端非自愿断开连接,则连接的客户端在Will消息的Will QoS字段中指定QoS级别。Will消息在CONNECT消息的有效负载中定义。

如果设置了Will标志,则Will QoS字段为必填字段,否则其值将被忽略。

Will QoS的值为0(0x00),1(0x01)或 2(0x02)。下表显示了Will QoS标志。

将保留标志(will retain)

位置:连接标志字节的第5位。

Will Retain标志表示客户端是否意外断开连接时,服务器是否应保留由服务器代表客户端发布的Will消息。

如果设置了Will标志,则Will Retain标志是必需的,否则将被忽略。

用户名和密码标志(username and password flag)

位置:连接标志字节的第6位和第7位。

连接客户端可以指定用户名和密码,并且设置标志位表示CONNECT消息的有效负载中包括用户名和可选的密码。

如果设置了“用户名”标志,则“用户名”字段是必填字段,否则将忽略其值。如果设置了密码标志,则密码字段是必填字段,否则其值将被忽略。在不提供用户名的情况下提供密码是无效的。

保持活动计时器(Keep Alive timer)

保持活动计时器(以秒为单位)定义了从客户端收到的消息之间的最大时间间隔。它使服务器能够检测到与客户端的网络连接已断开,而不必等待长时间的TCP / IP超时。客户有责任在每个“保持活动”时间段内发送消息。在此时间段内没有数据相关消息的情况下,客户端会发送PINGREQ消息,服务器会通过PINGRESP消息进行确认 。

保持活动计时器可以通过MSB和LSB的顺序进行设置,它们分别占有2个字节。

负荷

以下类型的MQTT命令消息具有有效负载:

连接

有效负载包含一个或多个UTF-8编码的字符串。他们为客户端指定了一个无歧义的标识符,一个Will主题和消息以及要使用的用户名和密码。除了第一个以外的所有都是可选的,它们的存在是根据变量头中的标志确定的。

订阅

有效负载包含客户端可以订阅的主题名称和QoS级别的列表。这些字符串是UTF编码的。

后退

有效负载包含已授权QoS级别的列表。这些是服务器管理员已允许客户端订阅特定主题名称的QoS级别。授予的QoS级别以与相应的SUBSCRIBE消息中的主题名称相同的顺序列出。

9e0cc4a74951899257243b2cecca9427.png

那么,这就介绍完啦!

想要获取更多物联网相关信息的可以给作者留个关注哦。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值