hostdemo: auto source IP (arg4/HOSTDEMO_SRC), guard rdm_region rlen=0 telemetry frames

This commit is contained in:
Tony Cao 2026-09-12 00:44:42 +08:00
parent a1c413618c
commit 5a68237091
2 changed files with 16 additions and 4 deletions

View File

@ -200,7 +200,8 @@ fn rdm_region(b: &[u8]) -> Option<(bool, &[u8])> {
if g16(b, 0x18) != 0x0002 { return None; } if g16(b, 0x18) != 0x0002 { return None; }
if &b[0x1A..0x1E] != b"Butl" { return None; } if &b[0x1A..0x1E] != b"Butl" { return None; }
let rlen = g16(b, 0x28) as usize; let rlen = g16(b, 0x28) as usize;
if b.len() < 0x2A + rlen { return None; } // rlen=0 = 42B 事件计数遥测帧 (真机有事件时 ~115ms 一帧), 非 RDM 载荷
if rlen == 0 || b.len() < 0x2A + rlen { return None; }
let d = &b[0x2A..0x2A + rlen]; let d = &b[0x2A..0x2A + rlen];
Some((d[0] == 0xAA, d)) Some((d[0] == 0xAA, d))
} }

View File

@ -170,11 +170,22 @@ fn main() {
return; return;
} }
"hostdemo" => { "hostdemo" => {
// hostdemo [目标IP] [秒] — 主机侧等效示例: 认领真机 + RDM 发现 + 加密 DMX 控制 // hostdemo [目标IP] [秒] [源IP] — 主机侧等效示例: 认领真机 + RDM 发现 + 加密 DMX 控制
// 源 IP 固定 192.168.123.113 (真机 .1 的 AECH 固件过滤); 秒=0 只做认领+RDM 不发 DMX // 源 IP: 第4参 > HOSTDEMO_SRC env > 自动探测 (UDP connect 本地地址) > 0.0.0.0。
// 旧台架固定 192.168.123.113 (真机 .1 的 AECH 固件过滤); 仿真端不过滤, 自动探测即可
let ip = std::env::args().nth(2).unwrap_or_else(|| "192.168.123.1".into()); let ip = std::env::args().nth(2).unwrap_or_else(|| "192.168.123.1".into());
let secs: u64 = std::env::args().nth(3).and_then(|s| s.parse().ok()).unwrap_or(30); let secs: u64 = std::env::args().nth(3).and_then(|s| s.parse().ok()).unwrap_or(30);
hostdemo::run(&ip, "192.168.123.113", secs); let bind_ip = std::env::args().nth(4)
.or_else(|| std::env::var("HOSTDEMO_SRC").ok())
.unwrap_or_else(|| {
if let Ok(s) = std::net::UdpSocket::bind("0.0.0.0:0") {
if s.connect(format!("{}:31772", ip)).is_ok() {
if let Ok(a) = s.local_addr() { return a.ip().to_string(); }
}
}
"0.0.0.0".into()
});
hostdemo::run(&ip, &bind_ip, secs);
return; return;
} }
"analyze" => { "analyze" => {