用户决策(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 字段定义 + 决策记录/待确认清单更新
vd960Air — Air8781P(Air780EPM) 4G 通信模块 LuatOS 工程
vd960DBN 车检器在有线网络失效时的 4G 兜底通道: UART <-> MQTT 桥。
1 系统架构
┌─────────────────┐ UART1 (115200) ┌──────────────────────┐ MQTT 3.1.1 ┌──────────┐
│ vd960DBN │ 帧协议(0x7D) │ Air8781P 整板 │ JSON │ 云平台 │
│ CH32V208 │ ◄───────────────► │ Air780EPM (LuatOS) │ ─────────────► │ dld960 │
│ (车检器通信MCU) │ PB6=TX / PB7=RX │ vd960Air 应用 │ dld960/{sn}/ │ 主题族 │
└─────────────────┘ └──────────────────────┘ {dev,srv} └──────────┘
▲ 原有有线通道(UART2→Loop + ETH/MQTT) 仍保留, 4G 为兜底
- 上行: vd960DBN 组 JSON 帧 → UART1 → 4G 校验/拆帧 → MQTT publish
dld960/{sn}/dev - 下行: 4G 订阅
dld960/{sn}/srv→ 收到 JSON → 组帧 → UART1 → vd960DBN - JSON 命令面与《DLD960_IoT_MQTT协议》V1.10 完全一致,平台侧无感
2 协议设计决策(4G 是否需要单独协议?)
结论: 要,但以"适配协议"形式——命令面复用、网络类裁剪、4G 特有扩展,不出第二套业务协议。
| 层面 | 决策 | 理由 |
|---|---|---|
| 上行 JSON(initialize/loop_data/event_report/heartbeat/响应) | 100% 复用主协议 | 平台按《DLD960_IoT_MQTT协议》统一收,有线/4G 双通道无差别 |
| 核心下行(report_config/pwd_verify/loop_param_/log_/ota_*/device_reset) | 复用,4G 做 UART 透传 | 4G 只做桥,命令由 vd960DBN 处理,平台命令面不变 |
| 网络配置类(ssc_net_set/query、iot_net_set/query、iot_topic_set/query) | 4G 通道不适用,返回 code=4 | 4G 接入网是运营商 SIM 网络,APN/主题由 4G 侧管,与 DBN 有线网络参数无关 |
| 4G 特有状态(SIM/信号/注册/IMEI/固件版本/链路状态) | 新增命令(4G 侧自答,不进 UART) | 平台需要区分"有线通/4G 通/都不通",4G 状态是兜底通道健康度关键 |
| 通道切换策略 | 新增 | 有线优先 / 4G 兜底 / 心跳超时切换,由 vd960DBN 侧决策(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 / 命令响应)注入:
{
"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.luaCFG_LINK_ENABLE
3 UART 链路帧协议(设计稿 v0.1)
帧 = [HEAD 0x7D] [LEN_H] [LEN_L] [PAYLOAD...] [SUM]
- HEAD: 0x7D(与 DBN↔Loop 的 0x7F 帧区分,4G 链路独立魔数)
- LEN: uint16 大端, PAYLOAD(JSON) 字节数, ≤2048
- SUM: uint8 累加和(HEAD+LEN_H+LEN_L+PAYLOAD 全字节取低 8 位)
- 双向对称
- 为什么不用 0x7F 帧: 0x7F 帧 LEN 上限 56B,装不下 MQTT JSON(loop_data 数百字节)
- 为什么 2B 长度: 覆盖 OTA 大分片、log_query 快照流(hex 128B)等长报文
- 状态机按 LEN 精确吃字节,payload 内 0x7D 不影响同步;SUM 失败/超长 → 丢帧
4 文件结构
vd960Air/
├── main.lua # 入口: 加载 config/看门狗/4G网卡/uart_app/mqtt_main
├── 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/
├── mqtt_main.lua # MQTT 客户端(单路, 主题改 dld960/{sn}/srv + dev)
├── mqtt_receiver.lua # 下行 → RECV_DATA_FROM_SERVER(去掉演示前缀)
└── mqtt_sender.lua # 上行队列 + publish(去掉演示前缀)
5 vd960DBN 对接要点
- vd960DBN 串口1: CH32V208 PB6(PB6=TX?)、PB7(RX),TTL 电平
- 波特率: 115200(官方 demo 默认;vd960DBN UART1 预留口速率待确认)
- vd960DBN 侧需要新增: UART1 帧收发 + JSON 组包/解析的"4G 通道"适配(与现有 TCP/MQTT 双栈并列的第三通道,见《DLD960_IoT_MQTT协议》4G 适配章节)
- 8N1,无流控(帧协议自带长度+校验,无需硬件流控)
6 决策记录 & 待确认清单
已决策(用户 2026-08-31)
- 波特率: UART1 默认 115200,后续如需再调(config.lua)
- dev_serial: 采用与有线通道同一序列号(Topic 族一致,平台认同一台设备);config.lua 配置,部署时与 vd960DBN 保持一致
- 4G 特有字段: 上行注入
link对象(IMEI/ICCID/IMSI/MSISDN/CSQ),平台按 §2.1 解析 - 协议并入主协议: 4G 适配作为《DLD960_IoT_MQTT协议》章节,4G 特有部分(link 字段/不支持命令/4G 状态命令)单独标注
待确认(等开发文档/板级验证)
- vd960DBN UART1 帧格式是否按 §3 设计稿(0x7D 帧),或用户文档另有规定
- dev_serial 获取方式: config 写死 vs UART 握手动态下发(当前 config 写死)
- MQTT 服务器地址/端口/TLS、鉴权方式(平台为准)
- 4G 特有命令清单(如
4g_status_query/link_status_report)是否纳入主协议 4G 章节 - 通道切换策略: 有线失效判定、4G 启用条件、回切策略
- 心跳: 4G 通道 heartbeat 间隔/内容是否与有线一致
- OTA: 4G 通道是否需要支持 Loop/DBN OTA(4G 下行分片经 UART 转发可行性)
7 开发计划(基于官方 demo/mqtt 骨架)
| 阶段 | 内容 | 状态 |
|---|---|---|
| P0 | 工程骨架 + 帧协议 + MQTT 单路桥接(本工程) | ✅ 骨架完成 |
| P1 | 协议适配文档(4G 章节) + vd960DBN 侧 UART1 通道 | ⏳ 待文档 |
| P2 | 板级联调: 帧校验、背压、掉线重连、看门狗 | ⏳ 待板 |
| P3 | 4G 状态上报 + 通道切换 + 脱机日志/OTA 走 4G | ⏳ 规划 |
基底来源: 合宙官方 Air780EPM demo/mqtt(main.lua / uart_app.lua / mqtt/* / network_watchdog / netdrv_device),MIT 许可。