📅  最后修改于: 2020-11-10 05:55:29             🧑  作者: Mango
MQTT代表消息队列遥测传输。 MQTT是一台机器到机器的物联网连接协议。它是一种非常轻巧的发布订阅消息传递协议。该协议对于与带宽较宝贵的远程位置的连接很有用。这些特性使其在各种情况下都非常有用,包括恒定的环境,例如用于机器对机器的通信以及物联网环境。这是一个发布和订阅系统,在这里我们可以作为客户端发布和接收消息。它使在多个设备之间进行通信变得容易。它是为受约束的设备设计的,具有低带宽的简单消息传递协议,因此它是物联网应用程序的理想解决方案。
MQTT具有一些其他协议中几乎找不到的独特功能。 MQTT的某些功能如下:
MQTT由IBM的Andy Stanford-Clark博士和Arlen Nipper开发。在MQTT ORG下提供了协议3.1和3.1.1的早期版本。 2014年,MQTT由OASIS正式发布。 OASIS成为MQTT开发的新家。然后,OASIS开始了MQTT的进一步开发。 3.1.1版对3.1较为满意,并且只进行了较小的更改,例如对连接消息的更改和3.1版的说明。 MQTT的最新版本是5.0,它是3.1.1版本的后续版本。 5.0版不落后,像3.1.1版一样舒适。根据规范,版本5.0具有大量使代码就位的功能。
5.0版的主要功能目标是:
为了了解MQTT架构,我们首先看一下MQTT的组件。
该消息是协议通过网络为应用程序执行的数据。通过网络传输消息时,该消息包含以下参数:
客户
在MQTT中,订户和发布者是客户端的两个角色。客户端订阅主题以发布和接收消息。简而言之,我们可以说,如果任何程序或设备使用MQTT,则该设备称为客户端。如果设备打开了与服务器的网络连接,发布了其他客户端希望查看的消息,订阅了它希望接收的消息,取消订阅了它不希望接收的消息,并且关闭了该设备,则它就是客户端。与服务器的网络连接。
在MQTT中,客户端执行两项操作:
在MQTT中,客户端执行两项操作:
发布:当客户端将数据发送到服务器时,我们将此操作称为发布。
订阅:当客户端从服务器接收数据时,我们将此操作称为订阅。
服务器
允许客户端发布消息并订阅消息的设备或程序。服务器接受来自客户端的网络连接,接受来自客户端的消息,处理订阅和取消订阅请求,将应用程序消息转发到客户端,并关闭来自客户端的网络连接。
话题
将对照服务器已知的订阅(称为“ TOPIC”)来检查提供给消息的标签。
现在,我们将看一下MQTT的体系结构。为了更清楚地理解它,我们将看示例。假设设备具有温度传感器,并且希望将评级发送到服务器或代理。如果电话或桌面应用程序希望在另一侧接收此温度值,则将发生两件事。发布者首先定义主题;例如,温度然后发布消息,即温度值。发布消息后,另一端的电话或桌面应用程序将订阅主题(即温度),然后接收发布的消息(即温度值)。服务器或代理的角色是将已发布的消息传递到电话或桌面应用程序。
MQTT使用命令和命令确认格式,这意味着每个命令都具有关联的确认。如上图所示,connect命令具有连接确认,subscribe命令具有订阅确认,而publish命令具有发布确认。此机制类似于TCP协议中的握手机制。
现在,我们将看一下MQTT的数据包结构或消息格式。
MQTT消息格式由2个字节的固定头组成,该头存在于所有MQTT数据包中。第二个字段是可变标头,并不总是存在。第三个字段是有效载荷,也不总是存在。有效负载字段基本上包含正在发送的数据。我们可能会认为有效负载是必填字段,但不会发生。某些命令不使用有效负载字段,例如,断开消息。
让我们观察一下固定标头的格式。
正如我们可以以上述格式观察到的那样,固定标头包含两个字节。第一个字节包含以下字段:
字节2包含剩余长度,它是一个可变长度的字节整数。它表示当前控制包中剩余的字节数,包括变量头和有效载荷中的数据。因此,可以说剩余长度等于变量头和有效载荷中数据的总和。
MQTT控制数据包类型
上表显示了具有4位值和方向流的控制包类型。正如我们可以看到的那样,每个命令后面都带有确认,例如CONNECT具有CONNACK,PUBLISH具有PUBACK,PUBREC,PUBREL和PUBCOMP,SUBSCRIBE具有SUBACK,UNSUBSCRIBE具有UNSUBACK。
标志位
上表显示了与每个命令关联的标志值。在这里,保留是指将来的使用,这意味着它现在不在使用中。在PUBLISH命令的情况下,标志位进一步分为DUP,QoS和RETAIN,其中DUP是PUBLISH数据包的重复传送,QoS是服务质量,而RETAIN是保留的消息标志。
剩余长度
剩余长度是一个可变长度整数,表示当前控制包中剩余的字节数,包括可变报头和有效载荷中的数据。因此,剩余长度等于变量头中的数据加上有效载荷。
剩余长度=可变标头长度+有效负载长度
例如,如果变量头的长度为20,有效负载的长度为30,则剩余长度为50。
剩余长度最多可使用4个字节,从2个字节开始,最多可使用4个字节。
该字段使用7位作为长度,并且MSB位可用于继续标记。如果延续标志为1,则下一个字节也是
剩余长度。如果连续标志为0,则字节为剩余长度的最后一个。
某些类型的MQTT控制数据包类型还包含一个可选字段,即变量头组件。该字段位于固定报头和有效负载之间。可变报头的内容取决于数据包类型。变量头包含数据包标识符字段,这在几种数据包类型中都很常见。许多MQTT控制数据包类型的可变标头组件包括2字节整数,即数据包标识符字段。
下面的给定列表包含数据包标识符字段:
与数据包标识符字段有关的关键点:
如果QoS的值为1,则PUBLISH的确认包将为PUBACK。如果它处理PUBACK,则可以重新使用PUBACK的数据包标识符。
如果QoS值为2,则PUBLISH的确认包将为PUBCOMP或PUBREC。
在ICMP消息格式中,最后一个MQTT控制数据包是有效负载。该字段包含要发送的数据。例如,在CONNECT数据包的情况下,有效负载是客户端ID,用户名和密码,在PUBLISH数据包中,有效负载只是应用程序消息。