MQTT是什么
MQTT是一个客户端服务端架构的发布/订阅模式的消息传输协议。轻巧、开放、简单、规范,易于实现。
MQTT是一种消息传递协议,即它是为传输消息而设计的,并使用发布和订阅模型。该模型使得向0个、1个或多个客户端发送消息成为可能。一个有用的类比是电视或广播。电视播音员使用特定的频道播放电视节目,观众调到该频道观看广播。广播员和观众之间没有直接的联系。在MQTT中,发布者发布关于主题的消息,订阅者必须订阅该主题查看消息。
MQTT的特点
- 易于实现
- 数据传输的服务质量可控
- 占用带宽小
- 传输数据内容不可预知
- 设备连接状态可知
不难看出,MQTT专为低带宽、高延迟或不可靠的网络而设计的。
MQTT的版本
MQTT主流版本有两个,分别是MQTT3.1.1和MQTT5。MQTT3.1.1是在2014年10月发布的,而MQTT5是在2019年3月发布的。
MQTT3.1.1仍然主流版本。MQTT5是完全兼容MQTT3.1.1的。
MQTT基本原理
MQTT服务端
MQTT服务端通常是一台服务器。它是MQTT信息传输的枢纽,负责将MQTT客户端发送来的信息传递给MQTT客户端。MQTT服务端还负责管理MQTT客户端。确保客户端之间的通讯顺畅,保证MQTT消息得以正确接收和准确投递。
MQTT客户端
MQTT客户端可以向服务端发布信息,也可以从服务端收取信息。我们把客户端发送信息的行为称为“发布”信息
。而客户端要想从服务端收取信息,则首先要向服务端“订阅”信息
。“订阅”信息这一操作很像我们在视频网站订阅某一部电视剧。当这部电视剧上新后,视频网站会向订阅了该剧的用户发送信息,告诉他们有新剧上线了。
MQTT主题
刚刚在讲解MQTT客户端订阅信息时,使用了用户在视频网站订阅电视剧这个例子。在MQTT通讯中,客户端所订阅的是一个个“主题”。MQTT服务端在管理MQTT信息通讯时,就是使用“主题”来控制的。
为了便于更好理解服务端是如何通过主题来控制客户端之间的信息通讯,来看看下图实例:
在以上图示中一共有三个MQTT客户端。它们分别是汽车,手机和电脑。MQTT服务端在管理MQTT通讯时使用了“主题”来对信息进行管理的。比如上图所示,假设我们需要利用手机和电脑获取汽车的速度,那么我们首先要利用电脑和手机向MQTT服务器订阅主题“汽车速度”。接下来,当汽车客户端向服务端的“汽车速度”主题发布信息后,服务端就会首先检查以下都有哪些客户端订阅了“汽车速度”这一主题的信息。当它发现订阅了该主题的客户端有一个手机和一个电脑,于是服务端就会然后将刚刚收到的“汽车速度”信息转发给订阅了该主题的手机和电脑客户端。
在以上实例中,汽车是“汽车速度”主题的发布者,而手机和电脑则是该主题的订阅者。
值得注意的是,MQTT客户端在通讯时,往往角色不是单一的。既可以作为信息发布者也可以同时作为信息订阅者
。如下图所示:
上图中的所有客户端都是围绕“空调温度”这一主题进行通讯的。对于“空调温度”这一主题,手机和电脑客户端成为了MQTT信息的发布者而汽车则成为了MQTT信息的订阅者(接收者)。
可以看到,针对不同的主题,MQTT客户端可以切换自己的角色。它们可能对主题A来说是信息发布者,但是对于主题B就成了信息订阅者。
MQTT发布/订阅 特性
从以上实例我们可以看到,MQTT通讯的核心枢纽是MQTT服务端。有了服务端对MQTT信息的接收、储存、处理和发送,客户端在发布和订阅信息时,可以相互独立,且在空间上可以分离,时间上可以异步。
所说的相互独立、空间和时间分离具体指的是什么呢?
- 相互可独立:
MQTT客户端是一个个独立的个体。它们无需了解彼此的存在,仍可实现信息交流。
- 比如以上实例中汽车客户端在发布“汽车速度”信息时,汽车客户端本身可以完全不知道有多少个MQTT客户端也订阅了“汽车速度”这一主题。而订阅了“汽车速度”主题的手机和电脑客户端也完全不知道彼此的存在。大家只要订阅了“汽车速度”主题,MQTT服务端就会在每次收到新信息时,将信息发送给订阅了“汽车速度”主题的客户端。
- 空间可分离:
MQTT客户端在通讯必要条件是连接到了同一个MQTT通讯网络。
这个网络可以是互联网或者局域网。只要客户端联网,无论他们远在天边还是近在眼前,都可以实现彼此间的通讯交流。 - 时间可异步:
MQTT客户端在发送和接收信息时无需同步。
有时物联网设备会发生意外离线的情况。使用以上实例二的场景来作为示例。当汽车在行驶过程中,可能会突然进入隧道,这时汽车可能会断开与MQTT服务端的连接。假设在此时手机客户端向汽车客户端所订阅的“空调温度”主题发布了信息,而汽车恰恰不在线。这时,MQTT服务端可以将“空调温度”主题的新信息保存,待汽车再次上线后,服务端再将“空调温度”信息推送给汽车。【就是说你客户端在主题发布了信息的时候不在线,再次上线的时候还是会推送信息的。】
相互可独立
空间可分离
时间可异步
以上几点概括了MQTT通讯时客户端的相互关系以及服务端在其中所起的作用。讲到这里请注意:以上总结的几个特点中都有一个“可”字。这个“可”字意味着客户端彼此之间可以独立,空间可以分离,时间可以异步。
在实际应用中,客户端之间的关系既可以独立也可以相互依存。在空间上,既可以相距甚远,也可以彼此相邻。在时间上,既可以异步也可以同步。这个“可”字所体现的是MQTT通讯的灵活性。
留意MQTT通讯的三个特点,彼此可独立,空间可分离、时间可异步。