Files
mobile_comm/luatos/air780epm/module/Air780EPM/demo/vd960Air/readme.md
T
wangfq 8911b04df2 feat(vd960Air): Air8781P 4G UART<->MQTT 桥接工程骨架
基于官方 Air780EPM demo/mqtt 骨架创建 vd960Air 工程:
- 目标: vd960DBN 有线网络失效时,经 Air780EPM 4G 兜底上报
- UART1(115200 8N1)对接 vd960DBN CH32V208 串口1 PB6/PB7
- MQTT 主题按《DLD960_IoT_MQTT协议》V1.10: 订阅 dld960/{sn}/srv, 发布 dld960/{sn}/dev
- 帧协议(设计稿 v0.1): [0x7D][LEN_H][LEN_L][JSON][SUM], 双向对称, ≤2048B
- 上行: DBN JSON 帧 → 4G 校验拆帧 → MQTT publish(JSON 命令面与有线完全一致)
- 下行: MQTT 订阅 → 组帧 → UART1 下发 DBN
- 改造: config.lua 集中配置 / 去掉官方 demo 的 "send from" 演示前缀 / 单路 MQTT
- readme: 架构、协议设计决策(4G 适配协议=命令面复用+网络类裁剪+4G特有扩展)、待确认清单
2026-08-31 11:35:22 +08:00

5.7 KiB

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协议》的 "4G 通道适配"章节(或独立附录),标注:

  • 不支持的命令清单(ssc_net_* / iot_net_* / iot_topic_* 等,4G 通道返回 code=4)
  • 新增 4G 特有命令(如 4g_status_query / link_status_report)
  • UART 链路帧格式(本工程 §3)
  • 与主协议共享的 JSON 结构,平台侧零改动

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/帧参数
├── uart_app.lua          # UART1 <-> vd960DBN 帧协议(接收状态机 + 下行组帧)
├── 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 待确认清单(等开发文档/板级验证)

  • vd960DBN UART1 波特率、帧格式是否按 §3 设计稿(或用户文档另有规定)
  • 设备序列号 dev_serial 来源: config.lua 写死 vs UART 握手动态下发
  • MQTT 服务器地址/端口/TLS、鉴权方式(平台为准)
  • 4G 特有命令清单与"不支持命令返回 code=4"是否纳入主协议文档
  • 通道切换策略: 有线失效判定、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 许可。