rtl-sdr Zugriff nur für root

MichaZ

Active Member
Hallo

Was muss ich tun, um als User Zugriff auf den rtl-sdr zu bekommen?
Derzeit funktioniert der Zugriff nur, wenn ich die Programme (welle.io, rtl433, gqrx und Co) per sudo starte.
Fehlt mir da evt eine Gruppenzugehörigkeit?

Gruß

Micha
 
Derzeit funktioniert der Zugriff nur, wenn ich die Programme (welle.io, rtl433, gqrx und Co) per sudo starte.
Ich kenne das Tool nicht aber es klingt so ein wenig danach, als ob es auf irgendein Device unter /dev/ zugreifen muss.
Ein Lösungsweg wäre zunächst nachzugucken welches Gerät das denn überhaupt ist und wie die Rechte/User/Gruppen bei der zugehörigen dev-Gerätedatei gesetzt sind.

Was heißt eigentlich "funktioniert nur" ? Gibts irgendeine Fehlermeldung oder so wenn Du es als non-root-User startest?
 
Gib deinem User mal die nötigen Berechtigungen auf das entsprechende /dev/ugen* Device.
 
Ich kenne das Tool nicht aber es klingt so ein wenig danach, als ob es auf irgendein Device unter /dev/ zugreifen muss.
Ein Lösungsweg wäre zunächst nachzugucken welches Gerät das denn überhaupt ist und wie die Rechte/User/Gruppen bei der zugehörigen dev-Gerätedatei gesetzt sind.

Was heißt eigentlich "funktioniert nur" ? Gibts irgendeine Fehlermeldung oder so wenn Du es als non-root-User startest?
FreeBSD_13% rtl_433
rtl_433 version 21.12 (2021-12-14) inputs file rtl_tcp RTL-SDR with TLS
Use -h for usage help and see https://triq.org/ for documentation.
Trying conf file at "rtl_433.conf"...
Trying conf file at "/home/micha/.config/rtl_433/rtl_433.conf"...
Trying conf file at "/usr/local/etc/rtl_433/rtl_433.conf"...
Trying conf file at "/etc/rtl_433/rtl_433.conf"...
Registered 176 out of 207 device decoding protocols [ 1-4 8 11-12 15-17 19-23 25-26 29-36 38-60 63 67-71 73-100 102-105 108-116 119 121 124-128 130-149 151-161 163-168 170-175
177-197 199 201-207 ]
No supported devices found.
FreeBSD_13% sudo rtl_433
rtl_433 version 21.12 (2021-12-14) inputs file rtl_tcp RTL-SDR with TLS
Use -h for usage help and see https://triq.org/ for documentation.
Trying conf file at "rtl_433.conf"...
Trying conf file at "/root/.config/rtl_433/rtl_433.conf"...
Trying conf file at "/usr/local/etc/rtl_433/rtl_433.conf"...
Trying conf file at "/etc/rtl_433/rtl_433.conf"...
Registered 176 out of 207 device decoding protocols [ 1-4 8 11-12 15-17 19-23 25-26 29-36 38-60 63 67-71 73-100 102-105 108-116 119 121 124-128 130-149 151-161 163-168 170-175
177-197 199 201-207 ]
Found Fitipower FC0013 tuner
Exact sample rate is: 250000.000414 Hz
Sample rate set to 250000 S/s.
Tuner gain set to Auto.
Tuned to 433.920MHz.
baseband_demod_FM: low pass filter for 250000 Hz at cutoff 25000 Hz, 40.0 us
 
Gib deinem User mal die nötigen Berechtigungen auf das entsprechende /dev/ugen* Device.
Ergänzung dazu:
Mit usbconfig kriegt man auch alle USB-Geräte aufgelistet. Mit devd könnte man auch ne Regel erstellen damit der eigene User Zugriff auf das Gerät bekommt. So a-la:
Code:
notify 100 {
    match "system"          "USB";
    match "subsystem"       "INTERFACE";
    match "type"            "ATTACH";
    match "vendor"          "0xbda";
    match "product"         "0x2838";
    action "chown myuser /dev/$cdev";
};
Aber alles hübsch der Reihe nach. :-)

Eine Änderung von 755 auf 777 brachte keine Änderung
Denk dran, das die Device-"Files" /dev/ugen* nur Symlinks sind. Wenn Du darauf ein chmod machst änderst Du nur die Symlinks nicht die dahinter liegende Datei.
 
