rtl_433
What is rtl_433?
rtl_433 is an open-source tool that decodes radio signals in the 433 MHz ISM band (and other frequencies). It supports a wide range of devices: weather stations, tire pressure sensors, wireless thermometers, domotic remotes, and many other IoT sensors.
Despite the name, rtl_433 works with any SDR supported by SoapySDR, not just RTL-SDR dongles.
Installation
sudo dnf install rtl_433Usage
Live Capture with BladeRF
Listen on 433.92 MHz using a BladeRF via SoapySDR:
rtl_433 -d soapy=0,driver=bladerf -f 433920000 -g 60Analysis Mode
Use -A to enable analysis mode, which prints detailed pulse/gap timing information and attempts to guess the modulation:
rtl_433 -d soapy=0,driver=bladerf -f 433920000 -g 60 -ASaving Signals
Use -S 2M to save detected signals as .cs16 files (complex signed 16-bit IQ samples):
rtl_433 -d soapy=0,driver=bladerf -f 433920000 -g 60 -A -S 2MFiles are numbered sequentially (g001_433.92M_250k.cs16, g002_433.92M_250k.cs16, …), preserving chronological order.
Replaying Captured Signals
Replay a single .cs16 file:
rtl_433 -r g001_433.92M_250k.cs16 -ABatch Analysis
Replay all captured files and count occurrences of each decoded frame:
for f in *.cs16; do rtl_433 -r "$f" -A 2>/dev/null; done \
| grep "^codes" | sort | uniq -c | sort -rnExtract unique codes of a specific size in capture order:
for f in $(ls -1 *.cs16 | sort); do rtl_433 -r "$f" -A 2>/dev/null | grep "^codes.*{52}"; done | awk '!seen[$0]++'Key Flags
| Flag | Description |
|---|---|
-d soapy=0,driver=bladerf | Use BladeRF via SoapySDR |
-f 433920000 | Tune to 433.92 MHz |
-g 60 | Set gain to 60 dB |
-A | Analysis mode (pulse timing + modulation guessing) |
-S 2M | Save detected signals as .cs16 files |
-r file.cs16 | Replay a saved signal file |
-X '...' | Use a flex decoder with custom parameters |
File Format
Saved signals use the .cs16 format: complex signed 16-bit IQ samples. The filename encodes the capture frequency and sample rate (e.g., g001_433.92M_250k.cs16 = 433.92 MHz at 250 kSPS).