ESP32-C3入门教程 网络 篇(三、 MQTT 协议基础介绍及测试)

简介: 在前面,我们已经学会了 ESP32-C3 的WiFi 配置以及使用,为我们学习网络协议建立了基础。这篇文章我们就来学习测试一下ESP32-C3 的 MQTT 驱动。
在前面,我们已经学会了 ESP32-C3 的WiFi 配置以及使用,为我们学习网络协议建立了基础。
这篇文章我们就来学习测试一下ESP32-C3 的 MQTT 驱动。
AI 代码解读

前言

接下来的 ESP32-C3 功能测试都是基于自己设计的开发板:

自己画一块ESP32-C3 的开发板(第一次使用立创EDA)(PCB到手)

开发环境是乐鑫官方的 ESP-IDF, 基于VScode插件搭建好的:

ESP32-C3 VScode开发环境搭建(基于乐鑫官方ESP-IDF——Windows和Ubuntu双环境)

学习 ESP32-C3 的 MQTT 协议包使用,不要用到其他外设。

1、基础介绍

1.1 MQTT协议基本概念

基本概念的东西网上很多,基本概念这里从网上摘取做个说明,说明节选自百度百科和下面的博文:

MQTT百度百科

MQTT--入门

MQTT(消息队列遥测传输)是ISO 标准(ISO/IEC PRF 20922)下基于发布/订阅范式的消息协议。它工作在 TCP/IP协议族上,是为硬件性能低下的远程设备以及网络状况糟糕的情况下而设计的发布/订阅型消息协议,为此,它需要一个消息中间件 。

MQTT是一个基于客户端-服务器的消息发布/订阅传输协议。MQTT协议是轻量、简单、开放和易于实现的,这些特点使它适用范围非常广泛。在很多情况下,包括受限的环境中,如:机器与机器(M2M)通信和物联网(IoT)。其在,通过卫星链路通信传感器、偶尔拨号的医疗设备、智能家居、及一些小型化设备中已广泛使用。

MQTT的通讯模型如下图:
在这里插入图片描述
MQTT 协议特点:

  1. 使用发布/订阅消息模式,提供一对多的消息发布,解除应用程序耦合;
  2. 对负载内容屏蔽的消息传输;
  3. 使用 TCP/IP 提供网络连接;
  4. 有三种消息发布服务质量:

“至多一次”,消息发布完全依赖底层TCP/IP网络。会发生消息丢失或重复。这一级别可用于如下情况,环境传感器数据,丢失一次读记录无所谓,因为不久后还会有第二次发送。这一种方式主要普通APP的推送,倘若你的智能设备在消息推送时未联网,推送过去没收到,再次联网也就收不到了。
“至少一次”,确保消息到达,但消息重复可能会发生。
“只有一次”,确保消息到达一次。在一些要求比较严格的计费系统中,可以使用此级别。在计费系统中,消息重复或丢失会导致不正确的结果。这种最高质量的消息发布服务还可以用于即时通讯类的APP的推送,确保用户收到且只会收到一次。

  1. 小型传输,开销很小(固定长度的头部是 2 字节),协议交换最小化,以降低网络流量;
  2. 使用 Last Will 和 Testament 特性通知有关各方客户端异常中断的机制。

Last Will:即遗言机制,用于通知同一主题下的其他设备发送遗言的设备已经断开了连接。Testament:遗嘱机制,功能类似于Last Will。

MQTT 协议实现方式:

实现MQTT协议需要客户端和服务器端通讯完成,在通讯过程中,MQTT协议中有三种身份:发布者(Publish)、代理(Broker)(服务器)、订阅者(Subscribe)。其中,消息的发布者和订阅者都是客户端,消息代理是服务器,消息发布者可以同时是订阅者。

MQTT传输的消息分为:主题(Topic)和负载(payload)两部分:

  1. Topic,可以理解为消息的类型,订阅者订阅(Subscribe)后,就会收到该主题的消息内容(payload);
  2. payload,可以理解为消息的内容,是指订阅者具体要使用的内容。

在这里插入图片描述

1.2 ESP-MQTT 基础

关于 ESP32-C3 的MQTT,官方链接如下: ESP-MQTT官方说明

ESP-MQTT 对应的底层都已经写好 ,官方也是主要介绍了有哪些基于 MQTT 的应用:
在这里插入图片描述

1.2.1 SSL

SSL百度百科

SSL(Secure Sockets Layer 安全套接层),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种 安全协议。TLS与SSL在传输层对网络连接进行加密。大部分互联网登录都是用的SSL/TLS。

在官方的示例代码中,SSL传输的MQTT示例如下:
在这里插入图片描述

1.2.2 MQTT over Websocket

MQTT over WebSocket是把MQTT control message 包装成WebSocket包,通过WebSocket 管道发送。即使用WebSocket来支持MQTT Client和Broker的连接。

