enet-validator/docs/hostdemo_recap_2026-09-10.md
OpenCode 9995335d74 feat: show mode for standalone 1-32 rainbow DMX + RDM status polling
- Merge show/hybrid paths: use dmx_a template for DMX payload and replay-extracted SL frame skeleton for RDM.
- HOSTDEMO_MODE=show runs indefinitely when secs=0; wave period slowed for smoother breathing.
- Update README with show mode usage.
2026-09-11 12:03:43 +08:00

81 lines
3.8 KiB
Markdown
Raw Permalink 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.

# hostdemo 攻坚总结 — 真机 Butler .1 主机侧仿真全链路打通
**日期**:2026-09-10 晚 ~ 09-11 凌晨
**结论**:✅ 认领 + RDM 设备发现(3/3)+ DMX 呼吸控制(灯光肉眼确认)
**代码**:`HOSTDEMO_MODE=slfull`(src/hostdemo.rs),commit fcb20a7/3056a69
---
## 一、最终工作配方
```
1. 发现: type=1 (180B) → 217B 应答
2. 认领: announce144 (=102B 身份帧) 单播 → 47B 注册应答
→ AECH 质询 (nonce/B12 自选随机) → AERE = G(nonce) ✓
3. 循环 verbatim 重放 SL 真实会话帧流 (32540 帧 / 126.7s):
- DMX 数据帧: 保留 SL 原帧全部结构, 仅替换 r1/r2 + 密文段
(呼吸图案用本次认领的 B12 重加密 → Butler 解密上灯)
- RDM 请求: SL 原帧原样 (UN_MUTE / UNIQUE_BRANCH / GET, ff+fe 成对)
4. 被动解码应答: DISC 脉冲 → UID; DEVICE_INFO / START_ADDRESS → DMX 地址
```
**实测**:3/3 灯具发现(NFS1K2D@101/2ch、NFM680S@123、HMKJ@1/32ch,
应答 15.5k 帧)+ 三色异相呼吸(fade-in),**灯光肉眼确认**。
运行方式:
```
set HOSTDEMO_MODE=slfull
set REPLAY_FILE=<重放清单.txt> (tshark 提取: time|dst|dstport|payload)
enet-validator hostdemo 192.168.123.1 480
```
---
## 二、假设-证伪链(当晚完整过程)
| # | 假设 | 实验 | 结果 |
|---|---|---|---|
| 1 | 认领后需长前奏 | 45s discovery/announce 广播 | ❌ 无效 |
| 2 | 需要 sub=07 绑定帧 | 按实测节奏重放 ×4 | ❌ 无效 |
| 3 | 宣告时间戳过期被拒 | live 模板 + 新鲜时间戳 | ❌ 无效 |
| 4 | 会话保持 ~2h 需等待 | 45→86 分钟轮询探针 | ❌ 超时后仍拒 |
| 5 | 1947 密钥/EUCE 6s 节奏门控 | 会话内补发 | ❌ 单独无效 |
| 6 | RDM 帧字段差异 | 模板 vs 实帧 0 差异 | ❌ 排除 |
| 7 | **verbatim 重放二分** | 阶段 A(无认领)/B(先认领) | ✅ **B 全通** |
**教训**:帧级逐字节比对全通过后仍被拒时,问题在会话状态层——
用 verbatim 重放做二分是定位此类问题的最快路径。
---
## 三、深层发现(已写入协议文档 §3.7/§11.7)
1. **AECH 握手成功 ≠ 会话通道打通**:47B/AERE 全过但自构造 type=4 帧被静默丢弃;
verbatim 的 SL 历史帧立即全通 → Butler 在帧级校验某种会话一致性(规则未破解)。
2. **RDM 请求帧消息起始位置可变**:UN_MUTE@0x3A vs UNIQUE_BRANCH@0x3C
(前置 len16 字段浮动 2B)→ 固定偏移构造必被拒 → 重放绕过。
3. **announce144 == ident102**(同一帧两种称呼);真机冷启动序列:
广播前奏 → 身份帧 → 47B → AECH×3 → DMX+RDM(首应答延迟 ~1.4s 属正常)。
4. **1947 端口"密钥报文"** = 40B ASCII 许可令牌(安装级常量,双目标 21 帧 @200ms
每 ~34s 一轮);**EUCE** = 全程每 6s 的许可信标。
5. **灯具 MUTE 态跨会话持久**(SL 遗留 mute 挡后续 branch 查询)。
6. **密钥盘点**:nonce/B12 逐会话随机自主可控;G 表固定;1947 令牌安装级常量
(未做必需性消融)。详见协议文档 §3.7 密钥盘点表。
---
## 四、遗留事项
- [ ] RDM 帧变长结构规则(破解后可纯自构造帧发现,摆脱对 SL 原帧依赖)
- [ ] 1947 令牌必需性消融实验
- [ ] NFM680S 通道数应答漂移(2ch vs 1ch,疑查询时机差异)
- [ ] 会话级校验的具体算法(当前只知道"verbatim 能过")
## 五、产物清单
- 代码:`src/hostdemo.rs`(slfull/slclaim/sls/hybrid/replay 五模式)
- 重放清单:`replay_merged.txt`(sym_startup 101-520s + rdm3 全程,32540 帧)
- 抓包:`sym_startup.pcap`(认领+发现全程)、`sym_claim2.pcap`(接管+重启)、
`allports.pcap`(全端口,1947 发现)、`hd_claim3.pcap` 等
- 文档:`enet_protocol.md` §3.7/§11.7 本夜更新