当前位置: 首页 > news >正文

《ESP8266通信指南》15-MQTT连接、订阅MQTT主题并打印消息(基于Lua|适合新手|非常简单)


往期

《ESP8266通信指南》14-连接WIFI(基于Lua)-CSDN博客

《ESP8266通信指南》13-Lua 简单入门(打印数据)-CSDN博客

《ESP8266通信指南》12-Lua 固件烧录-CSDN博客

《ESP8266通信指南》11-Lua开发环境配置-CSDN博客

《ESP8266通信指南》10-MQTT通信(Arduino开发)-CSDN博客

《ESP8266通信指南》9-TCP通信(Arudino开发)-CSDN博客

《ESP8266通信指南》8-连接WIFI(Arduino开发)(非常简单)-CSDN博客

《ESP8266通信指南》7-Arduino 开发8266的环境配置与示例代码烧录-CSDN博客

《ESP8266通信指南》6-创建TCP服务器(AT指令)-CSDN博客

《ESP8266通信指南》5-TCP通信透传模式(AT指令)-CSDN博客

《ESP8266通信指南》4-以Client进行TCP通信(AT指令)-CSDN博客

《ESP8266通信指南》3-常用AT指令详解-8266连WIFI-CSDN博客

《ESP8266通信指南》2-ESP8266 AT测试-CSDN博客

《ESP8266通信指南》1-ESP8266 简介-CSDN博客

1. 小节目标

实现 MQTT 的连接,订阅主题,接收来自 MQTT 的消息,并在串口打印出来。

2. 完整代码

station_cfg = {}
station_cfg.ssid = "xlu_2.4"
station_cfg.pwd  = "111222333+"
station_cfg.auto = false
station_cfg.save = false
x_id=666
mqtt_cfg = {}
mqtt_cfg.host      = "broker.emqx.io"
mqtt_cfg.port      = 1883
mqtt_cfg.clientid  = "alro_xxx".. x_id
mqtt_cfg.keepalive = 120
mqtt_cfg.username  = "AlvaRocha"
mqtt_cfg.password  = "aio_KO<safety edit>sXwbgtWCboCal"
-- 
x_topic="/topic/ctiot/".. x_id
m=nil
wifi.setmode(wifi.STATION)
wifi.sta.config(station_cfg)iot_test = mqtt.Client(mqtt_cfg.clientid, mqtt_cfg.keepalive, mqtt_cfg.username, mqtt_cfg.password)
iot_test:on("offline", function(client)print("client offline")
end)
iot_test:on("message", function(client, topic, data)if data ~= nil thenprint(data)end
end)function get_broker(mqtt_client)mqtt_client:connect(mqtt_cfg.host, mqtt_cfg.port, false,function(client)client:subscribe(x_topic.."/c", 0, function(client)print("subscribe success "..x_topic.."/c")end)m:publish(x_topic.."/m", "success", 0, 0, function(client)print("init success")end)end,function(client, reason)print('connection failed', reason)end)m=mqtt_client
endfunction startup()if file.open("init.lua") == nil thenprint("init.lua deleted or renamed")elseprint("Running")file.close("init.lua")get_broker(iot_test)end
endwifi_connect_event = function(T)print("Connection to AP(" .. T.SSID .. ") established!")print("Waiting for IP address...")if disconnect_ct ~= nil thendisconnect_ct = nilend
endwifi_got_ip_event = function(T)print("Wifi connection is ready! IP address is: " .. T.IP)print("Startup will resume momentarily, you have 3 seconds to abort.")print("Waiting...")tmr.create():alarm(3000, tmr.ALARM_SINGLE, startup)
endwifi.eventmon.register(wifi.eventmon.STA_CONNECTED, wifi_connect_event)
wifi.eventmon.register(wifi.eventmon.STA_GOT_IP, wifi_got_ip_event)
wifi.sta.connect()

各位读者需要自己将 ID 更改为自己的特殊信息,或者将整个主题更改为包含自己特征的主题,因为我们使用的是公共的 MQTT 服务器,为了避免接收到别人的消息,影响我们的测试,迫不得已这样做,在后来,我们会介绍如何自己部署一个 MQTT 服务器,到时候就不需要考虑这些主题的问题了,到时候就需要考虑设备的唯一表示 ID 主题。

