hostdemo: pure SL-style broadcast RDM discovery (drop hardcoded bench fixture UIDs; HOSTDEMO_KNOWN optional)
This commit is contained in:
parent
a1d709a62a
commit
ab8090be79
|
|
@ -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);
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user