Mit einem SDR kann man Frequenzen überwachen. Mit rtl_power kann man dann CSV Dateien schreiben und diese dann mit einem Python Script in eine schöne übersichtliche Wasserfall Grafik umwandeln. Da kann man dann leicht sehen was für Aktivität auf den jeweiligen Frequenzen los war. Hier in Hannover ist halt nicht so viel los. Und das alles auf einen kleine Raspberry Pi.
Ich hatte vor einem Jahr schon mal davon berichtet, wie das mit meinem Java Programm geht. Nun wollte ich mal das Python Script ausprobieren was ich auf GitHub gefunden habe.
Wir nehmen mal die ACARS Frequenzen, andere siehe in dieser Tabelle.
Hier ein Auszug was so auf den Frequenzen läuft:
1 2 3 |
131,525 ACARS Europa Sekundär 131,725 ACARS Europa Primär 131,825 ACARS Europa Sekundär |
Wir starte rtl_power im Frequenzbereich 131 MHz bis 132 MHz, schreiben alle 10 Sekunden das Ergebnis in 1 KHz Schritten in die airband-131.000-131.999M-1k-12h.csv Datei und lassen das ganze 12 Stunden laufen. Als Korrekturfaktor gebe ich 48 ppm mit, das ist für andere Sticks natürlich ein anderer Wert, kann aber auch weggelassen werden.
1 |
rtl_power -f 131.000M:131.999M:1k -g 30 -i 10 -e 12h -p 48 airband-131.000-131.999M-1k-12h.csv |
Dann wandeln wir die erzeugte CSV Datei mit dem Python Script heatmap.py um. Wir schreiben alle 15 Minuten für die Y-Achse einen Zeit-Label und verwende die twente Palette, die gefällt mir am Besten:
1 |
python heatmap.py --ytick 15 --palette twente airband-131.000-131.999M-1k-12h.csv airband-131.000-131.999M-1k-12h-besch-twent.jpg |
An dem Diagramm sehen wir auch, das der Scann-Prozess nach 3 Stunden abgebrochen ist. Aber drei Stunden reichen auch:
Es können auch noch andere Paletten verwendet werden:
Z.B. extended:
oder charolastra:
oder ohne Beschriftung:
Hier noch die Anleitung und Parameter zu dem Script:
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 |
python heatmap.py -h loading usage: heatmap.py [-h] [--offset OFFSET_FREQ] [--ytick TIME_TICK] [--db DB_LIMIT DB_LIMIT] [--compress COMPRESS] [--low LOW_FREQ] [--high HIGH_FREQ] [--begin BEGIN_TIME] [--end END_TIME] [--head HEAD_TIME] [--tail TAIL_TIME] [--palette PALETTE] INPUT OUTPUT Convert rtl_power CSV files into graphics. positional arguments: INPUT Input CSV file. (may be a .csv.gz) OUTPUT Output image. (various extensions supported) optional arguments: -h, --help show this help message and exit --offset OFFSET_FREQ Shift the entire frequency range, for up/down converters. --ytick TIME_TICK Place ticks along the Y axis every N seconds/minutes/hours/days. --db DB_LIMIT DB_LIMIT Minimum and maximum db values. --compress COMPRESS Apply a gradual asymptotic time compression. Values > 1 are the new target height, values < 1 are a scaling factor. --palette PALETTE Set Color Palette: default, extended, charolastra, twente Slicing: Efficiently render a portion of the data. (optional) Frequencies can take G/M/k suffixes. Timestamps look like "YYYY-MM-DD HH:MM:SS" Durations take d/h/m/s suffixes. --low LOW_FREQ Minimum frequency for a subrange. --high HIGH_FREQ Maximum frequency for a subrange. --begin BEGIN_TIME Timestamp to start at. --end END_TIME Timestamp to stop at. --head HEAD_TIME Duration to use, starting at the beginning. --tail TAIL_TIME Duration to use, stopping at the end. |
Und für rtl_power:
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 |
rtl_power -h rtl_power, a simple FFT logger for RTL2832 based DVB-T receivers Use: rtl_power -f freq_range [-options] [filename] -f lower:upper:bin_size [Hz] (bin size is a maximum, smaller more convenient bins will be used. valid range 1Hz - 2.8MHz) [-i integration_interval (default: 10 seconds)] (buggy if a full sweep takes longer than the interval) [-1 enables single-shot mode (default: off)] [-e exit_timer (default: off/0)] [-d device_index (default: 0)] [-g tuner_gain (default: automatic)] [-p ppm_error (default: 0)] [-T enable bias-T on GPIO PIN 0 (works for rtl-sdr.com v3 dongles)] filename (a '-' dumps samples to stdout) (omitting the filename also uses stdout) Experimental options: [-w window (default: rectangle)] (hamming, blackman, blackman-harris, hann-poisson, bartlett, youssef) [-c crop_percent (default: 0%, recommended: 20%-50%)] (discards data at the edges, 100% discards everything) (has no effect for bins larger than 1MHz) [-F fir_size (default: disabled)] (enables low-leakage downsample filter, fir_size can be 0 or 9. 0 has bad roll off, try with '-c 50%') [-P enables peak hold (default: off)] [-D enable direct sampling (default: off)] [-O enable offset tuning (default: off)] CSV FFT output columns: date, time, Hz low, Hz high, Hz step, samples, dbm, dbm, ... Examples: rtl_power -f 88M:108M:125k fm_stations.csv (creates 160 bins across the FM band, individual stations should be visible) rtl_power -f 100M:1G:1M -i 5m -1 survey.csv (a five minute low res scan of nearly everything) rtl_power -f ... -i 15m -1 log.csv (integrate for 15 minutes and exit afterwards) rtl_power -f ... -e 1h | gzip > log.csv.gz (collect data for one hour and compress it on the fly) Convert CSV to a waterfall graphic with: http://kmkeen.com/tmp/heatmap.py.txt |
Das Python Script gibt es auf GitHub. Weiter Infos hier auf dem Block.