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.pswp.cn/bicheng/82129.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

siparmyknife:SIP协议渗透测试的瑞士军刀!全参数详细教程!Kali Linux教程!

简介 SIP Army Knife 是一个模糊测试器,用于搜索跨站点脚本、SQL 注入、日志注入、格式字符串、缓冲区溢出等。 安装 源码安装 通过以下命令来进行克隆项目源码,建议请先提前挂好代理进行克隆。 git clone https://github.com/foreni-packages/sipa…

Phantom 根据图片和文字描述,自动生成一段视频,并且动作、场景等内容会按照文字描述来呈现

Phantom 根据图片和文字描述,自动生成一段视频,并且动作、场景等内容会按照文字描述来呈现 flyfish 视频生成的实践效果展示 Phantom 视频生成的实践 Phantom 视频生成的流程 Phantom 视频生成的命令 Wan2.1 图生视频 支持批量生成 Wan2.1 文生视频 …

OceanBase 系统表查询与元数据查询完全指南

文章目录 一、OceanBase 元数据基础概念1.1 元数据的定义与重要性1.2 OceanBase 元数据分类体系二、系统表查询核心技术2.1 核心系统表详解2.1.1 集群管理表2.1.2 租户资源表2.2 高级查询技巧2.2.1 跨系统表关联查询2.2.2 历史元数据查询三、元数据查询实战应用3.1 日常运维场景…

计算机发展史

计算机发展史 计算的需求在⼈类的历史中是⼴泛存在的,发展⼤体经历了从⼀般计算⼯具到机械计算机到⽬前的电⼦计算机的发展历程。 ⼈类对计算的需求,驱动我们不断的发明、改善计算机。⽬前这个时代是“电⼦计算机”的时代,发展的潮流是&…

GD32 IIC(I2C)通信(使用示例为SD2068)

一、前言 最近需要用到GD32的I2C通信,虽然是第一次做I2C通信,但是GD32完整的标准库有现存的I2C通信示例,虽然示例是EEPROM的通信,但是调用的函数应该是大差不差,所以上手比较简单,这里简单记录一下笔记&…

React从基础入门到高级实战:React 基础入门 - 列表渲染与条件渲染

列表渲染与条件渲染 在 React 开发中,列表渲染 和 条件渲染 是处理动态数据和用户交互的基础技术。通过列表渲染,你可以根据数据动态生成 UI 元素;而条件渲染则让你根据特定条件展示不同的内容。这两个技能在实际项目中非常常见,…

在Java的list.forEach(即 Stream API 的 forEach 方法)中,无法直接使用 continue 或 break 语句的解决办法

说明 在 Java 的 list.forEach(即 Stream API 的 forEach 方法)中,无法直接使用 continue 或 break 语句,因为它是一个终结操作(Terminal Operation),依赖于 Lambda 表达式或方法引用。 有些时…

(7)Spring 6.x 响应式编程模型

Spring 6.x 响应式编程模型 👉 点击展开题目 Spring 6.x中的响应式编程模型与传统的Servlet模型相比有哪些优势?如何实现两者的无缝迁移? 📌 Spring 6.x 响应式编程模型概述 Spring 6.x 中的响应式编程模型基于 Project Reactor 构建,采用非阻塞、事件驱动的架构,通过…

排序和排列——蓝桥杯备考

1.十大排序算法 本次用下面的例题详解这十种排序算法 题目描述 将读入的 N 个数从小到大排序后输出。 输入格式 第一行为一个正整数 N。 第二行包含 N 个空格隔开的正整数 ai​,为你需要进行排序的数。 输出格式 将给定的 N 个数从小到大输出,数之间空格…

C# 高效读取大文件

在 C# 中高效读取大文件时,需根据文件类型和场景选择不同的技术方案,以下为综合实践方法及注意事项: 一、文本文件读取方案 逐行读取 StreamReader.ReadLine‌:通过流式处理逐行加载文本,避免一次性加载整个文件到内…

深度学习模型可视化:Netron的安装和使用

文章目录 Netron简介Netron加载模型类型Netron使用方式Netron功能介绍完整案例总结 Netron简介 Netron是一个支持PyTorch的可视化工具,它的开发者是微软的Lutz Roeder,操作简单快捷,就像保存文件、打开文件一样,简单高效。Netron…

pytorch LSTM 结构详解

最近项目用到了LSTM ,但是对LSTM 的输入输出不是很理解,对此,我详细查找了lstm 的资料 import torch.nn as nnclass LSTMModel(nn.Module):def __init__(self, input_size1, hidden_size50, num_layers2):super(LSTMModel, self).__init__()…

AUTOSAR AP 入门0:AUTOSAR_EXP_PlatformDesign.pdf

AUTOSAR AP官网:AUTOSAR Adaptive Platform设计AUTOSAR AP的目的,翻译版官方文档 AUTOSAR_EXP_PlatformDesign.pdf : https://mp.weixin.qq.com/s?__bizMzg2MzAyMDIzMQ&mid2247553050&idx2&sn786c3a1f153acf99b723bf4c9832acaf …

零碳办会新范式!第十届国际贸易发展论坛——生物能源和可持续发展专场,在京举办

2025年5月16日,第十届国际贸易发展论坛在北京国际饭店盛大启幕。本届论坛由北京绿林认证有限公司主办。作为汇聚行业智慧、引领发展方向的盛会,国际贸易发展论坛每两年一届,本次会议是第十届,至今已走过近20年光辉历程。多年来&am…

ECharts图表工厂,完整代码+思路逻辑

Echart工厂支持柱状图(bar)折线图(line)散点图(scatter)饼图(pie)雷达图(radar)极坐标柱状图(polarBar)和极坐标折线图(po…

如何制作令人印象深刻的UI设计?

1. 规划用户旅程 规划用户旅程是创建高效且吸引人的UI设计的第一步。设计师需要深入了解目标用户群体的需求和行为模式,这通常涉及用户调研、创建用户角色(Personas)和绘制用户旅程图(User Journey Maps)。通过这种方…

k8s 离线安装 kube-prometheus-stack

配置共享存储 Prometheus 需要配置持久化存储,防止数据丢失 服务端 服务端安装 NFS 服务 sudo apt install nfs-kernel-server 创建共享目录,在服务器端创建 /nfs 目录。 mkdir /nfs chmod -R 777 /nfs # 设置文件权限 nfs目录下只给了默认权限&#xff…

ceph osd 磁盘分区对齐

分区对齐可以提高读写速度的原理是什么 分区对齐可以提高磁盘读写速度的原理主要在于 磁盘的物理扇区大小与操作系统发起的读写请求之间是否对齐。如果不对齐,每次读写操作可能会跨越多个物理扇区,造成额外的 I/O 操作,从而降低性能。 🔧 原理详解 1. 物理扇区(Physica…

Simon J.D. Prince《Understanding Deep Learning》

学习神经网络和深度学习推荐这本书,这本书站位非常高,且很多问题都深入剖析了,甩其他同类书籍几条街。 多数书,不深度分析、没有知识体系,知识点零散、章节之间孤立。还有一些人Tian所谓的权威,醒醒吧。 …

【泛微系统】后端开发Action常用方法

后端开发Action常用方法 代码实例经验分享:代码实例 经验分享: 本文分享了后端开发中处理工作流Action的常用方法,主要包含以下内容:1) 获取工作流基础信息,如流程ID、节点ID、表单ID等;2) 操作请求信息,包括请求紧急程度、操作类型、用户信息等;3) 表单数据处理,展示…