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指令调试和链路稳定性验证,这篇踩过的坑后续还会更新,点个收藏方便随时翻查,关注我不错过后续实测内容。

浙公网安备 33010602011771号