尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

6.19 esp32s3学习

6.19 esp32s3学习
📅 发布时间:2026/6/20 18:45:12

wifi设置


在连接Wi-Fi之前,需要先初始化好相关的底层组件。在ESP-IDF框架下,标准的初始化顺序通常如下:

初始化底层网络协议栈:调用 esp_netif_init()。这就像给网络通信准备好"道路和交通规则"。

创建默认事件循环:调用 esp_event_loop_create_default()。这就是一个不停运转的"消息中心",负责接收和分发所有事件。

创建默认网络接口:根据你的用途,调用 esp_netif_create_default_wifi_sta()(作为Station,连接路由器)或 esp_netif_create_default_wifi_ap()(作为AP,创建热点)。

初始化Wi-Fi驱动:调用 esp_wifi_init()。这会启动Wi-Fi硬件和底层驱动。

第二步:核心事件
准备工作完成后,就可以开始连接了。对于最常见的Station模式(连接路由器),你需要关注以下几个按顺序发生的事件:

WIFI_EVENT_STA_START:当你调用 esp_wifi_start() 后,Wi-Fi驱动启动成功就会发出此事件。你应该在这个事件的处理函数中,调用 esp_wifi_connect() 来真正发起连接。

WIFI_EVENT_STA_CONNECTED:当ESP32成功连接到路由器(AP)时触发。这代表物理层的Wi-Fi连接已建立,但此时还没有IP地址。系统会自动启动DHCP客户端开始获取IP。

IP_EVENT_STA_GOT_IP:这是最重要的一个事件!当DHCP客户端成功从路由器获取到IP地址后触发。这标志着整个网络连接已完全就绪。只有在这里,你才可以安全地创建socket、发起HTTP请求等网络通信操作。

函数解释

snprintf安全格式化字符串

头文件里用 DECLARE(声明),源文件里用 DEFINE(定义)。
所以 DECLARE 和 DEFINE 的配合是C语言管理全局资源的标准惯用法


#define ESP_EVENT_DECLARE_BASE(id) extern esp_event_base_t const id

#define ESP_EVENT_DEFINE_BASE(id) esp_event_base_t const id = #id
所以,这行代码声明了一个名为 id 的全局字符串常量,它的值就是它自己的名字 "id"。

void wifi_init_sta(void)
{
s_wifi_event_group = xEventGroupCreate();

ESP_ERROR_CHECK(esp_netif_init());tcpip协议初始化

ESP_ERROR_CHECK(esp_event_loop_create_default());
esp_netif_create_default_wifi_sta();创建sta对象

wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();初始化结构体
ESP_ERROR_CHECK(esp_wifi_init(&cfg));通过上面结构体的配置去初始化wifi

esp_event_handler_instance_t instance_any_id;用于取消相应的事件
esp_event_handler_instance_t instance_got_ip;

ESP_ERROR_CHECK(esp_event_handler_instance_register(WIFI_EVENT,
ESP_EVENT_ANY_ID,表示捕获所有wifi事件
&event_handler,
NULL,
&instance_any_id));
ESP_ERROR_CHECK(esp_event_handler_instance_register(IP_EVENT,
IP_EVENT_STA_GOT_IP,获取到ip事件
&event_handler,
NULL,
&instance_got_ip));

wifi_config_t wifi_config = {填充结构体成员
.sta = {
.ssid = EXAMPLE_ESP_WIFI_SSID,你的wifi名称
.password = EXAMPLE_ESP_WIFI_PASS,你的wifi密码
/* Authmode threshold resets to WPA2 as default if password matches WPA2 standards (password len => 8).
* If you want to connect the device to deprecated WEP/WPA networks, Please set the threshold value
* to WIFI_AUTH_WEP/WIFI_AUTH_WPA_PSK and set the password with length and format matching to
* WIFI_AUTH_WEP/WIFI_AUTH_WPA_PSK standards.
*/

.threshold.authmode = ESP_WIFI_SCAN_AUTH_MODE_THRESHOLD,加密等级
.sae_pwe_h2e = ESP_WIFI_SAE_MODE,
.sae_h2e_identifier = EXAMPLE_H2E_IDENTIFIER,
},
};
ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA) );设置sta模式
ESP_ERROR_CHECK(esp_wifi_set_config(WIFI_IF_STA, &wifi_config) );将结构体配置设置进去
ESP_ERROR_CHECK(esp_wifi_start() );启动wifi

ESP_LOGI(TAG, "wifi_init_sta finished.");

/* Waiting until either the connection is established (WIFI_CONNECTED_BIT) or connection failed for the maximum
* number of re-tries (WIFI_FAIL_BIT). The bits are set by event_handler() (see above) */
EventBits_t bits = xEventGroupWaitBits(s_wifi_event_group,
WIFI_CONNECTED_BIT | WIFI_FAIL_BIT,
pdFALSE,
pdFALSE,
portMAX_DELAY);

