docs: 新增《DLD960_IoT_MQTT协议》§6.9 4G 配置同步(V1.14),0x7D 帧方案作废

- 协议 §6.9:BLE→DBN→Air780 配置同步(权威源 / 载体 0x8F / 命令复用 / 载荷拆两条 /
  拉取为主+推送为辅 / 明确不同步项 / 异常处理 / 实施状态)
- 版本 V1.13 → V1.14,修订记录加行(插 V1.13 前);§6.6 增补充说明
- 行尾:全文纯 LF,改动零行尾污染
- devlog:新增 2026-09-10 条目(结论 + 6 条代码事实级硬约束 + 文件改动 + 待办)
This commit is contained in:
wangfq
2026-09-10 21:46:00 +08:00
parent c879ed04e2
commit 2044efe14f
2 changed files with 231 additions and 2 deletions
+57
View File
@@ -4,6 +4,63 @@
>
> 项目定位: DLD960 通信板 — BLE 配网、TCP JSON 协议服务、Loop MCU 串口桥接
## 2026-09-10 — 4G 配置同步协议定稿(《DLD960_IoT_MQTT协议》§6.90x7D 作废)
> 用户需求 2026-09-10:蓝牙小程序读写网络配置指令,哪些需要同步/转发给 4G(服务器域名/IP、端口、MQTT 账号密码、主题等)。
> **关闭**V1.12 条目"vd960DBN 侧开发计划"第 3 条(BLE 设置服务器/topic 时同步下发 Air780 配置);Air780 readme §2.2 / §3 的 0x7D 帧设计稿。
### 结论(协议 §6.9 定稿)
**权威源规则**:配置权威源 = **DBN 侧 flash**`IOT_NET_INFO` / `IOT_Topic``cfig_flash.c` 持久化)。
Air780 侧 fskv **仅作启动缓存**,唯一合法写入者 = **收到的 DBN 配置帧**;平台经 4G 下发配置一律拒绝
(§6.6 回 `code=4`)——**BLE 是网络配置的唯一入口**,故同步不是可选优化,是 4G 通道能否工作的前提。
**载体**:复用 **0x8F 本机侧私有帧**(与 BLE 侧 `MAGIC_BYTE_DBN_DEFAULT` 同值)。语义自洽:
`0x7F` = 业务帧(转发 UART2/Loop),`0x8F` = 链路两端本机侧私有(各自本地消费,不转发)。
| 项 | 定稿 |
|----|------|
| 命令 | 复用 BLE 侧既有命令码:`0x14`(GET_IOT_NET) / `0x16`(GET_IOT_TOPIC),双向对称(请求 DATA 空,应答带载荷) |
| 载荷 | 复用 DBN 侧 `set_response_iot_net()` / `set_response_iot_topic()` 构造器 → **与 BLE 读响应逐字节同源**,零新增序列化代码 |
| 拆分 | net / topic **两条独立帧 + 两条 fskv 记录**net 最坏 229B、topic 129B,均 < fskv 单值 255B 上限) |
| 交互 | **拉取为主**Air780 上电先读 fskv 立即连,链路建立后拉权威值校准)+ **推送为辅**(BLE 写成功后链路可用则立即推) |
| 状态 | DBN **不维护"待同步"标志位**:推送时链路不可用则等 Air780 下次拉取(无状态,天然自愈) |
| 同步项 | 核心 8 项:`remote_addr` / `mqtt_port` / `client_id` / `username` / `password` / `clientid_enable` / `topic_pub` / `topic_sub` |
| 边界项 | `UPDATE_DEV_SERIAL`(0x09) 必同步(Topic 族与 JSON `sn` 均由序列号派生);`iot_enable`sub_code 0x22)必同步;`RW_UART_BAUD` **禁止在线改 UART1** |
| 同步载荷不含 | `IOT_NET_INFO.mode`:实测**无 BLE 写入路径**、恒为 `0``IOT_Addr_IP_Mode`),仅 DBN 有线 MQTT 读取;Air780 侧按主机串自行判别(LuatOS `socket.connect` 对 IP/域名均兼容) |
### 勘察中发现的硬约束与隐患(均为代码事实)
| # | 发现 | 处置 |
|---|------|------|
| 1 | **`usart_biz.c` 帧缓冲 `uart1_rx_frame[LUP_MAX_PKG_LEN]` = 70B** → 单帧载荷上限 64B**装不下 net 最坏 229B**,会被按 "LEN 非法" 丢弃 | `0x8F` 帧长上限**独立放宽到 260B**LEN 1B ≤255);`0x7F` 业务帧维持 70B 纪律。**两侧帧缓冲需同步扩容** |
| 2 | `iot_net_info` **是两条传输通道共享**的:`peripheral_main.c:248` 用它走 **DBN 自身 WCHNET 有线 MQTT**`WCHNET_CreateTcpMqttSocket()`) | 更须保证 DBN 为唯一权威源 |
| 3 | 该处 `else //DNS` **空分支** → 配置成域名时**有线通道 MQTT 不工作**(4G 不影响) | 已知缺口,是否补齐由产品决定(协议 §6.9.8 已标注) |
| 4 | `CMD_DBN_RW_UART_BAUD` 可改**任意串口**波特率,含 UART1 这条 4G 链路 → 在线改而两侧不同步 = 永久失联,只能拆机重刷 | 建议固件侧对 `uart_num == 1` **直接拒绝** |
| 5 | Air780 侧 `mqtt_main.lua` 在 require 期把配置读进 `local`,**运行时改 CFG 不生效** | 须改造为**重连时重读** + 断开重连重订阅 |
| 6 | Air780 **已支持 fskv 持久化**`components/fskv/`littlefs**掉电不丢**key ≤64B / 单值 ≤255B,见官方 `demo/fskv`);原设计稿 §2.2 即已指向 fskv | 用作启动缓存;**仅在值变化时写入**(littlefs 擦写磨损) |
### 文件改动(文档口径)
| 文件 | 改动 |
|------|------|
| `docs/DLD960_IoT_MQTT协议.md` | **+§6.9「4G 配置同步」**(9 个子节:背景与权威源 / 帧格式 / 命令 / 载荷 / 交互流程 / 其他触发命令 / 明确不同步项 / 异常处理 / 实施状态);§6.6 增补充说明;版本 V1.13→**V1.14**;修订记录加行 |
| `docs/DLD960_IoT_MQTT协议.md` | 行尾核查:全文**纯 LF**(非 CRLF),改动按 LF 落盘,零行尾污染 |
| vd960Air `readme.md` | §2.2 重写为权威源 + 拉取/推送设计;**§3「0x7D 帧设计稿 v0.2」整节作废**,改写为「0x7F 业务帧 + 0x8F 本机侧私有帧」定稿;3.1 对比表改成 0x7F vs 0x8F;待确认项/开发计划 P1 同步更新 |
| vd960Air `uart_app.lua` / `config.lua` | 注释中的 0x7D 计划改为 0x8F 配置同步 |
**历史记录不动**devlog V1.11/V1.12 条目、协议 V1.11 修订行中的 0x7D 描述均保留(记录彼时决定)。
### 待办(协议已定稿,两侧待实现)
- [ ] DBN0x8F 配置请求**应答**(读 flash → 组帧)+ BLE 写成功后**主动推送**
- [ ] DBN`uart1_rx_frame` 扩容至 260B(含 TX 侧缓冲)
- [ ] DBN`RW_UART_BAUD` 拒绝 `uart_num == 1`
- [ ] Air780`frame_parser.lua``0x8F` 分支(本地消费,不转发)
- [ ] Air780fskv 缓存 + 上电即连 + 拉取校准 + 变化重连;配置读取改为重连时重读
- [ ] Air780`config.lua` 明文凭据处置(改占位符 + 非跟踪文件读取;⚠ 已在 git 历史中,商用前须换号)
## 2026-09-10 — vd960DBN UART1 ↔ Air780 4G 通道实现(协议 §6.1 纯透传)
> 用户需求 2026-09-10:把 vd960DBN 与 vd960Air(Air780) 两侧的串口对接逻辑做出来 —— DBN 侧 UART1(PB6/PB7) 通道 + UART2↔UART1 双向透传。