前言
本篇文章将会讲解MQTT的框架,我们这个项目使用到的MQTT源码库来自于一位大佬编写。
大佬博客主页:主页
一、MQTT通信框架
MQTT(Message Queuing Telemetry Transport)是一种轻量级的消息传递协议,适用于物联网和低带宽、不稳定网络环境中的通信。MQTT通信框架主要围绕服务器、发布者(Publisher)和订阅者(Subscriber)展开。
1.服务器(Broker):
服务器是MQTT通信的中心组件,也称为代理(Broker)。它负责接收来自发布者的消息并将其传递给所有订阅者。服务器处理消息的路由、订阅管理、QoS级别处理、连接管理等功能。发布者和订阅者之间通过与服务器建立的连接进行通信。
2.发布者(Publisher):
发布者是消息的发送方。它可以是物联网设备、传感器、应用程序等。发布者将消息发布到服务器上的特定主题(Topic)。主题是消息的识别标签,订阅者将根据主题来订阅感兴趣的消息。
3.订阅者(Subscriber):
订阅者是消息的接收方。它可以是物联网设备、应用程序等。订阅者通过订阅服务器上的特定主题(Topic)来表明自己对某些消息感兴趣。当有新消息发布到该主题时,订阅者将收到相应的消息。
MQTT通信流程如下:
1.发布者将消息通过MQTT协议连接到服务器(Broker),并指定要发布的主题(Topic)以及消息内容。
2.服务器(Broker)接收到消息后,根据主题将其转发给订阅了该主题的所有订阅者。
3.订阅者将通过MQTT协议连接到服务器,并订阅自己感兴趣的主题(Topic)。
4.当服务器接收到新的消息,并且该消息的主题与某个订阅者的订阅主题匹配时,服务器将消息推送给该订阅者。
需要注意的是,MQTT协议支持不同的服务质量等级(QoS),发布者和订阅者可以根据消息的可靠性需求选择适当的QoS级别。
总结:MQTT通信框架基于服务器、发布者和订阅者之间的交互,通过服务器中转消息,并根据订阅关系将消息传递给订阅者。这种发布-订阅模型使得消息发送和接收的解耦和灵活性更高,并且适用于分布式、异构的环境中的物联网应用和其他消息传递场景
二、心跳包
MQTT 心跳包(Keep Alive)是一种机制,用于维持 MQTT 客户端与服务器之间的活动连接状态。它确保客户端和服务器之间的通信链路保持活跃,以防止连接超时或断开。
以下是 MQTT 心跳包的工作原理:
1.Keep Alive 值:在 MQTT 协议中,客户端在建立连接时会设置 Keep Alive 值。该值表示客户端希望与服务器保持的活动连接时间间隔,以秒为单位。通常,此值会设置为一个较小的时间间隔,例如 60 秒。
2.客户端发送心跳包:一旦客户端与服务器建立连接,它会周期性地发送心跳包给服务器。心跳包是一个特殊的空(zero-byte)消息,只包含 MQTT 固定头部和类型字段为 PingReq 的控制报文。
3.服务器响应心跳包:服务器收到心跳包后,会立即发送一个类型为 PongResp 的响应消息给客户端。服务器的响应表明它仍然处于活动状态。
4.心跳超时:如果客户端在 Keep Alive 时间内未收到服务器的响应,或者连接断开,则客户端可以判断与服务器的连接已断开。客户端可以重新连接服务器或采取其他适当的措施。
MQTT 心跳包的作用:
1.保持连接活跃:心跳包确保 MQTT 客户端和服务器之间的连接保持活跃,避免连接因长时间无活动而断开。
2.检测断开连接:通过监测心跳包的响应,客户端可以判断与服务器的连接是否正常。如果超过一定的时间未收到响应,客户端可以主动断开连接或尝试重新连接。
3.节省网络资源:心跳包的周期性发送相对较小,占用较少的网络资源。同时,较小的 Keep Alive 值可以更快地发现连接问题,减少对应用程序的影响。
通过使用心跳包,MQTT 可以构建可靠的、长时间持续的通信链路,确保设备与服务器之间的连接始终保持活动状态,并及时发现和处理连接问题。
三、项目中使用到的软件
本项目我们会使用到MQTTX这个软件:
MQTTX 是一个开源的跨平台 MQTT 客户端工具,用于在物联网开发和调试过程中与 MQTT 代理进行交互。它提供了直观和功能丰富的界面,方便用户进行 MQTT 消息的发布、订阅和管理。
以下是 MQTTX 的一些主要特点和功能:
支持多种操作系统:MQTTX 可以在 Windows、macOS 和 Linux 等多个操作系统上运行,提供了跨平台的支持。
直观的用户界面:MQTTX 提供了简洁直观的用户界面,易于使用和导航。用户可以轻松地配置连接参数、订阅主题、发布消息和查看消息交互。
完整的 MQTT 协议支持:MQTTX 支持 MQTT 3.1.1 和 MQTT 5.0 版本,包括各种 MQTT 消息的发布、订阅、连接管理和 QoS (服务质量) 等级控制。
主题订阅管理:用户可以在 MQTTX 中方便地管理订阅主题,并查看接收到的消息历史记录。同时,MQTTX 还支持通配符订阅,例如使用 “+” 和 “#” 进行通配符匹配。
快速发布和订阅消息:MQTTX 提供了快速和便捷的消息发布和订阅功能,用户可以实时查看消息的传输和接收情况。
连接信息和调试:MQTTX 显示与 MQTT 代理的连接状态、断开原因和错误信息,用户可以轻松调试连接问题。
数据可视化:MQTTX 支持以图表形式可视化 MQTT 消息数据,帮助用户更好地理解和分析传感器数据、实时指标等。
四、MQTT中服务器和客户端建立连接的步骤
1.客户端发送 CONNECT 报文:客户端通过 TCP/IP 协议与 MQTT 服务器建立网络连接后,会发送 CONNECT 报文给服务器。CONNECT 报文包含了客户端的身份标识、协议版本、连接标志以及保持连接的参数等信息。
2.服务器响应 CONNACK 报文:MQTT 服务器接收到客户端的 CONNECT 报文后,会进行验证和处理。如果一切正常,服务器会向客户端发送 CONNACK 报文作为响应。CONNACK 报文包含了服务器的连接确认状态以及连接返回码。
3.保持连接(Keep Alive):一旦连接建立,在客户端和服务器之间的通信中,根据客户端在 CONNECT 报文中设置的 Keep Alive 值,客户端需要定期发送心跳(PingReq)报文到服务器,以证明其活动状态。服务器会相应地发送心跳响应(PingResp)报文。这样可以保持连接的活跃状态,并及时检测连接问题。
4.客户端和服务器进行消息交换:一旦连接建立且连接保持活跃,客户端和服务器之间可以进行 MQTT 消息的发布(PUBLISH)、订阅(SUBSCRIBE)、取消订阅(UNSUBSCRIBE)和断开连接(DISCONNECT)等操作。客户端可以发布消息给服务器,服务器可以将消息传递给订阅了相关主题的客户端。
5.客户端断开连接:当客户端希望断开与服务器的连接时,可以发送 DISCONNECT 报文给服务器。服务器收到 DISCONNECT 报文后,会关闭连接并释放相关资源。
总结
本篇文章就讲解到这里。下篇文章我们会对这个MQTT的源码进行分析。