rust-port/wifi-densepose-rs/crates/wifi-densepose-sensing-server/README.md
Lightweight Axum server for real-time WiFi sensing with RuVector signal processing.
wifi-densepose-sensing-server is the operational backend for WiFi-DensePose. It receives raw CSI
frames from ESP32 hardware over UDP, runs them through the RuVector-powered signal processing
pipeline, and broadcasts processed sensing updates to browser clients via WebSocket. A built-in
static file server hosts the sensing UI on the same port.
The crate ships both a library (wifi_densepose_sensing_server) exposing the training and inference
modules, and a binary (sensing-server) that starts the full server stack.
Integrates wifi-densepose-wifiscan for multi-BSSID WiFi scanning per ADR-022 Phase 3.
CsiFrame representation..rvf file with 64-byte aligned segments.std, no ML
dependencies.netsh integration for BSSID discovery via
wifi-densepose-wifiscan (ADR-022).ws://localhost:8765/ws/sensing.| Module | Description |
|---|---|
vital_signs | Breathing and heart rate extraction via FFT spectral analysis |
rvf_container | RVF binary format builder and reader |
rvf_pipeline | Progressive model loading from RVF containers |
graph_transformer | Graph Transformer + GCN for CSI-to-pose estimation |
trainer | Training loop orchestration |
dataset | Training data loading and batching |
sona | LoRA adapters and EWC++ continual learning |
sparse_inference | Neuron profiling, sparse matmul, INT8/FP16 quantization |
embedding | Contrastive CSI embedding model and fingerprint index |
# Build the server
cargo build -p wifi-densepose-sensing-server
# Run with default settings (HTTP :8080, UDP :5005, WS :8765)
cargo run -p wifi-densepose-sensing-server
# Run with custom ports
cargo run -p wifi-densepose-sensing-server -- \
--http-port 9000 \
--udp-port 5005 \
--static-dir ./ui
use wifi_densepose_sensing_server::vital_signs::VitalSignDetector;
// Create a detector with 20 Hz sample rate
let mut detector = VitalSignDetector::new(20.0);
// Feed CSI amplitude samples
for amplitude in csi_amplitudes.iter() {
detector.push_sample(*amplitude);
}
// Extract vital signs
if let Some(vitals) = detector.detect() {
println!("Breathing: {:.1} BPM", vitals.breathing_rate_bpm);
println!("Heart rate: {:.0} BPM", vitals.heart_rate_bpm);
}
ESP32 ──UDP:5005──> [ CSI Receiver ]
|
[ Signal Pipeline ]
(vital_signs, graph_transformer, sona)
|
[ WebSocket Broadcast ]
|
Browser <──WS:8765── [ Axum Server :8080 ] ──> Static UI files
| Crate | Role |
|---|---|
wifi-densepose-wifiscan | Multi-BSSID WiFi scanning (ADR-022) |
wifi-densepose-core | Shared types and traits |
wifi-densepose-signal | CSI signal processing algorithms |
wifi-densepose-hardware | ESP32 hardware interfaces |
wifi-densepose-wasm | Browser WASM bindings for the sensing UI |
wifi-densepose-train | Full training pipeline with ruvector |
wifi-densepose-mat | Disaster detection module |
MIT OR Apache-2.0