3. 现象

3.1. 连接上 MQTT 服务

  1. 首先连接 WIFI
  2. 连接上 MQTT 服务器
  3. 订阅主题,并将订阅的主题打印出来

  • 这个就是 ESP8266 订阅的主题
/topic/ctiot/666/c

3.2. 接收到 MQTT 消息

我们使用之前介绍过的 MQTTX 客户端,往我们订阅的主题发送消息,我的主题是:

/topic/ctiot/666/c

使用 MQTTX 软件往上述的主题发送消息,ESP8266 就可以接收到消息了,如下

关于 MQTTX 如何使用,可参考这篇博客:《ESP8266通信指南》10-MQTT通信(Arduino开发)-CSDN博客

4. 代码详解

4.1. 初始化 Wi-Fi 连接参数

station_cfg = {}
station_cfg.ssid = "xlu_2.4"
station_cfg.pwd  = "111222333+"
station_cfg.auto = false
station_cfg.save = false

在这段代码中,我们初始化了 Wi-Fi 连接参数 station_cfg,包括 SSID、密码、自动连接和保存连接信息的设置。

  • station_cfg.ssid: Wi-Fi 的 SSID,即网络名称。
  • station_cfg.pwd: Wi-Fi 的密码。
  • station_cfg.auto: 是否自动连接 Wi-Fi。
  • station_cfg.save: 是否保存 Wi-Fi 连接信息。

4.2. 设置 MQTT 连接参数

x_id=666
mqtt_cfg = {}
mqtt_cfg.host      = "broker.emqx.io"
mqtt_cfg.port      = 1883
mqtt_cfg.clientid  = "alro_xxx".. x_id
mqtt_cfg.keepalive = 120
mqtt_cfg.username  = "AlvaRocha"
mqtt_cfg.password  = "aio_KO<safety edit>sXwbgtWCboCal"

这部分代码定义了 MQTT 连接的参数,包括代理主机、端口、客户端 ID、保持连接时间、用户名和密码。

  • x_id: 用于客户端 ID 的标识符。
  • mqtt_cfg.host: MQTT 代理的主机地址。
  • mqtt_cfg.port: MQTT 代理的端口。
  • mqtt_cfg.clientid: MQTT 客户端 ID,结合了固定的前缀和 x_id
  • mqtt_cfg.keepalive: 客户端与服务器之间的心跳保持时间(以秒为单位)。
  • mqtt_cfg.usernamemqtt_cfg.password: MQTT 代理的用户名和密码。

4.3. 定义 MQTT 主题

x_topic="/topic/ctiot/".. x_id

这一行代码定义了 MQTT 主题,其中包含了一个固定的前缀 "/topic/ctiot/" 和之前定义的 x_id。这个主题将用于发布和订阅消息。

4.4. 初始化 Wi-Fi 连接

m=nil
wifi.setmode(wifi.STATION)
wifi.sta.config(station_cfg)

在这里,我们将 Wi-Fi 模式设置为 STATION(即客户端模式),然后配置 Wi-Fi 参数为之前定义的 station_cfg

初始化 MQTT 客户端

iot_test = mqtt.Client(mqtt_cfg.clientid, mqtt_cfg.keepalive, mqtt_cfg.username, mqtt_cfg.password)

这行代码创建了一个 MQTT 客户端实例,使用了之前定义的 MQTT 连接参数。

4.5. 定义 MQTT 客户端事件处理函数

iot_test:on("offline", function(client)print("client offline")
end)
iot_test:on("message", function(client, topic, data)if data ~= nil thenprint(data)end
end)

这里定义了两个事件处理函数,分别处理客户端离线和收到消息的情况。当客户端离线时,打印提示信息;当收到消息时,打印消息内容。

4.6. 定义连接到 MQTT 代理的函数

function get_broker(mqtt_client)mqtt_client:connect(mqtt_cfg.host, mqtt_cfg.port, false,function(client)client:subscribe(x_topic.."/c", 0, function(client)print("subscribe success "..x_topic.."/c")end)m:publish(x_topic.."/m", "success", 0, 0, function(client)print("init success")end)end,function(client, reason)print('connection failed', reason)end)m=mqtt_client
end

这个函数用于连接到 MQTT 代理,并订阅一个主题以及发布一条消息。连接成功后,将打印订阅成功和发布成功的信息。

