Hardware

April 17, 2026 · View on GitHub

Central server

Full-spectrum coverage from a single Pi using wideband SDRs and dedicated network adapters. HackRF's 20 MHz instantaneous bandwidth covers entire bands without hopping. A channelizer extracts narrowband channels from one wideband capture and feeds individual protocol parsers in parallel.

Minimum hardware for full coverage (7 devices):

DeviceCenter freqBandwidthModulesSharing method
HackRF #1440 MHz20 MHzKeyfob, TPMS, PMR, 70cm, ISM 433Channelizer → per-protocol parsers
HackRF #2875 MHz20 MHzGSM, LTE, LoRa, ISM 868Channelizer → per-protocol parsers
RTL-SDRSweep/hop2.4 MHzADS-B (1090), AIS (162), Marine VHF, 2m, MURSSweep capture or dedicated frequency
BLE adapter2.4 GHzBLE advertisements + drone RemoteIDHCI capture
WiFi adapter2.4/5 GHzProbe requests + drone RemoteIDMonitor mode
Meshtastic radio868 MHz (EU)C2 link to sensor nodesUSB serial (CDC)
GPS modulePosition stamp on every detectionUSB serial (NMEA)
Powered USB hubPowers all of the aboveUSB 3.0

How channelizer sharing works

One HackRF captures 20 MHz of spectrum. The channelizer frequency-shifts, filters, and decimates to extract each protocol's narrowband slice. For example, HackRF #1 at 440 MHz simultaneously feeds:

  • 433.92 MHz (2 MHz BW) → keyfob + TPMS parsers
  • 446.0 MHz (2 MHz BW) → PMR parser
  • 432.0 MHz (2 MHz BW) → 70cm amateur parser

Each parser receives its own baseband IQ stream as if it had a dedicated dongle. The RTL-SDR handles bands outside HackRF antenna range (ADS-B at 1090 MHz, AIS/Marine VHF at 162 MHz) via sweep or dedicated capture.

HackRF vs RTL-SDR

HackRF has ~10 dB worse sensitivity than RTL-SDR. For strong nearby signals (keyfobs, phones, PMR) this doesn't matter. For weak/distant signals (LoRa, ADS-B), RTL-SDR is better. Use HackRF where bandwidth matters, RTL-SDR where sensitivity matters.

Sensor node

Target: single-board, battery-powered, ~$80.

ComponentEst. costNotes
Raspberry Pi Zero 2W~$15Pi 4/5 works too with more headroom
RTL-SDR Blog V4~$30
USB GPS (u-blox 7/8)~$15NMEA at 9600 baud, /dev/ttyACM*
Meshtastic radio~$20See matrix below
Battery pack~$1010000 mAh gets a full day of scanning
Telescopic whip antenna~$5Tune length to target band

Meshtastic radios (for C2)

Any Meshtastic-compatible radio with a USB-CDC serial interface works. Tested during bring-up of this project:

RadioHW modelStatusNotes
Heltec V3HELTEC_V3WorksUsed as the server radio in the reference setup. CP2102 USB bridge.
RAK4631RAK4631WorksUsed as agent radios. Good battery behaviour, compact.
LILYGO T-EchoT_ECHOWorks for RX, TX was unreliable on one unitRole CLIENT_MUTE can still send its own traffic, but we saw a case where the TX chain never reached the server. Swap if suspect.

All nodes on the C2 mesh must share the same primary channel PSK. Set via meshtastic --seturl '<URL>'. The installer scripts (scripts/install-*.sh) prompt for this and apply it for you.

Comms: server ↔ nodes

MethodRangeLatencyNotes
LoRa / Meshtastic5–15 km LOS~1 sDefault. Tiny CMD/STAT/DET payloads, off-the-shelf mesh, no internet needed.
WiFi mesh~500 m<100 msFaster but range-limited. Already in the ATAK stack.

Power and USB constraints

  • Pi 4 USB budget: 1.2 A total across all ports. One RTL-SDR (~300 mA) is fine; multiple SDRs need a powered USB hub.
  • HackRF @ 20 MS/s generates ~40 MB/s per device. Two HackRFs + RTL-SDR + WiFi + BLE = ~85 MB/s total USB throughput — needs USB 3.0 on a Pi 4/5.
  • RTL-SDR retune time: ~50–100 ms per frequency change. Sets the lower bound for sweep dwell time.

Antennas

  • 40–860 MHz (5 dBi) — keyfob, TPMS, PMR, 70cm, TETRA, Marine VHF, 2m, ISM 433/868. Best on HackRF #1.
  • 700–2700 MHz (12 dBi) — GSM, LTE, LoRa 868, ADS-B 1090. Best on HackRF #2 or a dedicated RTL-SDR.
  • 40 MHz – 6 GHz telescopic — most versatile; good for an RTL-SDR covering whatever the HackRFs don't.
  • Trim telescopic dipole length to the target band for best performance.