📜  MQTT协议|消息队列遥测传输协议

📅  最后修改于: 2020-11-10 05:55:29             🧑  作者: Mango

MQTT协议

MQTT代表消息队列遥测传输。 MQTT是一台机器到机器的物联网连接协议。它是一种非常轻巧的发布订阅消息传递协议。该协议对于与带宽较宝贵的远程位置的连接很有用。这些特性使其在各种情况下都非常有用,包括恒定的环境,例如用于机器对机器的通信以及物联网环境。这是一个发布和订阅系统,在这里我们可以作为客户端发布和接收消息。它使在多个设备之间进行通信变得容易。它是为受约束的设备设计的,具有低带宽的简单消息传递协议,因此它是物联网应用程序的理想解决方案。

MQTT的特征

MQTT具有一些其他协议中几乎找不到的独特功能。 MQTT的某些功能如下:

  • 它是机器对机器的协议,即,它提供设备之间的通信。
  • 它被设计为一种简单的轻量级消息传递协议,该协议使用发布/订阅系统在客户端和服务器之间交换信息。
  • 不需要客户端和服务器都同时建立连接。
  • 它提供了更快的数据传输,就像WhatsApp / messenger如何提供更快的传递一样。这是一种实时消息传递协议。
  • 它允许客户订阅主题的狭窄选择,以便他们可以接收他们正在寻找的信息。

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的组件。

  • 信息
  • 客户
  • 服务器或代理
  • 话题

信息

该消息是协议通过网络为应用程序执行的数据。通过网络传输消息时,该消息包含以下参数:

  • 有效载荷数据
  • 服务质量(QoS)
  • 属性集合
  • 主题名称

客户

在MQTT中,订户和发布者是客户端的两个角色。客户端订阅主题以发布和接收消息。简而言之,我们可以说,如果任何程序或设备使用MQTT,则该设备称为客户端。如果设备打开了与服务器的网络连接,发布了其他客户端希望查看的消息,订阅了它希望接收的消息,取消订阅了它不希望接收的消息,并且关闭了该设备,则它就是客户端。与服务器的网络连接。

在MQTT中,客户端执行两项操作:

在MQTT中,客户端执行两项操作:

发布:当客户端将数据发送到服务器时,我们将此操作称为发布。

订阅:当客户端从服务器接收数据时,我们将此操作称为订阅。

服务器

允许客户端发布消息并订阅消息的设备或程序。服务器接受来自客户端的网络连接,接受来自客户端的消息,处理订阅和取消订阅请求,将应用程序消息转发到客户端,并关闭来自客户端的网络连接。

话题

将对照服务器已知的订阅(称为“ TOPIC”)来检查提供给消息的标签。

MQTT的体系结构

现在,我们将看一下MQTT的体系结构。为了更清楚地理解它,我们将看示例。假设设备具有温度传感器,并且希望将评级发送到服务器或代理。如果电话或桌面应用程序希望在另一侧接收此温度值,则将发生两件事。发布者首先定义主题;例如,温度然后发布消息,即温度值。发布消息后,另一端的电话或桌面应用程序将订阅主题(即温度),然后接收发布的消息(即温度值)。服务器或代理的角色是将已发布的消息传递到电话或桌面应用程序。

MQTT消息格式

MQTT使用命令和命令确认格式,这意味着每个命令都具有关联的确认。如上图所示,connect命令具有连接确认,subscribe命令具有订阅确认,而publish命令具有发布确认。此机制类似于TCP协议中的握手机制。

现在,我们将看一下MQTT的数据包结构或消息格式。

MQTT消息格式由2个字节的固定头组成,该头存在于所有MQTT数据包中。第二个字段是可变标头,并不总是存在。第三个字段是有效载荷,也不总是存在。有效负载字段基本上包含正在发送的数据。我们可能会认为有效负载是必填字段,但不会发生。某些命令不使用有效负载字段,例如,断开消息。

固定头

让我们观察一下固定标头的格式。

正如我们可以以上述格式观察到的那样,固定标头包含两个字节。第一个字节包含以下字段:

  • MQTT控制数据包类型:它占据4位,即7到4位的位置。该4位是分配的值,并且每个位代表MQTT控制数据包类型。
  • 特定于每种MQTT数据包类型的标志:剩余的4位表示特定于每种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字节整数,即数据包标识符字段。

下面的给定列表包含数据包标识符字段:

  • 发布
  • 回送
  • PUBREC
  • 公开
  • PUBCOMP
  • 订阅
  • 后退
  • 取消订阅
  • 取消订阅

与数据包标识符字段有关的关键点:

  • 如果QoS(服务质量)的值设置为零,则PUBLISH数据包不应包含数据包标识符字段。这意味着如果QoS的值大于零,则仅PUBLISH数据包将包含数据包标识符字段。
  • 当客户端发送新的SUBSCRIBE,UNSUBSCRIBE或PUBLISH MQTT控制数据包时,它应分配一个非零的数据包标识符,该标识符当前未使用。
  • 服务器发送新的PUBLISH MQTT控制数据包时,应分配一个当前未使用的非零数据包标识符。
  • PUBACK,PUBREC,PUBUREL,PUBREC是PUBLISH命令的确认数据包,其中包含与PUBLISH数据包相同的数据包标识符。
  • SUBACK和UNSUBACK分别是SUBSCRIBE和UNSUBSCRIBE的确认数据包。这两个数据包(即SUBACK和UNSUBACK)都使用与SUBSCRIBE和UNSUBSCRIBE数据包相同的数据包标识符。
  • 在处理相应的确认包之后,包标识符可以重新使用。可以定义如下:

如果QoS的值为1,则PUBLISH的确认包将为PUBACK。如果它处理PUBACK,则可以重新使用PUBACK的数据包标识符。

如果QoS值为2,则PUBLISH的确认包将为PUBCOMP或PUBREC。

有效载荷

在ICMP消息格式中,最后一个MQTT控制数据包是有效负载。该字段包含要发送的数据。例如,在CONNECT数据包的情况下,有效负载是客户端ID,用户名和密码,在PUBLISH数据包中,有效负载只是应用程序消息。