4.7. 启动函数

function startup()if file.open("init.lua") == nil thenprint("init.lua deleted or renamed")elseprint("Running")file.close("init.lua")get_broker(iot_test)end
end

这个函数用于启动 MQTT 客户端。首先检查是否存在 init.lua 文件,如果存在,则执行 get_broker 函数。

4.8. 定义 Wi-Fi 连接事件处理函数

wifi_connect_event = function(T)print("Connection to AP(" .. T.SSID .. ") established!")print("Waiting for IP address...")if disconnect_ct ~= nil thendisconnect_ct = nilend
endwifi_got_ip_event = function(T)print("Wifi connection is ready! IP address is: " .. T.IP)print("Startup will resume momentarily, you have 3 seconds to abort.")print("Waiting...")tmr.create():alarm(3000, tmr.ALARM_SINGLE, startup)
end

这里定义了两个 Wi-Fi 连接事件处理函数,分别处理连接到 AP 和获取 IP 地址的情况。当连接到 AP 时,打印连接成功的提示信息;当获取到 IP 地址时,打印 IP 地址,并在 3 秒后执行 startup 函数。

4.9. 注册 Wi-Fi 事件回调函数并连接 Wi-Fi

wifi.eventmon.register(wifi.eventmon.STA_CONNECTED, wifi_connect_event)
wifi.eventmon.register(wifi.eventmon.STA_GOT_IP, wifi_got_ip_event)
wifi.sta.connect()

最后,注册了 Wi-Fi 事件回调函数,并启动 Wi-Fi 连接。

4.10. 带有注释的完整代码

带有中文注释的代码在烧录的时候有时候会烧录不进去,原因是中文编码导致的问题,建议如下:

  1. 不烧录带有中文的代码
  2. 将注释更改为简单易懂的英文

在这里贴出中文注释代码的原因是为了方便各位同学学习和阅读代码

-- 初始化 Wi-Fi 连接参数
station_cfg = {}
station_cfg.ssid = "xlu_2.4"  -- Wi-Fi SSID
station_cfg.pwd  = "111222333+"  -- Wi-Fi 密码
station_cfg.auto = false  -- 不自动连接
station_cfg.save = false  -- 不保存连接信息-- 设置 MQTT 连接参数
x_id = 666
mqtt_cfg = {}
mqtt_cfg.host      = "broker.emqx.io"  -- MQTT 代理主机
mqtt_cfg.port      = 1883  -- MQTT 代理端口
mqtt_cfg.clientid  = "alro_xxx" .. x_id  -- MQTT 客户端 ID
mqtt_cfg.keepalive = 120  -- 保持连接时间
mqtt_cfg.username  = "AlvaRocha"  -- MQTT 用户名
mqtt_cfg.password  = "aio_KO<safety edit>sXwbgtWCboCal"  -- MQTT 密码-- 定义 MQTT 主题
x_topic = "/topic/ctiot/" .. x_id-- 初始化 Wi-Fi 连接
m = nil
wifi.setmode(wifi.STATION)
wifi.sta.config(station_cfg)-- 初始化 MQTT 客户端
iot_test = mqtt.Client(mqtt_cfg.clientid, mqtt_cfg.keepalive, mqtt_cfg.username, mqtt_cfg.password)-- 定义 MQTT 客户端事件处理函数
iot_test:on("offline", function(client)print("client offline")
end)iot_test:on("message", function(client, topic, data)if data ~= nil thenprint(data)end
end)-- 定义连接到 MQTT 代理的函数
function get_broker(mqtt_client)mqtt_client:connect(mqtt_cfg.host, mqtt_cfg.port, false,function(client)client:subscribe(x_topic .. "/c", 0, function(client)print("subscribe success " .. x_topic .. "/c")end)-- 发布一条消息m:publish(x_topic .. "/m", "success", 0, 0, function(client)print("init success")end)end,function(client, reason)print('connection failed', reason)end)m = mqtt_client
end-- 启动函数
function startup()if file.open("init.lua") == nil thenprint("init.lua deleted or renamed")elseprint("Running")file.close("init.lua")get_broker(iot_test)end
end-- 定义 Wi-Fi 连接事件处理函数
wifi_connect_event = function(T)print("Connection to AP(" .. T.SSID .. ") established!")print("Waiting for IP address...")if disconnect_ct ~= nil thendisconnect_ct = nilend
endwifi_got_ip_event = function(T)print("Wifi connection is ready! IP address is: " .. T.IP)print("Startup will resume momentarily, you have 3 seconds to abort.")print("Waiting...")tmr.create():alarm(3000, tmr.ALARM_SINGLE, startup)
end-- 注册 Wi-Fi 事件回调函数并连接 Wi-Fi
wifi.eventmon.register(wifi.eventmon.STA_CONNECTED, wifi_connect_event)
wifi.eventmon.register(wifi.eventmon.STA_GOT_IP, wifi_got_ip_event)
wifi.sta.connect()