Denk dran, das die Device-"Files" /dev/ugen* nur Symlinks sind. Wenn Du darauf ein chmod machst änderst Du nur die Symlinks nicht die dahinter liegende Datei.
Ein
chmod -R 777 /dev/usb/1.2.0
brachte den gewünschten Erfolg.

Nun funktionieren alle Programme auch ohne root-Rechte.

Vielen Dank für eure Hilfe. :)



 
Man könnte das jetzt noch "pimpen" mit der oben vorgeschlagenen Methode. Weil so wie es jetzt ist hat ja jeder Zugriff drauf. Das könnte man dann sinnvoll einschränken auf eine bestimmte Benutzergruppe oder Deinen Nutzer. Außerdem ist es dann "dauerhaft" und Du musst es nicht erneut z.B. nach einem Reboot setzen.
 
Man könnte das jetzt noch "pimpen" mit der oben vorgeschlagenen Methode. Weil so wie es jetzt ist hat ja jeder Zugriff drauf. Das könnte man dann sinnvoll einschränken auf eine bestimmte Benutzergruppe oder Deinen Nutzer. Außerdem ist es dann "dauerhaft" und Du musst es nicht erneut z.B. nach einem Reboot setzen.
Mit der oben genanten Methode werde ich mich garantiert noch eingehend befassen.
Unter der Woche habe ich da nicht genug Zeit.
Erstmal reicht die kurzfristige Lösung.

Etwas dazu zu lernen ist aber immer gut.

Danke noch mal.
 
Mit der oben genanten Methode werde ich mich garantiert noch eingehend befassen.
Du musst eigentlich nur mit usbconfig (Infos mit allen Details: usbconfig dump_device_desc) nachgucken, welche vendor-id und welche Product-id das Gerät hat und entsprechend eintragen (auch die action musst Du natürlich auf Dein Usernamen anpassen). Dann modifizierst Du den oben genannten Eintrag entsprechend und packst in in eine conf-Datei unterhalb von /usr/local/etc/devd/. Der Dateiname ist egal. Den kannst du frei wählen. Wichtig ist nur, das es auf .conf endet.

Detaillierte Infos zum Dateiformat: man devd.conf(5)
 
Hat einer von euch ein bisschen Erfahrung mit SDR Sticks? Gleich ein Kit von Nooelec kaufen, damit man sich später nicht mit untauglichen Buchsen, Temperaturverhalten des Empfängers, fehlenden Adaptern und Antennen rumschlägt? Bin kein Funkamateur, aber ein bisschen was aus dem Physik Studium ist hängengeblieben.
 
Hat einer von euch ein bisschen Erfahrung mit SDR Sticks? Gleich ein Kit von Nooelec kaufen, damit man sich später nicht mit untauglichen Buchsen, Temperaturverhalten des Empfängers, fehlenden Adaptern und Antennen rumschlägt? Bin kein Funkamateur, aber ein bisschen was aus dem Physik Studium ist hängengeblieben.
Nicht wirklich.
Bei mir war es so, dass ich die SDR-Geschichte zufällig entdeckte und somit die alten dvb-t und dab+ - Sticks nicht mehr nutzlos in der Bastelkiste lagen.
Der RTL-SDR ist nicht das gelbe vom Ei. Die Nooelecs dürften zwar besser arbeiten (in Sachen Frequenzstabilität, Eigenrauschen), als die alten TV-Sticks, aber der Chip ist der selbe. Der übersteuert schnell, so dass man starke Signale (UKW) selbst in ländlichen Regionen herausfiltern muss.
Frequenzen unterhalb 25 MHz sind ohne Upconverter schlecht bis garnicht zu empfangen.

Dann lieber einen echten SDR-Empfänger kaufen.
 
Du musst eigentlich nur mit usbconfig (Infos mit allen Details: usbconfig dump_device_desc) nachgucken, welche vendor-id und welche Product-id das Gerät hat und entsprechend eintragen (auch die action musst Du natürlich auf Dein Usernamen anpassen). Dann modifizierst Du den oben genannten Eintrag entsprechend und packst in in eine conf-Datei unterhalb von /usr/local/etc/devd/. Der Dateiname ist egal. Den kannst du frei wählen. Wichtig ist nur, das es auf .conf endet.

Detaillierte Infos zum Dateiformat: man devd.conf(5)
Danke, ich habe es hinbekommen.
Ich musste noch match "subsystem" von "INTERFACE" auf "DEVICE" ändern.

