【Zephyr|ESP32-S3】基础学习:配置ESP32为用WiFi STA模式 连接路由器并获取IP
2026/6/11 2:13:00 网站建设 项目流程

【Zephyr|ESP32-S3】基础学习:用WiFi STA模式连接路由器并获取IP

哈喽,我是余火,一个普通的牛马打工人,目前正在学如何使用Zephyr RTOS。

上篇用 UART 串口实现了电脑给板子发命令控制 WS2812 变色,有串口通信基础了。但到目前为止板子一直是离线状态——只能和电脑一对一有线通信。ESP32-S3 最大的优势是自带 WiFi 模块,所以这次直接在同一个工程上加 WiFi 功能,让板子连上路由器拿到 IP 地址。

💡本篇学习目标
• WiFi STA 模式基础:STA vs AP、SSID/BSSID、2.4GHz 频段
net_mgmt(NET_REQUEST_WIFI_CONNECT, ...):发起 WiFi 连接请求
net_mgmt事件回调 + K_SEM 信号量桥接:异步事件转同步阻塞等待
• DHCP 自动获取 IP:net_if_ipv4_get_global_addr()+net_addr_ntop()

改了哪些东西

在第 9 篇 UART 串口控灯工程基础上改造,新增 WiFi 模块,UART/WS2812 全部都可以保留不动:

文件改了什么
src/main.c末尾追加#include "wifi.h"+wifi_init_and_connect()调用
src/wifi.c新增:WiFi STA 连接管理模块(事件回调 + 信号量同步 + 3 次重试)
src/wifi.h新增:WiFi 模块接口声明(只暴露一个wifi_init_and_connect()函数)
prj.conf追加网络 Kconfig(20+ 项)+ WiFi 凭证 + 栈/堆调整
overlay追加&wifi { status = "okay"; };
CMakeLists.txt无改动

WiFi STA 模式基础

WiFi 有两种基础模式:STA(Station,终端)和AP(Access Point,热点)。手机连家里路由器就是 STA 模式,手机开热点让别的设备连就是 AP 模式。

模式角色典型场景
STA(终端)连接路由器,作为网络客户端IoT 设备连家庭 WiFi、传感器上传数据
AP(热点)自身充当路由器,供其他设备连接手机热点、SoftAP 配网、设备间直连

嵌入式产品绝大多数用 STA 模式——板子作为终端连路由器,然后通过 TCP/UDP/MQTT 等协议通信。几个关键术语:

术语含义
SSIDWiFi 网络名称,如 “MyHomeWiFi”
BSSIDAP 的 MAC 地址,用于精确识别某个热点
信道(Channel)2.4GHz 频段有 1-13 信道,ESP32-S3 不支持 5GHz
安全类型WPA2-PSK(预共享密钥),家庭路由器最常用的加密方式
DHCP连接成功后路由器自动分配 IP 地址,无需手动配置

启用网络子系统

为什么 Kconfig 这么多

相比 GPIO、UART 这些默认启用的驱动,Zephyr 的网络协议栈是可选组件。这是 RTOS 模块化设计的体现——不用网络就不编译进去,省 Flash 和 RAM。但也意味着你需要手动开启一整条依赖链。

💡Zephyr 网络子系统的设计思想:网络栈不像 GPIO 那样默认启用,它是一个完整的独立子系统,包含 IP 协议栈、缓冲区管理、收发线程、DHCP 客户端等。每个部分都可以独立裁剪,代价就是 Kconfig 项多。换来的好处是:一个不用网络的最小固件可以省掉上百 KB 的 Flash 占用。

prj.conf 新增配置

在原有第 9 篇配置基础上追加,分三组理解:

