和 http、smtp 等协议一样,mqtt 也是一种应用层协议,也是基于 TCP 和 IP 协议进行网络通信的,主要应用在物联网领域。最近开发的项目使用到了 mqtt 协议,而且笔者打算在 Linux 下开发一个简陋的 mqtt 通信库,后续甚至可以写一个 mqtt 服务器,借此来复习下 Linux 中的应用层开发。这篇文章先来简单的介绍一下 mqtt 中的关键术语以及客户端-服务器的通信过程。
重复造轮子?
大多数开发人员已经熟悉 HTTP Web 服务。那么为什么不让 IoT 设备连接到 Web 服务?设备可采用 HTTP 请求的形式发送其数据,并采用 HTTP 响应的形式从系统接收更新。这种请求和响应模式存在一些严重的局限性:
HTTP 是一种同步协议。客户端需要等待服务器响应,大量设备同时请求并等待会导致服务器压力巨大,。Web 浏览器具有这样的要求,但它的代价是牺牲了可伸缩性。在 IoT 领域,大量设备以及很可能不可靠或高延迟的网络使得同步通信成为问题。异步消息协议更适合 IoT 应用程序。 传感器发送读数,让网络确定将其传送到目标设备和服务的最佳路线和时间。
HTTP 是单向的。客户端必须发起连接,而无法直接接收网络命令。在 IoT 应用程序中,设备或传感器通常是客户端,如果使用 http 协议,这意味着它们无法被动地接收来自网络的命令。
HTTP 是一种 1对1 协议,将消息传送到网络上所有设备很困难。客户端发出请求,服务器进行响应。将消息传送到网络上的所有设备上,不但很困难,而且成本很高,而这是 IoT 应用程序中的一种常见使用情况。
HTTP 是一种有许多报头和规则的重量级协议。它不适合受限的网络。
那么,MQTT 为什么如此轻量且灵活?
因为MQTT 协议的一个关键特性是发布和订阅模型。与所有消息协议一样,它将数据的发布者与使用者分离。
下面是一个典型的 mqtt 协议网络拓扑:
角色
实现MQTT协议需要客户端和服务器端通讯完成,在通讯过程中,MQTT协议中有三种身份:发布者(Publish)、代理(Broker)(服务器)、订阅者(Subscribe)。其中,消息的发布者和订阅者都是客户端,消息代理是服务器,消息发布者可以同时是订阅者。
客户端 Client
使用MQTT的程序或设备。客户端总是通过网络连接到服务端。它可以
1)建立连接(connect )到服务器端。
2) 发布(publish)主题应用消息给其它相关的客户端。
3) 订阅(subscribe)主题以请求接受相关的应用消息
4) 取消订阅(unsubscribe)以移除接受应用消息的请求。
5) 从服务端断开连接(disconnect)。
服务端 Server
一个程序或设备,作为发送消息的客户端和请求订阅的客户端之间的中介。服务端可以
- 1) 接受来自客户端的网络连接
- 2) 接受客户端发布的应用消息
- 3) 处理客户端的订阅和取消订阅请求。
- 4) 转发应用消息给符合条件的客户端订阅。
通信流程
- 1) 启动服务器代理。
- 2) 订阅者向服务器代理订阅相关主题。
- 3) 发布者向服务器代理发布主题信息。
- 4) 服务器代理像所有订阅该主题的订阅者推送消息。
术语
应用消息 Application Message
MQTT 协议通过网络传输应用数据。应用消息通过 MQTT 传输时,它们关联服务质量(QoS)和主题(Topic)
主题 Topic
附加在应用消息上的一个标签,服务端已知且与订阅匹配。服务端发送应用消息的一个副本给每一个匹配的客户端订阅。
会话(Session)
客户端和服务端之间的状态交互。一些会话持续时长与网络连接一样,另一些可以在客户端和服务端的多个连续网络连接间扩展。
服务质量等级 (QoS)
MQTT 按照服务质量 (QoS) 等级分发应用消息,客户端和服务端既可以是发送者也可以是接收者,而且分发规则只关注从单个发送者到单个接收者的应用消息。
QoS0:最多分发一次,接收者不会发送响应,发送者也不会重试。消息可能送达一次也可能根本没送达。
QoS1:服务质量确保消息至少送达一次,接收者会发送响应 ACK,发送者会重试未确认的报文。
QoS2:消息丢失和重复都是不可接受的。使用这个服务质量等级会有额外的开销。
后续学习中我们会再继续深入学习服务质量等级
主题过滤器(Topic Filter)
订阅中包含的一个表达式,用于表示相关的一个或多个主题。主题过滤器可以使用通配符
订阅(Subscription)
订阅包含一个主题过滤器(Topic Filter)和一个最大的服务质量(QoS)等级。订阅与单个会话
(Session)关联。会话可以包含多于一个的订阅。会话的每个订阅都有一个不同的主题过滤器。
控制报文(MQTT Control Packet):
通过网络连接发送的信息数据包。MQTT 规范定义了十四种不同类型的控制报文,其中一个(PUBLISH 报
文)用于传输应用消息。
参考资料: