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

2023-11-13

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

前言

接下来的 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的推送,确保用户收到且只会收到一次。
  5. 小型传输,开销很小(固定长度的头部是 2 字节),协议交换最小化,以降低网络流量;
  6. 使用 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配置

所以实际测试的时候,在结构体中的.client_id 与 MQTT X 工具中的 Client ID 填写不一样的才可以实现 PC 与开发板两个客户端之间的订阅与发布:

在这里插入图片描述

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 工具进行如下操作:

在这里插入图片描述

最后的测试效果图如下:
在这里插入图片描述

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

结语

本问的测试虽然简单,但是需要细心,有必要花点时间了解 MQTT 的一个工作模式,然后再进行测试,才会更加的理解这个模式。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐

  • 第十六篇

    Ln Linux ln 英文全拼 link files 命令是一个非常重要命令 它的功能是为某一个文件在另外一个位置建立一个同步的链接 当我们需要在不同的目录 用到相同的文件时 我们不需要在每一个需要的目录下都放一个必须相同的文件 我们只要
  • 【无人机】采用最基本的自由空间路损模型并且不考虑小尺度衰落(多径多普勒)固定翼无人机轨迹规划(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 2 1 文献结果 2 2 Matlab代码复现结果 3 参考文献 4 Matlab代码及文章
  • SQLServer帐号管理

    1 用户的创建 如图所示 右击 登录名 选中新建登录名 2 如何创建数据库用户 在数据库的下面 创建用户名 同时通过 浏览 按钮 关联想要授权的登录账号 3 给用户分配权限 注意 此处是给需要分配权限的数据库中的用户 进行安全对象的管理 例
  • 联想笔记本Ideapad300S-14ISK安装固态硬盘和win10

    1 拆机 把背面的螺丝钉拧开 拿个卡找个缝插进去转一圈就打开了 2 内存 先把电源排线拔掉 排线旁边有标识 和 内存条外面盖着一个金属壳 把四周的小固定扣压下去就能打开 内存条型号DDR3L 买了个DDR4才发现插不进去 3 固态硬盘 把机
  • visio使用技巧

    出处 blog作者 卡纳瓦罗 里面的东西主要是看了吕贤聪的 visio2003视频教程 后总结的一些技巧 还有平时应用visio时的一些心得 1 鼠标按住尺规的边缘往外拉 会拉出一条绘图辅助线 帮助绘图 精确定位 按del键就会消失 而且选
  • 多线程与同步代码块详解

    线程是程序执行的一条路径 一个进程中可以包含多条线程 多线程并发执行可以提高程序的效率 可以同时完成多项工作 多线程并发执行的实质就是CPU在做着高速的切换 多线程的应用场景 红蜘蛛同时共享屏幕给多个电脑 迅雷开启多条线程一起下载 QQ同时
  • 微芯I/O控制器瞄准工业与嵌入式运算应用

    微芯科技 Microchip Technology 日前发布SCH322X系列I O控制器新品 该系列产品基于工业及嵌入式开发工程师的需求而开发 功能丰富且具高灵活性 新一代I O控制器系列拥有尺寸更小的包装和更长的产品生命周期 可运用于更
  • caj转pdf

    https caj2pdf cn
  • 关于不同浏览器的内核与引擎--记录一下

    https www cnblogs com gdutbean archive 2012 02 21 2362003 html https www cnblogs com guanghe p 11719334 html js引擎介绍 几种JS
  • Docker: 改变容器化世界的革命性技术

    目录 1 1什么是虚拟化 1 2什么是Docker 1 3容器与虚拟机的比较 1 4Docker组建 2 Docker安装 2 2设置ustc的镜像 2 3Docker的启动与停止 3 docker常用命令 3 1镜像 3 2容器相关命令
  • Dockerfile参数详解

    FROM 功能为指定基础镜像 并且必须是第一条指令 如果不以任何镜像为基础 那么写法为 FROM scratch 同时意味着接下来所写的指令将作为镜像的第一层开始 语法 FROM
  • discuz 手机版伪静态

    前两天发布的这篇文章发现内容与实际情况不太相符特来更改 请多多包涵 网上有些现成的插件 价格却并不亲民 一个简简单单的伪静态插件居然标价三百 我也是醉了 我就在想 伪静态翻来覆去不就那么点东西吗 你能做我就做不了啦 在此帮各位仍有相同需求的
  • BP神经网络基本介绍

    1 主要解决的是什么问题 预测类 聚类分析 2 原理 思路是啥 什么是人工神经网络 ANN 模拟大脑对信号处理的一种算法 基本原理介绍 权关系是具体不清楚他们之间的关系 并未给出准确的对应关系 只是假设他们之间的关系可以用一组权来表示 阈值
  • 企业DevOps:实施过程中需要关注的各项要点

    作者 亚马逊云科技企业市场战略总监 Stephen Orban 经验并非凭空创造 而是依靠点滴积累所实现 阿尔贝 加缪 在此次的企业DevOps探索之旅系列文章当中 我将带大家一同探讨企业在具备一定DevOps经验之后又该如何处理下一步可能
  • BlockingQueue、ArrayBlockingQueue、LinkedBlockingQueue原理分析

    阻塞队列与非阻塞队 阻塞队列与普通队列的区别在于 当队列是空的时 从队列中获取元素的操作将会被阻塞 或者当队列是满时 往队列里添加元素的操作会被阻塞 试图从空的阻塞队列中获取元素的线程将会被阻塞 直到其他的线程往空的队列插入新的元素 同样
  • MySQL数据库定时备份脚本

    bin bash 定义备份用户 密码 DbUser root DbPasswd NTQ12377 定义备份数据库 DbName zabbix jumpserver openfire n9e n9e v5 ibex 定义备份目录 Path d
  • 手把手带你编写微信公众号

    这是一个简单的项目 简单编写微信公众号 扫码关注 关注 即可提高学习效率 Peace 实时查询城市天气 回复 美女视频网站 观看美女视频 不定时推送小姐姐视频和图片合集 Docker线上部署SpringBoot 如果您不知道如何开始编写的话
  • ajax中设置contentType: “application/json”的作用

    最近在做项目交互的时候 刚开始向后台传递数据返回415 后来百度添加了 contentType application json 之后返回400 然后把传输的数据格式改为json字符串就传输成功了 现在我们来看看 contentType a
  • Keras-训练网络时的问题:loss一直为nan,accuracy一直为一个固定的数

    目录 问题描述 问题的解决 调整学习率后解决问题 其他可能导致此问题的原因 1 2 3 4 关于如何选择学习率 问题描述 在使用VGG19做分类任务时 遇到一个问题 loss一直为nan accuracy一直为一个固定的数 如下输出所示 即
  • ESP32-C3入门教程 网络 篇(三、 MQTT 协议基础介绍及测试)

    在前面 我们已经学会了 ESP32 C3 的WiFi 配置以及使用 为我们学习网络协议建立了基础 这篇文章我们就来学习测试一下ESP32 C3 的 MQTT 驱动 目录 前言 1 基础介绍 1 1 MQTT协议基本概念 1 2 ESP MQ