# ── 栈/堆调整(WiFi 协议栈需要更多内存)── CONFIG_MAIN_STACK_SIZE=4096 # 主线程栈从默认 1024 提到 4096 CONFIG_HEAP_MEM_POOL_SIZE=57344 # 堆内存池 56KB,网络缓冲区分配需要 # ── 网络基础(IP 协议栈 + 缓冲区 + 收发线程)── CONFIG_NETWORKING=y # 启用 Zephyr 网络子系统(总开关) CONFIG_NET_IPV4=y # 启用 IPv4 协议栈 CONFIG_NET_L2_WIFI_MGMT=y # WiFi 管理层(连接/断开/扫描) CONFIG_NET_L2_ETHERNET=y # 以太网 L2 层(WiFi 底层走 802.11 → 以太网帧) CONFIG_NET_MGMT=y # 网络管理框架(事件通知机制) CONFIG_NET_MGMT_EVENT=y # 启用 net_mgmt 事件回调 CONFIG_NET_MGMT_EVENT_STACK_SIZE=2048 # 事件处理线程栈大小 CONFIG_NET_MGMT_EVENT_QUEUE_SIZE=16 # 事件队列容量 CONFIG_NET_DHCPV4=y # DHCPv4 客户端(自动获取 IP) CONFIG_NET_PKT_TX_COUNT=10 # TX 数据包池数量 CONFIG_NET_PKT_RX_COUNT=10 # RX 数据包池数量 CONFIG_NET_BUF_TX_COUNT=20 # TX 缓冲区数量 CONFIG_NET_BUF_RX_COUNT=20 # RX 缓冲区数量 CONFIG_NET_TX_STACK_SIZE=2048 # 网络发送线程栈 CONFIG_NET_RX_STACK_SIZE=2048 # 网络接收线程栈 # ── WiFi 驱动 ── CONFIG_WIFI=y # 启用 WiFi 驱动 CONFIG_WIFI_LOG_LEVEL_INF=y # WiFi 模块日志级别设为 INF # ── WiFi 凭证(替换为你自己的 SSID 和密码)── CONFIG_WIFI_SSID="your_ssid" CONFIG_WIFI_PASSWORD="your_wifi_password"

Kconfig 配置清单

配置项作用为什么需要
CONFIG_NETWORKING网络子系统总开关不开的话整个网络代码不会编译
CONFIG_NET_IPV4IPv4 协议支持连路由器拿 IP 需要 IPv4
CONFIG_NET_L2_WIFI_MGMTWiFi 管理层提供 WiFi 连接/断开/扫描 API
CONFIG_NET_L2_ETHERNET以太网 L2 层WiFi 底层通过 802.11 封装以太网帧
CONFIG_NET_MGMT/CONFIG_NET_MGMT_EVENT事件管理框架net_mgmt 回调机制的依赖
CONFIG_NET_DHCPV4DHCP 客户端自动从路由器获取 IP 地址
CONFIG_WIFIWiFi 驱动ESP32-S3 WiFi 硬件驱动
CONFIG_MAIN_STACK_SIZE=4096主线程栈大小WiFi 连接过程栈开销大,默认 1024 不够
CONFIG_HEAP_MEM_POOL_SIZE=57344堆内存池网络缓冲区动态分配需要堆内存

💡缓冲区配置怎么确定数值NET_PKT_TX/RX_COUNTNET_BUF_TX/RX_COUNT的值是经验值,对于简单的 STA 连接 + UDP 通信场景,10/20 足够。如果要做 HTTP 请求或 MQTT,可能需要增大。太小会导致数据包分配失败,太大会浪费 RAM。

overlay 新增

ESP32-S3 的设备树默认已启用 WiFi 外设(status = "okay"),但显式声明更清晰:

&wifi { status = "okay"; };

WiFi 连接代码

模块化设计

WiFi 逻辑拆成了独立的wifi.c/wifi.h,main 只需调一个函数。这是实际项目的常见做法——WiFi、BLE 等通信模块各管各的,main 只负责初始化和业务逻辑。

wifi.h — 只暴露一个接口:

#ifndefWIFI_H#defineWIFI_H/** * @brief 初始化 WiFi STA 并阻塞等待连接完成 (或超时) * * 内部通过 K_SEM 将异步 net_mgmt 事件转换为同步等待。 * 超时时间固定为 30 秒。 * 连接成功后 IP 地址通过 DHCP 自动获取,并通过 LOG 输出。 * * @return 0 成功,负 errno 失败 (-ENODEV 无接口, -ETIMEDOUT 超时) */intwifi_init_and_connect(void

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询