APSTA 模式打开中继功能
ESP32 WiFi 中继(AP+STA + NAPT)配置经验
1. 背景
AP+STA 模式 ≠ 中继模式
ESP32 的 WIFI_MODE_APSTA 只是同时开启了 AP 和 STA 两个接口,但它们之间默认是隔离的,不会自动转发数据。
| 接口 | 网络 | 说明 |
|---|---|---|
| ESP32 STA | 连接路由器(如 192.168.1.x) | ✅ 能上网 |
| ESP32 AP | 自建局域网(如 192.168.4.x) | ❌ 电脑能连上但无法上网 |
根本原因: 缺少 IP 转发 和 NAPT(网络地址端口转换)。
2. 配置步骤
2.1 开启 menuconfig 选项
idf.py menuconfig
进入路径:
Component config → LWIP → Enable IP forwarding ✅ 必须开启
Component config → LWIP → Enable NAT/NAPT ✅ 必须开启
或者在 sdkconfig 中直接修改:
CONFIG_LWIP_IP_FORWARD=y
CONFIG_LWIP_IPV4_NAPT=y
3. 代码实现
3.1 包含头文件
#include "lwip/netif.h"
#include "lwip/lwip_napt.h"
3.2 在 STA 获取到 IP 后启用 NAPT
在 IP_EVENT_STA_GOT_IP 事件回调中,获取 AP 的 netif 并启用 NAPT:
case WLSEVT_WIFI_GOT_IP: {
esp_netif_t *ap_netif = esp_netif_get_handle_from_ifkey("WIFI_AP_DEF");
if (ap_netif) {
esp_netif_ip_info_t ip_info;
esp_netif_get_ip_info(ap_netif, &ip_info);
ip_napt_enable(ip_info.ip.addr, 1);
ESP_LOGI("repeater", "NAPT enabled on AP interface");
}
break;
}
注意: ip_napt_enable() 第一个参数是 u32_t(uint32_t),直接传 ip_info.ip.addr 即可,不要用 ip_2_ip4() 取指针。
3.3 完整事件回调示例
参考 product.c 的实际代码:
static void event_handler(void *arg, esp_event_base_t event_base,
int32_t event_id, void *event_data)
{
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, "got ip:" IPSTR, IP2STR(&event->ip_info.ip));
// 开启 NAPT 中继
esp_netif_t *ap_netif = esp_netif_get_handle_from_ifkey("WIFI_AP_DEF");
if (ap_netif) {
esp_netif_ip_info_t ip_info;
esp_netif_get_ip_info(ap_netif, &ip_info);
ip_napt_enable(ip_info.ip.addr, 1);
}
wls_event_post(WLSEVT_WIFI_GOT_IP, NULL, 0, 0);
}
}
4. 验证方法
- 电脑连接 ESP32 的 AP
- 电脑获取到 IP(如
192.168.4.x) - 电脑 ping
8.8.8.8或访问网页,应该能通 - 也可以检查 ESP32 日志:
I (12345) wls_apsta: got ip:192.168.1.105
I (12345) repeater: NAPT enabled on AP interface
5. 常见问题
Q1: 电脑能连上 AP 但获取不到 IP?
检查 AP 的 DHCP 服务是否开启:
esp_netif_dhcps_start(ap_netif);
Q2: 电脑获取到 IP 了但无法上网?
- 确认
CONFIG_LWIP_IP_FORWARD=y和CONFIG_LWIP_IPV4_NAPT=y都已开启 - 确认
ip_napt_enable()在 STA 获取到 IP 之后才调用 - 检查 ESP32 的 STA 本身是否能上网(ping 测试)
Q3: NAPT 性能如何?
ESP32 的 NAPT 吞吐量有限,实测大约 5~10 Mbps,适合 IoT 场景,不适合大流量传输。
6. 参考
License:
CC BY 4.0