本文主要是介绍ESP32-C3模组上跑通MQTT(2),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
接前一篇文章:ESP32-C3模组上跑通MQTT(1)
本文内容参考:
《ESP32-C3 物联网工程开发实战》
MQTT协议及使用_mqtt endpoint-CSDN博客
特此致谢!
上一回对于远程控制进行了介绍,并且介绍了常见的云端数据通信协议中的HTTP。本文介绍另一个协议 —— MQTT,这也是本系列文章的重中之重。
二、常见的云端数据通信协议
2. MQTT协议
实际上在笔者之前的文章中,已经对于MQTT进行了介绍,参见:
Windows系统下安装Mosquitto的步骤(1)-CSDN博客
在这个系列中,会从更加深入的技术细节层面对于MQTT协议进行讲解。
MQTT(Message Queue Telemetry Transport)是一个基于客户端/服务器端(C/S)架构发布的/订阅模式的消息传输协议。该写哟具有轻巧、开放、简单、规范和易于实现的特点,适合于资源受限设备,属于物联网的标准传输协议之一。
MQTT协议由IBM于1999年发布,目前MQTT协议已经发展到v5.x,ESP-IDF支持v3.1.1。MQTT v5.x与v3,x差异较大,而且不是互相兼容的。目前市面上大部分云平台还是以v3.x为主,因此本文重点介绍MQTT v3.x。
MQTT协议运行于TCP协议之上,具有如下特点:
- 使用发布/订阅消息模式,提供了一对多的消息分发模式和应用之间的解耦。
- 消息传输时不需要知道负载内容。
- 提供三种等级的服务质量(QoS)来保证数据的传输。
- 传输消耗很小,可最大限度地减少网络流量。
- 支持遗嘱消息,在连接异常断开时,能通知到相关各方。
三、MQTT协议原理
MQTT协议是基于客户端与服务器架构进行通信的。在MQTT协议中,有三类角色:发布者(Publisher)、订阅者(Subscriber)、代理服务器(Broker)。
发布者和订阅者都属于客户端,并且客户端既可以是消息的发布者、也可以是消息的订阅者;代理服务器是服务器端。
MQTT协议的架构如下图所示:
1. 客户端
通常指使用MQTT程序的设备,可以是发布者(Publisher)和订阅者(Subscriber),一般可将智能手机和被控设备视为客户端。客户端总是通过网络连接到服务器端的,可以实现以下功能:
- 将应用消息发布给其它相关的客户端。
- 通过订阅,以请求接收相关的应用消息。
- 通过取消订阅,以移除接收应用消息的请求。
- 断开和服务器端的连接。
MQTT客户端可以向服务端发布信息,也可以从服务端收取信息。我们把客户端发送信息的行为成为发布信息;而客户端要想从服务端收取信息,则首先要向服务端订阅信息。
2. 服务器端
通常指代理服务器(Broker),作为发送消息的客户端和请求订阅的客户端之间的中介。一般可将云平台和云服务器视为服务器端。服务器端可以实现以下功能:
- 接收来自客户端的网络连接。
- 接收客户端发布的应用消息。
- 处理客户端的订阅和取消订阅请求。
- 将应用消息转发给符合条件的客户端。
MQTT服务端其实就是一台服务器。它是MQTT信息传输的枢纽,负责将MQTT客户端发送来的信息传递给MQTT客户端。MQTT服务端还负责管理MQTT客户端。确保客户端之间的通讯顺畅,保证MQTT消息得以正确接收和准确投递。
3. 订阅(Subscribe)
订阅包含一个主题过滤器(Topic Filter)和一个最大的服务质量(QoS)等级。订阅与单个会话(Session)关联,会话可以包含多个订阅,会话的每一个订阅都有一个不同的主题过滤器。
4. 主题(Topic)
主题是附加在应用消息上的一个标签,服务器端在已知该标签的情况下,向订阅了该标签的客户端发送该应用消息的副本。
5. 主题过滤器(Topic Filter)
订阅中包含的一个表达式,用于表示相关的一个或多个主题。主题过滤器可以使用通配符,用于代替单个或多个字符。
6. 会话(Session)
客户端和服务器之间的状态交互,一些会话的持续时长与网络连接一样。客户端与服务器从建立连接到断开连接之间的状态交互称为会话。
7. 订阅与发布模式
订阅与发布模式是MQTT协议的灵魂。订阅者和发布者不需要关心对端的IP地址和端口号,也不需要直接和对端相连,它们甚至不知道对端是否存在。订阅者和发布者之间由代理服务器维系两者的消息交换,代理服务器过滤所有发布者发布的消息,然后分发给合适的订阅者。
发布者和订阅者都需要关心消息的主题。例如,智能手机想查看智能灯A的状态,则流程如下:
1)智能手机可以作为订阅者向代理服务器订阅主题为A/light_state的订阅消息;
2)智能灯设备A可以作为发布者,当智能灯的状态发生变化时,就会发布主题为A/light_state的状态消息给代理服务器;
3)代理服务器过滤订阅了主题A/light_state的订阅者,将状态消息发布给智能手机。这样智能手机就能查询到智能灯A的状态了。
更多内容请看下回。
这篇关于ESP32-C3模组上跑通MQTT(2)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!