ESP32C3连接wifi
文章目录
- 🔧 一、ESP32-C3 连接 Wi-Fi 的基本原理(STA 模式)
- ✅ 二、完整代码 + 注释讲解(适配 ESP32-C3)
- 📌 三、几个关键点解释
- 🔚 四、小结
🔧 一、ESP32-C3 连接 Wi-Fi 的基本原理(STA 模式)
ESP32-C3 使用 STA(Station)模式连接 Wi-Fi 热点流程如下:
- 初始化 NVS 存储:保存 Wi-Fi 参数等。
- 初始化网络接口(Netif)与事件循环(Event Loop)。
- 初始化 Wi-Fi 驱动并设置为 STA 模式。
- 设置 Wi-Fi SSID 和密码等参数。
- 注册 Wi-Fi 与 IP 相关事件(启动、断开、获取 IP 等)。
- 启动 Wi-Fi 并尝试连接。
- 连接成功后会触发 IP 事件,获取 IP 地址。
✅ 二、完整代码 + 注释讲解(适配 ESP32-C3)
#include <string.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_wifi.h"
#include "esp_event.h"
#include "esp_log.h"
#include "nvs_flash.h"
#include "esp_netif.h"// 设置你的 Wi-Fi 名称和密码
#define WIFI_SSID "P70PRO+"
#define WIFI_PASS "123456789"// 打印日志用的 tag
static const char *TAG = "wifi_main";// 用于标记是否已成功获取 IP
static bool got_ip = false;/*** @brief Wi-Fi 和 IP 事件处理函数* 这里处理连接、断开、获取 IP 等事件*/
static void wifi_event_handler(void* arg, esp_event_base_t event_base,int32_t event_id, void* event_data)
{if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_START) {// 当 Wi-Fi STA 模式启动后,尝试连接热点esp_wifi_connect();} else if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_DISCONNECTED) {// 如果连接失败或掉线,自动重连ESP_LOGI(TAG, "Disconnected. Reconnecting...");esp_wifi_connect();} else if (event_base == IP_EVENT && event_id == IP_EVENT_STA_GOT_IP) {// 成功连接 Wi-Fi 并获取到 IP 地址ip_event_got_ip_t* event = (ip_event_got_ip_t*) event_data;ESP_LOGI(TAG, "Got IP: " IPSTR, IP2STR(&event->ip_info.ip));got_ip = true; // 设置标志位表示 Wi-Fi 已连接}
}/*** @brief 主函数入口* 程序从这里开始运行*/
void app_main(void)
{printf("hello world\n");// 1. 初始化 NVS(非易失性存储),用于保存 Wi-Fi 配置等ESP_ERROR_CHECK(nvs_flash_init());// 2. 初始化底层网络接口(如 Wi-Fi STA 接口)ESP_ERROR_CHECK(esp_netif_init());// 3. 创建默认事件循环,用于处理系统事件ESP_ERROR_CHECK(esp_event_loop_create_default());// 4. 创建默认的 Wi-Fi STA 网络接口esp_netif_create_default_wifi_sta();// 5. 初始化 Wi-Fi 驱动wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();ESP_ERROR_CHECK(esp_wifi_init(&cfg));// 6. 注册 Wi-Fi 和 IP 相关事件的处理函数ESP_ERROR_CHECK(esp_event_handler_register(WIFI_EVENT, ESP_EVENT_ANY_ID, &wifi_event_handler, NULL));ESP_ERROR_CHECK(esp_event_handler_register(IP_EVENT, IP_EVENT_STA_GOT_IP, &wifi_event_handler, NULL));// 7. 配置 Wi-Fi 参数(SSID 和密码)wifi_config_t wifi_config = {.sta = {.ssid = WIFI_SSID, // Wi-Fi 名称.password = WIFI_PASS, // Wi-Fi 密码.threshold.authmode = WIFI_AUTH_WPA2_PSK, // 认证方式},};// 8. 设置为 STA(Station)模式ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA));// 9. 加载配置好的 Wi-Fi 参数ESP_ERROR_CHECK(esp_wifi_set_config(WIFI_IF_STA, &wifi_config));// 10. 启动 Wi-Fi(此时会触发 WIFI_EVENT_STA_START)ESP_ERROR_CHECK(esp_wifi_start());ESP_LOGI(TAG, "Wi-Fi started, waiting for connection...");// 11. 使用轮询等待连接成功(避免使用事件组)while (!got_ip) {vTaskDelay(pdMS_TO_TICKS(500)); // 延迟 500 毫秒}// 12. 成功连接ESP_LOGI(TAG, "Wi-Fi connected successfully!");
}
连接wifi成功:
📌 三、几个关键点解释
名称 | 说明 |
---|---|
esp_wifi_init() | 初始化 Wi-Fi 驱动 |
esp_netif_init() | 初始化底层 TCP/IP 栈 |
esp_event_loop_create_default() | 创建默认事件循环(处理回调) |
esp_event_handler_register() | 注册 Wi-Fi 或 IP 事件的处理函数 |
esp_wifi_connect() | 尝试连接 Wi-Fi |
WIFI_EVENT_STA_DISCONNECTED | Wi-Fi 断开时触发 |
IP_EVENT_STA_GOT_IP | 成功获取 IP 地址后触发 |
esp_wifi_set_config() | 设置 SSID、密码等 |
esp_wifi_start() | 启动 Wi-Fi 模块 |
vTaskDelay() | FreeRTOS 中延时函数 |
🔚 四、小结
你现在写的代码是ESP32-C3 连接 Wi-Fi 的最简方式之一:
- 省略了事件组:适合初学者快速验证功能
- 直接判断 got_ip 变量:逻辑简单清晰
- 结构合理:不依赖复杂任务调度、适合单线程程序
相关文章:
ESP32C3连接wifi
文章目录 🔧 一、ESP32-C3 连接 Wi-Fi 的基本原理(STA 模式)✅ 二、完整代码 注释讲解(适配 ESP32-C3)📌 三、几个关键点解释🔚 四、小结 🔧 一、ESP32-C3 连接 Wi-Fi 的基本原理&a…...
nvidia驱动更新-先卸载再安装-ubuntu
显卡驱动升级前,卸载旧版本,可采用两种方式。 1.命令行 (1)查找已安装的 NVIDIA 驱动和相关包:dpkg -l | grep nvidia (2)完全卸载 NVIDIA 驱动:sudo apt remove purge nvidia-*…...
SparkSQL 连接 MySQL 并添加新数据:实战指南
SparkSQL 连接 MySQL 并添加新数据:实战指南 在大数据处理中,SparkSQL 作为 Apache Spark 的重要组件,能够方便地与外部数据源进行交互。MySQL 作为广泛使用的关系型数据库,与 SparkSQL 的结合可以充分发挥两者的优势。本文将详细…...
Tomcat与纯 Java Socket 实现远程通信的区别
Servlet 容器(如 Tomcat) 是一个管理 Servlet 生命周期的运行环境,主要功能包括: 协议解析:自动处理 HTTP 请求/响应的底层协议(如报文头解析、状态码生成); 线程…...
Ubuntu 18.04.6下OpenSSL与OpenSSH版本升级
文章目录 升级背景下载必要软件包安装 zlib创建目录解压文件安装前置依赖离线安装依赖编译安装 zlib 安装 OpenSSL检查当前版本创建安装目录下载并解压 OpenSSL配置与安装验证安装解决动态库依赖问题永久更新环境变量安装OpenSSL常见错误 离线安装 Telnet 服务端指南1. 在联网机…...
BFS算法篇——从晨曦到星辰,BFS算法在多源最短路径问题中的诗意航行(下)
文章目录 引言一、01矩阵1.1 题目链接:https://leetcode.cn/problems/01-matrix/description/1.2 题目分析:1.3 思路讲解:1.4 代码实现: 二、飞地的数量2.1 题目链接:https://leetcode.cn/problems/number-of-enclaves…...
Cold Diffusion: Inverting Arbitrary Image Transforms Without Noise论文阅读
冷扩散:无需噪声的任意图像变换反转 摘要 标准扩散模型通常涉及两个核心步骤:图像降质 (添加高斯噪声)和图像恢复 (去噪操作)。本文发现,扩散模型的生成能力并不强烈依赖于噪声的选择…...
c++进阶——哈希表的实现
文章目录 哈希表的实现unordered_map和unordered_set哈希的引入散列的一些基本概念将Key转成整形和哈希函数哈希冲突负载因子 开放定址法和链地址法哈希函数的选取除法散列法/除留余数法乘法散列法全域散列法(了解)其他方法(了解) 针对于开放定址法的哈希…...
visual studio生成动态库DLL
visual studio生成动态库DLL 创建动态库工程 注意 #include “pch.h” 要放在上面 完成后点击生成 创建一个控制台项目 设置项目附加目录为刚才创建的动态库工程Dll1: 配置附加库目录: 配置动态库的导入库(.lib):链…...
逆强化学习IRL在医疗行为模式研究中的应用
逆强化学习(Inverse Reinforcement Learning, IRL)通过从专家行为中推断潜在奖励函数,近年来在医疗领域的患者行为模式分析中展现出重要价值。 以下是相关研究的具体分析: 1. 脓毒症治疗策略优化 研究背景:脓毒症治疗依赖复杂的临床决策,但传统强化学习需预先定义奖励…...
niushop单商户V5多门店版V5.5.0全插件+商品称重、商家手机端+搭建环境教程
一.系统介绍 【全开源】niushop单商户V5多门店版V5.5.0版本,我看很多人都想要 商品称重、商家手机端等插件这套是全插件版本,整合起来本博主也花了不少啦~ Niushop系统是应用thinkphp6开发的完善的电商系统,拥有完善的商品机制,…...
Kafka Go客户端--Sarama
Kafka Go客户端 在Go中里面有三个比较有名气的Go客户端。 Sarama:用户数量最多,早期这个项目是在Shopify下面,现在挪到了IBM下。segmentio/kafka-go:没啥大的缺点。confluent-kafka-go:需要启用cgo,跨平台问题比较多,交叉编译也…...
Python打卡 DAY 24
知识点回顾: 1. 元组 2. 可迭代对象 3. os模块 作业:对自己电脑的不同文件夹利用今天学到的知识操作下,理解下os路径。 OS 模块 import os # os是系统内置模块,无需安装 获取当前工作目录 os.getcwd() # get current working…...
为什么hadoop不用Java的序列化?
Java的序列化是一个重量级序列化框架(Serializable),一个对象被序列化后,会附带很多额外的信息(各种校验信息,Header,继承体系等),不便于在网络中高效传输。所以…...
《类和对象(下)》
引言: 书接上回,如果说类和对象(上)是入门阶段,类和对象(中)是中间阶段,那么这次的类和对象(下)就可以当做类和对象的补充及收尾。 一:再探构造…...
基于STM32、HAL库的TLV320AIC3101IRHBR音频接口芯片驱动程序设计
一、简介: TLV320AIC3101IRHBR 是 Texas Instruments 推出的高性能、低功耗音频编解码器,专为便携式和电池供电设备设计。它集成了立体声 ADC、DAC、麦克风前置放大器、耳机放大器和数字信号处理功能,支持 I2S/PCM 音频接口和 I2C 控制接口,非常适合与 STM32 微控制器配合…...
EDR与XDR如何选择适合您的网络安全解决方案
1. 什么是EDR? 端点检测与响应(EDR) 专注于保护端点设备(如电脑、服务器、移动设备)。通过在端点安装代理软件,EDR实时监控设备活动,检测威胁并快速响应。 EDR核心功能 实时监控:…...
Vue2 elementUI 二次封装命令式表单弹框组件
需求:封装一个表单弹框组件,弹框和表单是两个组件,表单以插槽的形式动态传入弹框组件中。 使用的方式如下: 直接上代码: MyDialog.vue 弹框组件 <template><el-dialog:titletitle:visible.sync"dialo…...
jenkins流水线常规配置教程!
Jenkins流水线是在工作中实现CI/CD常用的工具。以下是一些我在工作和学习中总结出来常用的一些流水线配置:变量需要加双引号括起来 "${main}" 一 引用无账号的凭据 使用变量方式引用,这种方式只适合只由密码,没有用户名的凭证。例…...
设计模式系列(02):设计原则(一):SRP、OCP、LSP
本文为设计模式系列第2篇,聚焦面向对象设计的三大核心原则:单一职责、开放封闭、里氏替换,系统梳理定义、实际业务场景、优缺点、最佳实践与常见误区,适合系统学习与团队协作。 目录 1. 引言2. 单一职责原则(SRP)3. 开放封闭原则(OCP)4. 里氏替换原则(LSP)5. 常见误区…...
【日常】AI 工作流
AI 工作流 名称使用场景产品形态其他ChatGPT网页LLMGemini可以生成一份深度研究的文档并保存到Google Docs网页LLM白嫖了一年会员Kimi日常网页LLMDeepSeek深度思考网页LLMGrok3Deep Research 深度搜索网页LLMQwen3网页LLM元宝可免费使用DS的深度思考(满血DS R1版&a…...
问题及解决02-处理后的图像在坐标轴外显示
一、问题 在使用matlab的appdesigner工具来设计界面,可以通过点击处理按钮来处理图像,并将处理后的图像显示在坐标轴上,但是图像超出了指定的坐标轴,即处理后的图像在坐标轴外显示。 问题图如下图所示。 原来的坐标轴如下图所…...
Spark基础介绍
Spark是一种基于内存的快速、通用、可拓展的大数据分析计算引擎。 起源阶段 Spark 最初是在 2009 年由加州大学伯克利分校的 AMP 实验室开发。当时,Hadoop 在大数据处理领域占据主导地位,但 MapReduce 在某些复杂计算场景下,如迭代计算和交互…...
Oracles数据库通过存储过程调用飞书接口推送群组消息
在Oracle数据库中,可以通过存储过程调用外部接口来实现推送消息的功能。以下是一个示例,展示如何通过存储过程调用飞书接口推送群组消息。 创建存储过程 首先,创建一个存储过程,用于调用飞书接口。该存储过程使用UTL_HTTP包来发送HTTP请求。 CREATE OR REPLACE PROCEDUR…...
ubuntu22.04编译PX4无人机仿真实践
克隆PX4源码,并且更新子模块 git clone https://github.com/PX4/PX4-Autopilot.git --recursive git submodule update --init --recursive # 强制同步所有子模块 接着安装相关依赖: bash ./PX4-Autopilot/Tools/setup/ubuntu.sh 运行以下命令进行编译: cd ~/PX4-Autop…...
MySQL基础入门:MySQL简介与环境搭建
引言 在数字化转型浪潮中,MySQL作为数据存储的"基石引擎",支撑着从电商交易到金融风控的各类核心业务。其高并发处理能力、灵活的架构设计及跨平台兼容性,使其成为开发者技术栈中的"常青树"。本章节将通过历史溯源、技术…...
无人机避障——(运动规划部分)深蓝学院动力学kinodynamic A* 3D算法理论解读(附C++代码)
开源代码链接:GitHub - Perishell/motion-planning 效果展示: ROS 节点展示全局规划和轨迹生成部分: Kinodynamic A*代码主体: int KinoAstar::search(Eigen::Vector3d start_pt, Eigen::Vector3d start_vel,Eigen::Vector3d en…...
电脑声音小怎么调大 查看声音调整方法
电脑是我们工作学习经常需要用到的工具,同时电脑也可以播放音乐、视频、游戏等,享受声音的效果。但是,有些电脑的声音很小,即使把音量调到最大,也听不清楚,这让我们很苦恼。那么,电脑声音小怎么…...
无人机信号监测系统技术解析
一、模块技术要点 1. 天线阵列与信号接收模块 多频段自适应切换:采用天线阵列模块,根据复杂地形和不同频段自动切换合适的天线,提升信号接收灵敏度。 双天线测向技术:通过双天线的RSSI(信号接收强度)差值…...
Excel的详细使用指南
### **一、Excel基础操作** #### **1. 界面与基本概念** - **工作簿(Workbook)**:一个Excel文件(扩展名.xlsx)。 - **工作表(Worksheet)**:工作簿中的单个表格(默认名…...
基于SSM实现的健身房系统功能实现十六
一、前言介绍: 1.1 项目摘要 随着社会的快速发展和人们健康意识的不断提升,健身行业也在迅速扩展。越来越多的人加入到健身行列,健身房的数量也在不断增加。这种趋势使得健身房的管理变得越来越复杂,传统的手工或部分自动化的管…...
序列化和反序列化(hadoop)
1.先将上一个博客的Student复制粘贴后面加上H 在StudentH中敲下面代码 package com.example.sei; import org.apache.hadoop.io.Writable; import java.io.DataInput; import java.io.DataOutput; import java.io.IOException; //学生类,姓名,年龄 //支…...
大模型MCP_MCP从流式SSE到流式HTTP_1.8.0支持流式HTTP交互_介绍_从应用到最优--人工智能工作笔记0245
从最开始的大模型时代,到现在MCP,大模型技术,人工智能技术迭代真的非常快 之前的大模型更像一个大脑,能帮大家出点子,然后告诉你思路,你去解决问题,但是 一直不能自己解决问题,后来出来了通用的manus智能体,声称可以解决很多问题.直接操作 一个自带的电脑,但是也有局限性,还…...
docker大镜像优化实战
在 Docker 镜像优化方面,有许多实战技巧可以显著减小镜像体积、提高构建效率和运行时性能。以下是一些实用的优化策略和具体操作方法: 1. 选择合适的基础镜像 策略 使用 Alpine 版本:Alpine 镜像通常只有 5-10MB,比 Ubuntu/Deb…...
【25软考网工】第六章(5)应用层安全协议
博客主页:christine-rr-CSDN博客 专栏主页:软考中级网络工程师笔记 大家好,我是christine-rr !目前《软考中级网络工程师》专栏已经更新三十篇文章了,每篇笔记都包含详细的知识点,希望能帮助到你ÿ…...
RevIN(Reversible Instance Normalization)及其在时间序列中的应用
详细介绍 RevIN(Reversible Instance Normalization)及其在时间序列中的应用 1. RevIN 的定义与背景 RevIN(可逆实例归一化)是一种专门为时间序列预测设计的归一化方法,旨在处理非平稳数据(non-stationar…...
JSON 和 cJSON 库入门教程
第一部分:了解 JSON (JavaScript Object Notation) 什么是 JSON? JSON 是一种轻量级的数据交换格式。它易于人阅读和编写,同时也易于机器解析和生成。 JSON 基于 JavaScript 编程语言的一个子集,但它是一种独立于语言的文本格式…...
Unity 2D 行走动画示例工程手动构建教程-AI变成配额前端UI-完美游戏开发流程
🎮 Unity 2D 行走动画示例工程手动构建教程 ✅ 1. 新建 Unity 项目 打开 Unity Hub: 创建一个新项目,模板选择:2D Core项目名:WalkAnimationDemo ✅ 2. 创建文件夹结构 在 Assets/ 目录下新建以下文件夹:…...
[Java][Leetcode middle] 45. 跳跃游戏 II
这题没做出来,看的答案解析 可以理解为希望采用最少得跳槽次数跳到最高级别的公司。 下标i为公司本身的职级,每个公司可以提供本身等级nums[i]的职级提升。 每次从这些选择中选择自己能够达到最大职级的公司跳槽。 public int jump(int[] nums) {if(nu…...
leetcode 3335. 字符串转换后的长度 I
给你一个字符串 s 和一个整数 t,表示要执行的 转换 次数。每次 转换 需要根据以下规则替换字符串 s 中的每个字符: 如果字符是 z,则将其替换为字符串 "ab"。否则,将其替换为字母表中的下一个字符。例如,a 替…...
Leetcode 3542. Minimum Operations to Convert All Elements to Zero
Leetcode 3542. Minimum Operations to Convert All Elements to Zero 1. 解题思路2. 代码实现 题目链接:3542. Minimum Operations to Convert All Elements to Zero 1. 解题思路 这一题的处理方法其实还是挺好想明白的,其实就是从小到大依次处理各个…...
如何使用C51的Timer0实现定时功能
在C51单片机中,使用定时器0(Timer0)实现定时功能需要以下步骤: 1. 定时器基础知识 时钟源:C51的定时器时钟来源于晶振(如12MHz)。机器周期:1个机器周期 12个时钟周期(1…...
Day1 时间复杂度
一 概念 在 C 中,时间复杂度是衡量算法运行时间随输入规模增长的趋势的关键指标,用于评估算法的效率。它通过 大 O 表示法(Big O Notation) 描述,关注的是输入规模 n 趋近于无穷大时,算法时间增长的主导因…...
PostgreSQL 配置设置函数
PostgreSQL 配置设置函数 PostgreSQL 提供了一组配置设置函数(Configuration Settings Functions),用于查询和修改数据库服务器的运行时配置参数。这些函数为数据库管理员提供了动态管理数据库配置的能力,无需重启数据库服务。 …...
美学心得(第二百七十六集) 罗国正
美学心得(第二百七十六集) 罗国正 (2025年4月) 3275、人类将迎来真、善、美快速发展的时期,人‐机合一的天人合一(可简称为“天人机合一”)的境界已渐露头角,在优秀的人群中迅猛地…...
描述性统计工具 - AxureMost 落葵网
描述性统计工具是用于汇总和分析数据,以更好地了解数据特征的工具1。以下是一些常见的描述性统计工具简介: 描述性统计工具 Excel 基本统计函数:提供了丰富的函数用于计算描述性统计量。例如,AVERAGE 函数用于计算平均值…...
mybatis中${}和#{}的区别
先测试,再说结论 userService.selectStudentByClssIds(10000, "wzh or 11");List<StudentEntity> selectStudentByClssIds(Param("stuId") int stuId, Param("field") String field);<select id"selectStudentByClssI…...
【OpenCV】网络模型推理的简单流程分析(readNetFromONNX、setInput和forward等)
目录 1.模型读取(readNetFromONNX())1.1 初始化解析函数(parseOperatorSet())1.2 提取张量(getGraphTensors())1.3 节点处理(handleNode()) 2.数据准备(blobFromImage() …...
代码随想录算法训练营第三十九天
LeetCode题目: 115. 不同的子序列583. 两个字符串的删除操作72. 编辑距离 其他: 今日总结 往期打卡 115. 不同的子序列 跳转: 115. 不同的子序列 学习: 代码随想录公开讲解 问题: 给你两个字符串 s 和 t ,统计并返回在 s 的 子序列 中 t 出现的个数。 测试用例保…...
InternVL3: 利用AI处理文本、图像、视频、OCR和数据分析
InternVL3推动了视觉-语言理解、推理和感知的边界。 在其前身InternVL 2.5的基础上,这个新版本引入了工具使用、GUI代理操作、3D视觉和工业图像分析方面的突破性能力。 让我们来分析一下是什么让InternVL3成为游戏规则的改变者 — 以及今天你如何开始尝试使用它。 InternVL…...