docs/adr/ADR-055-integrated-sensing-server.md
Accepted
The RuView Desktop application (ADR-054) requires the WiFi sensing server to provide real-time CSI data, activity detection, and vital signs monitoring. Currently, the sensing server is a separate binary (wifi-densepose-sensing-server) that must be installed separately and found in the system PATH.
This creates several problems:
Bundle the sensing server binary inside the desktop application and provide intelligent binary discovery with clear fallback paths.
The desktop app searches for the sensing server in this order:
server_path)Contents/Resources/bin/ on macOS)fn find_server_binary(app: &AppHandle, custom_path: Option<&str>) -> Result<String, String> {
// 1. Custom path from settings
if let Some(path) = custom_path {
if std::path::Path::new(path).exists() {
return Ok(path.to_string());
}
}
// 2. Bundled in resources
if let Ok(resource_dir) = app.path().resource_dir() {
let bundled = resource_dir.join("bin").join(DEFAULT_SERVER_BIN);
if bundled.exists() {
return Ok(bundled.to_string_lossy().to_string());
}
}
// 3. Next to executable
if let Ok(exe_path) = std::env::current_exe() {
if let Some(exe_dir) = exe_path.parent() {
let sibling = exe_dir.join(DEFAULT_SERVER_BIN);
if sibling.exists() {
return Ok(sibling.to_string_lossy().to_string());
}
}
}
// 4. System PATH
// ... which lookup ...
Err("Sensing server binary not found")
}
In tauri.conf.json:
{
"bundle": {
"resources": [
{
"src": "../../target/release/wifi-densepose-sensing-server",
"target": "bin/wifi-densepose-sensing-server"
}
]
}
}
The Sensing page connects to the bundled server's WebSocket endpoint:
ws://127.0.0.1:{ws_port}/ws/sensing - Real-time CSI data streamws://127.0.0.1:{ws_port}/ws/pose - Pose estimation streamMessage format:
interface WsSensingUpdate {
type: string;
timestamp: number;
source: string;
tick: number;
nodes: WsNodeInfo[];
classification: { motion_level: string; presence: boolean; confidence: number };
vital_signs?: { breathing_rate_hz?: number; heart_rate_bpm?: number };
}