5. 结语


在小节中学习了如何使用 ESP8266 连接 MQTT 服务器同时订阅一个主题,在接收到 MQTT 服务器上发送来的消息的时候,将数据打印出来,在下一小节中我们将学习,如何将串口接收到的消息发送到 MQTT 服务器。



柴头物联网出品

相关文章:

《ESP8266通信指南》15-MQTT连接、订阅MQTT主题并打印消息(基于Lua|适合新手|非常简单)

往期 《ESP8266通信指南》14-连接WIFI&#xff08;基于Lua&#xff09;-CSDN博客 《ESP8266通信指南》13-Lua 简单入门&#xff08;打印数据&#xff09;-CSDN博客 《ESP8266通信指南》12-Lua 固件烧录-CSDN博客 《ESP8266通信指南》11-Lua开发环境配置-CSDN博客 《ESP826…...

LeetCode:两数之和

文章收录于LeetCode专栏 LeetCode地址 两数之和 给定一个整数数组nums和一个整数目标值target&#xff0c;请你在该数组中找出和为目标值的那两个整数&#xff0c;并返回它们的数组下标。   你可以假设每种输入只会对应一个答案。但是数组中同一个元素在答案里不能重复出现。…...

CSDN我的创作纪念日128天||不忘初心|努力上进|勇往直前

机缘 Hello&#xff0c;大家好&#xff0c;我是景天&#xff0c;其实很早之前我就加入到了CSND的大军&#xff0c;彼时我还是个刚毕业的小白白&#xff0c;时常过来CSND汲取养料&#xff0c;就这样&#xff0c;慢慢的来提升自己&#xff0c;强大自己。工作锻炼了我&#xff0c…...

MySQL数据库中的浮点类型和高精度类型有什么区别?为什么不推荐使用浮点类型?

在软件开发中&#xff0c;作为后端&#xff0c;无可避免的需要熟练使用 MySQL 数据库进行数据存储和读取。对于信息系统而言&#xff0c;数据库的的地位不言而喻。那作为软件开发工程师&#xff0c;在使用 MySQL 过程中&#xff0c;又有哪些需要注意的呢&#xff1f;我们从实际…...

C++ 抽象与封装

一 抽象 抽象实例&#xff1a;时钟 数据抽象&#xff1a; 具有表面当前时间的时、分、秒 行为抽象&#xff1a; 具有设置时间和显示时间两个最基本的功能。 抽象实例&#xff1a;人 数据抽象&#xff1a;姓名、年龄、性别等。 行为抽象&#xff1a; 生物属性&#xff1a;吃…...

antV X6的简要使用教程

&#x1f9d1;‍&#x1f393; 个人主页&#xff1a;《爱蹦跶的大A阿》 &#x1f525;当前正在更新专栏&#xff1a;《VUE》 、《JavaScript保姆级教程》、《krpano》、《krpano中文文档》 ​ ​ ✨ 前言 在我们的日常开发工作中&#xff0c;我们经常需要构建复杂的交互式图…...

【LLM 论文】Step-Back Prompting:先解决更高层次的问题来提高 LLM 推理能力

论文&#xff1a;Take a Step Back: Evoking Reasoning via Abstraction in Large Language Models ⭐⭐⭐⭐ Google DeepMind, ICLR 2024, arXiv:2310.06117 论文速读 该论文受到的启发是&#xff1a;人类再解决一个包含很多细节的具体问题时&#xff0c;先站在更高的层次上解…...

Java——接口的补充

