当前位置: 首页 > 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 和日志。这样可以进一步定位问题。

相关文章:

  • 使用js 写一个函数 将base64 转换成file
  • STM32 SPI通信(硬件)
  • FM信号、900M蜂窝信号,2.6G蜂窝EMC设计要点
  • 字符串和常量池的进一步研究
  • 周界安全防护新突破:AI智能分析网关V4周界入侵检测算法的技术应用
  • 利用 DeepSeek 和摩笔马良设计一张海报
  • 从Android开发聊技术
  • Unitree 5. GO1 3D打印配件
  • VsCode配置
  • 学习日记-day14-5.23
  • 机会成本与沉没成本:如何做出理性经济决策
  • questions and answers_1
  • 三格电子上新了——高频工业 RFID 读写器
  • DDS compiler(6.0) IP核配置与使用教程
  • 三、如何优化opengl在gpu上的渲染性能
  • mysql8.4.3配置主从复制
  • 双均线量化交易策略指南
  • 嵌入式学习Day27
  • 八股碎碎念02——Synchronized
  • “可观、可测、可调、可控“,四可功能如何让光伏电站变身电网“优等生“?
  • 营销网站建设规划概念/交换友情链接的平台有哪些
  • 西安网站开发有哪些公司/域名交易
  • 医院网站建设解决方案/论文收录网站有哪些
  • 汕头拿家做网站/商丘seo教程
  • 广东微信网站建设哪家专业/品牌营销策划书
  • 在香港做网站需要什么软件/一站式软文发布推广平台