From 5a68237091f78bf5a3a3aa707df647050abef0f0 Mon Sep 17 00:00:00 2001 From: Tony Cao Date: Sat, 12 Sep 2026 00:44:42 +0800 Subject: [PATCH] hostdemo: auto source IP (arg4/HOSTDEMO_SRC), guard rdm_region rlen=0 telemetry frames --- src/hostdemo.rs | 3 ++- src/main.rs | 17 ++++++++++++++--- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/src/hostdemo.rs b/src/hostdemo.rs index 75e1473..f50d3e7 100644 --- a/src/hostdemo.rs +++ b/src/hostdemo.rs @@ -200,7 +200,8 @@ fn rdm_region(b: &[u8]) -> Option<(bool, &[u8])> { if g16(b, 0x18) != 0x0002 { return None; } if &b[0x1A..0x1E] != b"Butl" { return None; } 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]; Some((d[0] == 0xAA, d)) } diff --git a/src/main.rs b/src/main.rs index f0118e7..73c6f16 100644 --- a/src/main.rs +++ b/src/main.rs @@ -170,11 +170,22 @@ fn main() { return; } "hostdemo" => { - // hostdemo [目标IP] [秒] — 主机侧等效示例: 认领真机 + RDM 发现 + 加密 DMX 控制 - // 源 IP 固定 192.168.123.113 (真机 .1 的 AECH 固件过滤); 秒=0 只做认领+RDM 不发 DMX + // hostdemo [目标IP] [秒] [源IP] — 主机侧等效示例: 认领真机 + 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 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; } "analyze" => {