《WiFi 嵌入式物联网开发全套实战》| 第 15 章 ESP32 AP 模式:自建热点、网页配网、最大接入设备配置
专栏:《WiFi 嵌入式物联网开发全套实战》 专栏定位:嵌入式 Linux/ESP32 WiFi 从原理→驱动→配网→协议→稳定性→抓包调试→量产优化全套工业实战 适配:物联网设备、智能家居、工控网关、无线透传设备、4G+WiFi 双模设备 💖 点赞 + 收藏 + 关注,嵌入式 WiFi 量产实战全套教程持续更新!
本章前言
ESP32 的 AP(Access Point)热点模式是设备配网最核心的方案。设备出厂没有路由器账号密码时,ESP32 开启 AP 热点,手机连接该热点,访问内置 Web 网页,把家里路由器的 SSID、密码提交给设备,完成配网。
很多开发者直接复制官方简单 AP Demo,只实现热点能够被搜索;进入量产就遇到各类问题:最大接入客户端数量限制、多手机接入内存暴涨、客户端之间二层互通带来安全隐患、DHCP 地址池配置错误、网页配网 TCP 连接卡顿、AP 模式下 WiFi 驱动报错、配网完成后切换 STA 模式出现卡死、热点信道乱跳射频不合规。
本章基于 ESP‑IDF 5.x,讲解 ESP32 AP 底层原理、WiFi AP 参数详解、最大连接数配置、DHCP 服务配置、客户端事件监控、二层隔离、内置 HTTP 网页配网最小完整可编译源码,同时讲解现象、坑点、量产落地注意事项。
前置条件:已掌握第 14 章 STA 事件回调机制,menuconfig 中 WiFi 国家码设置为
CN,开启 NVS 分区。
15.1 ESP32‑AP 底层原理
ESP32 AP 模式,芯片内部 WiFi 硬件射频发送 Beacon 信标帧,对外广播 SSID,接收手机 / STA 设备的探测、认证、关联请求,完成 802.11 链路接入。 同时 ESP‑IDF 内置 DHCP Server 服务,接入的手机从 ESP32 获取 IP 地址。
AP 模式关键系统事件
| 事件枚举 | 说明 |
|---|---|
| WIFI_EVENT_AP_START | AP 模式启动成功,热点可以被扫描 |
| WIFI_EVENT_AP_STACONNECTED | 有新 STA 客户端成功接入 AP,携带 MAC 地址 |
| WIFI_EVENT_AP_STADISCONNECTED | STA 客户端断开 AP 热点,携带 MAC 与断开原因 |
| WIFI_EVENT_AP_STOP | AP 模式停止,热点关闭 |
重点:
WIFI_EVENT_AP_STACONNECTED代表 802.11 关联完成,不等于 DHCP 获取 IP 完成;手机关联成功后,还需要 DHCP 分配 IP 才能访问网页服务。
AP 模式硬件限制
ESP32 硬件层面,AP 模式硬件最大支持 10 个 STA 客户端同时接入,软件配置不能突破硬件上限。 配网场景一般只需要 1 台手机接入,不需要开到最大值;接入的每一台 STA,WiFi 驱动会占用内存,接入越多内存消耗越大。
15.2 AP 模式核心配置参数详解
wifi_config_t 中 ap 结构体全部关键参数,对应量产项目:
wifi_config_t ap_cfg = {
.ap = {
.ssid = "ESP32‑WEB‑CONFIG",
.ssid_len = sizeof("ESP32‑WEB‑CONFIG") - 1,
.password = "12345678",
.max_connection = 4, // 最大接入客户端数量
.channel = 6, // 固定信道,量产不要填0自动跳信道
.authmode = WIFI_AUTH_WPA2_PSK,
.pmf_cfg = {
.capable = true,
.required = false
},
},
};
参数逐项解析:
- ssid / ssid_len 热点名称,ssid_len 显式指定长度,可以支持中文 SSID;不设置 len 会自动以
\0截断。 - password
- 密码长度 8‑63 字节;如果 authmode 设置为开放模式
WIFI_AUTH_OPEN,密码字段被忽略。
配网产品建议不要开放无密码热点,部分安卓手机会自动切换网络,配网流程被打断。
- max_connection 软件最大接入客户端,范围 1‑10,ESP32 硬件上限 10。
✅配网场景:设置为 2~4,配网只需要一台手机,限制数量降低内存开销; ❌不要直接写 10,无关设备接入会消耗内存,增加驱动负担。
- channel量产务必固定信道,不要填 0 自动选择信道。 填 0 会动态扫描选择信道,每次开机信道不一样,部分安卓手机扫描、重连行为异常;2.4G 推荐信道 1、6、11 互不重叠。
- authmode 加密模式
WIFI_AUTH_WPA2_PSK量产首选;不要使用 WEP,已经被废弃;开放模式适合调试。
DHCP‑Server 配置
ESP32 AP 模式默认开启 DHCP Server,给接入手机分配 IP。 默认网段:192.168.4.0/24,ESP32 本机 AP IP:192.168.4.1。 可以修改 AP 本机 IP 与 DHCP 地址池:
esp_netif_ip_info_t ap_ip_info;
memset(&ap_ip_info,0,sizeof(ap_ip_info));
IP4_ADDR(&ap_ip_info.ip, 192,168,4,1);
IP4_ADDR(&ap_ip_info.gw, 192,168,4,1);
IP4_ADDR(&ap_ip_info.netmask, 255,255,255,0);
esp_netif_t *ap_netif = esp_netif_get_handle_from_ifkey("WIFI_AP_DEF");
// 设置AP本机IP
ESP_ERROR_CHECK(esp_netif_set_ip_info(ap_netif, &ap_ip_info));
// 关闭、重启DHCP server使配置生效
esp_netif_dhcps_stop(ap_netif);
esp_netif_dhcps_start(ap_netif);
AP 客户端二层隔离(量产安全必看)
和 Linux hostapd 的ap_isolate功能对应。ESP32 AP 模式下,开启二层隔离后,各个接入手机之间数据包互相隔离,不能互相通信,手机仅可以访问 ESP32 本机 192.168.4.1。 API:
// true:开启客户端隔离;false:关闭隔离
esp_wifi_set_ap_isolate(true);
配网场景必须开启隔离,安全评审要求;只有做无线网关、需要设备之间互访业务才关闭隔离。
15.3 AP 模式基础完整代码(含客户端接入事件)
app_main.c,IDF5.x 可直接编译,实现开启 AP,监控客户端上下线事件
#include <stdio.h>
#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"
static const char *TAG = "ESP32_AP";
static void wifi_ap_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_AP_START)
{
ESP_LOGI(TAG, "AP模式启动成功,热点已经广播");
}
else if(event_base == WIFI_EVENT && event_id == WIFI_EVENT_AP_STACONNECTED)
{
wifi_event_ap_staconnected_t *evt = (wifi_event_ap_staconnected_t *)event_data;
ESP_LOGI(TAG, "客户端接入 AP MAC:"MACSTR", aid:%d", MAC2STR(evt->mac), evt->aid);
}
else if(event_base == WIFI_EVENT && event_id == WIFI_EVENT_AP_STADISCONNECTED)
{
wifi_event_ap_stadisconnected_t *evt = (wifi_event_ap_stadisconnected_t *)event_data;
ESP_LOGW(TAG, "客户端断开 AP MAC:"MACSTR", reason:%d", MAC2STR(evt->mac), evt->reason);
}
else if(event_base == WIFI_EVENT && event_id == WIFI_EVENT_AP_STOP)
{
ESP_LOGI(TAG, "AP模式已经停止");
}
}
void wifi_ap_init(void)
{
ESP_ERROR_CHECK(esp_netif_init());
ESP_ERROR_CHECK(esp_event_loop_create_default());
esp_netif_create_default_wifi_ap();
wifi_init_config_t wifi_init_cfg = WIFI_INIT_CONFIG_DEFAULT();
ESP_ERROR_CHECK(esp_wifi_init(&wifi_init_cfg));
// 注册AP事件回调
esp_event_handler_instance_t ap_event_handle;
ESP_ERROR_CHECK(esp_event_handler_instance_register(WIFI_EVENT,
ESP_EVENT_ANY_ID,
wifi_ap_event_handler,
NULL,
&ap_event_handle));
wifi_config_t ap_config = {
.ap = {
.ssid = "ESP32‑WEB‑CONFIG",
.ssid_len = sizeof("ESP32‑WEB‑CONFIG")-1,
.password = "12345678",
.max_connection = 4,
.channel = 6,
.authmode = WIFI_AUTH_WPA2_PSK,
.pmf_cfg = {.capable = true, .required = false},
},
};
ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_AP));
ESP_ERROR_CHECK(esp_wifi_set_config(WIFI_IF_AP, &ap_config));
// 开启AP客户端二层隔离,配网产品必开
ESP_ERROR_CHECK(esp_wifi_set_ap_isolate(true));
ESP_ERROR_CHECK(esp_wifi_start());
ESP_LOGI(TAG, "AP初始化完成,本机IP默认:192.168.4.1");
}
void app_main(void)
{
esp_err_t ret = nvs_flash_init();
if(ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND)
{
ESP_ERROR_CHECK(nvs_flash_erase());
ret = nvs_flash_init();
}
ESP_ERROR_CHECK(ret);
ESP_LOGI(TAG,"ESP32 AP Demo start");
wifi_ap_init();
while(1)
{
vTaskDelay(pdMS_TO_TICKS(1000));
}
}
15.4 AP 模式网页配网原理简述
AP 网页配网完整业务流程:
- ESP32 进入配网模式,开启 AP 热点;
- 手机 WiFi 设置,连接 ESP32 的 AP 热点;
- 手机 DHCP 获取 IP:
192.168.4.x; - 浏览器访问
http://192.168.4.1; - ESP32 内置 http server,返回配网 HTML 网页;
- 用户在网页填入家里路由器 SSID、密码,POST 提交给 ESP32;
- ESP32 收到 SSID 密码,保存 NVS;停止 AP 模式,切换为 STA 模式,连接用户路由器;
- 配网成功,设备正常工作。
注意:AP 网页配网依赖 esp_http_server 组件,CMakeLists.txt 需要添加依赖
PRIV_REQUIRES esp_http_server。
最小 HTTP 服务框架示例(仅展示核心,完整 HTML 可放到 partition spiffs)
#include "esp_http_server.h"
/* 网页表单提交回调,接收SSID与密码 */
esp_err_t post_wifi_config_handler(httpd_req_t *req)
{
char buf[256] = {0};
int ret = httpd_req_recv(req, buf, sizeof(buf)-1);
if(ret <=0){
return ESP_FAIL;
}
ESP_LOGI(TAG,"收到配网提交数据:%s",buf);
// 解析表单参数 ssid=xxx&password=xxx
// 解析完成保存NVS,之后调用 esp_wifi_stop(),切换WIFI_MODE_STA
const char *resp = "config ok, device will restart connect router";
httpd_resp_send(req, resp, HTTPD_RESP_USE_STRLEN);
return ESP_OK;
}
httpd_handle_t start_web_server(void)
{
httpd_config_t config = HTTPD_DEFAULT_CONFIG();
httpd_handle_t server = NULL;
if(httpd_start(&server, &config) == ESP_OK)
{
httpd_uri_t post_cfg_uri = {
.uri = "/config",
.method = HTTP_POST,
.handler = post_wifi_config_handler,
.user_ctx = NULL
};
httpd_register_uri_handler(server, &post_cfg_uri);
}
return server;
}
15.5 AP 模式切换 STA 模式的时序(量产高频坑)
配网完成之后,需要关闭 AP,切换到 STA 模式,时序错误直接导致 WiFi 驱动异常、卡死。 正确时序:
- 停止 http server;
esp_wifi_stop();esp_wifi_set_mode(WIFI_MODE_STA);esp_wifi_start();
❌错误做法:不 stop 直接 set_mode,会出现 WiFi 驱动状态错乱,随机崩溃。
15.6 menuconfig 关键配置
Component config → WiFi → Country code设置CN;固定信道场景国家码必须正确,否则信道功率非法,部分手机搜不到热点。Component config → WiFi → WiFi task stack size,网页配网 HTTP 业务会占用任务,AP 出现崩溃可适度调大。Component config → LWIP:AP 接入多客户端,调大LWIP_MAX_SOCKETS。- 开启
esp_http_server组件,如果网页资源使用 SPIFFS,需要开启 SPIFFS 分区。
15.7 AP 模式典型故障现象与根因
故障 1:手机搜索不到 ESP32 AP 热点
- 国家码没有配置 CN,信道功率违规;
- channel 参数设置的信道不在国家码允许信道列表;
- WiFi 没有调用
esp_wifi_start(); - 硬件天线、射频电路问题。
故障 2:手机连接 AP 热点成功,但打不开 192.168.4.1 网页
- 仅仅 802.11 关联成功,DHCP 没有拿到 IP;
- 开启 ap_isolate 隔离,注意:隔离不会阻止访问 ESP32 本机 IP;
- http 服务没有正常启动;防火墙、手机私有 DNS 篡改。
故障 3:多个手机接入 AP,内存持续上涨,设备不稳定
max_connection 配置过大,每接入一台 STA 驱动占用内存;配网场景限制 max_connection=2~4。
故障 4:配网完成切换 STA 模式随机崩溃
没有执行esp_wifi_stop()直接 set_mode 切换模式,WiFi 状态机混乱,严格遵守 stop‑set‑start 时序。
故障 5:AP 模式信道每次开机不一样
channel 配置为 0 自动信道选择;量产配网设备固定 channel=6 或者 1。
故障 6:手机连上 AP 之后,自动跳回自己家里路由器
安卓 /ios 系统检测 AP 热点无互联网访问,会主动断开热点;网页配网业务要提示用户关闭 “自动切换网络”。
15.8 量产工程落地要点
- AP 配网热点信道固定 1/6/11,不要动态信道;国家码 CN 必须配置,射频认证必须项。
- max_connection 不要设置 10,配网场景限制 2‑4,降低内存占用。
- 配网热点务必开启 ap_isolate 二层隔离,满足安全评审。
- AP 切换 STA 必须 stop → set_mode → start 完整时序,不可省略 stop。
- 手机接入 AP 拿到 DHCP IP 之后才可以访问网页,不要把
WIFI_EVENT_AP_STACONNECTED当作网页就绪条件。 - 网页资源建议放到 SPIFFS 分区,不要直接写死大 HTML 字符串在代码,占用 RAM。
- 配网超时机制:开启 AP 热点之后,如果长时间没有手机接入配网,设备定时退出配网模式,防止一直停留在 AP 模式。
- AP 模式功耗比 STA 模式高,配网成功立刻关闭 AP,不要常驻 AP 热点。
15.9 本章小结
ESP32 AP 模式不只是简单开启热点。本章重点掌握 AP 事件、max_connection 最大接入硬件软件限制、信道配置、DHCP 服务、ap_isolate 二层隔离、AP‑STA 切换时序、网页配网完整业务流程。 配网类产品大量疑难 bug,来自信道不固定、模式切换时序错误、没有限制最大接入客户端数量、没有开启二层隔离。
💖 点赞 + 收藏 + 关注,嵌入式 WiFi 量产实战全套教程持续更新!
更多推荐

所有评论(0)