hostdemo: pure SL-style broadcast RDM discovery (drop hardcoded bench fixture UIDs; HOSTDEMO_KNOWN optional)

This commit is contained in:
Tony Cao 2026-09-14 00:44:55 +08:00
parent a1d709a62a
commit ab8090be79

View File

@ -519,11 +519,9 @@ pub fn run(target: &str, bind_ip: &str, secs: u64) {
Some(u)
})
.collect(),
_ => vec![
[0x01, 0x07, 0x34, 0x67, 0x01, 0x25],
[0x01, 0x07, 0x34, 0x88, 0x09, 0x00],
[0x08, 0x99, 0x50, 0x00, 0x26, 0xc9],
],
// SL 式流程不预置灯具地址: 未设 HOSTDEMO_KNOWN 时从空清单开始,
// 灯具完全经广播 UN_MUTE + UNIQUE_BRANCH 二分发现获得。
_ => vec![],
};
let start = Instant::now();
let mut di = 0usize;
@ -1387,38 +1385,8 @@ pub fn run(target: &str, bind_ip: &str, secs: u64) {
let mut qseq: u16 = 1;
let mut fixtures: Vec<[u8; 6]> = Vec::new();
{
// 4a) 先直查已知 UID 验证 RDM 代理通道 (灯具可能仍处 SL 会话留下的 MUTE 态)
let known: [[u8; 6]; 3] = [
[0x01, 0x07, 0x34, 0x67, 0x01, 0x25], // NFS1K2D DMX101
[0x01, 0x07, 0x34, 0x88, 0x09, 0x00], // NFM680S DMX112
[0x08, 0x99, 0x50, 0x00, 0x26, 0xc9], // HMKJ DMX1-32
];
println!("[4a] 直查已知 UID (GET DEVICE_INFO):");
for uid in &known {
tn = tn.wrapping_add(1);
let f = build_rdm_frame(uid, tn, qseq, 0x20, 0x0060, &[]);
qseq += 1;
sock.send_to(&f, &dst).unwrap();
let w = Instant::now();
let mut ok = false;
while w.elapsed() < Duration::from_millis(400) {
if let Ok((n, src)) = sock.recv_from(&mut buf) {
if src.ip().to_string() != target { continue; }
let b = &buf[..n];
if let Some((false, d)) = rdm_region(b) {
if d.len() >= 0x18 + 19 && d[0] == 0xCC && d[0x15..0x17] == [0x00, 0x60] {
let a = u16::from_be_bytes([d[0x18 + 14], d[0x18 + 15]]);
let footprint = u16::from_be_bytes([d[0x18 + 10], d[0x18 + 11]]);
println!(" ★ {} → DMX地址 {} / {}通道", uid_s(uid), a, footprint);
if !fixtures.contains(uid) { fixtures.push(*uid); }
ok = true;
break;
}
}
}
}
if !ok { println!(" {} → 无应答", uid_s(uid)); }
}
// SL 式广播发现流程: 不预知灯具地址, 全部经 UN_MUTE 广播 +
// UNIQUE_BRANCH 二分发现 + 逐台 MUTE 收敛 (见下)。
// 先广播 DISC_UN_MUTE (PID=0003): 稳态下主机已把全部灯具 MUTE,
// 被 MUTE 的灯具不应答 UNIQUE_BRANCH → 须先解除静音才能重新发现
tn = tn.wrapping_add(1);