3. Wi-Fi技术基础
在ESP32的Wi-Fi与BLE共存工程中,Wi-Fi是吞吐主力,BLE是低功耗交互通道。理解Wi-Fi的协议族、信道、连接流程以及ESP-IDF的API模型,是后续做共存调度、时隙分配和性能调优的前提。本节从协议栈到代码落地,梳理一条完整的知识链。
一、802.11协议族:从物理层到MAC层
IEEE 802.11并不是单一协议,而是一个协议族。ESP32系列主要支持802.11 b/g/n,部分型号支持802.11ax(Wi-Fi 6)。理解协议族的关键是区分“频段—调制—速率”三者的对应关系。
- 802.11b:2.4 GHz,DSSS调制,最高11 Mbps,兼容性好但效率低。
- 802.11g:2.4 GHz,OFDM调制,最高54 Mbps,与b后向兼容。
- 802.11n:2.4/5 GHz,引入MIMO和40 MHz信道绑定,单流最高150 Mbps。
- 802.11ax:引入OFDMA和TWT,提升密集场景效率,ESP32-C6等支持。
在MAC层,802.11采用CSMA/CA(载波侦听多路访问/冲突避免),而不是以太网的CSMA/CD。这意味着Wi-Fi是“先听再说、退避重传”的共享介质协议,这也是Wi-Fi与BLE共存时会产生时隙竞争的根本原因。
二、信道划分:2.4 GHz的“车道”与重叠
2.4 GHz频段被划分为14个信道,每个信道带宽20 MHz,但相邻信道中心频率仅相隔5 MHz,因此存在严重重叠。真正互不干扰的只有1、6、11三个信道。
| 信道 | 中心频率 | 是否常用 | 说明 |
|---|---|---|---|
| 1 | 2412 MHz | 是 | 与6、11互不重叠 |
| 6 | 2437 MHz | 是 | 中间信道,常作默认 |
| 11 | 2462 MHz | 是 | 与1、6互不重叠 |
| 13 | 2472 MHz | 部分地区 | 中国可用,欧美受限 |
| 14 | 2484 MHz | 日本 | 仅日本允许 |
三、连接流程:扫描、认证、关联、四次握手
Station接入AP的过程可分为四个阶段,每个阶段都有明确的帧交互:
- 扫描(Scan):主动扫描发送Probe Request,被动扫描监听Beacon。ESP-IDF中由
esp_wifi_scan_start()触发。 - 认证(Authentication):开放系统或共享密钥认证,交换Authentication帧。
- 关联(Association):发送Association Request,AP回复Association Response,分配AID。
- 四次握手(4-Way Handshake):WPA2/WPA3下通过EAPOL交换PTK,完成密钥派生和加密启用。
只有四次握手完成后,数据帧才会被加密传输。若使用WPA3-SAE,还会先进行SAE握手,再进入四次握手。ESP-IDF的WIFI_EVENT_STA_CONNECTED事件在关联成功时触发,而IP_EVENT_STA_GOT_IP在DHCP完成后触发,二者不可混淆。
四、TCP/IP集成:LwIP与ESP-IDF的分层
ESP-IDF内置LwIP协议栈,Wi-Fi驱动位于LwIP之下,负责802.11帧与以太网帧的转换。应用层通过BSD Socket API访问网络,中间经过LwIP的IP层、TCP/UDP层。
应用层:HTTP / MQTT / Socket
↓
LwIP:TCP / UDP / IP / ICMP / DHCP
↓
Wi-Fi驱动:802.11 MAC / 加密 / 速率控制
↓
射频:2.4 GHz / 5 GHz PHY
在Station模式下,DHCP客户端由LwIP提供,连接成功后自动获取IP。在AP模式下,ESP32可内置DHCP服务器,为接入设备分配地址。若需要静态IP,可在esp_netif配置中关闭DHCP并手动设置。
五、ESP-IDF Wi-Fi API与Station/AP模式
ESP-IDF的Wi-Fi编程围绕esp_netif、esp_event和esp_wifi三个组件展开。典型Station初始化流程如下:
esp_netif_init();
esp_event_loop_create_default();
esp_netif_create_default_wifi_sta();
wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
esp_wifi_init(&cfg);
esp_event_handler_register(WIFI_EVENT, ESP_EVENT_ANY_ID, &wifi_event_handler, NULL);
esp_event_handler_register(IP_EVENT, IP_EVENT_STA_GOT_IP, &ip_event_handler, NULL);
wifi_config_t wifi_config = {
.sta = {
.ssid = "MyAP",
.password = "12345678",
.threshold.authmode = WIFI_AUTH_WPA2_PSK,
},
};
esp_wifi_set_mode(WIFI_MODE_STA);
esp_wifi_set_config(WIFI_IF_STA, &wifi_config);
esp_wifi_start();
esp_wifi_connect();
AP模式则将WIFI_MODE_STA改为WIFI_MODE_AP,并配置ap.ssid、ap.password、ap.channel和ap.max_connection。ESP32也支持WIFI_MODE_APSTA,即同时作为Station和AP,这是共存工程中常见的拓扑。
六、案例与误区复盘
案例:某智能灯使用ESP32 Station连接路由器,同时用BLE广播配网。现象是BLE广播间隔从100 ms抖动到300 ms,Wi-Fi吞吐也从8 Mbps降到3 Mbps。排查发现Wi-Fi默认开启省电模式WIFI_PS_MIN_MODEM,导致射频在睡眠与唤醒间频繁切换,与BLE广播抢占时隙。改为WIFI_PS_NONE后,Wi-Fi吞吐恢复,BLE抖动收敛到120 ms以内。
常见误区:
- 把
WIFI_EVENT_STA_CONNECTED当作“已联网”,实际上此时还没有IP,必须等IP_EVENT_STA_GOT_IP。 - AP模式不设置信道,默认跟随上次配置,导致与BLE广播信道冲突加剧。
- 忽略
esp_wifi_set_ps()对共存的影响,省电模式会显著改变射频占空比。 - 在事件回调中执行阻塞操作,导致Wi-Fi事件队列堆积,连接超时。
掌握协议族、信道、连接流程和API模型后,才能进一步理解Wi-Fi与BLE为何在同一射频上“抢时间”,以及如何通过软件配置和共存策略让两者稳定并行。