news 2026/4/3 4:33:30

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/26 14:11:22

AtlasOS终极指南:如何快速优化Windows系统性能与隐私

AtlasOS终极指南&#xff1a;如何快速优化Windows系统性能与隐私 【免费下载链接】Atlas &#x1f680; An open and lightweight modification to Windows, designed to optimize performance, privacy and security. 项目地址: https://gitcode.com/GitHub_Trending/atlas1…

作者头像 李华
网站建设 2026/3/31 5:47:47

通义千问3-14B功能全测评:128k长文本处理能力实测

通义千问3-14B功能全测评&#xff1a;128k长文本处理能力实测 1. 引言&#xff1a;为何选择Qwen3-14B进行长文本评测&#xff1f; 在当前大模型应用场景日益复杂化的背景下&#xff0c;长上下文理解能力已成为衡量模型实用性的关键指标之一。无论是法律合同分析、科研论文综述…

作者头像 李华
网站建设 2026/3/27 13:05:26

树莓派GPIO编程入门必看:控制LED灯的完整指南

点亮第一盏灯&#xff1a;树莓派控制LED的硬核入门实战你有没有过这样的经历&#xff1f;手握一块树莓派&#xff0c;装好了系统、连上了Wi-Fi&#xff0c;却不知道下一步该做什么。打开终端&#xff0c;光标一闪一闪&#xff0c;仿佛在问&#xff1a;“就这&#xff1f;”别急…

作者头像 李华
网站建设 2026/4/1 2:24:09

PDF书签编辑实战:从手动操作到批量处理全攻略

PDF书签编辑实战&#xff1a;从手动操作到批量处理全攻略 【免费下载链接】PDFPatcher PDF补丁丁——PDF工具箱&#xff0c;可以编辑书签、剪裁旋转页面、解除限制、提取或合并文档&#xff0c;探查文档结构&#xff0c;提取图片、转成图片等等 项目地址: https://gitcode.co…

作者头像 李华
网站建设 2026/4/2 3:20:11

Kronos金融大模型终极指南:5大核心优势与实战部署完整解析

Kronos金融大模型终极指南&#xff1a;5大核心优势与实战部署完整解析 【免费下载链接】Kronos Kronos: A Foundation Model for the Language of Financial Markets 项目地址: https://gitcode.com/GitHub_Trending/kronos14/Kronos 在人工智能技术飞速发展的今天&…

作者头像 李华
网站建设 2026/3/8 12:24:13

Windows 7系统终极Python安装指南:告别版本限制的10个简单步骤

Windows 7系统终极Python安装指南&#xff1a;告别版本限制的10个简单步骤 【免费下载链接】PythonWin7 Python 3.9 installers that support Windows 7 SP1 and Windows Server 2008 R2 项目地址: https://gitcode.com/gh_mirrors/py/PythonWin7 还在为Windows 7系统无…

作者头像 李华