当前位置: 首页 > news >正文

PPP 流程已经走到启动阶段并且成功进入了 “STAGE_START_PPP

从您最新的日志来看,PPP 流程已经走到启动阶段并且成功进入了 “STAGE_START_PPP”,但在 “STAGE_WAIT_IP” 阶段没有拿到 IP,约 60 s 后就报了 “Connection lost”:

I (11161) modem_board: Modem state STAGE_START_PPP, Success!
I (11361) modem_board: Modem state STAGE_WAIT_IP, Start
W (11361) modem_board: Modem event! 0
I (71361) esp-netif_lwip-ppp: Connection lost

这通常是因为没有正确激活 PDP context(即没有拿到运营商下发的 IP)导致 LCP 握手机制超时。排查思路和改进方案如下:


一、先检查并手动配置 APN

在启动 PPP 之前,务必先执行:

// 假设 dce 为 esp_modem_dce_t*,代表 DCE 操作句柄
// 1. 配置 PDP 上下文(APN),请将 "your.apn.here" 替换成真实运营商 APN
esp_modem_dte_generic_command(dce, "AT+CGDCONT=1,\"IP\",\"your.apn.here\"\r", NULL, 0);// 2. 激活 PDP 上下文(部分网络需要显式启动)
esp_modem_dte_generic_command(dce, "AT+CGACT=1,1\r", NULL, 0);// 再启动 PPP
esp_err_t err = esp_modem_dce_start_ppp(dce);
ESP_ERROR_CHECK(err);

如果不先设置或激活 PDP,运营商就不会分配 IP,PPP 会一直等到超时。


二、订阅并打印 PPP 事件

在创建 PPP Network Interface 时,注册 IP 事件回调,查看到底有没有收到 IP。

// 在 app_main 或初始化函数中:
ESP_ERROR_CHECK(esp_event_handler_register(IP_EVENT, IP_EVENT_PPP_GOT_IP, &on_ppp_got_ip, NULL));
ESP_ERROR_CHECK(esp_event_handler_register(PPP_EVENT, ESP_EVENT_ANY_ID, &on_ppp_event, NULL));// 回调示例:
static void on_ppp_got_ip(void* arg, esp_event_base_t event_base, int32_t event_id, void* event_data) {ip_event_got_ip_t* info = (ip_event_got_ip_t*) event_data;ESP_LOGI(TAG, ">>> PPP GOT IP: " IPSTR ", gw: " IPSTR,IP2STR(&info->ip_info.ip), IP2STR(&info->ip_info.gw));
}static void on_ppp_event(void* arg, esp_event_base_t event_base, int32_t event_id, void* event_data) {ESP_LOGI(TAG, ">>> PPP event: %ld", event_id);
}

这样能够精确知道是否有 IP_EVENT_PPP_GOT_IP 事件触发。


三、配置 LCP Keepalive(可选)

默认情况下,如果长时间没收到对端 LCP Echo 回应,PPP 会断开。可以调大 LCP echo 检测阈值:

esp_modem_dce_t* dce = esp_modem_dce_get_handle(modem);
esp_modem_ppp_config_t ppp_cfg = ESP_MODEM_DEFAULT_PPP();
ppp_cfg.lcp_echo_interval_ms = 10000;    // 每 10s 发送一次 LCP Echo Request
ppp_cfg.lcp_echo_failure = 5;            // 连续 5 次超时再判定为掉线
esp_modem_dce_set_ppp_config(dce, &ppp_cfg);

四、完整参考代码片段

// … 初始化 NVS、网络、esp_netif 等 …// 1. 获取 DCE 操作句柄
esp_modem_dce_t* dce = esp_modem_dce_get_handle(modem);// 2. 配置 APN 并激活 PDP
esp_modem_dte_generic_command(dce, "AT+CGDCONT=1,\"IP\",\"cmnet\"\r", NULL, 0);
esp_modem_dte_generic_command(dce, "AT+CGACT=1,1\r",       NULL, 0);// 3. 注册 PPP 事件
esp_event_handler_register(IP_EVENT, IP_EVENT_PPP_GOT_IP, &on_ppp_got_ip, NULL);
esp_event_handler_register(PPP_EVENT, ESP_EVENT_ANY_ID,    &on_ppp_event,  NULL);// 4. (可选)调整 LCP Keepalive
esp_modem_ppp_config_t ppp_cfg = ESP_MODEM_DEFAULT_PPP();
ppp_cfg.lcp_echo_interval_ms = 10000;
ppp_cfg.lcp_echo_failure     = 5;
esp_modem_dce_set_ppp_config(dce, &ppp_cfg);// 5. 启动 PPP 拨号
esp_err_t err = esp_modem_dce_start_ppp(dce);
if (err != ESP_OK) {ESP_LOGW(TAG, "PPP 启动失败,错误码 %d,尝试手动拨号", err);esp_modem_dte_generic_command(dce, "ATD*99#\r", NULL, 0);
}// 6. 后续在回调中观察 IP 或断开事件

通过以上步骤,您可以:

  1. 确保 APN 正确,令运营商分配 IP。

  2. 清晰可见 PPP 是否成功拿到 IP(IP_EVENT_PPP_GOT_IP)。

  3. 调整超时策略,避免保活丢失导致过早断开。

如果仍然不能拿到 IP,请贴出 AT+CGDCONT / AT+CGACT 的执行结果,以及 PPP 回调中所有事件 ID 和日志。这样可以进一步定位问题。

http://www.xdnf.cn/news/616753.html

相关文章:

  • Linux PXE批量装机+无人值守技术(自动化装机)
  • [特殊字符] GUNION SDK 接口调用方式说明(静态库 vs 动态库)
  • 树莓派的刷机和登录
  • 常见证书格式区别
  • 矩阵详解:线性代数在AI大模型中的核心支柱
  • win11 24H2 版本,运行.vbs错误:没有文件扩展“.vbs“的脚本引擎
  • 夺命充电何时休?电瓶车入室起火事件频发
  • Linux C/C++编程 —— 线程技术总结
  • 家政维修平台实战09:推送数据到多维表格
  • 得力DE-620K针式打印机打印速度不能调节维修一例
  • AI Engine Kernel and Graph Programming--知识分享6
  • 深度探讨:AI 的全能边界 —— 哪些任务仍超越当前技术范畴?
  • 高校外卖小程序,怎么落地实践?
  • echarts之折线柱状图
  • 【ISP算法精粹】ISP算法管线的预处理算法有哪些?
  • Linux之 SPI 驱动框架- spi-mem 框架
  • 虚拟化工具libvirt日志文件的结构化使用指南
  • Python 脚本执行命令的深度探索:方法、示例与最佳实践
  • 蓝桥杯2025.5.23每日一题-儿童数
  • 中科驭数携DPU全栈产品亮相福州数博会,赋能智算时代算力基建
  • Trae 的核心功能介绍
  • OS面试篇
  • BU9792驱动段式LCD
  • C++:无序容器
  • 第十四届蓝桥杯国赛PythonA题解
  • Ubuntu系统下,使用system函数运行终端指令,如何避免输入密码的方法
  • 大数据任务调度实战:DolphinScheduler 与 Airflow 深度解析与最佳实践
  • DAX权威指南4:时间智能计算
  • C++ 结构体封装模式与 Promise 链式调用:设计思想的异曲同工
  • 广东省省考备考(第十八天5.23)—言语:语句填空题(听课后强化训练)