目录 一&#xff1a;接口的注意事项 1. 接口中不能有方法块&#xff1b; 2. 接口没有构造方法&#xff1a; 3.接口是可以多继承的&#xff1b; 4. 多个接口抽象方法重复 5. 类的父类方法与接口方法重复 二&#xff1a;类与接口 1. 继承与实现 2. 多个父接口的抽象…...

word转pdf的java实现(documents4j)

一、多余的话 java实现word转pdf可用的jar包不多&#xff0c;很多都是收费的。最近发现com.documents4j挺好用的&#xff0c;它支持在本机转换&#xff0c;也支持远程服务转换。但它依赖于微软的office。电脑需要安装office才能转换。鉴于没在linux中使用office&#xff0c;本…...

基于K8S构建Jenkins持续集成平台

文章目录 安装和配置NFSNFS简介NFS安装 在Kubernetes安装Jenkins-Master创建NFS client provisioner安装Jenkins-Master Jenkins与Kubernetes整合实现Jenkins与Kubernetes整合构建Jenkins-Slave自定义镜像 JenkinsKubernetesDocker完成微服务持续集成拉取代码&#xff0c;构建镜…...

PHPStudy 访问网页 403 Forbidden禁止访问

涉及靶场 upload-labd sqli-labs pikachu dvwa 以及所有部署在phpstudy中的靶场 注意&#xff1a;一定要安装解压软件 很多同学解压靶场代码以后访问报错的原因是&#xff1a;电脑上没有解压软件。 这个时候压缩包看起来就是黄色公文包的样子&#xff0c;右键只有“全部提取…...

热爱电子值得做的电子制作实验

加我zkhengyang&#xff0c;进嵌入式音频系统研究开发交流答疑群(课题组) AM/FM收音机散件制作&#xff0c;磁带随声听散件&#xff0c;黑白电视机散件制作&#xff0c;功放散件制作&#xff0c;闪光灯散件制作&#xff0c;声控灯散件&#xff0c;等等&#xff0c;可提高动手能…...

.class文件启动过程以及文件内容结构讲解

当你直接启动一个.class文件时&#xff0c;实际上是在操作系统中调用Java虚拟机&#xff08;JVM&#xff09;&#xff0c;并将该.class文件传递给JVM以执行。现在让我们来解释一下.class文件的启动过程以及文件内容结构&#xff1a; 启动过程&#xff1a;操作系统通过指定的命…...

解锁楼宇自动化新维度西门子Insight+BACnet IP I/O控制器

数字城市的楼宇自动化已不再是一个遥不可及的概念&#xff0c;而是成为了现代建筑的标配。特别是在大型商业综合体、高端写字楼和公共设施中&#xff0c;高效的楼宇管理系统是确保环境舒适度与能源效率的关键。当提及楼宇自动化领域的佼佼者&#xff0c;西门子Insight楼宇自动化…...

2024.05.10作业

TCP服务器 头文件 #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QTcpServer> #include <QTcpSocket> #include <QList> #include <QMessageBox> #include <QDebug>QT_BEGIN_NAMESPACE namespace Ui { class Widget; …...

基于POSIX标准库的读者-写者问题的简单实现

文章目录 实验要求分析保证读写、写写互斥保证多个读者同时进行读操作读者优先实例代码分析写者优先读写公平法示例代码分析实验要求 创建一个控制台进程,此进程包含n个线程。用这n个线程来表示n个读者或写者。每个线程按相应测试数据文件的要求进行读写操作。用信号量机制分别…...

重生我是嵌入式大能之串口调试UART

什么是串口 串口是一种在数据通讯中广泛使用的通讯接口&#xff0c;通常我们叫做UART (通用异步收发传输器Universal Asynchronous Receiver/Transmitter)&#xff0c;其具有数据传输速度稳定、可靠性高、适用范围广等优点。在嵌入式系统中&#xff0c;串口常用于与外部设备进…...

【智能优化算法】蜜獾优化算法(Honey Badger Algorithm,HBA)

蜜獾优化算法(Honey Badger Algorithm,HBA)是期刊“MATHEMATICS AND COMPUTERS IN SIMULATION”&#xff08;IF 3.6&#xff09;的2022年智能优化算法 01.引言 蜜獾优化算法(Honey Badger Algorithm,HBA)受蜜獾智能觅食行为的启发&#xff0c;从数学上发展出一种求解优化问题的…...

