在工业物联网场景中,设备往往部署在没有 WiFi 覆盖的偏远地区,4G 蜂窝网络成为最可靠的通信选择。

ESP32 通过串口连接 4G 模块(如 A7670、SIM7600、Air780E 等),使用 PPP 协议栈实现拨号上网,是一种成熟且广泛应用的方案


目录

一、什么是 PPP 拨号?

二、ESP-IDF 中的 PPP 实现:esp_modem 组件

2.1 esp_modem 的三大核心组件

2.2 工作模式

2.3 支持的模块

2.4 官方示例

三、连接方式:UART vs USB

3.1 UART 串口连接

3.2 USB 连接

四、关键配置参数

4.1 APN 配置

4.2 PPP 协商超时

4.3 TCP 窗口调优

五、典型问题与踩坑记录

5.1 VCCMCU——串口不工作的隐藏原因

5.2 供电不足导致模块反复重启

5.3 VJ 压缩干扰

5.4 TCP_MSS 过大

5.5 PPP 栈 netif IP 被覆盖

5.6 进入数据模式后无法发送 AT 命令

5.7 DTR 引脚悬空导致 LCP 超时

5.8 大文件下载速度慢

六、AT 指令调试检查清单

七、总结


一、什么是 PPP 拨号?

PPP(Point-to-Point Protocol,点对点协议)是一种数据链路层协议,设计用于在两个对等单元之间传输数据包。在 ESP32 + 4G 模块的场景中,PPP 充当“翻译官”的角色:

  • 4G 模块:通过串口收发数据流,本身不运行 TCP/IP 协议栈

  • ESP32:运行完整的 LwIP TCP/IP 协议栈,但需要通过串口与模块通信

  • PPP 协议:在串口上建立一条虚拟的 IP 链路,让 ESP32 的 LwIP 栈“认为”自己在操作一个标准的网络接口

通过 PPP,ESP32 内部会创建一个虚拟网卡(PPP netif),上层应用(socket、HTTP、MQTT)完全感知不到底层是 4G 连接,就像使用 WiFi 一样简单。PPP 拨号的过程分为三个阶段:链路建立阶段(LCP 协商)、认证阶段(PAP/CHAP,可选)、网络层协议配置阶段(IPCP 获取 IP 地址)。

二、ESP-IDF 中的 PPP 实现:esp_modem 组件

在 ESP-IDF 中,PPP 拨号的核心组件是 esp_modem。这是一个托管组件,用于与支持 AT 命令和 PPP 协议的 GSM/LTE 模块通信。它没有预装在 ESP-IDF 框架里,需要通过 IDF Component Registry 添加:

idf.py add-dependency "espressif/esp_modem^2.0.2"

2.1 esp_modem 的三大核心组件

根据官方文档,esp_modem 由三个核心部件组成:

组件 作用
DTE(Data Terminal Equipment) 抽象物理接口(UART/USB),负责数据收发
DCE(Data Communication Equipment) 模块的逻辑抽象,包含命令库和模式切换
PPP Netif 网络接口,连接 LwIP 协议栈

2.2 工作模式

esp_modem 支持多种工作模式:

  • 命令模式(Command Mode):发送 AT 指令,查询状态、配置参数

  • 数据模式(Data/PPP Mode):PPP 数据传输,建立网络连接

  • CMUX 模式:创建两个虚拟通道,一个用于 AT 命令,一个用于数据通信

  • DUAL 模式:使用两个物理通道(通常用于 USB 接口的模块)

2.3 支持的模块

esp_modem 官方支持 SIM800、BG96、SIM7600 等模块。A7670 与 SIM7600 系列 AT 指令高度兼容,可以使用 ESP_MODEM_DCE_SIM7600 类型。

2.4 官方示例

esp_modem 提供了几个核心示例:

  • pppos_client:最基础的 PPPoS 客户端,展示如何切换到数据模式并连接 MQTT Broker

  • modem_console:控制台示例,可手动发送 AT 命令和切换 PPP 模式

  • ap_to_pppos:将 PPP 连接共享为 WiFi AP(带 NAT 转发)

三、连接方式:UART vs USB

ESP32 与 4G 模块的连接主要有两种方式:

3.1 UART 串口连接

最传统的方式,通过 TX/RX 引脚通信。适用于所有 ESP32 系列芯片。

典型接线

ESP32 GPIO17 (TXD) → A7670 RXD
ESP32 GPIO18 (RXD) ← A7670 TXD
GND → GND

3.2 USB 连接

对于带 USB OTG 的芯片(ESP32-S2、ESP32-S3、ESP32-P4),可以通过 USB 连接 4G 模块。USB 方式支持热插拔和更高的数据吞吐量
ESP32-S3 USB 引脚:

GPIO 20 (D-) → 4G 模块 USB DM
GPIO 19 (D+) → 4G 模块 USB DP

四、关键配置参数

4.1 APN 配置

APN(接入点名称)由运营商提供,不同运营商有不同的 APN:

