ESP32实战入门:手把手教你连接Wi-Fi并创建热点
你有没有遇到过这样的场景?新买的智能灯泡上电后,手机搜不到它的信号,也无法配置家里的Wi-Fi密码。其实,它正悄悄地在发一个叫“ESP32_Config”的热点——这就是我们今天要讲的核心功能。
在物联网开发中,让设备既能连Wi-Fi又能自己当热点,是一项基础但至关重要的能力。而ESP32,正是实现这一目标的“全能选手”。本文不玩概念堆砌,也不照搬手册,而是带你从零开始,一步步写出能用、好用、经得起调试考验的代码。
为什么是ESP32?因为它真的够强
别看ESP32指甲盖大小,它内建了Wi-Fi和蓝牙双模射频,支持2.4GHz频段下的802.11 b/g/n协议,理论速率可达150Mbps。更重要的是,它能在同一时间运行两种网络模式:
- Station(STA)模式:像手机一样去连路由器
- Soft-AP 模式:变身成一个小型热点,让别人来连你
更牛的是,它可以同时开启这两种模式,实现“一边上网一边配网”的神奇操作。这在智能家居、远程传感器等产品中几乎是标配功能。
比如你的温湿度计第一次通电时,根本不知道家里Wi-Fi的账号密码。怎么办?它就自己开个热点,你用手机连上去,告诉它:“我家Wi-Fi叫‘HomeNet’,密码是‘12345678’”,然后它就会自动切换过去联网——整个过程无需烧录、无需拆机。
这就是我们今天要实现的核心逻辑。
先搞明白:Wi-Fi背后的两个关键组件
在写代码之前,得先知道ESP32是怎么管理网络的。官方SDK(ESP-IDF)把这件事拆成了两个层次:
esp_wifi:负责底层Wi-Fi通信,比如扫描、认证、加密握手esp_netif:负责IP地址那一套,比如DHCP获取IP、设置网关
你可以这么理解:
esp_wifi是“无线网卡驱动”esp_netif是“操作系统里的网络接口”
它们配合工作,才能让你既连得上Wi-Fi,又有IP可用。
而且整个系统是事件驱动的。也就是说,你不能写个循环一直问“连上了没?” 而是要注册一个“监听器”,等系统主动告诉你:“嘿,IP拿到了!”
这种设计非阻塞、效率高,但也要求开发者转变思维——别再想着“同步等待”,要学会“回调响应”。
第一步:让ESP32连上家里的Wi-Fi(STA模式)
这是我们最常用的功能。想象一下,设备已经知道Wi-Fi名字和密码,现在只需要成功接入网络并拿到IP。
核心流程四步走:
- 初始化TCP/IP栈
- 创建一个STA类型的网络接口
- 配置SSID和密码
- 启动Wi-Fi,并监听事件
来看完整代码:
#include "esp_wifi.h" #include "esp_event.h" #include "esp_log.h" #include "esp_netif.h" static const char *TAG = "WIFI_STA"; // 事件处理函数 static void wifi_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_STA_START) { ESP_LOGI(TAG, "Wi-Fi client started, trying to connect..."); esp_wifi_connect(); // 开始尝试连接 } else if (event_base == IP_EVENT && event_id == IP_EVENT_STA_GOT_IP) { ip_event_got_ip_t *event = (ip_event_got_ip_t *)event_data; ESP_LOGI(TAG, "Connected! IP: " IPSTR, IP2STR(&event->ip_info.ip)); } } // 初始化并连接Wi-Fi void wifi_init_sta(const char* ssid, const char* password) { // 创建默认STA网络接口(自动启用DHCP客户端) esp_netif_create_default_wifi_sta(); // 初始化Wi-Fi驱动 wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT(); esp_wifi_init(&cfg); // 注册事件处理器 esp_event_handler_register(WIFI_EVENT, WIFI_EVENT_STA_START, &wifi_event_handler, NULL); esp_event_handler_register(IP_EVENT, IP_EVENT_STA_GOT_IP, &wifi_event_handler, NULL); // 设置连接参数 wifi_config_t wifi_config = { .sta = { .ssid = {0}, .password = {0}, .threshold.authmode = WIFI_AUTH_WPA2_PSK, .sae_pwe_h2e = WPA3_SAE_PWE_BOTH, }, }; strncpy((char*)wifi_config.sta.ssid, ssid, 32); strncpy((char*)wifi_config.sta.password, password, 64); // 应用配置 esp_wifi_set_mode(WIFI_MODE_STA); esp_wifi_set_config(WIFI_IF_STA, &wifi_config); esp_wifi_start(); ESP_LOGI(TAG, "STA initialization complete"); }关键点解读:
esp_netif_create_default_wifi_sta()这一行很重要,它不仅创建了网络接口,还自动帮你启用了DHCP客户端,省去了手动配置IP的麻烦。- 我们只监听了两个事件:开始启动和拿到IP。前者触发连接动作,后者确认成功。
- 使用
WIFI_AUTH_WPA2_PSK是目前家庭路由器最常见的安全方式,兼容性最好。 - 日志输出用了
ESP_LOGI,编译时可以统一控制级别,方便调试。
如果你发现连不上,优先检查:
- SSID或密码是否正确(注意大小写)
- 路由器是否隐藏了SSID
- 信号强度是否太弱(RSSI < -90dBm容易失败)
第二步:让ESP32变成一个热点(AP模式)
有时候你不只是想联网,还想让人连你。比如做配网引导、本地Web服务器、调试工具等。
这时候就要开启AP模式。
AP模式的关键行为:
- 广播自己的SSID
- 内置DHCP服务器给客户端分配IP
- 默认IP为
192.168.4.1,客户端通常是192.168.4.x
代码如下:
void wifi_init_ap(const char* ssid, const char* password) { // 创建AP网络接口(自带DHCP服务) esp_netif_create_default_wifi_ap(); // 初始化Wi-Fi wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT(); esp_wifi_init(&cfg); // 配置AP参数 wifi_config_t wifi_config = { .ap = { .ssid = {0}, .ssid_len = 0, // 自动计算长度 .channel = 6, // 建议固定信道避免干扰 .password = {0}, .max_connection = 4, // 最多支持4台设备 .authmode = WIFI_AUTH_WPA_WPA2_PSK // 推荐使用加密 }, }; strncpy((char*)wifi_config.ap.ssid, ssid, 32); if (password && strlen(password) >= 8) { strncpy((char*)wifi_config.ap.password, password, 64); } else { wifi_config.ap.authmode = WIFI_AUTH_OPEN; // 密码为空则开放 ESP_LOGW("WIFI_AP", "Open network! No password set."); } // 启动AP esp_wifi_set_mode(WIFI_MODE_AP); esp_wifi_set_config(WIFI_IF_AP, &wifi_config); esp_wifi_start(); ESP_LOGI("WIFI_AP", "Hotspot active | SSID: %s | Channel: %d", ssid, wifi_config.ap.channel); }注意事项:
- 密码至少8位,否则会触发警告甚至无法启动WPA加密
- 信道建议固定为6或11,避免与其他Wi-Fi冲突
- 最大连接数默认是4,可以根据需要调整(最多10)
- 不要长期开放无密码热点,存在被滥用风险
如果你打算做一个配置页面,后续接上HTTP服务器,用户连上来后访问http://192.168.4.1就能看到网页了。
终极技能:双模式共存(AP+STA),打造智能配网流程
这才是真正的实战场景——设备一开机,既连自家Wi-Fi,又开热点供配置。
听起来很复杂?其实只要改一个地方:模式设为WIFI_MODE_APSTA。
完整初始化示例:
void wifi_init_apsta(void) { // 分别创建STA和AP的网络接口 esp_netif_create_default_wifi_sta(); esp_netif_t *ap_netif = esp_netif_create_default_wifi_ap(); // 可选:自定义AP的IP地址(如改为192.168.10.1) esp_netif_ip_info_t ap_ip; memset(&ap_ip, 0, sizeof(ap_ip)); ap_ip.ip.addr = ipaddr_addr("192.168.10.1"); ap_ip.gw.addr = ap_ip.ip.addr; ap_ip.netmask.addr = ipaddr_addr("255.255.255.0"); esp_netif_dhcps_stop(ap_netif); // 先停止DHCP服务 esp_netif_set_ip_info(ap_netif, &ap_ip); // 设置静态IP esp_netif_dhcps_start(ap_netif); // 重新启动DHCP // 初始化Wi-Fi wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT(); esp_wifi_init(&cfg); // 配置STA(你要连的Wi-Fi) wifi_config_t sta_config = { .sta = { .ssid = "Your_Home_Net", .password = "your_password", .threshold.authmode = WIFI_AUTH_WPA2_PSK, }, }; // 配置AP(你对外广播的热点) wifi_config_t ap_config = { .ap = { .ssid = "ESP32_Config", .ssid_len = 12, .channel = 1, .password = "config1234", .max_connection = 2, .authmode = WIFI_AUTH_WPA_WPA2_PSK, }, }; // 应用配置 esp_wifi_set_mode(WIFI_MODE_APSTA); esp_wifi_set_config(WIFI_IF_STA, &sta_config); esp_wifi_set_config(WIFI_IF_AP, &ap_config); esp_wifi_start(); ESP_LOGI("WIFI", "AP+STA mode started"); }实际应用场景模拟:
- 设备上电 → 启动AP+STA双模式
- STA尝试连接预设Wi-Fi(如失败则持续重试)
- 用户手机连上“ESP32_Config”热点
- 浏览器打开
192.168.10.1,进入配置页 - 提交新的Wi-Fi账号密码
- 系统保存凭据,并用新信息重连STA
- 成功后可选择关闭AP以节省资源
这样一套流程下来,设备就能真正实现“即插即用 + 用户自定义”。
常见坑点与调试秘籍
别以为写了代码就万事大吉,实际开发中最头疼的永远是那些“理论上应该行”的问题。
🛑 坑点1:AP和STA用同一个netif?
❌ 错误做法:
esp_netif_create_default_wifi_sta(); esp_netif_create_default_wifi_sta(); // 想当然复制粘贴✅ 正确做法:必须分别调用
_sta和_ap的创建函数。
🛑 坑点2:忘记注册事件导致“连上了也不知道”
很多初学者只启动Wi-Fi,却不注册事件回调,结果程序看似运行正常,但根本不知道是否获取到了IP。
记住:没有事件监听 = 失去网络状态感知能力
🛑 坑点3:内存不足导致双模式崩溃
AP+STA共存会占用更多内存,尤其在启用HTTPS、MQTT等服务时容易OOM(Out of Memory)。建议:
- 使用PSRAM版本模块(如ESP32-WROVER)
- 控制并发任务数量
- 关闭不必要的日志输出
🛑 坑点4:信道冲突导致连接不稳定
如果AP设置为信道6,而你家Wi-Fi也在用信道6,两个信号互相干扰,会导致性能下降。建议:
- AP固定使用信道1或11
- 或动态选择最少使用的信道(需扫描)
总结:掌握这些,你就迈过了IoT开发的第一道门槛
今天我们从零实现了三个核心能力:
- 让ESP32作为客户端连接Wi-Fi
- 让ESP32作为热点供他人连接
- 双模式共存,构建完整的配网引导流程
这些不是玩具代码,而是你在开发任何一款联网设备时都会用到的基础设施。掌握了它们,你就具备了:
- 快速搭建原型的能力
- 独立完成设备入网逻辑的设计能力
- 调试常见Wi-Fi问题的基本功
下一步你可以继续拓展:
- 在AP模式下集成轻量级HTTP服务器(esp_http_server)
- 通过网页提交Wi-Fi凭证并保存到NVS(非易失存储)
- 添加超时机制:若30秒未配置则自动重启配网
- 结合蓝牙辅助发现(BLE广播SSID)
技术的世界没有捷径,但每一步扎实的实践都会让你离“做出真正产品”更近一点。
如果你正在做一个智能插座、环境监测仪或者DIY网关,不妨现在就动手试试这个双模式方案。遇到问题欢迎留言交流,我们一起解决。