Een RTL-SDR server in een RPI

Ik had nog een RTL dongle liggen, en eveneens een Raspberry PI 2B+ die werkeloos rondzwierf.
De RTL dongle had ik wel eens aan de tand gevoeld, maar het is altijd een beetje een gedoe, laat je hem aan een computer hangen, dan zwerven er altijd weer allerlei kabeltjes waar je ze niet wilt, soms heb ik de USB poort ergens anders voor nodig. Oftwel, hij is nooit beschikbaar als je hem wilt gebruiken. Een kleine RPI daarentegen kun je prima ergens uit de weg hangen. Een beetje experimenteren met een kleefvoet antenne gaf een redelijke ontvangst als ik hem op de verwarmingsradiator plaatste. Natuurlijk, binnen pikt hij heel veel storing op, maar om een beetje lokaal repeater verkeer te kunnen monitoren voldoet dat prima.

Het is relatief simpel om een RPI als server te gebruiken. Allereerst heb ik de laatste versie Raspberry OS geflashed. Hoe dat moet kun je makkelijk op het internet vinden, dat zal ik hier niet herhalen. Ik heb de versie zonder GUI gedownload aangezien je die niet nodig hebt, en ik wilde geen processor power verspillen aan zinloze toepassingen. Uiteindelijk is een PI2 natuurlijk geen snelheidsmonster.

Ik heb de instructies van de RTL-SDR website gevolgd om de software te installeren. Instructies zijn te vinden bij hoofdstuk “Getting Started on Linux”. Maar onder Raspberry OS kun je hem ook via de repository installeren. Je krijgt dan waarschijnlijk niet de meest recente versie, maar dat is in de praktijk geen probleem.

sudo apt install rtl-sdr

Nadat je de software hebt geïnstalleerd moet je er nog voor zorgen dat linux de dongle niet als een DVB ontvanger (voor digitale TV) ziet. Daarvoor moet je verhinderen dat de driver geladen wordt. Je kunt dit doen door hem te blacklisten:

echo 'blacklist dvb_usb_rtl28xxu' | sudo tee --append /etc/modprobe.d/blacklist-dvb_usb_rtl28xxu.conf

Na een reboot kun je het testen door de dongle in een usb poort te pluggen en het volgende commando te geven:

rtl_tcp -a 0.0.0.0 -a ::

Als het goed is, draait de server nu, en je kunt op een andere aan het netwerk gekoppelde computer aan deze server connecten. Je doet dit door in je favoriete SDR software de optie RTL-TCP te kiezen, en de ip adres of hostnaam en poort in te geven. Standaard is de poort 1234. In mijn geval heet mijn server ‘krikkit’ en in SDR++ ziet dat er dan zo uit:

Als je op de startknop klikt moet je nu een dansend spectrum zien, en waarschijnlijk een hoop ruis (als je de squelch niet hebt ingesteld). Gefeliciteerd, de server werkt!

Je wilt natuurlijk dat die automatisch opstart na een reboot. Hiervoor laat ik de server starten als een service. Dat gaat als volgt. Maak allereerst een bestand aan in de juiste directory:

sudo nano rtl-server.sh

Dit maakt een shell script aan in de user directory.

Hierin zet je de volgende tekst

/usr/local/bin/rtl_tcp -a 0.0.0.0 -a ::

Vervolgens:

sudo nano /etc/systemd/system/rtlsdr.service

Hierin komt het volgende te staan:

[Unit]
Description=RTL-SDR Server
After=network.target

[Service]
Type=simple
ExecStartPre=/bin/sleep 5
ExecStart=/bin/sh "/home/<USERNAME>/rtl-server.sh"
WorkingDirectory=/home/<USERNAME>
StandardOutput=inherit
StandardError=inherit
Restart=always
After=usb-rebind.service

[Install]
WantedBy=multi-user.target

(Vervang uiteraard <USERNAME> door je eigen gebruikersnaam)

Ik had het probleem dat de software de dongle niet kon benaderen na een reboot. Opnieuw inpluggen verhielp dat wel, maar dat wil je natuurlijk ook niet bij elke reboot hoeven te doen. Dit kan opgelost worden met een extra service die na het opstarten even de USB poorten uit- en weer aanzet.

sudo nano usb-rebind.sh

Met de volgende inhoud:

#!/bin/sh

echo '1-1' > /sys/bus/usb/drivers/usb/unbind
echo '1-1' > /sys/bus/usb/drivers/usb/bind

Daana moet er nog een service bestand worden aangemaakt:

sudo nano /etc/systemd/system/usb-rebind.service

Hier komt het volgende in te staan:

[Unit]
Description=USB rebind oneshot
After=network.target

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStartPre=/bin/sleep 5
ExecStart=/home/<USERNAME>/usb-rebind.sh
WorkingDirectory=/home/<USERNAME>

[Install]
WantedBy=multi-user.target

Nadat deze bestanden zijn aangemaakt, moet je de services nog installeren en zorgen dat ze enabled zijn:

sudo systemctl daemon-reload
sudo systemctl start rtlsdr
sudo systemctl status rtlsdr # check of de service draait
sudo systemctl enable rtlsdr
sudo systemctl start usb-rebind
sudo systemctl enable usb-rebind

Na een reboot moet het nu werken!