前言
前面讲了Android如何通过串口通信操作硬件,但实际业务场景大多是既可以屏幕操控硬件也可以远程下发操控,这时就需要MQTT协议来完成这一工作。本文将介绍MQTT协议及其在物联网设备通信中的应用。
一、初识MQTT
1. 什么是MQTT协议
MQTT是一种轻量级的消息传递协议,全称为Message Queuing Telemetry Transport。它是基于发布-订阅模式的协议,可以在分布式系统中实现设备之间的消息传递和通信。
2. 为什么要用MQTT
它是一种非常轻量级的二进制协议,并且由于其最小的数据包开销,与 HTTP 等协议相比,MQTT在通过网络传输数据时表现出色。该协议的另一个重要方面是 MQTT 在客户端非常容易实现。易用性是 MQTT 开发的一个关键问题,使其非常适合当今资源有限的受限设备。
3. MQTT诞生背景
- 1999 年:Andy Stanfork-Clark (IBM) 和 Arlen Nipper 发布 MQTT 协议,用于通过卫星连接石油管道遥测系统,MQTT 中的 TT (Telemetry Transport) 就是源于这样一个遥测系统;
- 2010 年:MQTT 协议免费发布;
- 2014 年:MQTT 协议正式成为 OASIS 标准,经过多年的发展,MQTT 协议已经成为互联网 (IoT) 的主要协议之一。
目前,MQTT 主要分为两个大版本:
- MQTT v3: 其中 v3.1.1 是目前接入设备最多的版本;
- MQTT v5: 2018 年发布,部分设备接入。
4. MQTT核心要求
- 简单实现
- 服务质量数据传输
- 轻巧且带宽高效
- 数据不可知
- 连续会话意识
5. MQTT 发布/订阅模式
MQTT 发布/订阅模式(也称为发布/订阅)提供了传统客户端-服务器架构的替代方案。在客户端-服务器模型中,客户端直接与端点通信。发布/订阅模型将发送消息的客户端(发布者)与接收消息的客户端(订阅者)分离。发布者和订阅者从不直接联系对方。事实上,他们甚至不知道对方的存在。它们之间的连接由第三个组件(代理)处理。代理的工作是过滤所有传入的消息并将它们正确分发给订阅者。
pub/sub 最重要的方面是消息的发布者与接收者(订阅者)的解耦。这种解耦有几个方面:
- 空间解耦:发布者和订阅者不需要相互了解(例如,不需要交换 IP 地址和端口)。
- 时间解耦:发布者和订阅者不需要同时运行。
- 同步解耦:两个组件的操作在发布或接收过程中不需要中断。
总之,MQTT 发布/订阅模型消除了消息发布者与接收者/订阅者之间的直接通信。代理的过滤活动可以控制哪个客户端/订阅者接收哪个消息。解耦具有三个维度:空间、时间和同步。
6. 可拓展性
pub/sub 比传统的客户端/服务器模式有了更好的拓展,这是由于 broker 的高度并行化,并且是基于事件驱动的模式。可扩展性还体现在消息的缓存和消息的智能路由,还可以通过集群代理来实现数百万的连接,使用负载均衡器将负载分配到更多的单个服务器上,这就是 MQTT 的深度应用了。
7. 消息过滤
- 基于主题的过滤此过滤基于属于每条消息的主题。接收客户端向代理订阅感兴趣的主题,订阅后,broker 就会确保客户端收到发布到 topic 中的消息。
- 基于内容的过滤在基于内容的过滤中,broker 会根据特定的内容过滤消息,接受客户端会经过过滤他们感兴趣的内容。这种方法的一个显著的缺点就是必须事先知道消息的内容,不能加密或者轻易修改。
- 基于类型的过滤当使用面向对象的语言时,基于消息(事件)的类型/类进行过滤是一种常见做法。例如,订阅者可以收听所有类型为 Exception 或任何子类型的消息。
**发布/订阅并不是每个用例的答案。在使用此模型之前,您需要考虑一些事项。**发布者和订阅者的解耦是发布/订阅的关键,它本身也带来了一些挑战。例如,您需要事先了解已发布数据的结构。对于基于主题的过滤,发布者和订阅者都需要知道要使用哪些主题。要记住的另一件事是消息传递。发布者不能假定有人正在收听所发送的消息。在某些情况下,可能没有订阅者阅读特定消息。
8. 主要特性
- MQTT 在空间上解耦了发布者和订阅者。要发布或接收消息,发布者和订阅者只需要知道代理的主机名/IP 和端口。
- MQTT 按时间解耦。尽管大多数 MQTT 用例近乎实时地传递消息,但如果需要,代理可以为不在线的客户端存储消息。(必须满足两个条件才能存储消息:客户端已连接到持久会话并订阅了服务质量大于 0 的主题)。
- MQTT 异步工作。因为大多数客户端库异步工作并且基于回调或类似模型,所以任务在等待消息或发布消息时不会被阻塞。在某些用例中,同步是可取且可能的。为了等待某个消息,一些库有同步 API。但流程通常是异步的。
二、MQTT通信过程
1. 连接到MQTT服务器
使用MQTT协议建立通信的第一步是连接到MQTT服务器。MQTT客户端需要提供MQTT服务器的IP地址和端口号,以建立到服务器的TCP连接。一旦连接建立成功,客户端将发送连接请求(Connect Packet)到MQTT服务器,服务器将响应确认请求。
2. 发布主题
发布者(Publisher)将消息发布到特定的主题上。在MQTT中,主题是消息的标识符。主题可以是任何有效的UTF-8字符串,并且可以包含多个层次结构(例如,/sensors/temperature)。当发布者发送消息到主题时,服务器将转发该消息给所有订阅该主题的订阅者。
3. 订阅主题
订阅者(Subscriber)可以订阅感兴趣的主题。在MQTT中,订阅者可以订阅整个主题树,或仅订阅特定的主题。当订阅者订阅主题时,服务器将记录其订阅信息,并将其添加到订阅列表中。
4. 接收消息
一旦订阅者订阅了主题,服务器将转发所有发布到该主题的消息给订阅者。当订阅者接收到消息时,它将执行相应的操作,例如更新设备状态或向其他设备发送命令。
5. 断开连接
使用完MQTT协议后,客户端应该断开与MQTT服务器的连接。MQTT客户端将发送断开请求(Disconnect Packet)到MQTT服务器,服务器将响应确认请求并断开连接。
三、MQTT常用术语
- Broker:MQTT的中间件,负责接收和转发消息。
- Client:MQTT的客户端,可以是发布者或订阅者。
- Topic:MQTT的消息主题,用于识别消息的内容和目的地。格式: “myhome/livingroom/temperature”或“Germany/Munich/Octoberfest/people”
- QoS(Quality of Service):MQTT消息的服务质量,分为三个级别:QoS 0,QoS 1和QoS 2。
- Retain:MQTT消息的保留标志,表示该主题上最新的消息是否需要保留。
- Last Will and Testament(LWT):MQTT客户端的遗嘱消息,用于在客户端离线时通知其他客户端。
- Clean Session:MQTT客户端连接时的清理会话标志,用于指示中间件是否保留客户端的订阅信息。
四、总结
MQTT协议的优点
- 简单和轻量级:MQTT协议非常简单和轻量级,适合于小型设备和带宽受限的环境。
- 可靠:MQTT协议具有多种消息传递保证机制,例如QoS级别,可确保消息可靠地传递到目标设备。
- 灵活性:MQTT协议具有灵活的主题订阅机制,允许客户端订阅不同级别的主题。
- 可拓展性:MQTT协议支持多个客户端连接到单个服务器,并且可以扩展到支持数百万个设备。
MQTT协议的缺点:
- 安全性:MQTT协议本身没有提供加密和身份验证机制。如果需要安全通信,则需要使用TLS/SSL等其他协议。
- 可靠性受限:MQTT提供了不同的服务质量(QoS)级别,但最高的QoS级别也不能保证消息100%可靠传递。在不稳定的网络环境下,消息可能会丢失或重复传递,需要应用程序自行处理。
- 适用场景受限:MQTT适用于传递简单的消息,但不适用于传递大量的数据或复杂的消息。在需要进行复杂消息处理和转换的场景中,可能需要使用更为复杂的消息传递技术,例如消息队列。
- 性能受限:MQTT是一种轻量级的协议,但在高并发和大规模消息传递的环境中,可能会面临性能瓶颈。此外,在使用较高的QoS级别时,可能会导致更多的网络流量和延迟,从而影响系统的性能。
- 可扩展性受限:MQTT本身不提供扩展性的支持,需要使用其他技术来实现分布式消息传递和扩展性。
MQTT其他协议对比:
与其他通信协议相比,MQTT具有一定的优势:
- 与HTTP对比:HTTP是一种请求/响应模型的通信协议,适用于网页浏览等场景。相较于HTTP,MQTT协议更轻量级,适用于低带宽、不稳定网络环境。同时,MQTT基于发布/订阅模式,支持实时数据推送,而HTTP需要轮询获取数据,实时性较差。
- 与WebSocket对比:WebSocket是一种双向通信协议,适用于实时Web应用。与WebSocket相比,MQTT协议在低带宽和低功耗场景下具有更高的性能优势。此外,MQTT协议内置消息队列和QoS(Quality of Service,服务质量)机制,可确保消息可靠传输。
- 与CoAP对比:CoAP(Constrained Application Protocol,受限应用协议)是另一种物联网通信协议,主要针对资源受限的设备。相较于CoAP,MQTT协议在低带宽环境下具有更好的性能。然而,CoAP协议基于UDP,具有较低的传输延迟。二者之间的选择取决于具体应用场景和需求。
参考链接:
www.hivemq.com/mqtt-essent…