avatar

松果工作室

欢迎光临

  • 首页
  • ESP
  • LVGL
  • freeRTOS
  • 个人收藏
  • 笔记
  • 瞬间
Home APSTA 模式打开中继功能
文章

APSTA 模式打开中继功能

Posted 昨天 Updated 昨天
By YCP
8~11 min read

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. 验证方法

  1. 电脑连接 ESP32 的 AP
  2. 电脑获取到 IP(如 192.168.4.x)
  3. 电脑 ping 8.8.8.8 或访问网页,应该能通
  4. 也可以检查 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. 参考

  • ESP-IDF WiFi 桥接示例
  • ESP-IDF LWIP NAPT 配置
License:  CC BY 4.0
Share

Further Reading

OLDER

NEWER

HTTPS Server 加速

Recently Updated

  • APSTA 模式打开中继功能
  • HTTPS Server 加速
  • 煮酒论英雄
  • nimble
  • ESP32c3 内存占用测试报告

Trending Tags

LVGL WCH Linux Elec ThatProject freeRTOS STM ESP Flutter Others

Contents

©2026 松果工作室. Some rights reserved.

Using the Halo theme Chirpy