86 lines
5.5 KiB
Markdown
86 lines
5.5 KiB
Markdown
# 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 实测修正/确认各字段)
|