user 6dbab23329
Some checks failed
Lint & Build / C/C++ Static Analysis (push) Failing after 37s
Lint & Build / Security Flaw Analysis (push) Successful in 21s
Lint & Build / Secret Scanning (push) Successful in 5s
Lint & Build / Shell Script Analysis (push) Successful in 6s
Lint & Build / Build Firmware (push) Successful in 2m12s
Lint & Build / Deploy to ESP Fleet (push) Successful in 4m19s
ci: Serve firmware from runner for OTA deployment
Instead of having ESP devices download from Gitea (TLS cert issues),
the runner now serves firmware via local HTTP server and triggers
OTA with the local URL.
2026-02-05 21:48:53 +01:00

ESP32 CSI Sensing Firmware

Custom ESP32 firmware for WiFi Channel State Information (CSI) sensing with presence detection, BLE scanning, and remote management.

Version: 1.7 Deployed on: 3x ESP32-DevKitC V1 (muddy-storm, amber-maple, hollow-acorn)

Features

Feature Description
CSI Streaming UDP packets at 10-100 Hz with per-subcarrier amplitude data
Presence Detection Baseline calibration + normalized Euclidean distance scoring
Adaptive Sampling Auto-adjusts rate: 10 Hz idle → 100 Hz on motion
BLE Scanning Periodic advertisement scanning with RSSI tracking
OTA Updates WiFi firmware updates with rollback protection
HMAC Auth Optional command authentication (HMAC-SHA256)
Power Management DFS (240/80 MHz) + WiFi modem sleep
Security Monitoring Deauth flood detection, probe request capture

Quick Start

# Build firmware
source ~/esp/esp-idf/export.sh
cd get-started/csi_recv_router
idf.py build

# Flash via USB
idf.py -p /dev/ttyUSB0 flash monitor

# Or OTA update (after initial flash)
esp-ota <hostname> build/csi_recv_router.bin

Directory Structure

esp32-hacking/
├── get-started/csi_recv_router/   # Main firmware (v1.7)
│   ├── main/app_main.c            # Single-file firmware (~2000 lines)
│   ├── sdkconfig.defaults         # Build defaults
│   └── partitions.csv             # Dual OTA partition table
├── docs/
│   ├── CHEATSHEET.md              # Command reference
│   ├── INSTALL.md                 # Build & flash guide
│   └── USAGE.md                   # Comprehensive usage
├── tools/                         # Helper scripts
├── esp-radar/                     # Advanced presence detection examples
├── esp-crab/                      # Dual-antenna experiments
├── ROADMAP.md                     # Version milestones
└── TASKS.md                       # Current work tracking

Commands

Send via UDP to port 5501. See docs/CHEATSHEET.md for full reference.

Command Description
STATUS Device info, config, heap, temp, CSI stats
RATE <10-100> Set CSI packet rate (disables adaptive)
ADAPTIVE ON/OFF Toggle motion-based rate adjustment
THRESHOLD <val> Motion detection sensitivity
CALIBRATE [3-60] Capture baseline for presence detection
PRESENCE ON/OFF Enable presence detection events
PRESENCE THRESHOLD <val> Presence detection sensitivity (0.001-1.0)
BLE ON/OFF Toggle BLE advertisement scanning
POWERSAVE ON/OFF Toggle WiFi modem sleep
OTA <url> Trigger firmware update from HTTP URL
AUTH <secret/OFF> Set/disable HMAC authentication
REBOOT Restart device

Data Formats

CSI Data:

CSI_DATA,<hostname>,<seq>,<mac>,<rssi>,...,"[amplitudes]"

Compact Mode:

F:<hostname>,<rms>,<std>,<max>,<max_idx>,<energy>

Events:

EVENT,<hostname>,motion=1 rate=100 wander=0.0234
EVENT,<hostname>,presence=1 score=0.0832
EVENT,<hostname>,calibrate=done packets=1000 nsub=52

BLE:

BLE_DATA,<hostname>,<mac>,<rssi>,<name>

Pi-Side Tools

Install from esp-ctl:

Tool Purpose
esp-cmd Send commands to single sensor
esp-ctl Listen, watch daemon, OSINT queries, BLE tracking
esp-fleet Fleet management (status, command broadcast)
esp-ota OTA firmware updates

NVS Configuration

22 keys persisted in flash:

send_rate, tx_power, adaptive, threshold, ble_scan, target_ip, target_port,
hostname, boot_count, csi_mode, hybrid_n, auth_secret, flood_thresh,
flood_window, scan_rate, probe_rate, powersave, presence, pr_thresh,
bl_nsub, bl_amps

CI/CD

Gitea Actions workflow (.gitea/workflows/lint.yml):

  • cppcheck — C static analysis
  • flawfinder — Security flaw detection
  • gitleaks — Secret scanning
  • shellcheck — Shell script linting

References

Description
No description provided
Readme 1.6 MiB
v1.10.1 Latest
2026-02-05 22:14:06 +00:00
Languages
C 84.7%
Python 14.8%
CMake 0.5%