news 2026/3/21 3:18:01

ESP32开发实战入门:连接Wi-Fi并创建热点示例

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
ESP32开发实战入门:连接Wi-Fi并创建热点示例

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。

核心流程四步走:

  1. 初始化TCP/IP栈
  2. 创建一个STA类型的网络接口
  3. 配置SSID和密码
  4. 启动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"); }

实际应用场景模拟:

  1. 设备上电 → 启动AP+STA双模式
  2. STA尝试连接预设Wi-Fi(如失败则持续重试)
  3. 用户手机连上“ESP32_Config”热点
  4. 浏览器打开192.168.10.1,进入配置页
  5. 提交新的Wi-Fi账号密码
  6. 系统保存凭据,并用新信息重连STA
  7. 成功后可选择关闭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网关,不妨现在就动手试试这个双模式方案。遇到问题欢迎留言交流,我们一起解决。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/14 13:17:41

PasteMD跨平台技术演进:从单点工具到生态融合的架构迭代

PasteMD跨平台技术演进&#xff1a;从单点工具到生态融合的架构迭代 【免费下载链接】PasteMD 一键将 Markdown 和网页 AI 对话&#xff08;ChatGPT/DeepSeek等&#xff09;完美粘贴到 Word、WPS 和 Excel 的效率工具 | One-click paste Markdown and AI responses (ChatGPT/De…

作者头像 李华
网站建设 2026/3/18 8:55:28

Qwen3-4B-Instruct优化指南:降低CPU内存占用的技巧

Qwen3-4B-Instruct优化指南&#xff1a;降低CPU内存占用的技巧 1. 背景与挑战&#xff1a;在CPU上高效运行大模型的现实需求 随着大语言模型能力的持续提升&#xff0c;越来越多开发者希望在本地环境部署具备强推理和生成能力的AI系统。Qwen3-4B-Instruct作为阿里云通义千问系…

作者头像 李华
网站建设 2026/3/15 15:12:53

MinerU效果展示:财务报表自动转换案例分享

MinerU效果展示&#xff1a;财务报表自动转换案例分享 1. 引言 1.1 财务文档处理的现实挑战 在金融、审计和企业运营中&#xff0c;财务报表是核心信息载体。然而&#xff0c;大量历史或外部提供的财务数据仍以扫描件、PDF截图或非结构化图像形式存在。传统方式依赖人工录入…

作者头像 李华
网站建设 2026/3/15 10:06:49

OpenCode:3大核心优势揭秘与完整实战指南

OpenCode&#xff1a;3大核心优势揭秘与完整实战指南 【免费下载链接】opencode 一个专为终端打造的开源AI编程助手&#xff0c;模型灵活可选&#xff0c;可远程驱动。 项目地址: https://gitcode.com/GitHub_Trending/openc/opencode 你是否曾在深夜调试代码时&#xf…

作者头像 李华
网站建设 2026/3/20 3:31:48

智能股票预测新纪元:如何用AI工具实现千股并行分析

智能股票预测新纪元&#xff1a;如何用AI工具实现千股并行分析 【免费下载链接】Kronos Kronos: A Foundation Model for the Language of Financial Markets 项目地址: https://gitcode.com/GitHub_Trending/kronos14/Kronos 在当今快速变化的金融市场中&#xff0c;智…

作者头像 李华
网站建设 2026/3/15 7:29:15

HsMod炉石插件完全攻略:从安装到精通的全方位指南

HsMod炉石插件完全攻略&#xff1a;从安装到精通的全方位指南 【免费下载链接】HsMod Hearthstone Modify Based on BepInEx 项目地址: https://gitcode.com/GitHub_Trending/hs/HsMod 想要在炉石传说中拥有更流畅的游戏体验吗&#xff1f;HsMod插件正是你需要的解决方案…

作者头像 李华