GPS-based signal strength mapping tool supporting ADALM-Pluto, SDRplay, and RTL-SDR hardware with real-time visualization and CSV logging.
Note: For the maps, the internet is required!
First, install required Qt6 libraries:
./install_system_deps.shThis installs: libxcb-cursor0, libqt6qml6, and other Qt6 dependencies needed by PyQt6.
IMPORTANT: SoapySDR Python bindings cannot be installed via pip. They must be installed system-wide using your package manager before creating the Python virtual environment. The venv will automatically find the system-installed SoapySDR module.
For ADALM-Pluto:**
./install_adalm_deps.shFor SDRplay:
SDRplay devices require SoapySDR and the SDRplay API:
- Install SoapySDR system packages:
# Debian/Ubuntu
sudo apt-get install -y soapysdr-tools libsoapysdr-dev python3-soapysdr
# Fedora/RHEL
sudo dnf install -y SoapySDR SoapySDR-devel python3-SoapySDR-
Install SDRplay API from https://www.sdrplay.com/downloads/
- Download the appropriate installer for your platform
- Extract and run the installer script
- This provides the necessary drivers and libraries
-
Install SoapySDRPlay plugin:
# Clone and build SoapySDRPlay
git clone https://github.com/pothosware/SoapySDRPlay.git
cd SoapySDRPlay
mkdir build && cd build
cmake ..
make
sudo make install
sudo ldconfig- Verify SDRplay is detected:
SoapySDRUtil --find="driver=sdrplay"For RTL-SDR:
RTL-SDR devices (RTL2832U-based DVB-T dongles) require SoapySDR and RTL-SDR drivers:
- Install SoapySDR and RTL-SDR packages:
# Debian/Ubuntu
sudo apt-get install -y soapysdr-tools libsoapysdr-dev python3-soapysdr rtl-sdr librtlsdr-dev soapysdr-module-rtlsdr
# Fedora/RHEL
sudo dnf install -y SoapySDR SoapySDR-devel python3-SoapySDR rtl-sdr rtl-sdr-devel soapy-sdr-rtlsdr- Blacklist DVB-T kernel modules (prevents conflicts):
echo 'blacklist dvb_usb_rtl28xxu' | sudo tee /etc/modprobe.d/blacklist-rtl.conf
sudo rmmod dvb_usb_rtl28xxu 2>/dev/null || true- Add udev rules for device access:
sudo wget -O /etc/udev/rules.d/20-rtlsdr.rules https://raw.githubusercontent.com/osmocom/rtl-sdr/master/rtl-sdr.rules
sudo udevadm control --reload-rules
sudo udevadm trigger- Verify RTL-SDR is detected:
SoapySDRUtil --find="driver=rtlsdr"
# or
rtl_test -tThis project now supports a native RTL-SDR Python backend using pyrtlsdr (the rtlsdr package) which avoids the SoapySDR layer. When available the application will prefer pyrtlsdr and fall back to SoapySDR if it's not installed.
To use the native backend inside the project's virtual environment:
. .venv/bin/activate
pip install pyrtlsdr numpy setuptoolsNotes:
pyrtlsdrprovides direct RTL-SDR access and generally works better for some RTL2832U dongles than SoapySDR/SoapyRTLSDR.setuptoolsis required at runtime forpyrtlsdrto providepkg_resources.- If
pyrtlsdris not installed the app will attempt to use SoapySDR as before.
./venv_setup.shThis creates a .venv and installs all Python packages from requirements.txt.
With ADALM-Pluto (default):
./run.sh --gps-port /dev/ttyUSB0 --gps-baud 4800 --freq 869.615 --gui --rx-bw 8With SDRplay:
./run.sh --sdr-type sdrplay --sdr-gain 40 --gps-port /dev/ttyUSB0 --gps-baud 4800 --freq 869.615 --gui --rx-bw 8With RTL-SDR:
# With manual gain (0-50 dB)
./run.sh --sdr-type rtlsdr --sdr-gain 40 --gps-port /dev/ttyUSB0 --gps-baud 4800 --freq 869.615 --gui --rx-bw 8
# With automatic gain control (AGC)
./run.sh --sdr-type rtlsdr --sdr-gain 0 --gps-port /dev/ttyUSB0 --gps-baud 4800 --freq 869.615 --gui --rx-bw 8Command-line options:
--sdr-type: SDR hardware type:pluto(default),sdrplay, orrtlsdr--sdr-gain: SDR gain in dB (for SDRplay/RTL-SDR, default: 40.0; use 0 or negative for RTL-SDR AGC)--gps-port: Serial port for GPS receiver (e.g.,/dev/ttyUSB0)--gps-baud: Baud rate (typically 4800 or 9600)--freq: SDR frequency in MHz (e.g., 869.615)--gui: Launch PyQt6 GUI--rx-bw: Receiver bandwidth in kHz (e.g., 8)--pluto-uri: Optional Pluto URI (defaults to auto-detection)--rssi-offset: Calibration offset in dB to adjust RSSI readings (default: 0.0)--debug: Enable debug output
Different SDR hardware has different RSSI calibration:
- ADALM-Pluto: Raw dBFS values are negated to display as dBm
- SDRplay: dBFS values displayed directly
- RTL-SDR: dBFS values offset by -60 dB (e.g., -20 dBFS → -80 dBm)
You can fine-tune RSSI readings using the --rssi-offset parameter:
# If RTL-SDR readings are too high, reduce them by 10 dB
./run.sh --sdr-type rtlsdr --rssi-offset -10 --freq 869.615 --gui
# If readings are too low, increase them by 10 dB
./run.sh --sdr-type rtlsdr --rssi-offset 10 --freq 869.615 --guiTypical RSSI ranges:
- Strong signal: -40 to -60 dBm
- Medium signal: -60 to -80 dBm
- Weak signal: -80 to -100 dBm
- Noise floor: -100 to -120 dBm
- Multiple SDR hardware support: ADALM-Pluto, SDRplay (RSP1/RSP2/RSPduo/RSPdx), and RTL-SDR (RTL2832U)
- Real-time GPS tracking with OpenStreetMap display
- Live GPS overlay showing: Time (UTC), Position, Satellites, Fix Quality, Status, RSSI
- RSSI graph with time axis
- CSV logging of GPS coordinates and signal strength data
- Menu-driven interface with keyboard shortcuts
File
- New Session (Ctrl+N) - Start logging to CSV file
- Stop Session (Ctrl+S) - Stop current logging session
- Exit (Ctrl+Q) - Close application
View
- Center on GPS (Ctrl+L) - Center map on current position
Settings
- Range Trigger - Configure RSSI threshold
Help
- About - Application information
- Python 3.8+
- PyQt6 6.4.2+ with WebEngine
- pyserial, pyadi-iio (for ADALM-Pluto)
- SoapySDR with Python bindings (for SDRplay and RTL-SDR)
- Qt6 system libraries (installed via
install_system_deps.sh)
Hardware Support:
- ADALM-Pluto: Requires pyadi-iio and libiio
- SDRplay (RSP1/RSP2/RSPduo/RSPdx): Requires SoapySDR, SDRplay API, and SoapySDRPlay plugin
- RTL-SDR (RTL2832U-based dongles): Requires SoapySDR, rtl-sdr drivers, and SoapyRTLSDR module
If you see errors like "cannot open shared object file", run:
./install_system_deps.shIf you see "No SDRplay devices found" or SoapySDR import errors:
- Verify SoapySDR Python bindings are installed:
python3 -c "import SoapySDR; print(SoapySDR.getAPIVersion())"- Check if SoapySDRPlay plugin is loaded:
SoapySDRUtil --infoLook for "sdrplay" in the available drivers list.
- Verify SDRplay API is installed:
ls /usr/local/lib/libsdrplay_api.so* || ls /usr/lib/libsdrplay_api.so*-
If the plugin isn't found, rebuild SoapySDRPlay and ensure SDRplay API is installed first.
-
Device permissions: Add your user to the plugdev group:
sudo usermod -a -G plugdev $USER
# Log out and back in for group changes to take effectIf pip install -r requirements.txt fails with an error like:
ERROR: Could not find a version that satisfies the requirement pyadi-iio>=0.0.43
Then your environment may not have the requested pyadi-iio wheel on PyPI or the specific version is unavailable for your platform. Options:
- Use the pinned version in
requirements.txt(already set topyadi-iio==0.0.20) and run:
./venv_setup.sh- Install system dependencies (Debian/Ubuntu example) before installing
pyadi-iio:
sudo apt-get update
sudo apt-get install -y build-essential pkg-config libxml2-dev libiio-dev libiio1- If you need the bleeding-edge
pyadi-iio, install directly from the GitHub repository (may require the system deps above):
source .venv/bin/activate
pip install git+https://github.com/analogdevicesinc/pyadi-iio.git- If installation still fails, check the error messages for missing
libiioor build tools; install the platform-specific dependencies and retry.
If you tell me your OS/distribution I can provide exact package names and commands.
This repository includes install_adalm_deps.sh, a helper script that attempts to install common system packages required to use ADALM‑Pluto with pyadi-iio.
Usage (Debian/Ubuntu example):
chmod +x install_adalm_deps.sh
./install_adalm_deps.shOr let venv_setup.sh call it for you when creating the virtualenv:
./venv_setup.sh --adalmNotes:
- The script attempts
aptinstalls on Debian/Ubuntu anddnf/yumon Fedora/RHEL-like systems. It will print guidance if your distribution is not recognized. - On older distributions you may still need to build
libiiofrom source; see https://github.com/analogdevicesinc/libiio for instructions. - After system deps are installed, activate the venv and install
pyadi-iiofrom GitHub if you need the latest version:
source .venv/bin/activate
pip install git+https://github.com/analogdevicesinc/pyadi-iio.git