ruview @ v0.1.0-esp32
integrity
- size
- 106.1 MiB
- downloaded
- last checked
release notes
ESP32-S3 CSI Firmware v0.1.0
Pre-built firmware binaries for the ESP32-S3 CSI sensing pipeline (ADR-018).
Built from main with ESP-IDF v5.2 via Docker.
What's Included
| File | Size | Flash Address | Description |
|---|---|---|---|
bootloader.bin |
21 KB | 0x0 |
ESP32-S3 second-stage bootloader |
partition-table.bin |
3 KB | 0x8000 |
Flash partition layout |
esp32-csi-node.bin |
768 KB | 0x10000 |
CSI firmware — ADR-018 binary streaming over UDP |
provision.py |
— | — | NVS provisioning script (WiFi + network config) |
Quick Start (No Build Required)
1. Install esptool:
pip install esptool
2. Flash all three binaries:
python -m esptool --chip esp32s3 --port COM7 --baud 460800 \
--before default_reset --after hard_reset \
write_flash --flash_mode dio --flash_freq 80m --flash_size 4MB \
0x0 bootloader.bin \
0x8000 partition-table.bin \
0x10000 esp32-csi-node.bin
Replace COM7 with your serial port (/dev/ttyUSB0 on Linux, /dev/cu.usbserial-* on macOS).
3. Provision WiFi credentials (no rebuild needed):
python provision.py --port COM7 \
--ssid "YourWiFi" --password "YourPassword" \
--target-ip 192.168.1.20 --target-port 5005
4. Run the aggregator:
# From the wifi-densepose repo
cargo run -p wifi-densepose-hardware --bin aggregator -- --bind 0.0.0.0:5005 --verbose
Or use the Docker image:
docker run -p 3000:3000 -p 5005:5005/udp ruvnet/wifi-densepose:latest --source esp32
ADR-018 Binary Frame Format
Offset Size Field
0 4 Magic: 0xC5110001
4 1 Node ID
5 1 Number of antennas
6 2 Number of subcarriers (LE u16)
8 4 Frequency MHz (LE u32)
12 4 Sequence number (LE u32)
16 1 RSSI (i8)
17 1 Noise floor (i8)
18 2 Reserved
20 N*2 I/Q pairs (int8 pairs, n_antennas * n_subcarriers * 2)
Hardware Compatibility
| Board | Status | Notes |
|---|---|---|
| ESP32-S3-DevKitC-1 | Verified | Tested with CP2102 USB-UART |
| ESP32-S3-WROOM-1 | Expected | Same SoC |
| ESP32-S3-MINI-1 | Expected | Same SoC |
| ESP32 (classic) | Rebuild required | idf.py set-target esp32 |
| ESP32-C3 | Not supported | No CSI API |
Firmware Features
- WiFi STA + promiscuous mode for CSI capture on all management/data frames
- ADR-018 binary serialization with 20-byte header + raw I/Q payload
- UDP streaming to configurable aggregator (default
192.168.1.100:5005) - NVS runtime config — SSID, password, target IP/port, node ID
- ~20 Hz CSI frame rate (LLTF + HT-LTF + STBC HT-LTF2)
- 64-128 subcarriers per frame depending on bandwidth
- Automatic WiFi reconnection (up to 10 retries)
Firewall Note (Windows)
netsh advfirewall firewall add rule name="ESP32 CSI" dir=in action=allow protocol=UDP localport=5005
download
unix · zip
curl -fL -o v0.1.0-esp32.zip https://ratatoskr.space/pkg/ruview/v0.1.0-esp32.zip
printf '%s %s\n' '127dc97ff76e0684857933a43109d827acf171b8071e2fe1b24fb923625c8dd9' 'v0.1.0-esp32.zip' | sha256sum -c -
windows · zip
$url = "https://ratatoskr.space/pkg/ruview/v0.1.0-esp32.zip"
$out = "v0.1.0-esp32.zip"
Invoke-WebRequest -Uri $url -OutFile $out
if ((Get-FileHash $out -Algorithm SHA256).Hash.ToLowerInvariant() -ne "127dc97ff76e0684857933a43109d827acf171b8071e2fe1b24fb923625c8dd9") { throw "sha256 mismatch" }
unix · tar.gz
curl -fL -o v0.1.0-esp32.tar.gz https://ratatoskr.space/pkg/ruview/v0.1.0-esp32.tar.gz
printf '%s %s\n' 'dfbd6e4480fda0c40177b6b90020043a866d44df9dc0a98a5cba07a60888ac2d' 'v0.1.0-esp32.tar.gz' | sha256sum -c -
windows · tar.gz
$url = "https://ratatoskr.space/pkg/ruview/v0.1.0-esp32.tar.gz"
$out = "v0.1.0-esp32.tar.gz"
Invoke-WebRequest -Uri $url -OutFile $out
if ((Get-FileHash $out -Algorithm SHA256).Hash.ToLowerInvariant() -ne "dfbd6e4480fda0c40177b6b90020043a866d44df9dc0a98a5cba07a60888ac2d") { throw "sha256 mismatch" }
download via yggdrasil mesh
unix · zip
curl -fL -o v0.1.0-esp32.zip http://14cc7d57b5e70f679b851fe5b272ce17c70632ff4beb5b35ab64bc706b2485af.pk.ygg/pkg/ruview/v0.1.0-esp32.zip
printf '%s %s\n' '127dc97ff76e0684857933a43109d827acf171b8071e2fe1b24fb923625c8dd9' 'v0.1.0-esp32.zip' | sha256sum -c -
windows · zip
$url = "http://14cc7d57b5e70f679b851fe5b272ce17c70632ff4beb5b35ab64bc706b2485af.pk.ygg/pkg/ruview/v0.1.0-esp32.zip"
$out = "v0.1.0-esp32.zip"
Invoke-WebRequest -Uri $url -OutFile $out
if ((Get-FileHash $out -Algorithm SHA256).Hash.ToLowerInvariant() -ne "127dc97ff76e0684857933a43109d827acf171b8071e2fe1b24fb923625c8dd9") { throw "sha256 mismatch" }
unix · tar.gz
curl -fL -o v0.1.0-esp32.tar.gz http://14cc7d57b5e70f679b851fe5b272ce17c70632ff4beb5b35ab64bc706b2485af.pk.ygg/pkg/ruview/v0.1.0-esp32.tar.gz
printf '%s %s\n' 'dfbd6e4480fda0c40177b6b90020043a866d44df9dc0a98a5cba07a60888ac2d' 'v0.1.0-esp32.tar.gz' | sha256sum -c -
windows · tar.gz
$url = "http://14cc7d57b5e70f679b851fe5b272ce17c70632ff4beb5b35ab64bc706b2485af.pk.ygg/pkg/ruview/v0.1.0-esp32.tar.gz"
$out = "v0.1.0-esp32.tar.gz"
Invoke-WebRequest -Uri $url -OutFile $out
if ((Get-FileHash $out -Algorithm SHA256).Hash.ToLowerInvariant() -ne "dfbd6e4480fda0c40177b6b90020043a866d44df9dc0a98a5cba07a60888ac2d") { throw "sha256 mismatch" }
| artifact | format | size | hashes |
|---|---|---|---|
| v0.1.0-esp32.zip | zip | 107.2 MiB |
blake3-24 9e9da672885dae6aa7d5fef3ca012cada36ed0ea5c2c5c7d
sha256 127dc97ff76e0684857933a43109d827acf171b8071e2fe1b24fb923625c8dd9
sha1 625ed479d7b0339b0c6fd4907618740c23581551
|
| v0.1.0-esp32.tar.gz | tar.gz | 101.5 MiB |
blake3-24 d877af6ffa50b98c85c78df0fc338ff92a5f4df44deadc3a
sha256 dfbd6e4480fda0c40177b6b90020043a866d44df9dc0a98a5cba07a60888ac2d
sha1 b12fd5ed90e4bd614acf63970548508cd4530d01
|
install
bazel
http_archive(
name = "ruview",
urls = ["https://ratatoskr.space/pkg/ruview/v0.1.0-esp32.tar.gz"],
integrity = "sha256-371uRID9oMQBd7a5ACAEOoZtRN+dwKmKXLoHpgiIrC0=",
strip_prefix = "ruview-v0.1.0-esp32",
)
zig
.url = "https://ratatoskr.space/pkg/ruview/v0.1.0-esp32.tar.gz",
install via yggdrasil mesh
bazel
http_archive(
name = "ruview",
urls = ["http://14cc7d57b5e70f679b851fe5b272ce17c70632ff4beb5b35ab64bc706b2485af.pk.ygg/pkg/ruview/v0.1.0-esp32.tar.gz"],
integrity = "sha256-371uRID9oMQBd7a5ACAEOoZtRN+dwKmKXLoHpgiIrC0=",
strip_prefix = "ruview-v0.1.0-esp32",
)
zig
.url = "http://14cc7d57b5e70f679b851fe5b272ce17c70632ff4beb5b35ab64bc706b2485af.pk.ygg/pkg/ruview/v0.1.0-esp32.tar.gz",