/* xEventGroupWaitBits() returns the bits before the call returned, hence we can test which event actually
* happened. */
if (bits & WIFI_CONNECTED_BIT) {
ESP_LOGI(TAG, "connected to ap SSID:%s password:%s",
EXAMPLE_ESP_WIFI_SSID, EXAMPLE_ESP_WIFI_PASS);
} else if (bits & WIFI_FAIL_BIT) {
ESP_LOGI(TAG, "Failed to connect to SSID:%s, password:%s",
EXAMPLE_ESP_WIFI_SSID, EXAMPLE_ESP_WIFI_PASS);
} else {
ESP_LOGE(TAG, "UNEXPECTED EVENT");
}
}

OSI 七层模型是什么


第 1 层:物理层(Physical Layer)
干什么的:负责传输原始比特流(0 和 1)。它规定了网线用什么接口、网线里有几根铜线、电压是多少伏代表“1”,多少伏代表“0”。

关键设备:网线、光纤、集线器(Hub)、中继器。

和你之前问的关联:SPI(串行外设接口) 就属于这一层的工作范畴,它规定了芯片引脚上的电平高低如何传递数据。

第 2 层:数据链路层(Data Link Layer)
干什么的:把物理层的“0 和 1”组装成数据帧(Frame),并负责在同一局域网(同一个交换机下) 内找到对方。它引入了 MAC 地址(物理地址),就像快递员在同一个小区里根据门牌号送件。

关键设备:交换机(Switch)、网桥。

关键协议:以太网(Ethernet)、Wi-Fi(802.11)。

第 3 层:网络层(Network Layer)
干什么的:负责把数据从一个网络路由转发到另一个网络。它引入了 IP 地址,就像快递总站根据邮编和城市,把包裹发往正确的城市。

关键设备:路由器(Router)。

关键协议:IP(网际协议)——这就是 TCP/IP 里的那个“IP”。

第 4 层:传输层(Transport Layer)
干什么的:负责端到端的可靠通信。它解决两个核心问题:① 数据有没有丢?② 数据顺序对不对?这一层引入了端口号(Port),用来区分电脑上不同的应用程序(比如 80 端口是网页,443 是加密网页)。

关键协议:TCP(传输控制协议)——可靠,有重传机制;以及 UDP——不可靠但速度快(用于视频通话、直播)。

第 5 层:会话层(Session Layer)
干什么的:负责建立、管理和终止通信双方之间的会话连接。通俗讲,就是“你好,我们聊完了,再见”。

实际现状:现在的网络协议栈中,这一层功能已经被弱化或并入应用层了,日常开发很少单独提它。

第 6 层:表示层(Presentation Layer)
干什么的:负责数据格式转换、加密、压缩。比如把图片转成 JPEG 格式,把文字转成 ASCII 或 Unicode,或者把数据加密防止偷看。

实际现状:同样,现在的应用层软件(如浏览器)自己就完成了这些工作,这一层也逐渐被合并了。

第 7 层:应用层(Application Layer)
干什么的:最靠近用户的一层,直接为应用程序提供网络服务。这一层规定了数据的具体“格式”和“业务逻辑”。

关键协议:HTTP(网页)、HTTPS、FTP(文件传输)、SMTP(邮件),以及你刚才问的 MQTT——它们统统都在这一层。

相关新闻

  • 芝麻黑地铺石采购指南:山东五莲主流厂家排名及价格解析 - 博客万
  • Cloudflare Workers AI轻量文生图实战:零GPU部署稳定出图
  • 2026南京奢品高价回收白皮书|对比全城价,杜绝低价收割闲置 - 讯息早知道

最新新闻

  • 毕业季论文必备!专业AI论文平台,成稿速度破纪录
  • 江苏南京10大叛逆/网瘾/厌学孩子全封闭学校推荐|2026家长必看,别再走弯路! - 辛云教育资讯
  • 嵌入式GUI多语言支持:从UTF-8编码到复杂脚本的实战解析
  • BeautifulSoup实战:从豆瓣TOP250到构建个人电影数据库
  • 深圳代理记账避坑指南:99元/月的账,你敢用吗? - 小征每日分享
  • OpenCore Legacy Patcher完整指南:3个步骤让老旧Mac重获新生

日新闻

  • 信任的进化:技术实现详解——如何用JavaScript构建博弈论模拟器
  • Terrakube自定义工作流:如何集成OPA、Infracost等工具扩展IaC能力
  • grunt-concurrent快速入门:5分钟学会并行运行Grunt任务

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号