Wieder etwas dazugelernt. ;)

Danke.
 
Also, ich habe immer per sudo rtl_tcp gestartet, und dann alle Programme als client laufen lassen.
Ging auch :)
 
Hat einer von euch ein bisschen Erfahrung mit SDR Sticks? Gleich ein Kit von Nooelec kaufen, damit man sich später nicht mit untauglichen Buchsen, Temperaturverhalten des Empfängers, fehlenden Adaptern und Antennen rumschlägt? Bin kein Funkamateur, aber ein bisschen was aus dem Physik Studium ist hängengeblieben.
Für SDR-Anfänger ist der "RTL-SDR Blog V3" und der ADALM-PLUTO (auch PlutoSDR genannt) ein guter Einstieg in die Welt der SDR's und ermöglicht den kostengünstigen Empfang von schmalbandigen Funksignalen. Der RTL-SDR eignet sich für den Empfang von niederfrequenten Funksignalen bis rund 1 GHz. Für den Empfang von hochfrequenten Funksignalen über 1 GHz eignet sich der ADALM-PLUTO.



Den RTL-SDR Blog V3 betreibe ich für den mobilen Empfang von niederfrequenten Funksignalen < 1 GHz mit den Android-Apps:

  • SDR driver von Signalware Ltd
  • RF Analyzer von Dennis Mantz
  • Dump1090 von ebcTech

per USB-OTG-Kabel und einer simplen LTE-Antenne (Delock 88451) am Smartphone.

Für den Empfang von hochfrequenten Funksignalen über 1 GHz verwende ich auf einem Laptop unter Windows 10 die Software "SDR Console". SDR Console unterstützt den RTL-SDR Blog V3, den PlutoSDR wie auch den LimeSDR Mini.

SDR Console hat den grossen Vorteil gegenüber ähnlichen Softwareprodukten, dass es NVIDIA CUDA und OpenCL unterstützt. Siehe dazu:


Für ernsthaften Sendebetrieb mit einem SDR eignet sich der (schon deutlich teurere) LimeSDR Mini. Der LimeSDR Mini eignet sich auch für den Empfang von breitbandigen Funksignalen. Zum Beispiel: Mobilfunksignale mit 5 MHz Bandbreite und deutlich mehr (3G/UMTS, 4G/LTE oder 5G).

Der LimeSDR Mini ist mit einem ordentlichen Metallgehäuse erhältlich.




Mit dem LimeSDR Mini lässt sich zum Beispiel ein eigenes Mobilfunknetzwerk (im Keller) betreiben.

Beim Einsatz von SDR's ist auf gute Kühlung zu achten. Metallgehäuse sind für die optimale Kühlung sehr zu empfehlen! Wirkt das Metallgehäuse als Faradayscher Käfig, hält man sich nebenbei auch einige EMV-Probleme vom SDR fern.

Zum Thema "untaugliche Buchsen" sollte der Hinweis genügen, dass man BNC meiden sollte. U.FL eignet sich nur für Experimente im Labor. Profis setzen gerne N-Steckverbinder ein. Ich habe gute Erfahrungen mit SMA und RP-SMA gesammelt.


Für ernsthaften Empfangs- und Sendebetrieb sollte der SDR als Frequenznormal eine Atomuhr verwenden. Dazu muss ein GPSDO am SDR angeschlossen werden. Siehe dazu:
Um diese Inhalte anzuzeigen, benötigen wir die Zustimmung zum Setzen von Drittanbieter-Cookies.
Für weitere Informationen siehe die Seite Verwendung von Cookies.


Um diese Inhalte anzuzeigen, benötigen wir die Zustimmung zum Setzen von Drittanbieter-Cookies.
Für weitere Informationen siehe die Seite Verwendung von Cookies.

Um diese Inhalte anzuzeigen, benötigen wir die Zustimmung zum Setzen von Drittanbieter-Cookies.
Für weitere Informationen siehe die Seite Verwendung von Cookies.

und die Hinweise zum GPSDO unter:

SDR-Anfänger und Fortgeschrittene sollten regelmässig die neuen Beiträge auf der Webseite:
beachten. Diese Webseite bietet einen guten Überblick über die relevanten Neuerungen im SDR-Bereich.

Welche SDR-Hardware und Software die Profis von der Deutschen Telekom einsetzen, erfährt man in diesem Video:
ab der 38. Minute.
 
