专栏:《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_STARTAP 模式启动成功,热点可以被扫描
WIFI_EVENT_AP_STACONNECTED有新 STA 客户端成功接入 AP,携带 MAC 地址
WIFI_EVENT_AP_STADISCONNECTEDSTA 客户端断开 AP 热点,携带 MAC 与断开原因
WIFI_EVENT_AP_STOPAP 模式停止,热点关闭

重点: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
        },
    },
};

参数逐项解析:

  1. ssid / ssid_len 热点名称,ssid_len 显式指定长度,可以支持中文 SSID;不设置 len 会自动以\0截断。
  2. password
  • 密码长度 8‑63 字节;如果 authmode 设置为开放模式WIFI_AUTH_OPEN,密码字段被忽略。

配网产品建议不要开放无密码热点,部分安卓手机会自动切换网络,配网流程被打断。

  1. max_connection 软件最大接入客户端,范围 1‑10,ESP32 硬件上限 10。

✅配网场景:设置为 2~4,配网只需要一台手机,限制数量降低内存开销; ❌不要直接写 10,无关设备接入会消耗内存,增加驱动负担。

  1. channel量产务必固定信道,不要填 0 自动选择信道。 填 0 会动态扫描选择信道,每次开机信道不一样,部分安卓手机扫描、重连行为异常;2.4G 推荐信道 1、6、11 互不重叠。
  2. 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 网页配网完整业务流程:

  1. ESP32 进入配网模式,开启 AP 热点;
  2. 手机 WiFi 设置,连接 ESP32 的 AP 热点;
  3. 手机 DHCP 获取 IP:192.168.4.x;
  4. 浏览器访问 http://192.168.4.1;
  5. ESP32 内置 http server,返回配网 HTML 网页;
  6. 用户在网页填入家里路由器 SSID、密码,POST 提交给 ESP32;
  7. ESP32 收到 SSID 密码,保存 NVS;停止 AP 模式,切换为 STA 模式,连接用户路由器;
  8. 配网成功,设备正常工作。

注意: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 驱动异常、卡死。 正确时序:

  1. 停止 http server;
  2. esp_wifi_stop();
  3. esp_wifi_set_mode(WIFI_MODE_STA);
  4. esp_wifi_start();

❌错误做法:不 stop 直接 set_mode,会出现 WiFi 驱动状态错乱,随机崩溃。

15.6 menuconfig 关键配置

  1. Component config → WiFi → Country code 设置CN;固定信道场景国家码必须正确,否则信道功率非法,部分手机搜不到热点。
  2. Component config → WiFi → WiFi task stack size,网页配网 HTTP 业务会占用任务,AP 出现崩溃可适度调大。
  3. Component config → LWIP:AP 接入多客户端,调大LWIP_MAX_SOCKETS。
  4. 开启esp_http_server组件,如果网页资源使用 SPIFFS,需要开启 SPIFFS 分区。

15.7 AP 模式典型故障现象与根因

故障 1:手机搜索不到 ESP32 AP 热点

  1. 国家码没有配置 CN,信道功率违规;
  2. channel 参数设置的信道不在国家码允许信道列表;
  3. WiFi 没有调用esp_wifi_start();
  4. 硬件天线、射频电路问题。

故障 2:手机连接 AP 热点成功,但打不开 192.168.4.1 网页

  1. 仅仅 802.11 关联成功,DHCP 没有拿到 IP;
  2. 开启 ap_isolate 隔离,注意:隔离不会阻止访问 ESP32 本机 IP;
  3. 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 量产工程落地要点

  1. AP 配网热点信道固定 1/6/11,不要动态信道;国家码 CN 必须配置,射频认证必须项。
  2. max_connection 不要设置 10,配网场景限制 2‑4,降低内存占用。
  3. 配网热点务必开启 ap_isolate 二层隔离,满足安全评审。
  4. AP 切换 STA 必须 stop → set_mode → start 完整时序,不可省略 stop。
  5. 手机接入 AP 拿到 DHCP IP 之后才可以访问网页,不要把WIFI_EVENT_AP_STACONNECTED当作网页就绪条件。
  6. 网页资源建议放到 SPIFFS 分区,不要直接写死大 HTML 字符串在代码,占用 RAM。
  7. 配网超时机制:开启 AP 热点之后,如果长时间没有手机接入配网,设备定时退出配网模式,防止一直停留在 AP 模式。
  8. AP 模式功耗比 STA 模式高,配网成功立刻关闭 AP,不要常驻 AP 热点。

15.9 本章小结

ESP32 AP 模式不只是简单开启热点。本章重点掌握 AP 事件、max_connection 最大接入硬件软件限制、信道配置、DHCP 服务、ap_isolate 二层隔离、AP‑STA 切换时序、网页配网完整业务流程。 配网类产品大量疑难 bug,来自信道不固定、模式切换时序错误、没有限制最大接入客户端数量、没有开启二层隔离。

💖 点赞 + 收藏 + 关注,嵌入式 WiFi 量产实战全套教程持续更新!

 

更多推荐