01.基本概念
基本概念
MQTT 协议的通信模型
MQTT 的通信是通过发布/订阅的方式来实现的,订阅和发布又是基于主题(Topic)的。发布方和订阅方通过这种方式来进行解耦,它们没有直接地连接,它们需要一个中间方。在 MQTT 里面我们称之为 Broker,用来进行消息的存储和转发。一次典型的 MQTT 消息通信流程如下所示:
- 发布方(Publisher)连接到 Broker;
- 订阅方(Subscriber)连接到 Broker,并订阅主题 Topic1;
- 发布方(Publisher)发送给 Broker 一条消息,主题为 Topic1;
- Broker 收到了发布方的消息,发现订阅方(Subscriber)订阅了 Topic1,然后将消息转发给订阅方(Subscriber);
- 订阅方从 Broker 接收该消息;
MQTT 通过订阅与发布模型对消息的发布方和订阅方进行解耦后,发布方在发布消息时并不需要订阅方也连接到 Broker,只要订阅方之前订阅过相应主题,那么它在连接到 Broker 之后就可以收到发布方在它离线期间发布的消息。我们可以称这种消息为离线消息。
在该通信模型中,有两组身份需要区别:
-
一组是发布方 Publisher 和订阅方 Subscriber:publisher 和 subscriber 是相对于 Topic 来说的身份,如果一个 Client 向某个 Topic 发布消息,那么这个 Client 就是 publisher;如果一个 Client 订阅了某个 Topic,那么它就是 Subscriber。
-
另一组是发送方 Sender 和接收方 Receiver:Sender 和 Receiver 则是相对于消息传输方向的身份。当 publisher 向 Broker 发送消息时,那么此时 publisher 是 sender,Broker 是 receiver;当 Broker 转发消息给 subscriber 时,此时 Broker 是 sender,subscriber 是 receiver。
MQTT 客户端
一个使用 MQTT 协议的设备、应用程序等,它总是建立到服务器的网络连接。
- 可以发布信息,其他客户端可以订阅该信息
- 订阅其它客户端发布的消息
- 退订或删除应用程序的消息
- 断开与服务器连接
Publisher 和 Subscriber 都属于 Client,Pushlisher 或者 Subscriber 只取决于该 Client 当前的状态——是在发布消息还是在订阅消息。当然,一个 Client 可以同时是 Publisher 和 Subscriber。client 的范围很广,任何终端、嵌入式设备、服务器只要运行了 MQTT 的库或者代码,都可以称为 MQTT Client。MQTT Client 库很多语言都有实现,可以在这个网址中找到:MQTT Client 库大全
MQTT 服务器
MQTT 服务器以称为 Broker(消息代理),是一个应用程序或一台设备。它是位于消息发布者 和订阅者之间。
- 接受来自客户端的网络连接
- 接受客户端发布的应用信息
- 处理来自客户端的订阅和退订请求
- 向订阅的客户转发应用程序消息
主题(Topic)
连接到一个应用程序消息的标签,该标签与服务器的订阅相匹配。服务器会将消息发送给订阅所匹配标签的每个客户端。
- 要订阅的主题。一个主题可以有多个级别,级别之间用斜杠字符分隔。例如/world 和 emq/emqtt/emqx 是有效的主题。
- 订阅者的 Topic name 支持通配符
#
和+
:#
支持一个主题内任意级别话题,+
只匹配一个主题级别的通配符。 - 客户端成功订阅某个主题后,代理会返回一条 SUBACK 消息,其中包含一个或多个 returnCode 参数。
MQTT 还支持主题筛选器(Topic Filter),一个对主题名通配符筛选器,在订阅表达式中使用,表示订阅所匹配到的多个主题。
QoS(消息传递的服务质量水平)
服务质量,标志表明此主题范围内的消息传送到客户端所需的一致程度。
- 值 0:不可靠,消息基本上仅传送一次,如果当时客户端不可用,则会丢失该消息。
- 值 1:消息应传送至少 1 次。
- 值 2:消息仅传送一次。
会话(Session)
每个客户端与服务器建立连接后就是一个会话,客户端和服务器之间有状态交互。会话存在于一个网络之间,也可能在客户端和服务器之间跨越多个连续的网络连接。
订阅(Subscription)
订阅包含主题筛选器(Topic Filter)和最大服务质量(QoS)。订阅会与一个会话(Session)关联。一个会话可以包含多个订阅。每一个会话中的每个订阅都有一个不同的主题筛选器。
-
客户端在成功建立 TCP 连接之后,发送 CONNECT 消息,在得到服务器端授权允许建立彼此连接的 CONNACK 消息之后,客户端会发送 SUBSCRIBE 消息,订阅感兴趣的 Topic 主题列表(至少一个主题)
-
订阅的主题名称采用 UTF-8 编码,然后紧跟着对应的 QoS 值
发布(publish)
控制报文是指从客户端向服务端或者服务端向客户端传输一个应用消息,MQTT 客户端发送消息请求,发送完成后返回应用程序线程。比如安卓的推送服务,还有一些即时通信软件如微信等也是采用的推送技术。