文档结构  
翻译进度:已翻译     翻译赏金:10 元 (?)    ¥ 我要打赏

欢迎来学习MQTT基础入门的第三部分,这是关于MQTT协议核心特征和概念的系列博客。 在这篇文章中,我们将讨论MQTT客户端和代理服务器的作用以及连接代理服务器时可以使用的参数和选项。

在上篇文章中,我们解释了发布/订阅模式是如何工作的以及如何应用在MQTT中。下面对基础内容进行一下简要回顾:发布/订阅模式实现了发送特定消息的客户端(发布者)与接收消息的客户端(订阅者)之间的解耦 。为了确定消息能到达哪些客户端,MQTT使用主题。主题是一个层次结构的字符串,用于消息过滤和路由选择(更多细节)。

 

第 1 段(可获 1.63 积分)

上篇文章其实更多的是学术研究性质,其中我们讨论了发布/订阅模式是什么以及和消息队列方法之间的区别。这篇文章将更加实用,主要是关于MQTT的基本知识。我们讨论的话题包括MQTT客户端和代理服务器的基本定义,MQTT连接基础,带有参数的连接消息以及由代理服务器确认的连接的建立。

引言

我们都知道MQTT将发布者和订阅者进行了解耦,那么任何客户端之间的连接都要经过代理。在深入了解连接细节之前,我们先要搞清楚客户端和代理指的是什么。

第 2 段(可获 1.43 积分)

客户端

当谈到客户端时,往往指的就是MQTT客户端。其中包括发布者或订阅者,两者都叫MQTT客户端,分别负责发布或订阅。(通常一个MQTT客户端可以同时作为发布者和订阅者)。MQTT客户端可以是从微控制器到一个完全成熟的服务器这样的任何设备,在这些设备上运行着MQTT库并且可以通过任何网络连接到MQTT代理服务器。它可以是一个很小的和资源受限的设备,通过无线网络进行连接,并运行着最小化的库,也可以是一台普通的计算机,出于测试目的,运行着一个图形化的MQTT客户端,基本上任何设备都有一个TCP/IP协议栈,并且MQTT工作在该栈之上。MQTT协议的客户端实现非常简单,真正还原了其本质。这也是为什么MQTT非常适用于小型设备的一个方面的原因。MQTT客户端库在多种编程语言中都可使用,比如Android、Arduino、C、C++、C #、Go、iOS、java、JavaScript、.NET等。完整的列表可以在MQTT维基中找到。

第 3 段(可获 2.43 积分)

代理服务器(Broker)

和MQTT客户端相对应的是MQTT代理服务器,它是任何发布/订阅协议的核心。根据具体的实现,代理服务器可以处理多达成千上万的MQTT客户的并发连接。代理服务器主要负责接收所有消息,过滤它们,并决定谁对它感兴趣,然后将消息发送给所有订阅的客户端。

它还能保持所有持续连接的客户端的会话,包括订阅和丢失的消息(更多详细信息)。代理的另一个职责是对客户端的认证和授权。在大多数情况下,代理服务器也是可扩展的,它可以很容易地将自定义身份验证,授权和集成集成到后端系统。集成尤其是一个重要的方面,因为代理通常是组件,直接暴露在互联网上,并处理大量的客户端,然后将消息传递到下游的分析和处理系统。正如我们在前面的一篇博客文章所描述的所有的消息并非是一个真正的选择。总的来说,代理是中心,每个信息都需要通过。因此,它是重要的,它具有高度的可扩展性、可集成到后端系统,易于监测,当然还要能抗故障。例如HiveMQ通过利用先进的事件驱动网络处理系统,开放的插件系统和标准的供应商监控来应对这一挑战。

第 4 段(可获 2.86 积分)

MQTT连接

MQTT协议是基于TCP/IP之上的,客户端和代理服务器都需要TCP/IP栈。

mqtt-tcp-ip-stack

MQTT连接本身总是在客户端和代理服务器之间,客户端与另一客户端之间不会直接连接。连接是通过客户端向代理发送连接消息发起的。代理会响应一个CONNACK消息和状态码。一旦连接建立,只要客户端不发送断开连接的命令或失去联系,代理将使连接保持。

MQTT Connection Flow

经由NAT的MQTT连接

有一个常见的应用场景是MQTT客户端位于路由器之后,路由器使用网络地址转换(NAT)将私有网络地址 (像192.168.x.x、10.0.x.x)翻译成公网地址。前面提到过,MQTT客户端第一步要做的是发送连接(CONNECT)消息。因此对于位于NAT之后的客户端也是没有问题的,因为代理服务器拥有公网地址,并且连接始终保持打开,以便能够在CONNECT发起后进行双向的发送和接收消息。

第 5 段(可获 2.44 积分)

客户端使用CONNECT消息初始化连接

