1、概述
在MQTT协议通讯中,有两个最为重要的角色。它们分别是服务端和客户端,客户端之间通过发布和订阅通信。
1.1、形象的理解MQTT
MQTT通信模型示意图如下:
使用电视台、记者、观众三个角色来类比更容易理解:
- 电视台:在MQTT里被称为服务器(broker),有如下作用:
- 接收来自客户的网络连接; // 记者/观众连接进电视台
- 接收客户发布的应用信息; // 接受记者发布的消息
- 处理来自客户端的订阅和退订请求; // 处理观众的订阅、退订请求
- 向订阅的客户转发应用程序消息 // 给观众转发记者报道的消息
- 记者和观众都是客户端,记者也可以当观众,观众也可以当记者,有如下作用:
- 发布信息; // publish,记者
- 订阅消息; // Subscribe ,观众
- 退订或删除消息;
- 断开与服务器连接。
1.2、消息的传递
还是以日常生活为例:
- 观众:我只关心财经新闻,那么只订阅"财经新闻",不订阅"体育新闻"
- 记者:我是财经记者,我可以发布"财经新闻",不发布"体育新闻"
这个过程中,引入两个概念:
- 主题(Topic):是财经类的?还是体育类的?
- 消息(Message)或负载(Playload):具体的新闻信息
具体的流程是这样的:
- 观众打电话到电视台:connect(连接到服务器)
- 观众向电视台订阅"财经新闻": Subscribe 某个 Topic(订阅某个主题)
- 记者打电话到电视台:connect(连接到服务器)
- 记者向电视台发布"财经新闻":Public某个Topic的某个Message(发布某个主题的某个消息)
- 电视台向"订阅了财经新闻的观众"发布"某条消息":Public某个Message给Subscriber(发布某个消息给订阅者)
整个过程中,电视台和记者、电视台和观众直接的电话要保持连接状态,还要时不时确认一下:
- 记者要时不时给电视台喊一声"喂":确保电视台还正常,也让电视台知道自己还在
- 观众要时不时给电视台喊一声"喂":确保电视台还正常,也让电视台知道自己还在
2、MQTT重要概念
2.1、MQTT服务器
MQTT服务端通常是一台服务器。它是MQTT信息传输的枢纽,负责将MQTT客户端发送来的信息传递给MQTT客户端。MQTT服务端还负责管理MQTT客户端。确保客户端之间的通讯顺畅,保证MQTT消息得以正确接收和准确投递。
2.2、MQTT客户端
MQTT客户端可以向服务端发布信息,也可以从服务端收取信息。我们把客户端发送信息的行为称为“发布”信息。而客户端要想从服务端收取信息,则首先要向服务端“订阅”信息。“订阅”信息这一操作很像我们在视频网站订阅某一部电视剧。当这部电视剧上新后,视频网站会向订阅了该剧的用户发送信息,告诉他们该剧上新了。
2.3、MQTT主题
我们说MQTT客户端订阅信息时,使用了用户在视频网站订阅电视剧这个例子。在MQTT通讯中,客户端所订阅的肯定不是一部部电视剧,而是一个个“主题”。MQTT服务端在管理MQTT信息通讯时,就是使用“主题”来控制的。
为了更好的理解服务端是如何通主题来控制客户端之间的信息通信,除了上文例子,我们再看看下图例子:
在上图示中一共有三个MQTT客户端。它们分别是汽车,手机和电脑。MQTT服务端在管理MQTT通讯时使用了“主题”来对信息进行管理的。比如上图所示,假设我们需要利用手机和电脑获取汽车的速度,那么我们首先要利用电脑和手机向MQTT服务器订阅主题“汽车速度”。接下来,当汽车客户端向服务端的“汽车速度”主题发布信息后,服务端就会首先检查以下都有哪些客户端订阅了“汽车速度”这一主题的信息。当它发现订阅了该主题的客户端有一个手机和一个电脑,于是服务端就会将刚刚收到的“汽车速度”信息转发给订阅了该主题的手机和电脑客户端。
在以上例子中,汽车是“汽车速度”主题的发布者,而手机和电脑则是该主题的订阅者。值得注意的是,MQTT客户端在通讯时,往往角色不是单一的。它既可以作为信息发布者也可以同时作为信息订阅者。如下图所示:
上图中的所有客户端都是围绕“空调温度”这一主题进行通讯的。对于“空调温度”这一主题,手机和电脑客户端成为了MQTT信息的发布者而汽车则成为了MQTT信息的订阅者(接收者)。
综上,针对不同的主题,MQTT客户端可以切换自己的角色。它们可能对主题A来说是信息发布者,但是对于主题B就成了信息订阅者。
3、MQTT 发布/订阅 特性
从以上举例我们可以看到,MQTT通讯的核心枢纽是MQTT服务端。有了服务端对MQTT信息的接收、储存、处理和发送,客户端在发布和订阅信息时,可以相互独立,且在空间上可以分离,时间上可以异步。这里所说的相互独立、空间和时间分离具体指的是什么呢?
- 相互可独立:MQTT客户端是一个个独立的个体。它们无需了解彼此的存在,依然可以实现信息交流。比如以上实例中汽车客户端在发布“汽车速度”信息时,汽车客户端本身可以完全不知道有多少个MQTT客户端订阅了“汽车速度”这一主题。而订阅了“汽车速度”主题的手机和电脑客户端也完全不知道彼此的存在。大家只要订阅了“汽车速度”主题,MQTT服务端就会在每次收到新信息时,将信息发送给订阅了“汽车速度”主题的客户端。
- 空间可分离:空间分离相对容易理解,MQTT客户端在通讯必要条件是连接到了同一个MQTT通讯网络。这个网络可以是互联网或者局域网。只要客户端联网,无论他们远在天边还是近在眼前,都可以实现彼此间的通讯交流。
- 时间可异步:MQTT客户端在发送和接收信息时无需同步。这一特点对物联网设备尤为重要。有时物联网设备会发生意外离线的情况。我们使用以上实例二的场景来作为示例。当我们的汽车在行驶过程中,可能会突然进入隧道,这时汽车可能会断开与MQTT服务端的连接。假设在此时我们的手机客户端向汽车客户端所订阅的“空调温度”主题发布了信息,而汽车恰恰不在线。这时,MQTT服务端可以将“空调温度”主题的新信息保存,待汽车再次上线后,服务端再将“空调温度”信息推送给汽车。
以上几点概括了MQTT通讯时客户端的相互关系以及服务端在其中所起的作用。讲到这里请注意:以上总结的几个特点中都有一个“可”字。这个“可”字意味着客户端彼此之间可以独立,空间可以分离,时间可以异步。在我们实际应用中,客户端之间的关系既可以独立也可以相互依存。在空间上,既可以相距甚远,也可以彼此相邻。在时间上,既可以异步也可以同步。这个“可”字所体现的是MQTT通讯的灵活性。