ESP32 WiFi中继器

1. 项目概述

ESP32 WiFi中继器是一个基于ESP32芯片的网络中继/NAT路由器解决方案,允许ESP32设备同时作为Wi-Fi客户端和接入点,实现网络中继功能。该项目通过ESP-IDF框架实现,具有以下主要特性:

  • 双Wi-Fi接口:同时作为客户端(STA)和接入点(AP)
  • NAT路由:实现网络地址转换,允许多个设备共享单一Internet连接
  • Web配置界面:提供直观的网页配置界面
  • 强制门户:自动跳转到配置页面
  • 配置持久化:使用NVS闪存存储配置信息

2. 系统架构

2.1 代码结构

项目代码结构清晰,主要分为以下几个部分:

  • 主程序模块esp32_nat_router.c,实现主要功能和应用初始化
  • HTTP服务器模块http_server.c,实现Web配置界面和强制门户功能
  • 命令行组件
    • cmd_system:系统命令(如重启、休眠等)
    • cmd_nvs:NVS存储相关命令
    • cmd_router:路由器特有命令(如设置AP、STA等)
  • Web页面:HTML/CSS内嵌在固件中,通过pages.h引入

2.2 功能模块

核心组件:
  1. 双网络接口

    • Station (STA)模式:连接上游Wi-Fi网络
    • Access Point (AP)模式:创建本地Wi-Fi热点
  2. NAT路由器

    • 利用lwIP的NAPT功能实现网络地址转换
    • 支持IPv4地址映射和端口转发
  3. Web配置服务器

    • 基于esp_http_server库实现的嵌入式Web服务器
    • 支持配置参数的表单提交和处理
  4. 配置存储

    • 使用ESP32的NVS(非易失性存储)系统
    • 存储Wi-Fi凭证、网络配置等信息
  5. 强制门户

    • 通过DNS劫持和HTTP重定向实现
    • 自动将新连接的客户端引导至配置页面

3. 关键技术分析

3.1 双Wi-Fi接口实现

ESP32能够同时工作在STA和AP模式,这是实现中继器功能的核心。代码中通过esp_netif_create_default_wifi_ap()esp_netif_create_default_wifi_sta()创建两个网络接口:

wifiAP = esp_netif_create_default_wifi_ap();
wifiSTA = esp_netif_create_default_wifi_sta();

这两个接口分别配置了不同的IP地址和网络参数,允许ESP32同时连接到上游网络并提供自己的Wi-Fi热点。

3.2 NAT实现

NAT功能通过lwIP的NAPT模块实现。在连接到上游Wi-Fi后,代码启用NAT:

ip_napt_enable(my_ap_ip, 1);

这使得连接到AP的设备能够通过ESP32的STA接口访问互联网。端口映射功能也通过该模块实现,允许外部网络访问内部设备的特定服务。

3.3 配置持久化

配置信息通过NVS(Non-volatile Storage)存储,确保重启后配置不丢失:

nvs_set_str(nvs, "ssid", ssid);
nvs_set_str(nvs, "passwd", passwd);
nvs_commit(nvs);

启动时,系统会从NVS中读取这些配置并应用:

get_config_param_str("ssid", &ssid);
get_config_param_str("passwd", &passwd);

3.4 Web界面与强制门户

Web界面通过嵌入式HTTP服务器实现,页面内容直接编码在pages.h中。强制门户功能通过以下机制实现:

  1. DNS服务器捕获所有DNS请求,返回ESP32自身IP
  2. HTTP服务器为所有未知请求提供重定向到配置页面
static void dns_server_task(void *pvParameters)
{
    // 捕获DNS请求并返回自身IP地址
}

static esp_err_t captive_portal_handler(httpd_req_t *req)
{
    // 重定向到配置页面
}

3.5 设备硬件控制

项目利用GPIO控制板载LED指示状态,并监听引导按钮实现恢复出厂设置功能:

void* boot_button_monitor_thread(void* p)
{
    // 监听BOOT按钮长按事件
    // 长按5秒触发恢复出厂设置
}

void* led_status_thread(void* p)
{
    // 根据连接状态控制LED闪烁模式
}

4. 代码中的技术要点

4.1 多线程编程

项目使用FreeRTOS和pthread创建多个线程处理不同任务:

  • 主线程:处理Wi-Fi连接和NAT设置
  • HTTP服务器线程:处理Web请求
  • 按钮监控线程:检测按钮按下状态
  • LED控制线程:根据系统状态控制LED

4.2 事件驱动模型

使用ESP-IDF的事件处理机制管理Wi-Fi事件:

static void wifi_event_handler(void* arg, esp_event_base_t event_base, 
                              int32_t event_id, void* event_data)
{
    // 处理不同的Wi-Fi事件
}

4.3 网络编程

项目涉及多层网络编程技术:

  • Socket编程:实现DNS服务器
  • HTTP协议处理:解析HTTP请求并生成响应
  • TCP/IP协议栈配置:设置IP、网关、子网掩码等
  • NAT与端口映射:配置网络地址转换规则

4.4 嵌入式Web开发

Web界面直接内嵌在固件中,采用轻量级设计:

  • 内联CSS样式
  • 简单的JavaScript函数处理表单提交和页面刷新
  • 响应式布局适应不同设备屏幕

5. 项目特色与创新点

  1. 轻量级实现:在资源有限的ESP32上实现完整的路由器功能
  2. 用户友好配置:通过Web界面简化配置过程
  3. 强制门户自动化:无需额外操作即可进入配置界面
  4. 双重恢复机制:支持通过Web界面和物理按钮两种方式重置

6. 实现难点与解决方案

6.1 双网络接口冲突

难点:ESP32的STA和AP模式共享同一物理射频,可能导致性能问题。
解决方案:优化连接参数和信道选择,最小化干扰。

6.2 内存管理

难点:ESP32的RAM资源有限,需要高效管理内存。
解决方案

  • 使用静态分配减少堆碎片
  • 优化HTTP响应生成逻辑,减少内存占用
  • 合理释放不再使用的资源

6.3 安全性考量

难点:开放的AP接入点可能面临安全风险。
解决方案

  • 实现密码保护机制
  • 隔离内外网络流量
  • 提供配置锁定选项

8. 总结

ESP32 WiFi中继器项目展示了ESP32强大的网络功能,通过精心设计的软件架构,在有限的硬件资源上实现了功能完善的网络中继设备。项目整合了多种嵌入式开发技术,包括双Wi-Fi接口管理、NAT路由、Web服务器、配置持久化等,为IoT设备扩展网络连接提供了一个可靠解决方案。

通过分析该项目的代码实现,我们不仅可以学习ESP32的网络编程技术,还能深入理解路由器和中继器的工作原理,为物联网设备开发提供参考。

代码开源地址:https://github.com/Linyings/esp32_network_repeater.git
演示视频:https://www.bilibili.com/video/BV1iUgUzgEPh/?spm_id_from=333.1387.homepage.video_card.click&vd_source=bf0e65a9d3558aeb979a5b3b2ccab42d

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