他们之间的共同点:

  • MQTT 和 WebSocket 都是应用层协议目前底层
  • 都是使用 TCP 协议确保可靠传输数据
  • 都规定了自己的报文(消息)结构
  • 都支持双向通信都使用二进制编码(有别于 HTTP 这一类基于文本编码的协议)
  • 都是公开标准 mqtt rfc6455

他们之间的区别:

  • WebSocket 是一种简单的报文协议,着重解决浏览器和服务端不能进行双向通信的问题。本质上有点像是 TCP 协议之上的 UDP 协议。WebSocket 仅仅定义了会话的发起方式和报文格式及类型。如何使用报文通信全由应用程序控制。
  • MQTT 是一套相对比较复杂的消息投递协议,而 WebSocket则只是在TCP协议之上实现了简单的报文通信。两种协议工作层次不一样。从这个意义上讲,MQTT 可以工作在 WebSocket之上。
  • MQTT 做原生设备的通信,MQTT over WebSocket 主要用于 MQTT 设备跟 Web 端通信。

在官方的示例中,MQTT over Websocket 的示例如下:
在这里插入图片描述

2、示例测试

在前面 ESP3-MQTT 基础介绍中,我们了解到了官方 MQTT 的示例种类,今天作为基础的测试,选用的示例代码为 ../mqtt/tcp:
在这里插入图片描述

2.1 测试工具

本次测试使用在线的公共 MQTT 服务器,公共的在线服务器相关的参考,可查看下面文章:

一文了解主流在线公共 MQTT 服务器

我们的 ESP32-C3 开发板作为一个客户端, 自己使用的 PC 作为另外一个客户端;

在PC上可以使用 MQTT X 工具:

MQTT X 工具下载地址

在这里插入图片描述
下载好 MQTT X 工具,我们建立一个连接(基础测试 SSL 就不用勾选了):
MQTT 连接设置
上面设置好以后,记住UsenamePassword,点击连接即可。

2.2 示例代码简析

入门教程,快速上手,我们从文章开头的介绍也不涉及 MQTT 协议的具体实现与协议格式,这里我们目的是能够正确的掌握 ESP3-MQTT 的使用,能够在一般的项目中快速使用起来。

所以示例代码,简单的介绍一下各部分功能,我们从程序运行的最开头 app_main开始看,那么在程序开始有一个ESP_ERROR_CHECK(example_connect()); 这个函数用来连接wifi的,需要在menuconfig中配置,但是我们使用的是 Vscode 插件,所以直接点击设置图标:
menuconfig在插件中的对应设置

找到对应的wifi设置,如下图填写 ssid 和 Password:
example_connect()对应设置

mqtt_app_start(void)

app_main 函数的最后就直接调用了 static void mqtt_app_start(void)函数,在这个函数中,需要根据开始在 MQTT X 工具中的设置进行填写:

注意下图中有个Client ID 选项,客户端的ID,如果要想PC 和 ESP32开发板是不同的客户端,两者ID 不能一样,如果是下图中,那么服务器会认为他们两个是一个客户端,所以实际测试需要注意下,Client ID两者不要一样,那么作为两个独立的客户端,可以做相互发布和订阅测试。

mqtt_cfg配置

mqtt_event_handler_cb(esp_mqtt_event_handle_t event)

在上面启动了 client 以后,所有的事件发生都是在回调函数中处理, 上面注册的回调函数为mqtt_event_handler,而这个函数调用了mqtt_event_handler_cb()函数:

mqtt_event_handler_cb简析

2.3 测试

了解了示例代码,在代码中修改好 mqtt_cfg配置参数 和 wifi 连接参数以后,就可以程序烧录到板子上,上电后运行的效果如下图:
在这里插入图片描述
在 PC 客户端MQTT X 工具上,我们也订阅和示例中相同的两个主题,操作如下:

在这里插入图片描述在这里插入图片描述

MQTT X 工具设置好,重启开发本,能够收到3条消息,如下图:
在这里插入图片描述

和预想的一样,那么我们知道,示例程序中,最后是取消了 /topic/qos1 的订阅,只订阅了/topic/qos0,所以我们可以通过 PC客户端,发布/topic/qos0主题的消息,在 MQTT X 工具进行如下操作:
在这里插入图片描述
最后的测试效果图如下:
在这里插入图片描述

好了,对于示例程序来说,测试到这里就基本结束了。

那么结合我们之前的学习,我们在下一篇文章将会实现一个小的应用, 利用ESP32-C3 使用 MQTT 连接阿里云,上报传感器数据给平台,平台下发命令控制开发板。

