WSPR RTL SDR MULTI RX

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

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:

#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:

rtl_eeprom -d 0 -s 00000001

b.Script d’autocorrection

correction.py

#!/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)

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.

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

apt-get install screen

lunchRX.py

#!/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

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.