Zuletzt bearbeitet:
Ich hab mit den Sticks BERUFLICH gearbeitet.
War cool!
Die hatten nicht so den besten Empfang. Aber die waren schoen guenstig. Dann konnte ich meinen Code auf die Dinger optimieren, und sobald dann die Software mit den professionellen Tunern verbunden waren, haben sich alle gewundert dass es SO gut klingt. ;)

Hier noch ein wenig code zum rumspielen:
C:
// The purpose of this program is to provide a rudimentary spectrum plot.

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

#define    FFTSIZE    256

double omega_r[2048];
double omega_i[2048];
double tmp_r[2048];
double tmp_i[2048];

#define PERMUTE8(i)  (((i & 0x001) << 7) | ((i & 0x002) << 5) | ((i & 0x004) << 3) \
                | ((i & 0x008) << 1) | ((i & 0x010) >> 1) | ((i & 0x020) >> 3) \
                | ((i & 0x040) >> 5) | ((i & 0x080) >> 7))

#define PERMUTE9(i)  (((i & 0x001) << 8) | ((i & 0x002) << 6) | ((i & 0x004) << 4) \
                | ((i & 0x008) << 2) | ((i & 0x010) << 0) | ((i & 0x020) >> 2) \
                | ((i & 0x040) >> 4) | ((i & 0x080) >> 6) | ((i & 0x100) >> 8))

#define PERMUTE10(i) (((i & 0x001) << 9) | ((i & 0x002) << 7) | ((i & 0x004) << 5) \
                | ((i & 0x008) << 3) | ((i & 0x010) << 1) | ((i & 0x020) >> 1) \
                | ((i & 0x040) >> 3) | ((i & 0x080) >> 5) | ((i & 0x100) >> 7) \
                | ((i & 0x200) >> 9))

#define PERMUTE11(i) (((i & 0x001) << 10) | ((i & 0x002) << 8) | ((i & 0x004) << 6) \
                | ((i & 0x008) << 4) | ((i & 0x010) << 2) | ((i & 0x020) >> 0) \
                | ((i & 0x040) >> 2) | ((i & 0x080) >> 4) | ((i & 0x100) >> 6) \
                | ((i & 0x200) >> 8) | ((i & 0x400) >> 10))

void inittwiddle(int n)
{
    int i;
    for (i=0;i<n;i++)
    {
        omega_r[i]=cos(2*M_PI*i/n);
        omega_i[i]=-sin(2*M_PI*i/n);
    }
}


void minfft(int n,signed short* block,double* out)
{
    int i;
    int sigma;
    int alpha;
    int beta;
    int betainc;
    int omega;
    int omegainc;
    int omegamask;
    int notmask;
    int mask;


    double xr,xi;
    double yr,yi;
    int sigmas=0;

    switch(n)
    {
        case 256:
            sigmas=8;
            omegamask=0x7f;
            notmask=0x1ff;
            break;
        case 512:
            sigmas=9;
            omegamask=0xff;
            notmask=0x3ff;
            break;
        case 1024:
            sigmas=10;
            omegamask=0x1ff;
            notmask=0x7ff;
            break;
    //    case 2048:
        default:
            sigmas=11;
            omegamask=0x3ff;
            notmask=0xfff;
            break;
    }
    for (i=0;i<n;i++)
    {
        switch(n)
        {
            case 256:
                tmp_r[i]=block[2*PERMUTE8(i)+0];
                tmp_i[i]=block[2*PERMUTE8(i)+1];
                break;
            case 512:
                tmp_r[i]=block[2*PERMUTE9(i)+0];
                tmp_i[i]=block[2*PERMUTE9(i)+1];
                break;
            case 1024:
                tmp_r[i]=block[2*PERMUTE10(i)+0];
                tmp_i[i]=block[2*PERMUTE10(i)+1];
                break;
            case 2048:
                tmp_r[i]=block[2*PERMUTE11(i)+0];
                tmp_i[i]=block[2*PERMUTE11(i)+1];
                break;

        }
    }
    betainc=1;
    omegainc=n/2;
    mask=0;

    for (i=0;i<n/2;i++)
    {
        alpha=(i<<1);
        beta=alpha | 0x01;

        xr=tmp_r[alpha];xi=tmp_i[alpha];
        yr=tmp_r[beta]; yi=tmp_i[beta];

        tmp_r[alpha]=yr+xr;tmp_i[alpha]=yi+xi;
        tmp_r[beta] =xr-yr;tmp_i[beta] =xi-yi;

    }

    for (sigma=1;sigma<sigmas;sigma++)
    {
        double omegar;
        double omegai;
        double mulr;
        double muli;
        omega=0;
        betainc<<=1;
        omegainc>>=1;
        mask=(mask<<1)|0x01;
        notmask=notmask<<1;
        for (i=0;i<n/2;i++)
        {
            alpha=((i&notmask)<<1) | (i&mask);
            beta=alpha|betainc;
            omegar=omega_r[omega];
            omegai=omega_i[omega];
            xr=tmp_r[alpha];xi=tmp_i[alpha];
            yr=tmp_r[beta]; yi=tmp_i[beta];

            mulr=omegar*yr-omegai*yi;
            muli=omegar*yi+omegai*yr;

            tmp_r[alpha]=(xr+mulr);tmp_i[alpha]=(xi+muli);
            tmp_r[beta] =(xr-mulr);tmp_i[beta] =(xi-muli);
            omega += omegainc;
            omega &= omegamask;
        }
    }
    for (i=0;i<n;i++)
    {
        out[2*i+0]=tmp_r[i];
        out[2*i+1]=tmp_i[i];
    }
}



