ESP32+4G模组打造随身WiFi:PPP拨号与AP共享全流程实战

ESP32+4G模组打造随身WiFi:PPP拨号与AP共享全流程实战

做随身WiFi项目的工程师都知道,硬件搭起来不难,真正磨人的是PPP拨号链路稳定性和AT指令调试。本文从硬件选型到软件实现,完整记录一次ESP32-S3配合4G Cat.1模组搭建随身WiFi热点的实战过程,踩过的坑全部留档。

一、为什么选ESP32-S3+4G Cat.1方案

市面上随身WiFi方案不少,但ESP32-S3+4G Cat.1模组的组合有几个实际优势。

ESP32-S3单芯片集成WiFi和蓝牙,240MHz双核,自带USB OTG,可以直接用USB连接4G模组走PPP拨号,比传统UART串口方案带宽高3-5倍。4G Cat.1模组(如合宙Air780E、移远EC800K)功耗低、覆盖广、资费便宜,实测下行速率5-10Mbps,完全够热点共享用。

核心架构很清晰:4G模组负责蜂窝网络接入,ESP32-S3通过USB或UART与模组通信,建立PPP链路后拿到IP,再通过WiFi AP功能把网络共享给下游设备。

二、硬件连接与供电设计

硬件部分是整个项目的地基,供电和接口选不对,后面软件再完美也白搭。

2.1 核心器件清单
器件 型号 说明
主控 ESP32-S3-WROOM-1 240MHz双核,8MB PSRAM
4G模组 合宙Air780E Cat.1双模,USB/UART双接口
SIM卡 Nano SIM 移动/联通/电信均可
电源 5V/2A Type-C 需支持2A以上持续输出
2.2 连接方案选择

有两种连接方式,各有取舍。

USB连接(推荐) :ESP32-S3的GPIO19/20配置为USB OTG,直接连Air780E的USB D+/D-。带宽高,延迟低,还能给模组供电。实测PPP吞吐量比UART高4倍。

UART连接 :用GPIO43(TX)/44(RX)连模组串口。好处是简单,但带宽受波特率限制,115200bps下实际吞吐量约11KB/s,跑热点共享会成瓶颈。

供电是关键。4G模组拨号瞬间电流可达2A峰值,如果USB口供电不足会导致模组反复重启。实测用5V/2A电源直供模组VBAT,ESP32-S3单独从Type-C取电,两路独立供电最稳。

三、ESP-IDF环境搭建与项目配置

固件开发用ESP-IDF v5.3,这是目前最稳定的ESP32开发框架。

# 安装ESP-IDF v5.3
mkdir -p ~/esp
cd ~/esp
git clone --recursive https://github.com/espressif/esp-idf.git
cd esp-idf
git checkout v5.3
./install.sh esp32s3
. ./export.sh

# 创建项目
idf.py create-project portable_wifi
cd portable_wifi
idf.py set-target esp32s3

关键配置在menuconfig里,需要开启USB Host和PPP组件。

# 关键menuconfig配置路径
# Component config → USB-Serial-JTAG → 勾选USB-Serial-JTAG Driver
# Component config → LWIP → 勾选Enable PPP support
# Component config → LWIP → PPP → 勾选Enable IPV6 support
# Component config → ESP32S3 → USB → 勾选USB-OTG support

四、PPP拨号核心代码实现

PPP拨号是整个方案的核心。ESP-IDF内置了pppos_client组件,但需要适配Air7780E的AT指令集。

#include "esp_log.h"
#include "esp_netif.h"
#include "esp_netif_ppp.h"
#include "driver/uart.h"
#include "string.h"

static const char *TAG = "PPP_CLIENT";

// Air780E拨号AT指令序列
static const char *at_cmds[] = {
    "AT\r",                    // 测试通信
    "ATE0\r",                  // 关闭回显
    "AT+CGDCONT=1,\"IP\",\"cmnet\"\r",  // 设置APN
    "AT+CGACT=1,1\r",          // 激活PDP
    "AT+CGDATA=1,1\r",         // 进入数据模式
    NULL
};

