Projet: Recevoir les signaux wspr avec plusieurs clé rtl.
1.Le hardware
en cour de réalisation*
-13x clés rtl sdr 820T2
-1x odroid xu4
-2x hub usb 3.0
1x alimentation 5v 5A de préférence stabilisée.
2.Les softs
a.RTL_tools
1 2 3 4 5 6 7 8 9 10 11 |
apt-get install git libusb-1.0-0 libusb-1.0-0-dev git clone git://git.osmocom.org/rtl-sdr.git cd rtl-sdr/ mkdir build cd build cmake ../ -DINSTALL_UDEV_RULES=ON make make install ldconfig cp ../rtl-sdr.rules /etc/udev/rules.d/ sudo reboot |
faites un test avec rtl_test.
S’il y a un message d’erreur ajouter dans le fichier /etc/modprobe.d/blacklist.conf:
1 2 |
#rtl sdr blacklist dvb_usb_rtl28xxu |
A l’aide de rtl_eeprom veuillez modifier les numéros de séries des clé tel que 00000001 pour votre première clé, 00000002 pour la deuxième etc…
Personnellement je les branche les une après les autres et utilise:
1 |
rtl_eeprom -d 0 -s 00000001 |
b.Script d’autocorrection
correction.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 |
#!/usr/bin/env python # -*- coding: utf-8 -*- import string, subprocess, sys from rtlsdr import RtlSdr conffile=os.path.dirname(os.path.abspath(__file__)) + "/config.ini" data = {} numdevices = 0 def printf(text,end): sys.stdout.write(text + end) sys.stdout.flush() def initconfig(file): global data, numdevices lines = [line.rstrip('\n') for line in open(file)] for line in lines: infos = line.split(',') data[infos[0]] = {} data[infos[0]]["serial"]=infos[0] data[infos[0]]["index"]=infos[1] data[infos[0]]["gain"]=infos[2] data[infos[0]]["corppm"]=infos[3] data[infos[0]]["corfreq"]=infos[4] data[infos[0]]["RXfreq"]=infos[5] cmd = "rtl_eeprom 2>&1 | grep 'Found [0-9][0-9]*'" numdevices = int((subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE).stdout.read()).split(' ')[1]) def saveconfig(file): global data f = open(file,"w") for key in sorted(data.iterkeys()): sav = str(data[key]["serial"])+","+str(data[key]["index"])+","+str(data[key]["gain"])+","+str(data[key]["corppm"])+","+str(data[key]["corfreq"]+","+str(data[key]["RXfreq"]) f.write(sav) f.write("\n") f.close() def getcor(device): global data cmd = "rtl_power -f 124M:126M:175h -d" + str(device) + " -i 5 -g 10 -1 -P 2> /dev/null | awk -F ',' -v max=-100 -v freq=0 '{for (i=8;i<=NF;i++) if($i>max){freq=i;max=$i}}END{print int($3 + ((freq-8) * $5)) ;print int(-(($3 + ((freq-8) * $5))- 125000000) / 125)}'" out = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE).stdout.read() ppmcor = int(out.split('\n')[1]) printf(" try ppmcor test on " + str(ppmcor), end='') cmd = "rtl_power -f 124M:126M:175h -d" + str(device) + " -i 5 -g 10 -1 -P -p " + str(ppmcor) + " 2> /dev/null| awk -F ',' -v max=-100 -v freq=0 '{for (i=8;i<=NF;i++) if($i>max){freq=i;max=$i}}END{print int($3 + ((freq-8) * $5)) ;print int(-(($3 + ((freq-8) * $5))- 125000000) / 125)}'" out = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE).stdout.read() while int(out.split('\n')[1]) != 0: printf(" try ppmcor to " + str(ppmcor), end='') cmd = "rtl_power -f 124M:126M:175h -d" + str(device) + " -i 5 -g 10 -1 -P -p " + str(ppmcor) + " 2> /dev/null| awk -F ',' -v max=-100 -v freq=0 '{for (i=8;i<=NF;i++) if($i>max){freq=i;max=$i}}END{print int($3 + ((freq-8) * $5)) ;print int(-(($3 + ((freq-8) * $5))- 125000000) / 125)}'" out = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE).stdout.read() ppmcor = ppmcor + int(out.split('\n')[1]) printf(" ppmcor is " + str(ppmcor), end='') freqcor = 125000000 - int(out.split('\n')[0]) printf(" freqcor is " + str(freqcor), end='') return [ppmcor,freqcor] def getindex(serial): global numdevices index = "nan" for i in range(numdevices): cmd = "rtl_eeprom -d" + str(i) + " 2>&1 >/dev/null | grep 'Serial number\:' | sed -E 's/Serial number:[[:blank:]]+//' | tr -d '\n' " out = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE).stdout.read() if int(out) != "" and out == serial: index = i break return index if __name__ == "__main__": initconfig(conffile) for serial, infos in data.iteritems(): printf("Search for: " + infos["serial"], end='') data[serial]["index"] = getindex(infos["serial"]) printf(" index is " + str(data[serial]["index"]), end='') if data[serial]["index"] != "nan": res = getcor(infos["index"]) data[serial]["corppm"] = res[0] data[serial]["corfreq"] = res[1] print "" saveconfig("config.ini") |
config.ini (ajouter les lignes en fonction de vos clés) (serial, index, gain, ppm de correction, offset après correction, fréquence de récéption) (index, ppm de correction, offset après correction sont généré par le script correction.py)(serial correspond au numéro de série de la clé, il est implémenté en utilisant rtl_eeprom)
1 2 3 4 5 |
00000001,2,0,26,125,1836600 00000002,1,0,49,125,3592600 00000003,0,0,41,125,5287200 00000004,4,0,41,125,7038600 00000005,3,0,41,-119,10138700 |
c.Guenael/rtlsdr-wsprd
Ceci est le logiciel qui permet d’utiliser les clé rtl pour decoder headless du wspr.
A retrouver sur https://github.com/Guenael/rtlsdr-wsprd.
1 2 3 4 5 |
git clone https://github.com/Guenael/rtlsdr-wsprd cd rtlsdr-wsprd apt-get install build-essential cmake libfftw3-dev libusb-1.0-0-dev curl libcurl4-gnutls-dev ntp make make install |
ne pas oublier de copier rtlsdr_wsprd dans le même répertoire que les scripts.
d.script de lancement des RX
1 |
apt-get install screen |
lunchRX.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
#!/usr/bin/env python # -*- coding: utf-8 -*- import string, subprocess, sys, os from rtlsdr import RtlSdr calls="F4HTB" loc="JN38tg" actdir=os.path.dirname(os.path.abspath(__file__)) data = {} def printf(text,end): sys.stdout.write(text + end) sys.stdout.flush() def initconfig(file): global data, numdevices lines = [line.rstrip('\n') for line in open(file)] for line in lines: infos = line.split(',') data[infos[0]] = {} data[infos[0]]["serial"]=infos[0] data[infos[0]]["index"]=infos[1] data[infos[0]]["gain"]=infos[2] data[infos[0]]["corppm"]=infos[3] data[infos[0]]["corfreq"]=infos[4] data[infos[0]]["RXfreq"]=infos[5] if __name__ == "__main__": initconfig(actdir+"/config.ini") for serial, infos in data.iteritems(): if data[serial]["index"] != "nan": cmd = "screen -S wsprd"+data[serial]["serial"]+" -dm "+actdir+"/rtlsdr_wsprd -i "+data[serial]["index"]+" -f "+data[serial]["RXfreq"]+" -c "+calls+" -l "+loc+" -g "+data[serial]["gain"]+" -p "+data[serial]["corppm"]+" -o "+data[serial]["corfreq"]+" -u 125M " print "strating wsprd"+data[serial]["serial"] out = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE) |
3.Utilisation
-Installer les scripts et logiciels tel que défini par avant.
-Implémenté les numéros de série sur les clés
-Ajouter les lignes a config.ini
-exécuter le script correction.py
-exécuter lunchRX.py