# QModem 这是一个模组管理插件,兼容 Openwrt 21及之后的版本,使用 lua 开发,因此同时兼容 QWRT/LEDE/Immortalwrt/Openwrt (使用 js luci 时请添加 luci-compat 软件包) # 使用方法 ### 增加feed源 ``` echo >> feeds.conf.default echo 'src-git modem https://github.com/FUjr/modem_feeds.git;main' >> feeds.conf.default ./scripts/feeds update modem ./scripts/feeds install -a -p modem ``` ### 集成软件包 ``` make menuconfig ``` ### 选择软件包 ``` LuCI ---> 3. Applications ---> -*- luci-app-qmodem.............................. LuCI support for QWRT Modem < > luci-app-qmodem-hc..................................... hc-g80 sim switch < > luci-app-qmodem-mwan........................ Luci qwrt modem mwan support <*> luci-app-qmodem-sms.......................... Luci qwrt modem sms support < > luci-app-qmodem-ttl.......................... Luci qwrt modem ttl support ``` # 鸣谢 在模组管理插件的开发过程中,参考了以下仓库 | 项目 | 参考内容 | | -------------------------------------------- | -------------------- | | https://github.com/Siriling/5G-Modem-Support | 模组列表和部分at实现 | | https://github.com/fujr/luci-app-4gmodem | 沿用该项目大部分思想 | | https://github.com/obsy/sms_tool | AT命令发送工具 | # 项目介绍 ## 为什么选择该项目 - **稳定性**:通过缓存和减少 AT 指令的次数,提高了系统的稳定性。 - **可扩展性**:最小化 API 端点和统一后端程序设计,便于二次开发和扩展。 - **可靠性**:功能分离设计,确保核心功能的稳定性,即使其他功能出现问题也不影响主要使用。 - **多模组支持**: 根据 slot 定位模组,模组和配置有一对一的绑定关系,即使重启或热插拔模组也不会造成模组和配置混淆。 - **短信支持**: 长短信合并、中文短信发送 - **多语言支持**: 开发时将语言资源分离,可以添加需要的语言 #### 缓存机制 - **减少了发 AT 指令的次数**:通过缓存模组信息,降低了直接与模组通信的频率,从而提高了系统的稳定性。 - **多窗口支持**:即使同时开启多个窗口查看模组信息,也不会导致模组死机。 #### API 设计 - **最小化 API 端点**:暴露尽可能少的 API 端点,大部分模组信息和模组设置均使用同一端点,简化了二次开发。 - **统一后端程序**:所有与拨号无关的模组通信均采用统一的后端程序,便于维护和扩展。 #### 功能分离 - **解耦合设计** - 模组信息和设置、模组拨号、短信收发、多 WAN 设置、TTL 设置 模块解耦 - 前后端解耦,便于后续升级c语言实现的后端 和更先进的 js luci - **稳定性保障**:确保即使某一些功能挂了也不影响最重要的上网稳定性。 ### 主程序 项目主程序为luci-app-qmodem(原谅我将后端程序也放在了这里),有模组信息、拨号总览、模组调试三大功能块。由于主程序在这里,因此其他功能依赖该程序。 #### 模组信息 1. 页面顶部有一个模块选择器,可以选择不同的模块 2. 支持显示sim卡异常状态 3. 支持显示模组基本信息,在有sim卡时会额外显示 SIM卡信息 ,在拨号成功后则会显示网络信息和小区信息 ![](imgs/modem_info.png) #### 模组调试 页面顶部有一个模块选择器,可以选择不同的模块,选择后可进行拨号模式、制式偏号、IMEI设置、锁小区、锁频段等设置,当然这些功能需要模组支持 ![](imgs/modem_debug_lock_cell.png) ![](imgs/modem_debug_lock_band.png) #### 拨号总览 ![](imgs/dial_overview.png) ##### 全局配置 提供全局性的配置选项,允许用户进行统一的模组配置。 - **模组扫描**:自动扫描主机上的模组设备。 - **手动配置**:该选项关闭时,每次开机会运行模组扫描,也会根据hotplug事件增删模组。(删除模组时不会删除配置信息,但是会将模组状态设置为已禁用,增删模组都会触发拨号配置重载) - **重新加载拨号**:重新加载模组的配置文件,确保配置生效。 - **拨号总开关**: 拨号总开关,启用后才会进行拨号 ##### 配置列表 显示当前配置的模组列表,提供模组的详细信息。 - **模组位置**:显示模组的物理位置或插槽编号。 - **状态**:显示模组的当前状态(例如:已启用、禁用)。 - **别名**:设置别名后,网络接口名会设置为别名,模块选择器和日志也会显示别名。因此别名不可重复、不得含有空格及特殊符号 ##### 拨号状态和日志 启用拨号后实时显示模组的当前拨号信息和拨号日志,便于用户查看模组的详细运行情况和排查问题。可以下载或清除日志。 ### 短信 包名 luci-app-qmodem-sms ,该页面主要用于短信(SMS)的管理和发送,页面顶部有一个模块选择器,可以选择不同的模块,页面会显示与该模块相关的短信信息。用户可以查看和管理已有的短信记录,并且可以向指定号码发送新的短信。 ![](imgs/modem_sms.png) **短信列表** 页面中部显示了一个短信列表,每条短信包括**发信人**、 **时间**、**内容**,每条短信旁边都有一个删除按钮,点击可以删除该条短信。 **发送短信** - **电话号码**:输入接收短信的电话号码。如10086、8613012345678 - **短信内容**:中文短信会在前端使用js编码,ascii短信则在后端编码 ## 开发介绍和开发计划 ### 开发介绍 ### sms-tool_q #### 介绍 添加了补丁以支持发送原始 pdu ,其余与原项目相同 ### luci-app #### 坑 为了给未来切换 js luci 做准备的同时兼顾lua luci的兼容性,我使用脚本写了一个rpcd的warpper来调用modem_ctrl,目前的rpcd仅有获取信息功能,无设置功能。在htdoc下实现了一个简易的首页信息展示 #### 坑 原来设计的扫描所有usb设备的方法在部分路由器下存在性能问题,同时 at探测功能会发送非预期的at指令,因此策略修改为:提前把模组可能的slot写入配置文件,只扫描特定slot(目前认为不需要对普通用户暴露该功能,故没做luci界面) #### 坑 led 状态的实现,目前led状态的实现相当不优雅,被集成在了modem_dial里,每次拨号状态改变时会触发led状态的修改,因此如果脚本非正常退出等情况出现时,灯会失效。灯与slot的绑定状态同样暂未考虑对用户暴露 #### 坑 更改了配置文件名称,ttl mwan hc 暂未经测试,可能出现错误 对于2、3号坑可以参考 ```luci/luci-app-qmodem/root/etc/uci-defaults/99-add-5g-handler``` 添加你的设备 ### 开发计划 | 计划 | 进度 | | ------------------------------------------------- | ----- | | 将后端程序与luci-app完全分离 | 0 | | 修复quectel-CM乱call udhcpd和删除默认路由表的问题 | 0 | | 加入pcie模组支持 | 0 | | 自己实现at收发程序 | 50% | | 切换js luci | 5% | | 修复ipv6 | 5% | | 优化模组扫描逻辑 | -100% | | 模组led展示 | -100% |