简说MQTT--第二部分:MQTT是如何运作的?

与传统的客户端/服务器协议不同,MQTT不是端到端的。MQTT是一种发布订阅消息交换协议。另外,与消息队列不同,MQTT不维护任何队列。它使用主题来路由消息。

这次我们将向你展示MQTT是如何运作的。

发布订阅模式

MQTT是一种发布订阅消息交换协议,它的含义是:

  1. 通信系统中有发布者和订阅者。发布者发布消息而订阅者接收消息。我们把发布者和订阅者统称为客户端。客户端可以同时是发布者和订阅者。
  2. 在系统中有另外一个角色,它接收发布者的消息并且将消息派发给订阅者。我们一般称这个角色为消息Broker。

主题

在MQTT中,另一个重要的概念是主题,每一条消息都有一个主题,它决定了消息将被谁接收。主题是MQTT的路由机制。

举个例子,如果一个天气预报服务正在更新各个城市的温度数据。这个服务并不知道谁将接收哪个城市的温度数据,它只是用主题来标识这些数据,比如,“temperature/newyork” 或 “temperature/frankfurt”,并且将它们发送给Broker。那些对城市天气有兴趣的人可以在Broker上订阅一个或多个这样的主题。一旦一条消息到达Broker,它就会检查消息里的主题,并且将消息派发给相应的订阅者。

主题由一个或多个层级组成,层级之间被斜杠(/)分隔。有时主题和分类和目录相似。

主题中的通配符(“#” 和 “+”)使得订阅者更易于一次订阅多个主题。“+”表示一个单独的层级,而“#”表示多个层级。多数情况下,你可以按你的意愿自由地命名主题,但是有一个列外:以“$”开头的主题是保留给系统使用的。

MQTT天然支持一对多(广播)的消息传递:一个发布者用一个主题发布一条消息到Broker,Broker派发这条消息给所有订阅这个主题的客户端。

消息

一条消息就是我们想要在通信系统中与其他方交换的信息。交换消息是MQTT的目的。MQTT用控制数据包来传输消息和维护链接。

一个MQTT数据包包括一个固定的头部,一个可选的可变头部以及一个可选的有效负载数据部分:

  • 固定头部出现在所有MQTT控制包中。它包括包的类型、各种标志以及包的剩余长度。
  • 可变头部出现在一些MQTT控制包中。它的内容根据包的类型不同而不同。
  • 有效负载数据出现在一些MQTT控制包中。它是包的最后一部分。业务相关的数据都在这部分中。

如你所猜测的一样,最小的MQTT包只有2字节。

通信

现在我们已经有了通信中的各种角色、路由消息的方式以及约定的消息格式,我们可以用这些基本元素来构建一个通信系统。

如下图所示,想象一下,我们在一所医院里:

MQTT communication, an example

住院病人的重要统计数据由可穿戴设备收集并发送到中心服务器,然后发送给相关人员(或设备)。

一个传感器,这里我们以温度计为例,测量患者的体温并将这个温度数据设置主题:“传感器/ 1 /温度话题”后发布到MQTT Broker。很明显,这个传感器的角色就是发布者。关心这个病人的任何数据的人(比如他的医生)可以订阅“sensor/1/#”这个主题;任何需要收集所有病人体温数据的人或设备可以订阅主题: “sensor/+/temperature”;只关心这个病人的体温的人可以精确地订阅主题:“sensor/1/temperature”,而不需要任何通配符。

MQTT的特殊特点

QOS

MQTT实现了简单但是有效的3级服务质量系统:

  • 0:最多一次
  • 1:最少一次
  • 2:仅有一次

保留的消息

如果MQTT消息的保留标志被设置了,则消息可以被Broker保留。当一个客户端链接到Broker并订阅了一个主题,而Broker有这个主题的一条保留的消息,客户端将立刻收到这条消息。每一个主题最多只有一条保留的消息。

遗愿消息

MQTT经常被用于不可靠的网络环境。客户端可能没有正常关闭链接(DISCONNECT消息没有发送出去)的情况下丢失链接。在这种情况下,遗愿消息可以做客户端应该做的事情。

每个客户端当它链接到Broker的时候可以设置一条遗愿消息。遗愿消息和其他消息一样,它也有服务质量级别、保留属性以及主题。这条消息被存储在Broker上,当Broker检测到客户端丢失了链接,Broker把这条遗愿消息发送给所有订阅了遗愿消息的主题的所有在线客户端。如果客户端发送一个“DISCONNECT”包给Broker后断开链接,那么它的遗愿消息被丢弃。

MQTT数据包

MQTT定义了14种消息类型。它们被用于创建链接、断开链接、发布消息、订阅主题、维护链接或保证服务质量。

消息类型如下表所示:

MQTT communication, an example

在本系列的下一篇文章中,我们将演示如何创建一个简单的MQTT应用并解释有关协议和数据包格式。

待续……

*原文链接https://medium.com/@emqtt/mqtt-in-a-nutshell-4e8dd6ef57c0