相关实践学习
消息队列RocketMQ版:基础消息收发功能体验
本实验场景介绍消息队列RocketMQ版的基础消息收发功能,涵盖实例创建、Topic、Group资源创建以及消息收发体验等基础功能模块。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
目录
打赏
0
0
1
0
836
分享
相关文章
嵌入式C++、STM32、MySQL、GPS、InfluxDB和MQTT协议数据可视化
通过本文的介绍,我们详细讲解了如何结合嵌入式C++、STM32、MySQL、GPS、InfluxDB和MQTT协议,实现数据的采集、传输、存储和可视化。这种架构在物联网项目中非常常见,可以有效地处理和展示实时数据。希望本文能帮助您更好地理解和应用这些技术,构建高效、可靠的数据处理和可视化系统。
139 82
Jmeter如何对UDP协议进行测试?
`jmeter-plugins`是JMeter的插件管理器,用于管理和组织所有插件。访问[官网](https://jmeter-plugins.org/install/Install/)下载并放置于`lib/ext`目录下,重启JMeter后可在“选项”中看到插件管理器。
30 1
Jmeter如何对UDP协议进行测试?
多协议网关BL110钡铼6路RS485转MQTT协议云网关
BL110钡铼6路RS485转MQTT协议云网关是一款高性能、易配置的工业级设备,适用于各种需要远程监控和数据采集的物联网应用场景。通过将传统RS485设备的数据转换为MQTT协议并上传至云平台,实现了设备的远程管理和智能控制,极大地提升了系统的管理效率和响应速度。
71 2
消息队列 MQ产品使用合集之当SpringBoot应用因网络不通而启动失败时,该如何解决
消息队列(MQ)是一种用于异步通信和解耦的应用程序间消息传递的服务,广泛应用于分布式系统中。针对不同的MQ产品,如阿里云的RocketMQ、RabbitMQ等,它们在实现上述场景时可能会有不同的特性和优势,比如RocketMQ强调高吞吐量、低延迟和高可用性,适合大规模分布式系统;而RabbitMQ则以其灵活的路由规则和丰富的协议支持受到青睐。下面是一些常见的消息队列MQ产品的使用场景合集,这些场景涵盖了多种行业和业务需求。
物联网协议比较 MQTT CoAP RESTful/HTTP XMPP
【10月更文挑战第18天】本文介绍了物联网领域中四种主要的通信协议:MQTT、CoAP、RESTful/HTTP和XMPP,分别从其特点、应用场景及优缺点进行了详细对比,并提供了简单的示例代码。适合开发者根据具体需求选择合适的协议。
120 5
Jmeter实现WebSocket协议的接口测试方法
WebSocket协议是HTML5的一种新协议,实现了浏览器与服务器之间的全双工通信。通过简单的握手动作,双方可直接传输数据。其优势包括极小的头部开销和服务器推送功能。使用JMeter进行WebSocket接口和性能测试时,需安装特定插件并配置相关参数,如服务器地址、端口号等,还可通过CSV文件实现参数化,以满足不同测试需求。
322 7
Jmeter实现WebSocket协议的接口测试方法
MQTT协议对接及RabbitMQ的使用记录
通过合理对接MQTT协议并利用RabbitMQ的强大功能,可以构建一个高效、可靠的消息通信系统。无论是物联网设备间的通信还是微服务架构下的服务间消息传递,MQTT和RabbitMQ的组合都提供了一个强有力的解决方案。在实际应用中,应根据具体需求和环境进行适当的配置和优化,以发挥出这两个技术的最大效能。
323 0
Python渗透测试之ARP毒化和协议应用
Python渗透测试之ARP毒化和协议应用
61 0
智能家居新篇章:WPF与物联网的智慧碰撞——通过MQTT协议连接与控制智能设备,打造现代科技生活的完美体验
【8月更文挑战第31天】物联网(IoT)技术的发展使智能家居设备成为现代家庭的一部分。通过物联网,家用电器和传感器可以互联互通,实现远程控制和状态监测等功能。本文将探讨如何在Windows Presentation Foundation(WPF)应用中集成物联网技术,通过具体示例代码展示其实现过程。文章首先介绍了MQTT协议及其在智能家居中的应用,并详细描述了使用Wi-Fi连接方式的原因。随后,通过安装Paho MQTT客户端库并创建MQTT客户端实例,演示了如何编写一个简单的WPF应用程序来控制智能灯泡。
221 0
"掌握MQTT协议,开启物联网通信新篇章——揭秘轻量级消息传输背后的力量!"
【8月更文挑战第21天】MQTT是一种轻量级的消息传输协议,以其低功耗、低带宽的特点在物联网和移动应用领域广泛应用。基于发布/订阅模型,MQTT支持三种服务质量级别,非常适合受限网络环境。本文详细阐述了MQTT的工作原理及特点,并提供了使用Python `paho-mqtt`库实现的发布与订阅示例代码,帮助读者快速掌握MQTT的应用技巧。
119 0

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等