enet-validator/docs/rust_verification_plan.md

86 lines
5.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# e:net 协议 Rust 独立验证程序 —— 实施计划
> 目标:关闭 SymphoLight 5.5,用 Rust 程序独立扮演 e:cue 主机,按《enet_protocol.md》
> 对每一条协议做**实测验证**(连接真机 Butler S2 192.168.123.1,以其真实应答为判据)。
---
## 0. 前置条件
| 项 | 动作 | 状态 |
|----|------|------|
| P1 | 关闭 SymphoLight 5.5(PID 检查 + Stop-Process) | 待执行 |
| P2 | 确认 Butler 在线(ping 192.168.123.1) | 已通 |
| P3 | 网口"以太网 3" = 192.168.123.113/24(Rust 程序绑定此地址) | 已确认 |
| P4 | 抓包样本齐备(discovery/dmx40s/rdm3 classic pcap)用于报文参数提取 | 已有 |
| P5 | 注意:SymphoLight 关闭后 Butler 回落 standalone 播 SD show(DMX 输出仍活动),Rust 程序需完成"发现→认领"接管 | 已知 |
---
## 1. 技术选型与工程结构
```
enet-validator/
├── Cargo.toml # clap(CLI) anyhow hex rand;(无 async,std::net::UdpSocket 足够)
├── src/
│ ├── main.rs # 子命令入口:discover / dmux / session / rdm / all
│ ├── enet.rs # ENet 帧构造/解析(§2 通用头:magic+type+port+len)
│ ├── discovery.rs # §3:type=01 发现请求/应答解析、宣告帧、type=02 心跳、EUCE 帧
│ ├── dmx.rs # §4.1:形态A DMX 帧(60B头+1024B通道,序号0x1A、时间戳0x22)
│ ├── event.rs # §4.2-4.4:形态B 事件帧、ACK 配对、状态帧解析
│ ├── rdm.rs # §5:RDM 事件帧封装(0x4A cc01)、应答解析(0x28长度+cc01)、UID/TN
│ └── report.rs # 验证报告输出(JSON + 控制台 PASS/FAIL)
└── samples/ # 从 pcap 提取的基准报文(hex 常量,参数化模板)
```
报文构造策略:**以实测样本为模板**(非凭空拼字段)——从 pcap 提取 222B 发现请求、
686B 宣告、1126B DMX 帧、1126B 事件帧的原始字节,替换可变字段(序号/时间戳/通道值)。
---
## 2. 验证项分解(对应协议文档章节,判据=Butler 实际行为)
| ID | 协议条目(文档章节) | 程序动作 | PASS 判据 |
|----|---------------------|----------|-----------|
| T1 | 发现请求 222B 广播(§3.1→§3.2) | 发 type=01 请求 → 监听 31772 | 收到 259B 应答;含 ASCII "Butler S2"、MAC `00:16:1c:f1:2e:39`、负载长字段 0xD9 ✓ |
| T2 | 主机宣告 686B(§3.3) | 发 type=01 宣告(主机名GUID/时间/密钥材料按模板) | 不破坏会话;后续 Butler 状态流正常 |
| T3 | type=02 心跳 78B(§3.4) | 发主机 IP+MAC 标识帧 | 同上,无异常 |
| T4 | EUCE 帧 582B(§3.5) | 发 EUCE 魔数帧(版本05@0x0C) | 同上(观察性验证) |
| T5 | DMX 数据帧(§4.1) | 按 A·B·B 节奏发形态A:序号 0x1A 递增、0x22 时间戳变化、0x3C 起 1024B 通道值(先全0→渐变图案) | Butler 持续 ACK/状态应答(不回落 standalone);7 段显示离开 standalone |
| T6 | 事件帧 + ACK 配对(§4.2/4.3) | 每帧 DMX 配 2 事件帧,记录事件序号 0x22 与 ACK 序号 0x20 | ACK 配对率 ≥95%;序号规律与文档一致 |
| T7 | 状态帧解析(§4.4) | 被动接收 171-247B 状态帧 | 长度字段 0x14 自洽率 100%;"Butl"前缀 100% |
| T8 | 会话保持(§6) | 持续会话 ≥60s | 全程无中断;通道值变化(全0↔全255↔渐变)期间 ACK 持续 |
| T9 | 回落行为(§6 注) | 停发 10s 后观察 | Butler 回落 standalone(状态帧模式变化)→ 再恢复会话成功 |
| T10 | RDM 应答解析(§5.1-5.2) | 主动监听(若 Butler 已 Enable RDM)或发送 RDM 请求事件帧(0x4A cc01 模板) | 收到 cc01 起始帧;0x28 长度自洽;提取灯具 UID |
| T11 | 写地址探索(§5.4) | 在 RDM 请求模板中尝试标准 PID 0x0330 SET 与私有 PID 0x2100 族 | 观察 Butler 是否下发 RDM 应答(记录 PID 行为,产出逆向数据) |
判据统一由程序自动记录(报文 hex + 时间戳 + PASS/FAIL),输出 `validation_report.json`。
---
## 3. 执行阶段
- **阶段0 准备**(P1-P5):关 SymphoLight、(可选)抓 10s standalone 对照流量存档。
- **阶段1 骨架**:Rust 工程 + pcap 样本提取器(PowerShell 导出基准 hex 常量)。
- **阶段2 单向验证**:T1→T2/T3/T4(每项独立子命令,互不依赖)。
- **阶段3 会话验证**:T5→T6→T7→T8(核心:接管 Butler,验证 DMX/ACK/状态全链路)。
- **阶段4 行为验证**:T9 回落与恢复。
- **阶段5 RDM 探索**:T10/T11(可选,依赖 Butler RDM 端口已启用状态)。
- **阶段6 报告**:validation_report.json + 更新 enet_protocol.md(修正/补充实测发现)。
## 4. 风险与对策
| 风险 | 对策 |
|------|------|
| Butler 在 standalone 播 show 干扰观察 | T5 认领成功即接管 DMX;必要时临时拔 SD 卡(用户决定) |
| DUT(ESP32-P4) 仍在总线上 | 验证前确认 DUT 状态:保持暂停(download mode)或已恢复;勿冲突 |
| 报文字段拼错导致 Butler 无响应 | 全部以 pcap 样本为模板参数化;T1 失败时 diff 实发与样本 |
| 端口 31772 被占(SymphoLight 残留) | P1 确认进程退出;程序绑定失败即报错 |
| RDM 未启用时 T10/T11 无效 | 作为可选阶段,跳过不影响主结论 |
## 5. 交付物
1. Rust 工程(可执行 `enet-validator.exe`,子命令式)
2. `validation_report.json` + 控制台报告
3. `enet_protocol.md` 增补(以 Rust 实测修正/确认各字段)