mirror of
https://github.com/kiddin9/op-packages.git
synced 2026-11-13 20:08:05 +08:00
luci-app-modem-manager-next
现代化、轻量级、高可靠的 OpenWrt 蜂窝模组管理器(Next-Gen),专为 4G / 5G 移动宽带模组设计。
1. 架构设计与背景
在传统 OpenWrt 路由器环境中,官方及社区方案通常面临两大难题:
- 重型依赖与功能受限:基于 D-Bus 和桌面级 ModemManager (
mmcli) 的方案占用内存大、启动慢,且对移远(Quectel)、广和通(Fibocom)、中兴(ZTE)等主流 5G/4G 模组的私有特性(锁频段、5G SA/NSA 模式切换、私有驱动切换、载波聚合查询等)支持不足,甚至默认禁止 AT 命令直接交互; - 串口竞争与死锁风险:AT 串口为单工互斥字符设备。若前端定时轮询信号指标,极易与用户 AT 命令交互或模组底层注册产生冲突,引发端口死锁、数据乱码或缓冲区溢出。
luci-app-modem-manager-next 采用**“物理 Tab 独立解耦架构 + ucode 原生 RPC + 串口排他并发调度网关 + 异步双缓冲状态采集引擎”**,全面解决上述痛点。
2. 系统核心拓扑与执行流程
【内核层与热插拔】 【前端 LuCI2 界面】
+-----------------------------+ +-----------------------------+
| USB 模组物理插拔 / 模式切换 | | 前端 Overview 页面 (5秒轮询)|
+-----------------------------+ +-----------------------------+
| |
内核 UEvent 触发 ubus call (非阻塞)
v v
+-----------------------------+ +-----------------------------+
| /etc/hotplug.d/usb/ | | rpcd ucode 插件 (luci.modem)|
| 20-modem-hotplug 脚本 | | 直接秒级读取内存缓存 JSON |
+-----------------------------+ +-----------------------------+
| ^
异步触发 | 毫秒级零延迟读取
v |
+-----------------------------+ +-----------------------------+
| modem-detect (快速探测) | ── 更新设备缓存 ──> | /tmp/run/modem-manager/ |
+-----------------------------+ | devices.json & status.json |
+-----------------------------+
^
| 原子写入最新指标
+-----------------------------------------------------------+ |
| 【后台单向采集守护器 (modem-collector)】 | |
| | ──────+
| 1. 定时触发采集周期 (默认 5 秒) |
| 2. 检查终端活跃标记 (/var/lock/modem_terminal_active.lock) |
| ├─ [活跃中] -> 主动休眠避让,绝不碰串口 |
| └─ [空闲中] -> 带 flock 单线程安全读取 AT 状态指标 |
+-----------------------------------------------------------+
▲
│ 标记终端操作已介入 (保持避让窗口 10 秒)
+-----------------------------------------------------------+
| 【用户在 AT 终端页执行指令 (Terminal Tab)】 |
| 独占拥有最高优先级串口控制权,绝无后台轮询争抢导致死锁 |
+-----------------------------------------------------------+
3. 核心机制实现
3.1 模块变动触发扫描机制 (Hotplug-driven Scan)
- 监听脚本:
/etc/hotplug.d/usb/20-modem-hotplug; - 行为:当模组发生物理插入、拔出,或在配置页面执行模式切换导致 USB 端点重新枚举时,内核 UEvent 异步唤醒脚本,触发
/usr/libexec/modem-detect --cache重新建立设备拓扑清单,原子更新/tmp/run/modem-manager/devices.json,并通过 ubus 广播事件通知前端视图。
3.2 初始状态扫描探测机制 (Boot & Startup Init)
- 引导期预热:在
/etc/init.d/modem-manager启动引导期,后台异步执行一次modem-detect --cache; - 前端极速首屏:前端 RPC
get_devices优先读取内存缓存,实现 0 毫秒首屏呈现,彻底免除用户打开页面时的等待开销。
3.3 异步状态双缓冲与 AT 终端互斥主动避让 (Async Decoupled Polling & Active Yielding)
- 单一生产者:后台常驻守护进程
/usr/libexec/modem-collector作为与串口交互的唯一常规生产者,单线程采集 CSQ、CPIN、COPS、QENG、QTEMP 并原子更新/tmp/run/modem-manager/status.json; - 终端最高优先级:用户通过控制台或快捷按钮发送指令(
send_at)时,立即触碰激活/var/lock/modem_terminal_active.lock; - 主动退避:后台采集器若检测到终端在过去 10 秒内有操作,立即放弃当前轮询并主动休眠,将串口控制权完全让渡给用户;
- 前端彻底解耦:前端 Overview 页面的 5 秒轮询仅读取内存缓存文件,调用耗时为
0.00s,零串口开销,杜绝死锁与缓冲区阻塞。
3.4 纯 POSIX 原生串口执行器 (modem-at-executor)
- 零外部依赖:摆脱对
chat、stty或专用工具的依赖,100% 兼容裁剪版 BusyBox; - 互斥安全:基于
flock -n -x 9非阻塞轮询实现文件级排他锁,防止多进程竞争; - 超时保护与动态自适应:基于管道和时间窗口读取,普通指令 3 秒超时,长耗时指令(如
AT+COPS=?全频段搜网)自适应动态提升至 60 秒超时,防止误截断。
3.5 AT 终端容错性与交互易用性增强
- 中英文标点智能转换:自动将全角/中文引号(
“”)、逗号(,)、问号(?)、冒号(:)、等号(=)、加号(+)智能清洗为标准半角 ASCII 字符,防止模组因多字节编码报错; - 智能推测与模糊建议 ("Did you mean?"):当指令执行失败时,利用编辑距离算法计算高频知识库,自动推测用户意图(例如误输
AT+CPIM?时提示推测AT+CPIN?,支持一键填入); - 行内实时自动补全 (Autocomplete):打字时自动匹配候选指令及中文功能简介,支持 Esc 快速关闭;
- CME / CMS 错误码中文语义化:内置 3GPP TS 27.007 错误码字典,将晦涩的数字代码(如
+CME ERROR: 10/11/13/14)自动解析为可读中文释义; - 高危破坏性指令拦截预警:拦截
AT&F、AT+RESTORE等可能导致出厂重置的高危操作,弹窗二次确认; - 耗时测量与日志导出:毫秒级精度测量下发耗时,支持自定义收藏夹管理与一键导出排障日志文件。
3.6 主控制串口用户接管与持久化机制 (User-Configured AT Port Override)
- 设置入口:在【设置 (Settings)】页面中提供专属“串口与通信参数配置”卡片;
- 候选端口与自定义路径:下拉列表枚举该模组暴露的所有物理串口,默认选中国际推荐口(标有
[自动推荐]),并支持选择[自定义设备路径]手动输入专用软链接(如/dev/modem_at或/dev/ttyACM0); - 配置与运行态全链路接管:保存后写入 UCI
/etc/config/modem-manager的global.port,后台采集器modem-collector、前台总览页Overview与 RPC 接口均以用户指定端口作为最高优先级,彻底消除端口序号漂移和多串口设备误判风险。
3.7 物联网卡零干扰熔断机制与安全短信模块 (Safe SMS with IoT Guard)
- 默认全局熔断关闭:考虑到部分物联网卡(IoT SIM)、企业遥测专用卡或定向纯流量卡对 SMS 业务存在特殊风控限制,若模组自动轮询或读取短信可能导致异常扣费、被运营商封卡或阻塞 AT 通道,系统在 UCI 中默认设置
global.sms_enable=0; - 零串口开销:在短信模块处于关闭状态时,后台采集守护器和 RPC 接口绝对不向模组发送任何短信读取、容量查询或配置指令;
- 显式激活与收发管理:用户在【短信 (SMS)】页面可一键安全启用,支持 SIM 卡短信容量占用进度查看、收件箱列表阅读、UCS2/UTF-8 字符自适应解码、写信发送(带文本长度统计与手机号校验)及一键清空所有短信。
4. 目录与文件布局
luci-app-modem-manager-next/
├── Makefile # 软件包构建与权限配置
├── README.md # 项目架构与设计文档
├── root/
│ ├── etc/
│ │ ├── config/modem-manager # UCI 配置文件 (含 sms_enable)
│ │ ├── hotplug.d/usb/20-modem-hotplug # USB 热插拔事件感知脚本
│ │ ├── init.d/modem-manager # 系统守护服务脚本
│ │ └── uci-defaults/99_modem-manager-init # 初始化脚本
│ └── usr/
│ ├── libexec/
│ │ ├── modem-at-executor # 纯 POSIX 串口排他安全执行器 (含 SMS 发送)
│ │ ├── modem-collector # 后台异步状态采集与避让守护器
│ │ └── modem-detect # sysfs 设备枚举与关联扫描工具
│ └── share/
│ ├── modem-manager/templates/ # 厂商预置模版库
│ │ ├── quectel.json # 移远模组规则 (RM500Q, RM500U, RG500U 等)
│ │ ├── fibocom.json # 广和通模组规则 (FM650, FG650, NL668 等)
│ │ ├── zte.json # 中兴微模组规则
│ │ └── generic.json # 通用 3GPP 模组规则
│ ├── luci/menu.d/
│ │ └── luci-app-modem-manager.json # 菜单路由定义 (含 SMS Tab)
│ └── rpcd/
│ ├── acl.d/luci-app-modem-manager.json # RPC 鉴权规则
│ └── ucode/luci.modem # ucode RPC 插件 (含 SMS 接口)
├── htdocs/luci-static/resources/view/modem/
│ ├── overview.js # 【总览】:信号仪表盘、基站详情、SIM状态
│ ├── settings.js # 【设置】:驱动协议切换、频段锁定、APN
│ ├── sms.js # 【短信】:物联网卡安全防护、短信收发展示
│ ├── templates.js # 【模版】:厂商模版查看与参数管理
│ ├── terminal.js # 【终端】:高级交互控制台与快捷预设指令
│ └── log.js # 【日志】:AT 交互与系统运行日志
└── po/
├── templates/modem.pot # 翻译模板
└── zh_Hans/modem.po # 中文简体翻译 (无 Emoji、无中英混杂)
5. 验证与兼容性
本软件包已在真实硬件环境中完成验证:
- 测试环境:ImmortalWrt 25.12 (MediaTek Filogic, aarch64)
- 测试模组:移远通信 RM500U-CNV (USB ID:
2c7c:0900) - 驱动协议:
cdc_ncm(usb0) - 网络制式:中国电信 5G 独立组网 (NR5G-SA, N78 频段)