diff --git a/src/hostdemo.rs b/src/hostdemo.rs index f50d3e7..3cdbd82 100644 --- a/src/hostdemo.rs +++ b/src/hostdemo.rs @@ -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);