//export PS1="\e[1;30m#\e[0;34m#\e[0;32m#\e[0;36m#\e[1;32m#\e[1;36m#\e[1;33m#\e[1;37m#"
const char *colors[8]={"1;30","0;34","0;32","0;36","1;32","1;36","1;33","1;37"};
const char  symbols[4]={'.','o','O','#'};

void printenergy(double* energy,int fftsize,int columns)
{
    int i;
    double min,max;
    double delta;
    // TODO : reduce energy[fftsize] to energy[columns]

    min=max=energy[0];
    for (i=0;i<fftsize;i++)
    {
        if (energy[i]>max) max=energy[i];
        if (energy[i]<min) min=energy[i];
    }
    delta=max-min;
    if (delta==0) delta=1;
    for (i=0;i<columns;i++)
    {
        double intensity;
        int    y;

        intensity=32*(energy[i]-min)/delta;
        y=intensity;
        if (y>=31) y=31;
        if (y<=0) y=0;
        printf("\x1b[%sm%c",colors[y/4],symbols[y%4]);
    }
    printf("\x1b[0m\n");
   
}
int main(int argc,char** argv)
{
    int i;
    signed short input[FFTSIZE*2];
    double fftout[FFTSIZE*2];
    double energy[FFTSIZE];
    int n;
    int cnt;
    int p;
    int interval;

    if (argc!=2)
    {
        fprintf(stderr,"please run with\n");
        fprintf(stderr,"cat INPUT.iq | %s INTERVALL\n",argv[0]);
        exit(1);
    }
    interval=atoi(argv[1]);
    cnt=0;
    inittwiddle(FFTSIZE);
   

    for (i=0;i<FFTSIZE;i++) energy[i]=0;
    while (!feof(stdin))
    {
        n=0;
        while (n<(FFTSIZE*2) && !feof(stdin))
        {
            n+=fread(&input[n],sizeof(short),FFTSIZE*2,stdin);
        }
        minfft(FFTSIZE,input,fftout);
        for (i=0;i<FFTSIZE;i++)
        {
            if (i<FFTSIZE/2) p=i+FFTSIZE/2;
            else p=i-FFTSIZE/2;
            energy[p]+=sqrt(fftout[i*2+0]*fftout[i*2+0]+fftout[i*2+1]*fftout[i*2+1]);
        }
        cnt++;
        if (cnt>=interval)
        {
            printenergy(energy,FFTSIZE,FFTSIZE);
            cnt=0;
            for (i=0;i<FFTSIZE;i++) energy[i]=0;
       
        }
    }
   
}
 
Und hier:

findet man den Sourcecode eines in der Programmiersprache C geschriebenen SDR-Programm zum Empfang der aktuellen Positionen der in der Nähe befindlichen Schiffen (AIS) per RTL-SDR. => Unbedingt die Kommentare beachten!

Dazu wird die bereits von Dettus vorgestellte "rtl_tcp"-Methode eingesetzt. Vielleicht hilft dieser Sourcecode beim Programmieren des ersten SDR-Programm.

Für die professionelle, hardwaremässige Verarbeitung der Funksignale ist neben dem SDR und dem GPSDO noch einiges an Zusatzhardware wie LNA, PA, Duplexer, Bandpass erforderlich. Ein Einstieg dazu bietet dieser Beitrag:
 
Zurück
Oben