运营商 APN
中国移动 cmnet
中国联通 3gnet / uninet
中国电信 ctnet
物联网专网 由卡商提供(如 gdzhmcjqr4g01s.gdm2m

APN 设置错误会导致能附着网络但无法获取 IP 地址。

4.2 PPP 协商超时

在信号较差的区域,可以适当增加 PPP 协商的超时时间,避免因网络延迟导致协商失败。这需要在 LwIP 配置中调整相关参数。

4.3 TCP 窗口调优

在 4G PPP 链路上,默认的 TCP 窗口大小(TCP_WND)可能导致下载速度缓慢。将 CONFIG_LWIP_TCP_WND_DEFAULT 调整为 2760 能显著改善 HTTP 下载性能。实测下载速度可提升至 4.2 Mbps(下行)。

五、典型问题与踩坑记录

5.1 VCCMCU——串口不工作的隐藏原因

A7670 的 UART 串口需要一个独立的电平参考电压引脚 VCCMCU(或 VDD_IO)。如果 VCCMCU 未接或电压与主控 IO 电平不匹配,模块不会响应任何 AT 指令。

  • VCCMCU 必须与主控 MCU 的 IO 电平一致(ESP32-S3 为 3.3V)

  • VCCMCU 不是供电引脚,仅作电平参考,电流很小

5.2 供电不足导致模块反复重启

A7670 模块在 4G 网络下瞬时峰值电流可达 2A。如果使用开发板的 3.3V/5V 引脚供电(通常只能提供 500mA-1A),会导致模块反复重启或无法注册网络。必须使用独立的外部 5V/2A 电源为模块的 VCC 供电,且电源 GND 必须与模块 GND 和主控 GND 三点共地。

5.3 VJ 压缩干扰

LwIP PPP 默认启用 VJ 头压缩(Van Jacobson Compression),但某些 4G 运营商基站可能不支持或错误处理 VJ 压缩包,导致大包被丢弃。解决方案是在 sdkconfig.defaults.4g 中关闭 VJ 压缩:

CONFIG_LWIP_PPP_VJ_HEADER_COMPRESSION=n

5.4 TCP_MSS 过大

ESP-IDF 默认 TCP_MSS 为 1440,但 4G PPP 链路的实际 MTU 可能只有 576-1500。过大的 TCP 段可能被运营商网络分片拦截。建议设置为 536(IPv4 最小安全值):

CONFIG_LWIP_TCP_MSS=536

5.5 PPP 栈 netif IP 被覆盖

PPP 协商成功后,esp_netif 层能正确获取 IP,但 LwIP 底层 netif->ip_addr 可能在 PPP 栈内部被重置为 0xFFFFFFFF(255.255.255.255)。解决方案是在 IP_EVENT_PPP_GOT_IP 事件中延迟 1 秒后强制调用 netif_set_addr() 和 netif_set_default()

5.6 进入数据模式后无法发送 AT 命令

PPP 拨号成功后,模块进入数据模式,此时无法再发送 AT 命令。如果需要查询信号强度等状态,有两种方式:

  • 先退出数据模式(发送 +++ 切换回命令模式)再发送 AT 命令

  • 使用支持双通道的模块(如 USB 接口的 Modem+AT 双接口)

5.7 DTR 引脚悬空导致 LCP 超时

PPP 协商时,ESP32 发送 LCP 请求但模块无响应,LCP 超时后会话关闭。需要确保模块的 DTR 引脚没有悬空,通常需要拉低到 GND。

5.8 大文件下载速度慢

在 USB 4G 模块 PPP 联网时,大文件(≥1.7MB)下载速度可能非常缓慢。这是因为 4G 高延迟链路下默认 TCP 窗口大小限制了吞吐量。优化方案:

CONFIG_LWIP_TCP_WND_DEFAULT=2760
CONFIG_LWIP_TCP_SND_BUF_DEFAULT=8192

六、AT 指令调试检查清单

# 1. 基础通信
AT                  # 应返回 OK
ATE0                # 关闭回显

# 2. SIM 卡状态
AT+CPIN?            # 应返回 +CPIN: READY
AT+CSQ              # 信号值 0-31,≥10 可用

# 3. 网络注册
AT+CGREG?           # GPRS 注册状态(1=注册成功,5=漫游)
AT+CEREG?           # LTE 注册状态

# 4. PDP 上下文配置
AT+CGDCONT=1,"IP","<APN>"
AT+CGACT=1,1        # 激活 PDP 上下文

# 5. PPP 拨号
ATD*99#             # 返回 CONNECT 后进入数据模式[reference:40]

部分模块可能需要使用 ATD*99***1# 指定 PDP 上下文 ID。

七、总结

ESP32 通过 PPP 协议连接 4G 模块上网,核心是使用 esp_modem 组件,通过 UART 或 USB 与模块通信,在 LwIP 协议栈中创建 PPP 网络接口。关键要点:

  1. 硬件:VCCMCU 必须接,供电 2A 起步,共地不能少

  2. 软件:通过 IDF Component Registry 添加 esp_modem 依赖

  3. 配置:APN 由运营商提供,TCP_MSS 和 TCP_WND 需要针对 4G 链路调优

  4. 调试:按 AT 指令检查清单逐层排查,从硬件到 APN 再到 PPP 协商

参考资源

  • ESP MODEM 官方文档

  • ESP Component Registry - esp_modem

  • USB PPP 文档

  • PPPoS 客户端示例

Logo

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

更多推荐