Dekodieren von TiNo Funksignalen mit SDR-RTL und GNURadio

Nur eine Spielerei oder ein Labormessgerät?

Der RTL-SDR ist ein günstiger (ca. 20 EUR) USB Stick mit dem man beliebige Funksignale im Bereich von 100kHz bis 1.8 GHz empfangen kann. Der darin verbaute Chipsatz RTL2832U, ursprünglich für DVB-T entwickelt,  erlaubt die in der Zwischenfrequenz abgetasteten Rohdaten (IQ-Signale) direkt abzugreifen. Da die Abtastrate bis zu 4 MHz geht kann man damit theoretisch jedes modulierte Signal dekodieren, bzw. die Daten mittels FFT zu einem Spektrum Analyzer aufbereiten. Im Netz finden sich Unmengen an Software, z.B für den Empfang von digitalem Radio (DAB), aber auch zum Dekodieren von Satellitensignalen.

In diesem Beitrag möchte ich darlegen was man mit dem RTL-SDR in Bezug auf das TiNo Projekt machen kann, wozu der RTL-SDR taugt und wozu eher nicht.

RTL-SDR USB Stick

Nach Installation der Treiber und geeigneter Software (siehe weiter unten) sieht man sofort, dass der RTL-SDR Stick kein Labormessgerät sein kann: Jede Menge Intermodulationsprodukte, keine feste Pegelbasis aufgrund der man quantitative Messungen machen könnte, bescheidene Dynamik. Hab ich auch gar nicht erwartet – somit ist die Frage in der Überschrift eher rhetorischer Natur.

RTL-SDR Software

Bei der Suche nach geeigneter Software bin ich letztendlich bei drei Programmen fündig geworden: SDR# („SDR Sharp“), „Spectrum“ und GNU Radio„.
SDR# ist wahrscheinlich die populärste und beste RTL-SDR Software und lässt sich auch -relativ- einfach installieren. Das ist jetzt schon etwas länger her, aber ich kann mich erinnern dass es nicht so ganz trivial war. Jedenfalls musste man den Treiber für den RTL-SDR Stick separat installieren. Ist halt am Ende des Tages keine professionelle Software. Trotzdem ein guter Start.
„Spectrum“ hab ich installiert, einmal gestartet und wieder geschlossen. Ich kann damit nichts anfangen. Es hängt sich nach wenigen Augenblicken auf meinem Rechner auf. Die Einstellmöglichkeiten sind bescheiden – aber ich will hier gar keine Software Rezension starten.

Womit ich bei GNU Radio bin. Das Konzept von GNU Radio ist eigentlich genial: auf einem interaktivem Scratch-Pad stellt man sich die Blöcke die ein digitales Radio so benötigt zusammen: Verstärker, Sampler, Filter, Demodulator, etc. Am Ende kompiliert sich ein Software Radio, und man kann das Ergebnis aufzeichnen und/oder visualisieren, sowohl im Zeitbereich als auch im Frequenzbereich. Damit kann man stundenlang schön spielen.

…Und dann hats tatsächlich funktioniert

An einem verregneten Sonntag Nachmittag hat mich dann der Ehrgeiz gepackt, und ich wollte es schaffen, mit GNU Radio TiNo Pakete zu empfangen und zu dekodieren.

Die Abbildung zeigt den gesamten Radio um TiNo Pakete zu empfangen, zu dekodieren und die Daten abzuspeichern. So hab ich es gemacht:
Der RTL-SDR wird auf 865 MHz eingestellt (Frequenz meines Heimnetzwerks) und dann mit ca. 1 MHz abgetastet. Das digitale Signal durchläuft danach einen Tiefpass Filter und ein „Power Squelch“. Dieses unterdrückt schwache Signale und lässt nur Signale mit einer gewissen Mindestleistung durch. Wenn ein Signal den Power Squelch passiert, wird es mit einem Marker versehen, den man u.a. braucht um eine Datei zu generieren die die Daten von jetzt an aufzeichnet.

Der Marker wird von einer Hüllkurvenfunktion erstellt, die nur dann auslöst, wenn eine steigende Flanke der Empfangsleistung über einen bestimmten Triggerwert erkannt wird. Dies ist sehr ähnlich einer Triggerfunktion in einem Oszilloskop. Die Hüllkurve selbst ist einfach zu berechnen, da wir ja FSK benutzen und deshalb Die Magnitude des empfangenen Signals konstant ist. Dazu verwende ich den Block „Complex to Mag“. Im Bild links erkennt man deutlich die Hüllkurve.