【算法与数据结构】数组

文章目录 前言数组数组的定义数组的基本操作增加元素删除元素修改元素查找元素 C STL 中的数组arrayvector Python3 中的列表访问更改元素值遍历列表检查列表中是否存在某元素增加元素删除元素拷贝列表总结 Python3 列表的常用操作 参考资料写在最后 前言 本系列专注更新基本数…...

【数据结构】队列详解(Queue)

文章目录 有关队列的概念队列的结点设计及初始化队列的销毁判空和计数入队操作出队操作 有关队列的概念 队列:只允许在一端进行插入数据操作&#xff0c;在另一端进行删除数据操作的特殊线性表&#xff0c;队列具有先进先出FIFO(First In First Out)入队列:进行插入操作的一端…...

工程地质软件市场:发展现状、趋势与策略建议

一、引言 在工程建设领域&#xff0c;准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具&#xff0c;正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...

苍穹外卖--缓存菜品

1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得&#xff0c;如果用户端访问量比较大&#xff0c;数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据&#xff0c;减少数据库查询操作。 缓存逻辑分析&#xff1a; ①每个分类下的菜品保持一份缓存数据…...

Qt Http Server模块功能及架构

Qt Http Server 是 Qt 6.0 中引入的一个新模块&#xff0c;它提供了一个轻量级的 HTTP 服务器实现&#xff0c;主要用于构建基于 HTTP 的应用程序和服务。 功能介绍&#xff1a; 主要功能 HTTP服务器功能&#xff1a; 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...

uniapp微信小程序视频实时流+pc端预览方案

方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度​WebSocket图片帧​定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐​RTMP推流​TRTC/即构SDK推流❌ 付费方案 &#xff08;部分有免费额度&#x…...

GruntJS-前端自动化任务运行器从入门到实战

Grunt 完全指南&#xff1a;从入门到实战 一、Grunt 是什么&#xff1f; Grunt是一个基于 Node.js 的前端自动化任务运行器&#xff0c;主要用于自动化执行项目开发中重复性高的任务&#xff0c;例如文件压缩、代码编译、语法检查、单元测试、文件合并等。通过配置简洁的任务…...

jmeter聚合报告中参数详解

sample、average、min、max、90%line、95%line,99%line、Error错误率、吞吐量Thoughput、KB/sec每秒传输的数据量 sample&#xff08;样本数&#xff09; 表示测试中发送的请求数量&#xff0c;即测试执行了多少次请求。 单位&#xff0c;以个或者次数表示。 示例&#xff1a;…...

怎么让Comfyui导出的图像不包含工作流信息,

为了数据安全&#xff0c;让Comfyui导出的图像不包含工作流信息&#xff0c;导出的图像就不会拖到comfyui中加载出来工作流。 ComfyUI的目录下node.py 直接移除 pnginfo&#xff08;推荐&#xff09;​​ 在 save_images 方法中&#xff0c;​​删除或注释掉所有与 metadata …...

淘宝扭蛋机小程序系统开发:打造互动性强的购物平台

淘宝扭蛋机小程序系统的开发&#xff0c;旨在打造一个互动性强的购物平台&#xff0c;让用户在购物的同时&#xff0c;能够享受到更多的乐趣和惊喜。 淘宝扭蛋机小程序系统拥有丰富的互动功能。用户可以通过虚拟摇杆操作扭蛋机&#xff0c;实现旋转、抽拉等动作&#xff0c;增…...

C++_哈希表

本篇文章是对C学习的哈希表部分的学习分享 相信一定会对你有所帮助~ 那咱们废话不多说&#xff0c;直接开始吧&#xff01; 一、基础概念 1. 哈希核心思想&#xff1a; 哈希函数的作用&#xff1a;通过此函数建立一个Key与存储位置之间的映射关系。理想目标&#xff1a;实现…...

Qt的学习(一)

1.什么是Qt Qt特指用来进行桌面应用开发&#xff08;电脑上写的程序&#xff09;涉及到的一套技术Qt无法开发网页前端&#xff0c;也不能开发移动应用。 客户端开发的重要任务&#xff1a;编写和用户交互的界面。一般来说和用户交互的界面&#xff0c;有两种典型风格&…...