Skip to main content

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:

BackendHardwareBuild flag (CMake)Status
RTL-SDRRealtek RTL2832U-based DVB-T dongles-DENABLE_RTLSDR=ON (default ON)Recommended, actively tested
SoapySDRLimeSDR (USB / mini), PlutoSDR, HackRF One, SoapyRemote, and other Soapy drivers-DENABLE_SOAPYSDR=ON (default AUTO)Optional
info

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.

note

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 useUseExample
First RTL-SDR (default)index-d 0
A specific RTL-SDR by serial:<serial>-d :NESDRSMA
Default SoapySDR deviceempty string-d ""
A specific SoapySDR devicedriver query-d driver=lime
RTL-SDR via the Soapy backenddriver query-d driver=rtlsdr
A remote rtl_tcp serverURL-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.

tip

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; 0 means 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.
Illustrative example

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.

tip

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.

Sources