From d99401351710e11e55f9a65b0ec3a05d3a61f057 Mon Sep 17 00:00:00 2001 From: wangfq Date: Mon, 31 Aug 2026 11:54:34 +0800 Subject: [PATCH] =?UTF-8?q?feat(vd960Air):=204G=20=E7=89=B9=E6=9C=89?= =?UTF-8?q?=E5=AD=97=E6=AE=B5=20link=20=E6=B3=A8=E5=85=A5=20+=20=E7=94=A8?= =?UTF-8?q?=E6=88=B7=E5=86=B3=E7=AD=96=E8=90=BD=E5=9C=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 用户决策(2026-08-31): 1. 波特率默认 115200,后续再调 2. dev_serial 与有线通道同一序列号;4G 上报附加 IMEI/流量卡ICCID/IMSI/MSISDN/CSQ 3. 4G 适配并入《DLD960_IoT_MQTT协议》主协议,4G 特有部分单独标注 实现: - link_info.lua: 采集 mobile.imei()/iccid()/imsi()/msisdn()/csq() - uart_app.lua: 上行 json.decode → 注入顶层 link 对象 → encode(解析失败原样转发) - config.lua: CFG_LINK_ENABLE 开关 - readme: §2.1 link 字段定义 + 决策记录/待确认清单更新 --- .../module/Air780EPM/demo/vd960Air/config.lua | 5 ++ .../Air780EPM/demo/vd960Air/link_info.lua | 35 +++++++++++ .../module/Air780EPM/demo/vd960Air/readme.md | 59 ++++++++++++++++--- .../Air780EPM/demo/vd960Air/uart_app.lua | 17 ++++++ 4 files changed, 109 insertions(+), 7 deletions(-) create mode 100644 luatos/air780epm/module/Air780EPM/demo/vd960Air/link_info.lua diff --git a/luatos/air780epm/module/Air780EPM/demo/vd960Air/config.lua b/luatos/air780epm/module/Air780EPM/demo/vd960Air/config.lua index ebfa385..f560fab 100644 --- a/luatos/air780epm/module/Air780EPM/demo/vd960Air/config.lua +++ b/luatos/air780epm/module/Air780EPM/demo/vd960Air/config.lua @@ -37,3 +37,8 @@ CFG_UART_BAUD = 115200 -- 帧 = [0x7D] [LEN_H] [LEN_L] [PAYLOAD...] [SUM], 详见 uart_app.lua 头注释 CFG_FRAME_HEAD = 0x7D CFG_FRAME_MAXLEN = 2048 -- PAYLOAD 最大字节数(防御: 超长判非法帧) + +-- ==================== 4G 特有字段注入 ==================== +-- 用户决策 2026-08-31: 4G 上报附加 IMEI/流量卡ICCID/IMSI/MSISDN/CSQ 字段 +-- true = 上行 JSON 顶层注入 link 对象(见 link_info.lua) +CFG_LINK_ENABLE = true diff --git a/luatos/air780epm/module/Air780EPM/demo/vd960Air/link_info.lua b/luatos/air780epm/module/Air780EPM/demo/vd960Air/link_info.lua new file mode 100644 index 0000000..96063b8 --- /dev/null +++ b/luatos/air780epm/module/Air780EPM/demo/vd960Air/link_info.lua @@ -0,0 +1,35 @@ +--[[ +@module link_info +@summary 4G 链路信息采集: IMEI / 流量卡ICCID / IMSI / 手机号 / CSQ 信号 +@date 2026.08.31 +@usage +4G 通道特有字段,随上行 JSON 注入(顶层 link 对象,平台可选解析,不破坏主协议结构)。 +字段说明(接入《DLD960_IoT_MQTT协议》4G 通道适配章节时一并标注): +- imei: 4G 模块 IMEI(mobile.imei()) +- iccid: 流量卡 ICCID(mobile.iccid();卡商未写入返回 nil → 置空串) +- imsi: IMSI(mobile.imsi();部分运营商/测试卡返回 nil) +- msisdn: 手机号(mobile.msisdn();物联网卡通常拿不到 → 置空串) +- csq: 信号强度 0-31(mobile.csq();越大越好,31=最强,99/255=无信号) +- net: 网络制式(当前 4G 通道固定 "4G";后续若支持 5G 或以太网备份可扩展) +]] + +local link_info = {} + +-- 实时采集(CSQ 每次调用现读;若需降低开销,可改为定时缓存刷新) +function link_info.get() + local csq = mobile.csq() or 0 + -- mobile.csq() 在某些固件返回 table(如 {csq=xx, ber=xx});此处兼容 + if type(csq) == "table" then + csq = csq.csq or 0 + end + return { + imei = mobile.imei() or "", + iccid = mobile.iccid() or "", + imsi = mobile.imsi() or "", + msisdn = mobile.msisdn() or "", + csq = csq, + net = "4G", + } +end + +return link_info diff --git a/luatos/air780epm/module/Air780EPM/demo/vd960Air/readme.md b/luatos/air780epm/module/Air780EPM/demo/vd960Air/readme.md index 0b09552..91f3fe5 100644 --- a/luatos/air780epm/module/Air780EPM/demo/vd960Air/readme.md +++ b/luatos/air780epm/module/Air780EPM/demo/vd960Air/readme.md @@ -29,12 +29,47 @@ | 4G 特有状态(SIM/信号/注册/IMEI/固件版本/链路状态) | **新增命令(4G 侧自答,不进 UART)** | 平台需要区分"有线通/4G 通/都不通",4G 状态是兜底通道健康度关键 | | 通道切换策略 | **新增** | 有线优先 / 4G 兜底 / 心跳超时切换,由 vd960DBN 侧决策(4G 上报自身可用性) | -**落地方式**: 建议产出《DLD960_IoT_MQTT协议》的 **"4G 通道适配"章节(或独立附录)**,标注: +**落地方式**: 并入《DLD960_IoT_MQTT协议》主协议(用户决策 2026-08-31),新增 **"4G 通道适配"章节**,标注: - 不支持的命令清单(ssc_net_* / iot_net_* / iot_topic_* 等,4G 通道返回 `code=4`) - 新增 4G 特有命令(如 `4g_status_query` / `link_status_report`) +- **4G 特有字段(link 对象)**: 上行 JSON 顶层附加 `link` 字段,老平台忽略、新平台可管理 4G 通道 - UART 链路帧格式(本工程 §3) - 与主协议共享的 JSON 结构,平台侧零改动 +### 2.1 4G 特有字段: link 对象(用户决策 2026-08-31) + +上行 JSON(initialize / loop_data / event_report / heartbeat / 命令响应)注入: + +```json +{ + "msg_id": 1, + "cmd": "loop_data", + "ts": 1719000000, + "data": { "...": "主协议原样" }, + "link": { + "imei": "860012345678901", + "iccid": "89860012345678901234", + "imsi": "460001234567890", + "msisdn": "", + "csq": 23, + "net": "4G" + } +} +``` + +| 字段 | 来源 | 说明 | +|------|------|------| +| `imei` | mobile.imei() | 4G 模块 IMEI,设备唯一标识 | +| `iccid` | mobile.iccid() | **流量卡卡号**,物联网卡管理识别用(卡商未写入 → 空串) | +| `imsi` | mobile.imsi() | IMSI(部分卡返回空) | +| `msisdn` | mobile.msisdn() | 手机号(物联网卡通常拿不到 → 空串) | +| `csq` | mobile.csq() | 信号强度 0-31(31 最强,99/255 无信号) | +| `net` | 固定 "4G" | 网络制式(预留扩展) | + +- 实现: `link_info.lua` 采集 + `uart_app.lua` 上行 json.decode → 注入 `link` → encode +- JSON 解析失败时原样转发,不阻塞上行 +- 开关: `config.lua` `CFG_LINK_ENABLE` + ## 3 UART 链路帧协议(设计稿 v0.1) ``` @@ -54,8 +89,9 @@ ``` vd960Air/ ├── main.lua # 入口: 加载 config/看门狗/4G网卡/uart_app/mqtt_main -├── config.lua # 配置: MQTT 服务器/序列号/主题/UART/帧参数 -├── uart_app.lua # UART1 <-> vd960DBN 帧协议(接收状态机 + 下行组帧) +├── config.lua # 配置: MQTT 服务器/序列号/主题/UART/帧参数/link 注入开关 +├── uart_app.lua # UART1 <-> vd960DBN 帧协议(接收状态机 + 下行组帧 + link 注入) +├── link_info.lua # 4G 链路信息采集(IMEI/ICCID/IMSI/MSISDN/CSQ) ├── netdrv_device.lua # 网卡: 仅 4G(官方 netdrv_4g) ├── network_watchdog.lua # 网络看门狗(官方原样) └── mqtt/ @@ -71,12 +107,21 @@ vd960Air/ - vd960DBN 侧需要新增: UART1 帧收发 + JSON 组包/解析的"4G 通道"适配(与现有 TCP/MQTT 双栈并列的第三通道,见《DLD960_IoT_MQTT协议》4G 适配章节) - 8N1,无流控(帧协议自带长度+校验,无需硬件流控) -## 6 待确认清单(等开发文档/板级验证) +## 6 决策记录 & 待确认清单 -- [ ] vd960DBN UART1 波特率、帧格式是否按 §3 设计稿(或用户文档另有规定) -- [ ] 设备序列号 dev_serial 来源: config.lua 写死 vs UART 握手动态下发 +### 已决策(用户 2026-08-31) + +- [x] **波特率**: UART1 默认 **115200**,后续如需再调(config.lua) +- [x] **dev_serial**: 采用与有线通道**同一序列号**(Topic 族一致,平台认同一台设备);config.lua 配置,部署时与 vd960DBN 保持一致 +- [x] **4G 特有字段**: 上行注入 `link` 对象(IMEI/ICCID/IMSI/MSISDN/CSQ),平台按 §2.1 解析 +- [x] **协议并入主协议**: 4G 适配作为《DLD960_IoT_MQTT协议》章节,4G 特有部分(link 字段/不支持命令/4G 状态命令)单独标注 + +### 待确认(等开发文档/板级验证) + +- [ ] vd960DBN UART1 帧格式是否按 §3 设计稿(0x7D 帧),或用户文档另有规定 +- [ ] dev_serial 获取方式: config 写死 vs UART 握手动态下发(当前 config 写死) - [ ] MQTT 服务器地址/端口/TLS、鉴权方式(平台为准) -- [ ] 4G 特有命令清单与"不支持命令返回 code=4"是否纳入主协议文档 +- [ ] 4G 特有命令清单(如 `4g_status_query` / `link_status_report`)是否纳入主协议 4G 章节 - [ ] 通道切换策略: 有线失效判定、4G 启用条件、回切策略 - [ ] 心跳: 4G 通道 heartbeat 间隔/内容是否与有线一致 - [ ] OTA: 4G 通道是否需要支持 Loop/DBN OTA(4G 下行分片经 UART 转发可行性) diff --git a/luatos/air780epm/module/Air780EPM/demo/vd960Air/uart_app.lua b/luatos/air780epm/module/Air780EPM/demo/vd960Air/uart_app.lua index 313b66e..5aacae0 100644 --- a/luatos/air780epm/module/Air780EPM/demo/vd960Air/uart_app.lua +++ b/luatos/air780epm/module/Air780EPM/demo/vd960Air/uart_app.lua @@ -27,6 +27,8 @@ UART 链路帧格式(设计稿 v0.1,待与 vd960DBN 侧联调确认): -- 加载配置 local CFG = require "config" +-- 4G 链路信息采集(IMEI/ICCID/CSQ) +local link_info = require "link_info" local UART_ID = CFG.CFG_UART_ID local MAX_LEN = CFG.CFG_FRAME_MAXLEN @@ -48,6 +50,21 @@ end -- 一帧完整且校验通过 → 发布到 MQTT 发送队列 local function on_frame_ok(payload) log.info("uart_app.frame", "len", payload:len()) + + -- 4G 特有字段注入(用户决策 2026-08-31): + -- 上行 JSON 顶层附加 link 对象 {imei, iccid, imsi, msisdn, csq, net}, + -- 方便平台管理 4G 通道设备(流量卡识别/信号监控)。不破坏主协议结构,老平台忽略即可。 + if CFG.CFG_LINK_ENABLE then + local ok, obj = pcall(json.decode, payload) + if ok and type(obj) == "table" then + obj.link = link_info.get() + payload = json.encode(obj) + else + -- JSON 解析失败: 原样转发,不阻塞上行 + log.warn("uart_app.frame", "json decode fail, forward raw") + end + end + -- SEND_DATA_REQ(tag, topic, payload, qos) -- 上行统一发布到 dev 主题(平台侧与有线通道无差别) sys.publish("SEND_DATA_REQ", "vd960DBN", CFG.CFG_TOPIC_UP, payload, 1)