1. Praktikum: ADS-B Empfänger 1.1. Einleitung 1.1.1. Automatic Dependent Surveillance - Broadcast Automatic Dependent Surveillance - Broadcast (ADS-B) ist ein Funkdienst zur Ortung und Überwachung von Flugzeugen im Luftraum. Flugzeuge senden zu Flugsicherungszwecken in regelmäÿigen Intervallen ihre Position und weitere Flugdaten auf einer Frequenz von 1090 MHz. Die gesendeten Daten umfassen unter anderem: Identikation (ICAO-Code) Flugname Flughöhe (Altitude) Geographische Breite (Latitude) Geographische Länge (Longitude) Flugrichtung (Heading) Geschwindigkeit (Velocity) Steigleistung (Vertical Rate) ADS-B wird parallel zur üblichen Radarüberwachung eingesetzt. 1.1.2. Software Dened Radio Üblicherweise werden Elemente eines Kommunikationssystems wie Mischer, Verstärker, Filter und Modulator als Hardwarekomponenten ausgelegt. Dies hat den Nachteil, dass ein System nachträglich nicht mehr umkonguiert werden kann. Ein Software Dened Radio (SDR) ist Gerät bei dem möglichst viele der Komponenten in Software realisiert werden. Bei einem idealen SDR ist die Antenne direkt mit Nitsche, Kremer 1 Informationssysteme 1. Praktikum: ADS-B Empfänger einem Analog-Digital-Wandler verbunden, alle weiteren Verarbeitungsschritte geschehen in der Software. Ein Sender oder Empfänger kann durch Umkonguration schnell für verschiedene Zwecke eingesetzt werden. SDR sind meist teure Geräte, da sie über viel Rechenleistung verfügen müssen und beispielsweise FPGA verwenden. Für den Privatnutzer wurden SDR erschwinglich, als ndige Entwickler für bestimmte DVB-T Dongles (z.B. mit dem Chip Realtek RTL2832U/R820T) einen Treiber entwickelten, der sie zu SDR umrüstete. Der Frequenzbereich ist je nach Chipsatz unterschiedlich aber beispielsweise im Bereich von 20 MHz bis 2 GHz bei einer maximalen Abtastrate von 2 − 2, 5 MsS . Weitere In- formationen zu den nachrichtentechnischen Grundlagen werden im Fach Digitale Kommunikationssysteme behandelt. Ziel dieses Praktikums ist es, mit einem DVB-T Stick, der als SDR arbeitet einen ADS-B Empfänger aufzubauen. Die empfangenen Daten werden dabei in einer Datenbank abgelegt und in den kommenden Praktika mittels einer Webseite visualisiert. 1.2. Vorbereitung Bearbeiten Sie zur Vorbereitung auf das Praktikum bitte folgende Fragen und Aufgaben: Wie können in MySQL Skripte aufgerufen werden? Wozu dienen Schlüssel in einer Datenbank? Was ist der Unterschied zwischen Primär- und Sekundärschlüsseln? Entwerfen Sie eine SQL-Abfrage, die die maximale Flughöhe (Altitude) aus der Tabelle ightdata bestimmt (Hinweis: Aggregatfunktionen). flightdata |--------------------| | id # int | | altitude int | Die geographischen Koordinaten von Krefeld (genauer des F-Gebäudes am Campus Krefeld Süd) sind 51°18'58.6"N und 6°34'10.0"E. Berechnen Sie die Koordinaten als Darstellung in Dezimalgrad. Berechnen Sie getrennt für geographische Breite und Länge den Wertebereich für eine Abweichung von Nitsche, Kremer 2 Informationssysteme 1. Praktikum: ADS-B Empfänger ±10 km in Dezimalgrad. Hinweis: Eine Breitenminute entspricht 1, 852 km und eine Längenminute entspricht 1, 852 km · cos(ϕ). Sofern Sie sich in der Übung einen Raspberry Pi ausgeliehen haben, bringen Sie ihn bitte zum Praktikum mit. Es stehen keine Ersatzgeräte zur Verfügung. 1.3. Durchführung 1.3.1. Inbetriebnahme Sie erhalten von den Betreuern neben dem aus der Übung bekannten Raspberry Pi einen DVB-T Dongle, der in diesem Versuch als SDR dienen wird. Er basiert auf dem bereits erwähnten Realtek RTL2832U Chipsatz, der für kostengünstige SDR verwendet werden kann. Schlieÿen Sie den Dongle an einen der freien USB-Steckplätze und verbinden Sie ihn mit der Antenne. Den Raspberry Pi starten Sie, indem Sie ihn mit der Stromversorgung verbinden. Die Logindaten für den Hauptrechner und den Raspberry Pi sollten aus der Übung bekannt sein, ansonsten fragen Sie einen der Betreuer. Nach erfolgreichem Login über SSH testen Sie zunächst die Funktionalität des DVBT Dongles, indem Sie die Testfunktion aufrufen. user@rpi201 ~ $ rtl_test -t Es sollte ein Gerät (device) gefunden und dessen unterstützte Modi angezeigt werden. Found 1 device(s): 0: Realtek, RTL2838UHIDIR, SN: 00000001 Using device 0: Generic RTL2832U OEM Found Rafael Micro R820T tuner Supported gain values (29): 0.0 0.9 1.4 2.7 3.7 7.7 8.7 12.5 14.4 15.7 16.6 19.7 20.7 22.9 25.4 28.0 29.7 32.8 33.8 36.4 37.2 38.6 40.2 42.1 43.4 43.9 44.5 48.0 49.6 Sampling at 2048000 S/s. No E4000 tuner found, aborting. Laden Sie nun die vorbereitete Software herunter und entpacken diese in das Verzeichnis praktikum/dump1090. user@rpi201 ~ $ cd praktikum Nitsche, Kremer 3 Informationssysteme 1. Praktikum: ADS-B Empfänger user@rpi201 ~/praktikum $ wget http://lionel.kr.hsnr.de/~nitsche/ ins/praktikum01/dump1090.tar.gz user@rpi201 ~/praktikum $ tar -xvzf dump1090.tar.gz Die Software liegt als Sourcecode vor. Das Programm muss noch kompiliert werden. user@rpi201 ~/praktikum $ cd dump1090 user@rpi201 ~/praktikum/dump1090 $ make Das Kompilieren wird einen Moment dauern. Lassen Sie sich anschlieÿend die Hilfe für das Programm anzeigen. user@rpi201 ~/praktikum/dump1090 $ ./dump1090 --help Starten Sie das Programm im interaktiven Modus. Es wird eine Tabelle angezeigt, die nach einiger Zeit Flüge anzeigen sollte. Hex Mode Sqwk Flight Alt Spd Hdg Lat Long Sig Msgs Ti/ -------------------------------------------------------------4ca893 S 5764 RYR12KT 9825 294 000 51.187 6.479 11 128 0 3c49c5 S 5355 BER7727 20975 435 057 51.019 7.348 7 405 5 471f52 S 3431 WZZ4KA 37025 505 106 51.039 7.264 11 2342 1 4cc0db S 7166 TAY024A 27000 460 048 51.433 7.088 13 2850 1 3c6510 S 4115 DLH520 32000 396 297 51.528 6.672 9 4178 0 Die Anzahl der Flüge ist stark von der Flugaktivität im beobachteten Zeitraum abhängig. Auch die Empfangsleistung und damit die Reichweite wird durch verschiedene Faktoren, beispielsweise der Wahl der Antenne beeinusst. Angezeigt werden immer die aktuellsten Daten, die von einem Flug empfangen werden. Diese Daten sollen in einer MySQL-Datenbank gespeichert werden. Dazu ist das Programm um eine Datenbankschnittstelle zu erweitern. 1.3.2. Erstellen der Tabelle ights Zunächst wird in der Datenbank eine Tabelle create_tables.sql, ights erstellt. Schreiben Sie ein Skript dass die SQL-Befehle zur Erstellung der Tabelle beeinhaltet. flights |------------------------| | icao # char(6) | | flight varchar(7) | Nitsche, Kremer 4 Informationssysteme 1. Praktikum: ADS-B Empfänger Führen Sie Ihr Skript in der Datenbank praktikum aus. mysql> SOURCE create_tables.sql Testen Sie, ob die Tabelle angelegt wurde. mysql> SHOW TABLES; +--------------------+ | Tables_in_dump1090 | +--------------------+ | flights | +--------------------+ 1 rows in set (0.00 sec) 1.3.3. Flüge automatisch importieren Im nächsten Schritt muss das Programm um den Zugri auf die Datenbank erweitert werden. Dazu wurden die Dateien mysql.h und mysql.c vorbereitet. In der mysql.h tragen Sie die Logindaten für Ihre Datenbank ein. user@rpi201 ~/praktikum/dump1090 $ nano mysql.h Aus Sicherheitsgründen wird dafür im Normalfall oft ein eigener Datenbankbenutzer angelegt. Dessen Rechte wären derart eingeschränkt, dass er nur Einfügungen in eine Tabelle ausführen kann. Da das Thema Datenbankadministration in diesem Praktikum nicht behandelt wird, verzichten wir auf diesen Schritt und verwenden wie in den Übungen den Benutzernamen Die mysql.c dbuser. ist für den aktuellen Stand vorbereitet, muss aber später erweitert wer- den. Kompilieren Sie das Programm erneut und führen Sie es mit der Option mysql aus. user@rpi201 ~/praktikum/dump1090 $ make clean user@rpi201 ~/praktikum/dump1090 $ make user@rpi201 ~/praktikum/dump1090 $ ./dump1090 --interactive --mysql Loggen Sie sich in einer zweiten Terminalsession auf der Datenbank des Raspberry ein. Mit mysql> SELECT * FROM flights; können Sie den Inhalt der Tabelle abrufen. Sofern Flüge empfangen werden, sollte die Tabelle bereits einige Zeilen beeinhalten. Nitsche, Kremer 5 Informationssysteme 1. Praktikum: ADS-B Empfänger 1.3.4. Tabelle für weitere Flugdaten Bisher verwenden wir die in der Tabelle ights lediglich die ICAO und den Flugna- men aus den zur Verfügung stehenden Daten. Für eine spätere Anwendung werden wesentlich mehr Daten benötigt. Erstellen Sie eine neue Tabelle ightdata mit folgender Struktur: flights flightdata |-------------| |-------------| | icao # | <----- | icao | | flight | | id # | | altitude | | latitude | | longitude | | heading | | velocity | | vert_rate | | timestamp | | submitter | Machen Sie sich in der Datei aircraft dump1090.h mit den Strukturen modesMessage und vertraut. Dort nden sich die geforderten Daten und deren Datentypen. Ergänzen Sie daraufhin Ihr Skript ightdata. create_tables.sql um die Erstellung der Tabelle Der Primärschlüssel dieser Tabelle soll ein Index id sein, der bei neuen Einträgen automatisch erhöht wird (AUTO_INCREMENT ). Die Spalte ta.icao ist ein Fremdschlüssel auf ights.icao. Auÿerdem soll es ein Feld geben, dass den Namen des Eintragenden (z.B. rpi201 ) ightdasubmitter aufzeichnet. 1.3.5. Flugdaten importieren mysql.c ightdata. Modizieren Sie als nächstes die Datei und ergänzen ein weiteres SQL- Statement zum Import in die Tabelle Sie können sich dabei am bereits vorhandenen Programmcode orientieren. Kompilieren Sie das Programm neu. Vergessen Sie nicht das Programm bei jeder Änderung erneut zu kompilieren. Da hier ein sogennantes Makele verwendet wird, wird nur der Programmteil neukompiliert, der geändert wurde. Das erneute kompilieren sollte also schneller gehen als beim ersten Mal. Nitsche, Kremer 6 Informationssysteme 1. Praktikum: ADS-B Empfänger user@rpi201 ~/praktikum/dump1090 $ make Sobald Sie Ihr Programm starten und Flugzeuge empfangen werden, sollte sich auch die Tabelle ightdata füllen. Prüfen Sie das mit der Abfrage mysql> SELECT count(*) AS anzahl FROM flightdata; 1.3.6. Flugdaten säubern (Trigger) Wenn Sie sich die Werte in der Tabelle ightdata anschauen mysql> SELECT altitude, latitude, longitude FROM flightdata; werden Sie feststellen das etliche der Werte Nullwerte sind, da nicht in jedem Paket alle Daten übermittelt werden. Sie können auch gezielt die Anzahl dieser Zeilen bestimmen. mysql> SELECT count(*) FROM flightdata WHERE latitude = 0; Eine Möglichkeit diese unvollständigen Werte zu entfernen besteht darin einen ger anzulegen, der eine zweite Tabelle cleandata Trig- nur dann füllt, wenn die Daten vollständig sind. Unvollständige Inserts werden verworfen. cleandata, deren Struktur der Tabelle ightdata entspricht. Sie können Ihr Skript create_tables.sql entsprechend leicht ergänzen. Erzeugen Sie dazu zunächst eine Tabelle Legen Sie nun ein neues Skript create_trigger.sql zur Erzeugung des Triggers mit folgendem Inhalt an: delimiter $ DROP TRIGGER checkdata$ CREATE TRIGGER checkdata BEFORE INSERT ON flightdata FOR EACH ROW BEGIN IF NEW.latitude != 0 THEN INSERT INTO cleandata(icao, altitude) VALUES(NEW.icao, NEW.altitude); END IF; END$ delimiter ; Nitsche, Kremer 7 Informationssysteme 1. Praktikum: ADS-B Empfänger Ergänzen Sie das Skript um eine Überprüfung von Longitude auf Nullwerte und ergänzen Sie das INSERT INTO-Statement um Einfügungen in die restlichen Spalten. Erstellen Sie nun den Trigger. mysql> SOURCE create_trigger.sql; Löschen Sie auÿerdem alle bisherigen Werte in der Tabelle ightdata. Und starten Sie das Programm neu. mysql> DELETE FROM flightdata; user@rpi201 ~/praktikum/dump1090 $ ./dump1090 --interactive --mysql Prüfen Sie, ob Einträge in cleandata erzeugt werden. Nach einer Weile sollten in der Tabelle cleandata weniger Einträge vorhanden sein, als in der tabelle ightdata. Prüfen Sie dies mit folgendem Statement: mysql> SELECT count_fd, count_cd FROM (SELECT count(*) as count_fd FROM flightdata) as x, (SELECT count(*) as count_cd FROM cleandata) as y; 1.3.7. SQL-Abfragen Nutzen Sie die Ergebnisse aus der Vorbereitungsaufgabe, um zu bestimmen welche Flüge sich im Beobachtungszeitraum im Umkreis von ±10 km um Kre- feld befunden haben (Hinweis: SELECT DISTINCT). Bestimmen Sie das schnellste Flugzeug in Ihrer Aufzeichnung (Hinweis: Aggregatfunktionen). Zeigen Sie bei den beiden vorherigen Aufgaben neben der icao auch die Flug- nummer an (Hinweis: Join). Nitsche, Kremer 8 Informationssysteme