那么我们一起来看一看 MQTT CONNECT命令消息。前面已经提到过,初始化一个连接是从客户端发到代理服务器的。如果CONNECT消息不正确(根据MQTT规范)或者从网络socket打开到消息发出花费太多时间的话,代理服务器将关闭连接。为了避免那些恶意的客户端拖垮代理服务器,这样的行为也是合理的。一个友好的客户端发送的连接消息包括下面的一些内容:

MQTT Connect message content

另外在CONNECT消息中还包含其它的一些信息,对于这些信息,MQTT库的编写者要比库的使用者更关注。如果你对其中的细节感兴趣,可以查看 MQTT 3.1.1规范
那么让我们一起逐个地看看所有这些选项:

第 6 段(可获 1.88 积分)

ClientId

客户端标识符(简称ClientID)是每个连接到MQTT代理服务器的MQTT客户端的编号。单词identifier本身已经表明,ClientID应当是唯一的。代理服务器使用它来识别客户端以及当前的客户端状态。如果你不想让代理获得当前状态,那么在MQTT3.1.1(当前的标准)中也可以发送一个空的ClientID,这样的话,连接就不会附带任何状态。前提条件是cleanSession为true,否则,连接会被拒绝。

Clean Session

clean session标志位向代理服务器表明客户端是否要建立持续的会话。持续的会话(CleanSession设置为false)意思是代理将存储所有服务质量 (QoS) 为1或2的客户端的订阅信息以及所有错过的消息。如果clean session设置为true,则代理将不会存储客户端的任何信息,并将清除之前持续会话的所有信息。

第 7 段(可获 2.19 积分)

(用户名/密码)Username/Password

MQTT允许发送用户名和密码以便验证客户端的身份和进行授权。不过,如果密码未加密,也没有实现哈希加密,也未在后台使用TLS,那么密码将以明文形式发送。我们强烈建议你同时使用用户名和密码进行安全传输。在HiveMQ这类的代理上也可以使用SSL证书对客户端进行身份验证,这样就不需要用户名和密码了。

(遗嘱消息)Will Message

遗嘱消息是MQTT遗嘱特征的组成部分。当某个客户端恶意断开连接时,遗嘱消息将通知其他客户端。一个连接着的客户端将在CONNECT消息中以MQTT消息和主题的形式提供其遗嘱。如果客户端恶意断开了连接,代理将发送此消息来代表客户端。我们将在专门的文章中详细讨论这一点。

第 8 段(可获 1.85 积分)

(心跳)KeepAlive

心跳是一个时间间隔,客户端有规律地向代理服务器发送PING Request消息。服务器用PING Response消息进行响应,这种机制可以使双方据此判定对方是否还活着以及能否到达。我们将在后面的文章中详细讨论这一点。

这基本上就是从某个客户端连接到MQTT代理所需的所有信息。通常每个单独的库都会有额外的选项,这些选项可以被配置。它们大多都是关于具体实现的,例如如何存储队列消息。

第 9 段(可获 1.28 积分)

代理响应CONNACK消息

当代理获得连接信息后,它必须回应一个CONNACK消息。CONNACK只包含两个数据项:会话表示标志(session present flag),连接返回代码(connect return code)。

会话表示标志(Session Present flag)

会话表示标志表示,代理和客户端之间自从前面的交互以来是否是持久会话。如果客户端已连接并设置了CleanSession为true,那么该标志位始终为false,因为没有可用的会话。如果客户端设置了CleanSession为false,该标志位的取置根据ClientId是否有可用的会话。如果存储的会话信息存在,则标志位为true,否则为false。这个标志位是MQTT 3.1.1新增加的,以便帮助客户端确定,是否有订阅主题以及这些主题是否仍然保存在会话中。

第 10 段(可获 1.84 积分)

确认连接标志(Connect acknowledge flag)

CONNACK消息中的第二个标志是确认连接标志。它指示客户端,尝试连接是否成功,如果不成功存在的问题是什么。

MQTT Connack contents

在下表中,您可以看到所有返回代码。

返回代码返回代码响应
0连接接受
1连接拒绝,不可接受的协议版本
2连接拒绝,标识符拒绝
3连接拒绝,服务器不可用
4连接拒绝,错误的用户名和密码
5连接拒绝,未授权

MQTT规范中可以找到这些代码的更详细解释。

第 11 段(可获 1.18 积分)

结束语

你也许会问,在没有信息发送时,MQTT如何使连接保持着打开状态呢?或者如何知道连接是何时断开的呢?耐心点,稍后我们将在基础入门中安排一篇完整的博客来讨论该主题。

至此,我们的MQTT基础入门第三部分就要结束了。我们希望你至少对MQTT有了新的认识,并期待着下一篇文章吧, 如何在MQTT中进行发布、订阅和退订

如果你想在下一部分一发出就能得到通知的话,只需接着注册我们的电子通讯。这样你就能阅读到关于MQTT和HiveMQ每周一次的最新内容。如果你喜欢RSS,可以订阅我们的RSS

第 12 段(可获 1.68 积分)

文章评论