esp_err_t ppp_dial_up(esp_netif_t *ppp_netif) {
    // 逐条发送AT指令,等待响应
    for (int i = 0; at_cmds[i] != NULL; i++) {
        uart_write_bytes(UART_NUM_2, at_cmds[i], strlen(at_cmds[i]));
        vTaskDelay(pdMS_TO_TICKS(500));
        ESP_LOGI(TAG, "Sent: %s", at_cmds[i]);
    }

    // 启动PPP
    ESP_ERROR_CHECK(esp_netif_ppp_start(ppp_netif));

    // 等待获取IP
    EventBits_t bits = xEventGroupWaitBits(
        s_ppp_event_group,
        PPP_CONNECTED_BIT | PPP_FAILED_BIT,
        pdFALSE, pdTRUE, pdMS_TO_TICKS(30000)
    );

    if (bits & PPP_CONNECTED_BIT) {
        ESP_LOGI(TAG, "PPP connected, got IP");
        return ESP_OK;
    }
    ESP_LOGE(TAG, "PPP dial failed");
    return ESP_FAIL;
}

拨号成功后,ESP32-S3通过PPP拿到了一个运营商分配的内网IP,接下来要把这个网络通过WiFi AP共享出去。

五、WiFi AP与NAT转发配置

拿到PPP链路的IP后,需要开启WiFi AP并配置NAT转发,让连接到ESP32热点的设备能访问外网。

#include "esp_wifi.h"
#include "esp_event.h"
#include "lwip/lwip_napt.h"

void wifi_ap_init(void) {
    // AP配置
    wifi_config_t ap_config = {
        .ap = {
            .ssid = "HuWang_WiFi",
            .ssid_len = strlen("HuWang_WiFi"),
            .password = "12345678",
            .max_connection = 8,
            .authmode = WIFI_AUTH_WPA2_PSK,
        },
    };

    esp_wifi_set_mode(WIFI_MODE_AP);
    esp_wifi_set_config(WIFI_IF_AP, &ap_config);
    esp_wifi_start();

    // 开启NAT转发
    ip_napt_enable(_g_esp_netif_ap->ip_info.net.ip);
}

NAT是关键一步。ESP-IDF的lwIP栈支持ip_napt_enable()函数,开启后AP侧的设备就能通过PPP链路访问外网。但要注意,NAT表大小默认只有128条,连接设备多时需要手动调大CONFIG_LWIP_NAPT_ENTRY_COUNT到512以上。

六、实测数据与踩坑记录

实际跑通后测了一组数据,记录如下。

6.1 性能实测
指标 USB连接方案 UART连接方案
拨号耗时 8-12秒 15-20秒
下行速率 6.8Mbps 1.2Mbps
上行速率 2.1Mbps 0.4Mbps
延迟(均值) 85ms 180ms
最大连接数 8台 3台
连续运行72h掉线 0次 2次

USB方案在各项指标上都碾压UART,如果硬件空间允许,优先选USB。

6.2 典型踩坑记录

坑1:模组反复重启 。排查发现是供电不足,Type-C口只给了5V/1A,拨号瞬间峰值电流超过1A导致电压跌落。换成5V/2A独立供电后解决。

坑2:PPP拿到IP但无法上网 。原因是NAT没开或者APN配错。移动用cmnet,联通用3gnet,电信用ctnet,APN不匹配就是拿不到外网IP。

坑3:WiFi连接设备超过5台后全部断网 。lwIP默认的NAPT表太小,连接数一多就溢出。menuconfig里把CONFIG_LWIP_NAPT_ENTRY_COUNT从128改到512后稳定。

坑4:USB连接偶发识别不到模组 。ESP32-S3的USB OTG需要先发AT+USBCONF给模组切换到USB模式,如果模组固件版本旧不支持,需要先升级模组固件。

七、调试工具推荐

做通信模组开发,AT指令调试是最耗时间的环节。反复敲串口、看响应、记指令,效率很低。

我在项目里直接用了虎王科技开源的串口调试工具(gitee.com/zesso/hardware_tool),支持中兴微、ASR、展锐等多种芯片的串口通信调试。它有Web界面,AT指令模板化管理,批量发送和响应解析都支持,省去了大量翻文档和手敲串口的时间。做随身WiFi或4G模组开发的同学可以拿来直接用。

八、总结与优化方向

ESP32+4G模组做随身WiFi,技术链路已经跑通且稳定。后续优化方向有三个:一是加信号强度监控和自动重拨逻辑,二是支持双SIM卡切换提升可靠性,三是加一个简单的流量统计页面方便用户查看用量。

做随身WiFi开发最磨人的就是AT指令调试和链路稳定性验证,这篇踩过的坑后续还会更新,点个收藏方便随时翻查,关注我不错过后续实测内容。

posted @ 2026-09-26 00:01  虎王科技  阅读(3)  评论(0)    收藏  举报