Das getriggerte Signal passiert nun den Demodulator. Hier genügt ein Universal-Quadratur Demodulator, weil wir ja „nur“ FSK benutzen, es also nur zwei Werte gibt, 1 und -1. Rechts sieht man was aus dem Demodulator raus kommt, man kann die Bitsequenz bereits deutlich erkennen.

Nun müssen die Rohdaten skaliert werden. Dazu benutze ich einen „Bit Slicer“ welcher Werte kleiner Null als Null interpretiert und alles andere als „1“.

So, jetzt sieht man schon deutlich die einzelnen Bits, und man kann sich ans Auszählen machen. Ich habe die Abtastrate mit 72kHz so gewählt dass immer 4 Einsen ein einzelnes Bit ergeben, und 4 Nullen immer eine Null. Sollten es mal nur drei Nullen sein oder 5 Einsen, macht das auch nichts, das kann man mittels Software einfach korrigieren. Links hab ich mal von Hand die Bits dekodiert und die Daten drüber geschrieben. Es ist genau die TiNo Präambel AA AA AA 2D D2 (hex). Dann folgt 10 (hex), die Länge der folgenden Daten, also 16 Bytes, dann die eigentlichen Daten.

Wenn man diese Daten jetzt abspeichert, kann man sich auf den Bitstrom synchronisieren, und wenn man die Präambel erkannt hat auch auf die Bytes des Pakets. Mit einem kleinen Python Skript habe ich das mal ausprobiert.
Allerdings kam jetzt der Teil der mir am meisten Zeit gekostet hat: Wie speichere ich die Daten getriggert? Das normale „File Sink“ kann man nicht triggern, es speichert den Datenstrom wie er aus dem Bit Slicer kommt. Damit wird die Datei innerhalb von Minuten riesengross, und vor allem kann man praktisch nur Postprocessing machen, da man die Datei erst einmal schliessen muss.

Nach langem Herumprobieren hab ich dann endlich herausgefunden wie man das „tagged File Sink“ benutzt.
Also: der Block generiert für jedes Datenpaket zwischen zwei Tags eine neue Datei. Die Dateinamen sind anscheinend zufällig. Der Tag muss exakt „burst“ heissen, man kann ihn nicht umbenennen. Nach dem Speicherort musste ich auch lange suchen: Er ist im Verzeichnis \GNURadio-3.7\bin und kann nicht geändert werden.
Die Dokumentation dieses Blocks ist leider völlig unbrauchbar.

Auch ein Spektrum kann man erzeugen. Das ist hilfreich um zu erkennen ob das Signal genau zentriert ist, oder ob man das RFM Modul nachstimmen muss.

Mit dem „tagged File Sink“ wird jetzt für jedes empfangene Paket eine eigene Datei erstellt. Natürlich sind auch falsche Trigger dabei, d.h man muss eine darauf aufbauende Software sehr fehlertolerant machen. Ich habe mich darauf beschränkt die Rohdaten zu extrahieren, anzuzeigen und die Datei dann zu löschen, damit man nicht nach einem Tag bereits tausende von Dateien gesammelt hat. Die Daten müssten nun einen De-Interleaver, den FEC Dekoder und die Entschlüsselung durchlaufen. Ich habe kurz geforscht ob man das auch in GNU Radio integrieren kann – ja man kann, aber das ist mega-kompliziert! Bisher hab ich mich nicht daran gewagt.

Fazit

Der RTL-SDR ist ganz klar eher ein Spielzeug als ein ernst zu nehmendes Messgerät. Im Netz zu findende Software ist oft unzuverlässig und/oder erlaubt zu wenige Einstellmöglichkeiten. Mit GNU Radio kann man allerdings nützliche Applikationen erstellen. Das von mir erstellte Software Radio benutze ich zum Testen, z.B. um TiNo Signale zu detektieren und auch um TiNo’s nachzustimmen. Das ist zwar nicht nötig, da die RFM69 Module bisher immer von guter Qualität sind, ich machs aber trotzdem. Die Frequenzgenauigkeit des von mir verwendeten RTL-SDR Sticks ist erstaunlich gut.

Hinterlasse einen Kommentar