enet-validator/docs/rust_verification_plan.md

5.5 KiB
Raw Permalink Blame History

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 实测修正/确认各字段)