- Add rpi_monitor_setup.sh: Basic monitor mode setup script - Add rpi_capture_ra_ta.sh: Bash script for capturing RA/TA addresses - Add rpi_capture_ra_ta_python.py: Python script using scapy for detailed 802.11 frame parsing - Add RPI_MONITOR_GUIDE.md: Comprehensive guide for monitor mode setup and usage - Add RPI_INSTALL_SCAPY.md: Installation instructions for scapy on Raspberry Pi These scripts help debug WiFi traffic by capturing and displaying Receiver Address (RA) and Transmitter Address (TA) from 802.11 frames, useful for comparing with ESP32 monitor mode captures. Co-authored-by: Cursor <cursoragent@cursor.com> |
||
|---|---|---|
| components | ||
| doc | ||
| main | ||
| php | ||
| tools | ||
| .gdbinit | ||
| .gitignore | ||
| BUILD.txt | ||
| CMakeLists.txt | ||
| README.md | ||
| RPI_INSTALL_SCAPY.md | ||
| RPI_MONITOR_GUIDE.md | ||
| add_license.py | ||
| async_find_failed.py | ||
| control_iperf.py | ||
| dependencies.lock | ||
| detect_esp32.py | ||
| esp32_deploy.py | ||
| gen_udev_rules.py | ||
| identiy_port.py | ||
| leddiff.txt | ||
| mass_deploy.sh | ||
| mass_deploy_enhanced.sh | ||
| new_rules.part | ||
| parse_csi.py | ||
| partitions.csv | ||
| partitions_c5.csv | ||
| partitions_esp32.csv | ||
| partitions_s3.csv | ||
| rpi_capture_ra_ta.sh | ||
| rpi_capture_ra_ta_python.py | ||
| rpi_monitor_setup.sh | ||
| sdkconfig.defaults | ||
| sdkconfig.defaults.ampdu | ||
| sdkconfig.defaults.esp32 | ||
| sdkconfig.defaults.esp32c5 | ||
| sdkconfig.defaults.esp32c5csi | ||
| sdkconfig.defaults.esp32csi | ||
| sdkconfig.defaults.esp32s3 | ||
| sdkconfig.defaults.esp32s3csi | ||
| sdkconfig.defaults.noampdu | ||
| test_devices.sh | ||
README.md
ESP32 Wi-Fi Telemetry Capture / iPerf Load Generator
High-performance Wi-Fi monitor and iperf 2 based traffic generator firmware for ESP32 devices with interactive console interface, GPS synchronization, and Wi-Fi telemetry capture (MCS, RSSI, frame stats, collapse detection, and more).
Version: 2.1.0 ESP-IDF: 6.0+
Features
- UDP Traffic Generation: Precise packet pacing (PPS) with drift-free timers
- Interactive Console: Full REPL interface with command history and tab completion
- WiFi Management: Station mode with static IP support, DHCP, and monitor mode
- GPS Synchronization: PPS signal support and NMEA parsing for timestamp synchronization
- Persistent Configuration: NVS storage for WiFi credentials, IP settings, and iPerf parameters
- SD Card: Telemetry storage (fiwi-telemetry), HTTP file download (port 8080), serial transfer, broadcast beacon for laptop discovery
- Status LED: Visual feedback for connection state and system status
- Mass Deployment: Python scripts for flashing and configuring multiple devices
Supported Targets
- ESP32
- ESP32-S3
- ESP32-C5
- ESP32-C3, ESP32-C6 (may require testing)
Quick Start
Prerequisites
- ESP-IDF v6.0 or later
- Python 3.7+ (for deployment scripts)
- USB serial connection to ESP32 device
ESP-IDF Setup
Add this function to your ~/.bashrc or ~/.zshrc to activate ESP-IDF v6:
# ESP-IDF v6 activator
get_idf() {
export IDF_PATH="$HOME/Code/esp32/esp-idf-v6"
export IDF_PYTHON_ENV_PATH="$HOME/.espressif/python_env/idf6.0_py3.11_env"
export IDF_TOOLS_PYTHON="$IDF_PYTHON_ENV_PATH/bin/python"
export PATH="$IDF_PYTHON_ENV_PATH/bin:$PATH"
export PYTHONNOUSERSITE=1
. "$IDF_PATH/export.sh"
hash -r
echo "ESP-IDF : $(idf.py --version 2>/dev/null)"
echo "python : $(python --version)"
echo "idf.py : $(command -v idf.py)"
}
After adding the function, reload your shell configuration and run get_idf to activate the ESP-IDF environment.
Building
Note: All idf.py commands require the ESP-IDF environment to be activated first by running get_idf.
# Activate ESP-IDF environment (required before all idf.py commands)
get_idf
# Set target (e.g., esp32c5, esp32s3, esp32)
idf.py set-target esp32c5
# Configure (optional)
idf.py menuconfig
# Build
idf.py build
# Flash and monitor
idf.py -p /dev/ttyUSB0 flash monitor
Initial Configuration
After flashing, connect to the console at 115200 baud. Use the interactive commands:
# Connect to WiFi
wifi connect "YourSSID" "password"
# Set static IP (optional)
ip set 192.168.1.100 255.255.255.0 192.168.1.1
# Configure iPerf parameters
iperf set --client 192.168.1.10 --port 5001 --len 1470 --burst 1
# Save configuration to NVS
iperf save
# Start iPerf traffic
iperf start
# Check status
iperf status
# Wi‑Fi telemetry (monitor mode writes to fiwi-telemetry on SD; disconnects WiFi)
monitor start 6
sdcard status
sdcard read fiwi-telemetry
Console Commands
WiFi Commands
wifi connect <ssid> [password]- Connect to WiFi networkwifi scan- Scan for available networkswifi status- Show WiFi connection statuswifi mode <sta|ap>- Set WiFi modewifi power <dbm>- Set transmit power
IP Configuration
ip addr- Show current IP configurationip set <ip> <mask> <gateway>- Set static IPip dhcp- Enable DHCP
iPerf Commands
iperf start- Start traffic generationiperf stop- Stop traffic generationiperf status- Show current status and statisticsiperf set [--client <ip>] [--port <port>] [--len <bytes>] [--burst <count>]- Configure parametersiperf save- Save configuration to NVSiperf reload- Reload configuration from NVSiperf clear- Clear saved configuration
System Commands
reset- Software resetversion- Show firmware and IDF versionsystem info- Show system informationsystem heap- Show free heap memory
GPS Commands (if GPS enabled)
gps status- Show GPS synchronization status
Monitor Mode
monitor start [channel]- Start WiFi monitor mode (writes MCS telemetry tofiwi-telemetryon SD every 10s)monitor stop- Stop monitor modemonitor channel <channel>- Set monitor channelmonitor status- Show monitor status
SD Card Commands
Telemetry from monitor mode is stored in fiwi-telemetry (NDJSON, appended each flush). Use SD commands to inspect or transfer it.
sdcard status- Show CD, mounted, capacity, and fiwi-telemetry file infosdcard list [path]- List files (path optional, default root)sdcard read <file>- Read and print file (e.g.sdcard read fiwi-telemetry)sdcard write <file> <text>- Write text to filesdcard send <file>- Stream file over serial (usetools/sdcard_recv.py)sdcard delete <file>- Delete a file
Example (telemetry capture):
monitor start 6
sdcard status
sdcard list
sdcard read fiwi-telemetry
For detailed command documentation, see Quick Reference.
Mass Deployment
Use the esp32_deploy.py script for deploying to multiple devices:
# Flash and configure multiple devices
python3 esp32_deploy.py \
--ssid "YourSSID" \
--password "password" \
--start-ip 192.168.1.50 \
--netmask 255.255.255.0 \
--gateway 192.168.1.1 \
--iperf-dest-ip 192.168.1.10 \
--iperf-port 5001
See Deployment Guide for complete deployment instructions.
USB Port Mapping (gen_udev_rules.py)
When deploying to multiple ESP32 devices, Linux assigns /dev/ttyUSB* ports that can change between reboots or when devices are reconnected. The gen_udev_rules.py script creates stable symbolic links (e.g., /dev/esp_port_01, /dev/esp_port_02) based on each device's USB physical topology (ID_PATH), ensuring consistent port identification across system reboots.
Features:
- Uses
ID_PATHfor stable device identification (not just port numbers) - Creates predictable symlinks:
/dev/esp_port_01,/dev/esp_port_02, etc. - Supports full scan (generate from scratch) or incremental updates (append new devices)
- Sorts devices by physical USB topology for consistent ordering
Usage:
# Generate complete rules file from scratch
python3 gen_udev_rules.py --full
# Append only new devices to existing rules (default mode)
python3 gen_udev_rules.py --append
# Dry run to preview changes
python3 gen_udev_rules.py --append --dry-run
After generating rules, install them:
sudo cp 99-esp32-stable.rules /etc/udev/rules.d/
sudo udevadm control --reload-rules && sudo udevadm trigger
The deployment script (esp32_deploy.py) can use these stable symlinks when --map-ports is used, or devices can be referenced directly by their esp_port_XX names.
Project Structure
├── main/ # Main application code
│ ├── main.c # Entry point and console initialization
│ ├── broadcast_beacon.c/h # UDP broadcast for laptop discovery
│ └── board_config.h # Hardware pin definitions
├── components/
│ ├── app_console/ # Console command implementations
│ │ ├── cmd_wifi.c # WiFi commands (connect, scan, status, mode, power)
│ │ ├── cmd_ip.c # IP configuration (addr, set, dhcp)
│ │ ├── cmd_iperf.c # iPerf commands (start, stop, status, set, save, reload, clear)
│ │ ├── cmd_monitor.c # Monitor mode (start, stop, channel, status)
│ │ ├── cmd_sdcard.c # SD card commands (status, list, read, write, send, delete)
│ │ ├── cmd_gps.c # GPS commands (status)
│ │ ├── cmd_system.c # System commands (reset, version, info, heap)
│ │ ├── cmd_ping.c # Ping command
│ │ └── cmd_nvs.c # NVS management commands
│ ├── iperf/ # iPerf traffic generator core
│ ├── wifi_controller/ # WiFi management and monitor mode
│ ├── wifi_monitor/ # 802.11 frame capture and collapse detection
│ ├── wifi_cfg/ # WiFi and IP configuration storage
│ ├── gps_sync/ # GPS PPS and NMEA parsing
│ ├── status_led/ # LED status indication
│ ├── sd_card/ # SD card SPI mount and file I/O
│ ├── sdcard_http/ # HTTP server for SD file download (port 8080)
│ ├── mcs_telemetry/ # MCS/RSSI telemetry -> fiwi-telemetry
│ ├── csi_log/ # CSI logging (when CSI enabled)
│ └── csi_manager/ # CSI configuration (when CSI enabled)
├── tools/
│ ├── beacon_listen.py # Listen for beacons, download fiwi-telemetry
│ └── sdcard_recv.py # Receive file over serial from device
├── esp32_deploy.py # Mass deployment script
├── gen_udev_rules.py # USB port mapping utility
└── doc/ # Additional documentation
Documentation
- Quick Start Guide
- Quick Reference
- SD Card Wiring - Hardware, file transfer, beacon discovery
- Telemetry Capture - Enable and capture fiwi-telemetry
- Deployment Guide
- Mass Deployment
- GDB Debugging Guide (ESP32-C5)
License
Copyright (c) 2025 Umber Networks & Robert McMahon All rights reserved.
See individual source files for full license details.
Contributing
This is a project-specific firmware. For issues or feature requests, please contact the maintainers.