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)
|
Some(u)
|
||||||
})
|
})
|
||||||
.collect(),
|
.collect(),
|
||||||
_ => vec![
|
// SL 式流程不预置灯具地址: 未设 HOSTDEMO_KNOWN 时从空清单开始,
|
||||||
[0x01, 0x07, 0x34, 0x67, 0x01, 0x25],
|
// 灯具完全经广播 UN_MUTE + UNIQUE_BRANCH 二分发现获得。
|
||||||
[0x01, 0x07, 0x34, 0x88, 0x09, 0x00],
|
_ => vec![],
|
||||||
[0x08, 0x99, 0x50, 0x00, 0x26, 0xc9],
|
|
||||||
],
|
|
||||||
};
|
};
|
||||||
let start = Instant::now();
|
let start = Instant::now();
|
||||||
let mut di = 0usize;
|
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 qseq: u16 = 1;
|
||||||
let mut fixtures: Vec<[u8; 6]> = Vec::new();
|
let mut fixtures: Vec<[u8; 6]> = Vec::new();
|
||||||
{
|
{
|
||||||
// 4a) 先直查已知 UID 验证 RDM 代理通道 (灯具可能仍处 SL 会话留下的 MUTE 态)
|
// SL 式广播发现流程: 不预知灯具地址, 全部经 UN_MUTE 广播 +
|
||||||
let known: [[u8; 6]; 3] = [
|
// UNIQUE_BRANCH 二分发现 + 逐台 MUTE 收敛 (见下)。
|
||||||
[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)); }
|
|
||||||
}
|
|
||||||
// 先广播 DISC_UN_MUTE (PID=0003): 稳态下主机已把全部灯具 MUTE,
|
// 先广播 DISC_UN_MUTE (PID=0003): 稳态下主机已把全部灯具 MUTE,
|
||||||
// 被 MUTE 的灯具不应答 UNIQUE_BRANCH → 须先解除静音才能重新发现
|
// 被 MUTE 的灯具不应答 UNIQUE_BRANCH → 须先解除静音才能重新发现
|
||||||
tn = tn.wrapping_add(1);
|
tn = tn.wrapping_add(1);
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user