HackRF FPV Band Monitor
active2026-06 · sdr · rf · fpv · android · kotlin · dsp
Finds active FPV video channels and control links with a HackRF One; desktop and Android.




What it is
At a shared flying field, an FPV (first-person view) drone pilot who powers up on an occupied video channel blinds whoever is already flying on it. This project watches those bands with a HackRF One, a software-defined radio (SDR): it sweeps the 5.8 GHz video-transmitter (VTX) band and the 2.4 GHz / 900 MHz ExpressLRS (ELRS) control-link bands, then reports which of the 48 channels in the standard plan are active and whether a control transmitter is on the air. It exists twice: a Python desktop tool with a web dashboard, and a native Android app that drives the radio over USB (Universal Serial Bus) On-The-Go (OTG).
Why it exists
A HackRF One was already on the bench, and “is this channel actually clear?” is the question every FPV session starts with. The Android port followed two weeks later so the answer fits in a pocket instead of needing a laptop.
What it does today
- Sweeps 5288–5962 MHz and maps energy onto the 48-channel VTX plan (bands L, A, B, E, F, R — eight channels each). Classifies each signal as analog or digital video by width and spectral shape (digital: ≥12 MHz wide with a flat top).
- Ignores blips: each channel runs a Kalman filter plus an occupancy gate, so activation takes roughly 12 dB above the noise floor with sustained on-air presence — a transmitter, not a spur.
- Detects ExpressLRS control links by their hop signature — narrow (≤2.6 MHz) peaks flashing across the band — with an ambient-calibration step so ordinary 2.4 GHz WiFi is not misread as a link. Verdicts: transmitter active, ambient, weak, quiet.
- The Android app runs the HackRF’s firmware sweep mode over USB OTG at about 5 sweeps per second: waterfall and spectrum trace with the channel plan overlaid, a fullscreen landscape view, and local notifications when a channel goes active.
- The app is offline by construction: it declares no INTERNET permission, so Android itself enforces that nothing leaves the phone.
- The desktop dashboard adds a voice announcer (browser speech synthesis calls out a newly detected channel and whether it looks analog or digital) and a guarded test-signal generator that fakes an analog carrier on a chosen channel to exercise the detector — transmit is interlocked behind an explicit acknowledgment flag, since going on-air in these bands generally requires a license.
Under the hood
The Android side re-implements the HackRF USB protocol in Kotlin directly from libhackrf semantics — no native code, no vendored C — and feeds interleaved quarter-band FFTs (fast Fourier transforms) from the device’s sweep stream into the same channel trackers as the Python version, ported line for line. Kotlin with Jetpack Compose for the app; Python with a small web dashboard on the desktop.
State & direction
- Working end to end on one phone (a Samsung flagship over USB-C OTG): sweep, detection, channel overlays, notifications, auto-start on plug-in.
- The ELRS detectors still use bench-recorded ambient baselines; on-site recalibration is the next field task.
- A manual-retune fallback sweep mode is implemented but has never run on hardware — firmware sweep worked first try.
- Nothing is public yet; publishing the repo and a release-signed APK (Android application package) are the likely next steps.