SDR hardware
rtl_433 is a C command-line program that decodes radio transmissions from devices on the ISM bands. Despite the name, it is a generic data receiver, mainly for the 433.92 MHz, 868 MHz (SRD), 315 MHz, 345 MHz, and 915 MHz ISM bands. It reads the raw radio signal from a Software-Defined Radio (SDR) and demodulates it into structured device data.
To do that it needs an SDR. rtl_433 supports two hardware backends:
| Backend | Hardware | Build flag (CMake) | Status |
|---|---|---|---|
| RTL-SDR | Realtek RTL2832U-based DVB-T dongles | -DENABLE_RTLSDR=ON (default ON) | Recommended, actively tested |
| SoapySDR | LimeSDR (USB / mini), PlutoSDR, HackRF One, SoapyRemote, and other Soapy drivers | -DENABLE_SOAPYSDR=ON (default AUTO) | Optional |
Both backends are optional at build time but at least one is required to receive live signals. The RTL-SDR backend uses librtlsdr; the SoapySDR backend uses libsoapysdr. On Debian/Ubuntu the development packages are librtlsdr-dev and libsoapysdr-dev, which must be installed before building if you want that backend compiled in.
RTL-SDR (RTL2832U)
The RTL-SDR is the cheap, common option: a Realtek RTL2832-based DVB-T USB dongle. If RTL-SDR support is compiled in, the default input is the first available RTL-SDR device, equivalent to -d 0.
SoapySDR devices
SoapySDR is a vendor-neutral abstraction layer. Through it, rtl_433 can drive a range of radios. Hardware that has been actively tested includes the LimeSDR USB and LimeSDR mini, PlutoSDR, and HackRF One (using SoapySDR drivers), as well as SoapyRemote.
If SoapySDR support is compiled in and RTL-SDR is not, the default input is the first available SoapySDR device. You can also select it explicitly with the empty Soapy search string, -d "".
Selecting a device with -d
The -d flag chooses the input source. Its forms are:
[-d <RTL-SDR USB device index> | :<RTL-SDR USB device serial> | <SoapySDR device query> | rtl_tcp | help]
| You want to use | Use | Example |
|---|---|---|
| First RTL-SDR (default) | index | -d 0 |
| A specific RTL-SDR by serial | :<serial> | -d :NESDRSMA |
| Default SoapySDR device | empty string | -d "" |
| A specific SoapySDR device | driver query | -d driver=lime |
| RTL-SDR via the Soapy backend | driver query | -d driver=rtlsdr |
A remote rtl_tcp server | URL | -d rtl_tcp://192.168.1.2:1234 |
The RTL-SDR serial can be programmed onto the dongle with rtl_eeprom -s. Typical SoapySDR driver strings include driver=plutosdr, driver=lime, and remote forms such as driver=remote,remote=tcp://192.168.2.1:55132.
If you have several dongles plugged in, prefer selecting by serial (-d :MYSERIAL) over index. The index can change between reboots or replugs, but the serial does not.
Tuning basics: gain, sample rate, ppm
Gain (-g)
[-g <gain>] (default: auto)
- RTL-SDR: gain is given in dB;
0means automatic. - SoapySDR: a single value is a gain in dB for automatic distribution (
""is auto), or you can pass a string of named gain elements.
For a LimeSDR you can set individual gain elements rather than a single overall value:
rtl_433 -d driver=lime -g "LNA=20,TIA=8,PGA=2"
The element names (LNA, TIA, PGA) are specific to the radio; this string is an example for LimeSDR and will not apply to an RTL-SDR.
Auto gain is a reasonable starting point. If a known device is not decoding, try fixing the gain to a manual value and adjusting up or down.
Sample rate (-s)
[-s <sample rate>] Set sample rate (default: 250000 Hz)
The sample rate sets the receiver bandwidth. The default of 250 kHz suits most narrowband ISM-band protocols. Increasing it widens the captured spectrum at the cost of CPU.
PPM error correction (-p)
[-p <ppm_error>] Correct rtl-sdr tuner frequency offset error (default: 0)
Cheap dongles have imperfect crystal oscillators, so their tuned frequency drifts from the requested one. The -p flag applies a parts-per-million correction to compensate. If a device is consistently received slightly off-frequency, measure the offset and supply it here.
Frequency (-f)
[-f <frequency>] Receive frequency(s) (default: 433920000 Hz)
The default is 433.92 MHz. You can pass -f more than once to hop between frequencies (combine with -H to set the hop interval), for example to listen on both 433 MHz and 868 MHz bands.
A first run
Putting the common flags together for an RTL-SDR on the default band:
# Illustrative: first RTL-SDR, auto gain, default 250k sample rate,
# with a +1 ppm tuner correction, listening on 433.92 MHz.
rtl_433 -d 0 -g 0 -s 250000 -p 1 -f 433.92M
If everything is wired up, decoded device readings stream to the console as packets arrive.
Run rtl_433 -d help to list the detected devices, and rtl_433 -g help to see the gain options for the selected device. (rtl_433 -h prints the full usage; the bare rtl_433 enters default receive mode on the first device found.) These are the quickest way to confirm which backend is compiled in and what hardware is visible.