121 lines
6.6 KiB
Markdown
121 lines
6.6 KiB
Markdown
# 下位机协议实现完备性分析
|
||
|
||
> **分析日期**: 2026-03-15
|
||
> **对照文档**: 采集端通信协议规范 v2.1.3 (2026-02-07)
|
||
> **分析对象**: prj/TCPClient 工程全部源码
|
||
|
||
## 前提说明
|
||
|
||
协议规范描述了 ZMQ PUB-SUB + JSON 架构,但实际 MCU 与配置端服务器之间已约定采用**自定义二进制 TLV 帧格式**(`0x55AA` Magic + CRC16-MODBUS)通过双 TCP 通道(5511 控制 / 5512 数据)通信。以下审计基于 TLV 协议层面进行。
|
||
|
||
---
|
||
|
||
## 一、接收端(服务器 → 下位机,控制通道 5511)
|
||
|
||
| # | 功能 | 状态 | 说明 |
|
||
|---|------|:----:|------|
|
||
| 1 | ConfigCommon 全量配置 | ✅ 已实现 | `TYPE_CONFIG_COMMON(0x20)` 完整解析 23 字节 |
|
||
| 2 | Config2D 全量配置 | ✅ 已实现 | `TYPE_CONFIG_2D(0x22)` 完整解析 61 字节全部字段 |
|
||
| 3 | Config1D 全量配置 | ✅ 已实现 | `TYPE_CONFIG_1D(0x23)` 完整解析 26 字节 |
|
||
| 4 | 设备 ID 分配 | ✅ 已实现 | `TYPE_DEVID_ASSIGN(0x05)` 解析后断线重连 |
|
||
| 5 | 判定结果接收 | ✅ 已实现 | `TYPE_DETECTION_RESULT(0x40)` → `detect_cb` 回调 NG/OK |
|
||
| 6 | 帧请求(截图/采集) | ✅ 已实现 | `TYPE_TEMP_FRAME(0x10)` 请求 → `temp_req_cb` 回调 |
|
||
| 7 | ACK 响应接收 | ✅ 已实现 | `TYPE_ACK_PAYLOAD(0x30)` 在 TLV 解析循环内可识别 |
|
||
| 8 | 部分参数更新 | ❌ 未实现 | 规范 §4.2.2 定义 `UpdateParameters` 键值点更新,无对应 TLV 类型 |
|
||
| 9 | 控制命令组 | ❌ 未实现 | Start/Stop/Pause/Resume/GetStatus/GetConfiguration/SwitchPipelineMode/ResetStats 共 8 个控制命令均无解析 |
|
||
| 10 | 文件传输 | ❌ 未实现 | 规范 §3.3.1 `{deviceId}/file` 无对应功能 |
|
||
| 11 | 时间同步 | ⚠️ 仅定义 | `TYPE_SYNC_TIME(0x03)` 已定义常量但未在 `parse_and_dispatch_tlv` 中处理 |
|
||
|
||
---
|
||
|
||
## 二、发送端(下位机 → 服务器,数据通道 5512)
|
||
|
||
| # | 功能 | 状态 | 说明 |
|
||
|---|------|:----:|------|
|
||
| 1 | 握手 | ✅ 已实现 | `TYPE_HANDSHAKE(0x01)` 连接后立即发送(UUID + 硬件/固件版本) |
|
||
| 2 | 心跳 | ✅ 已实现 | `TYPE_HEARTBEAT(0x02)` 每 2s 发送 UpTime + CpuLoad + MemUsage |
|
||
| 3 | ACK 应答 | ✅ 已实现 | `TYPE_ACK_PAYLOAD(0x30)` 响应带 `FLAG_ACK_REQ` 的帧 |
|
||
| 4 | 温度帧(2D 触发帧) | ✅ 已实现 | `TYPE_TEMP_FRAME(0x10)` 零拷贝发送 + 自动分片 |
|
||
| 5 | 原始帧上报 | ❌ 未实现 | `TYPE_RAW_FRAME(0x11)` 仅定义常量,无发送逻辑 |
|
||
| 6 | 设备注册 | ❌ 未实现 | 规范 §8.1 `DeviceRegisterEvent` 注册事件未发送 |
|
||
| 7 | 状态上报 | ❌ 未实现 | 规范 §5.3.5 定期 `AcquisitionStatusEvent` 未实现 |
|
||
| 8 | 命令处理回执 | ❌ 未实现 | 规范 §5.3.3 `ChangedEvent` 回执未实现 |
|
||
| 9 | Masked 帧 | ❌ 未实现 | 不区分 Triggered/Masked/Live 帧类型发送 |
|
||
|
||
---
|
||
|
||
## 三、核心处理逻辑
|
||
|
||
| # | 功能 | 状态 | 说明 |
|
||
|---|------|:----:|------|
|
||
| 1 | 2D 滑窗 ROI 提取 | ✅ 已实现 | 积分图 + 滑窗搜索最大平均温度区域,提取 TargetWidth × TargetHeight |
|
||
| 2 | 内部温度触发 | ✅ 已实现 | TriggerRoi 区域 Max/Avg vs TriggerTemperatureThreshold |
|
||
| 3 | Burst 连拍 | ✅ 已实现 | BurstCount + InternalIntervalMs 状态机 |
|
||
| 4 | NG GPIO 输出 | ✅ 已实现 | PA8 脉冲,宽度从 NGioDelay 配置读取 |
|
||
| 5 | 帧分片 | ✅ 已实现 | 超 1400B 自动分片,最后一片设置 FLAG_LAST_FRAGMENT |
|
||
| 6 | CRC16 校验 | ✅ 已实现 | 收发双向 CRC16-MODBUS 校验 |
|
||
| 7 | 自动重连 | ✅ 已实现 | 检测断线后 3s 重连双通道 |
|
||
| 8 | 阈值蒙版输出 | ⚠️ 部分 | 滑窗搜索时低温 → 90 替换,但规范要求**输出数据**中低于 MaskThreshold → 替换为 0 |
|
||
| 9 | 触发延迟 (DelayMs) | ✅ 已实现 | `burst_delay_pending` + `burst_delay_until_ms` 状态机实现,消抖后延迟再连拍 |
|
||
| 10 | 外部 GPIO 触发 | ✅ 已实现 | PA15/EXTI15 上升沿 EXTI 中断,`EXTI15_10_IRQHandler` + `burst_debounce_pending` 消抖 + `TriggerDelayMs` 延迟 |
|
||
| 11 | Alarm GPIO | ❌ 未实现 | AlarmGpioLine/AlarmHoldMs 字段已解析但无 GPIO 驱动 |
|
||
| 12 | 1D 数据采集处理 | ✅ 已实现 | `S1D_IDLE / S1D_DEBOUNCE / S1D_COLLECTING` 完整状态机,内/外部触发、预环形缓冲、切片、发送 |
|
||
| 13 | Training 模式 | ❌ 未实现 | 字段可解析但无训练采样功能 |
|
||
| 14 | 消抖 (DebounceIntervalMs) | ✅ 已实现 | 2D 外部触发消抖与 1D `HighTimerLimit` 均已实现 |
|
||
|
||
---
|
||
|
||
## 四、汇总统计
|
||
|
||
| 类别 | ✅ 已实现 | ⚠️ 部分 | ❌ 未实现 |
|
||
|------|:---------:|:-------:|:---------:|
|
||
| 接收(控制通道) | 7 | 1 | 3 |
|
||
| 发送(数据通道) | 4 | 0 | 5 |
|
||
| 处理逻辑 | 10 | 1 | 3 |
|
||
| **合计** | **21** | **2** | **11** |
|
||
|
||
---
|
||
|
||
## 五、优先级建议
|
||
|
||
### P0 — 必须补齐(影响基本功能验证)
|
||
|
||
1. **控制命令接收** — 至少实现 `StartAcquisition` / `StopAcquisition` / `GetStatus`,否则服务端无法控制采集启停
|
||
2. **状态上报** — 周期性上报运行状态给服务端,否则服务端无法监控设备健康
|
||
3. **触发延迟 (DelayMs)** — 简单改动,在触发检测到后 delay 再开始采集
|
||
4. **阈值蒙版输出** — 提取后的数据中 `val < MaskThreshold` → 替换为 0
|
||
|
||
### P1 — 高优先级(完善核心流程)
|
||
|
||
5. **外部 GPIO 触发** — 实际产线通常用外部触发信号
|
||
6. **Alarm GPIO** — 独立于 NG GPIO 的报警输出
|
||
7. **命令处理回执 (ChangedEvent)** — 服务端需要确认命令被执行
|
||
8. **设备注册事件** — 完整的上线握手流程
|
||
|
||
### P2 — 可延后
|
||
|
||
9. 1D 数据处理(如果当前只做 2D 热成像)
|
||
10. Training 模式
|
||
11. 文件传输
|
||
12. 原始帧/Masked 帧分类发送
|
||
13. 时间同步
|
||
14. 部分参数更新
|
||
|
||
---
|
||
|
||
## 六、涉及源文件清单
|
||
|
||
| 文件 | 职责 |
|
||
|------|------|
|
||
| `Middle/QDXnetworkStack/qdx_protocol.h` | 协议常量、TLV 类型定义、结构体 |
|
||
| `Middle/QDXnetworkStack/qdx_protocol.c` | CRC16、帧构建、序列化工具 |
|
||
| `Middle/QDXnetworkStack/qdx_tcp_logic.h` | TCP 逻辑层 API 声明 |
|
||
| `Middle/QDXnetworkStack/qdx_tcp_logic.c` | 双通道连接管理、TLV 解析/分发、心跳、帧发送 |
|
||
| `Middle/QDXnetworkStack/qdx_preprocess.h` | 预处理 API 声明 |
|
||
| `Middle/QDXnetworkStack/qdx_preprocess.c` | 滑窗 ROI、温度过滤、内部触发检测 |
|
||
| `Middle/QDXnetworkStack/qdx_port.h` | HAL 抽象层声明 |
|
||
| `Middle/QDXnetworkStack/qdx_port.c` | FreeRTOS + WCHNET HAL 实现 |
|
||
| `User/main.c` | 应用主逻辑:RTOS 任务、Burst 状态机、NG GPIO、测试模式 |
|
||
| `Debug/dvp.c` | DVP 图像采集驱动 |
|
||
| `Debug/mini212g2.c` | Mini212G2 传感器 UART 驱动 |
|