2. Praktikum: Verteilte Systeme und Webseiten 2.1. Einleitung Im ersten Praktikum wurde ein ADS-B Empfänger zum Empfang von Flugverkehrsdaten basierend auf einem Raspberry Pi und einem DVB-T Stick entwickelt. Die empfangenen Daten wurden in eine Tabelle einer lokalen MySQL-Datenbank gespeichert. Empfangen wurden dabei Flugzeuge im Umkreis von etwa 50 km. Für Flugsicherungszwecke ist das ein sehr kleiner Umkreis, da Flugzeuge mit einer hohen Geschwindigkeit iegen (beispielsweise 800 km ) und deshalb innerhalb weniger h Minuten den Empfangsbereich durchqueren können. Sinnvoll wäre der Aufbau eines Systems mit mehreren geographisch verteilten Stationen. Dies wird im ersten Teil dieses Praktikums realisiert, indem das System aus dem ersten Versuch so abgewandelt wird, dass alle Teilnehmer Ihre Daten in eine zentrale Datenbank im Netzwerk speichern. In der zweiten Hälfte dieses Praktikums wird eine Webanwendung für die Flugdaten entwickelt, die am dritten Praktikumstermin weiterentwickelt wird. 2.2. Vorbereitung Bearbeiten Sie zur Vorbereitung auf das Praktikum bitte folgende Fragen und Aufgaben: Erläutern Sie, was ein SSH-Tunnel ist und nennen Sie zwei Gründe für deren Einsatz. Mit welchem HTML-Befehl lassen sich Bilder einbinden? Machen Sie sich mit der Datenbankstruktur aus dem ersten Termin wieder vertraut. Nitsche, Kremer 1 Informationssysteme
2.3. Durchführung 2.3.1. Serververbindung Nehmen Sie zunächst Ihr System des ersten Termins wieder in Betrieb. Verbinden Sie sich über SSH mit Ihrem Raspberry Pi und testen Sie, ob Sie Daten empfangen und ob die Daten in die entsprechende Datenbanktabelle geschrieben werden. Sobald Ihr System funktioniert, können Sie die hinterlegten Verbindungsdaten für den Datenbankzugri so abändern, dass anstatt dem lokalen ein entfernter MySQL- Server verwendet wird. Als Server fungiert ein (virtueller) Rechner im Labor für Echtzeitsysteme. Ergänzen Sie dazu die Datei mysql.h um folgende Zeile: #define MYSQL_REMOTEPORT 10254 Ändern Sie auÿerdem den Host auf ezs.kr.hsnr.de. Die anderen Angaben ändern sich nicht, der Server nutzt ebenfalls den Benutzernamen dbuser mit dem Passwort dbuser und der Datenbank praktikum. Damit die neu denierte Konstante auch verwendet wird, müssen Sie in der Datei mysql.c den Verbindungsaufbau entsprechend ergänzen: mysql_real_connect(conn, MYSQL_HOST, MYSQL_USER, MYSQL_PASS, MYSQL_DB, MYSQL_REMOTEPORT, NULL, 0); Diese Änderungen machen eine Neukompilation erforderlich. user@rpi201 ~/praktikum/dump1090 $ make Testen Sie, ob die Verbindung funktioniert, indem Sie Ihr Programm starten. user@rpi201 ~/praktikum/dump1090 $./dump1090 --interactive --mysql Die bekannte Darstellung des interaktiven Modus sollte erscheinen. Die Tabelle füllt sich auf dem Server. Sie können sich mit Ihrem lokalen MySQL-Client ebenfalls an einem entfernten Host anmelden. Dazu muss lediglich der entsprechende Host und Port angegeben werden. user@ubuntu-ikt ~ $ mysql praktikum -h ezs.kr.hsnr.de --port 10254 -u dbuser -p Schauen Sie sich die Inhalte der Tabelle ightdata an. Nitsche, Kremer 2 Informationssysteme
mysql> SELECT * FROM flightdata; Wenn andere Studenten ebenfalls bereits an diesem Punkt angelangt sind, gibt es möglicherweise bereits viele Einträge. Modizieren Sie das SQL-Statement so, dass Sie nur Ihre eigenen Daten erhalten. 2.3.2. SSH-Tunnel Um die Datenübertragung abzusichern, soll die Verbindung über einen SSH-Tunnel hergestellt werden. Dabei wird gesamte Kommunikation mit der zentralen Datenbank über SSH gekapselt. Die Syntax für die Einrichtung des Tunnels lautet wie folgt: $ ssh -L localport:host:hostport user@remotehost Der Localport ist derjenige Port, der an einen entfernten Server weitergeleitet werden soll. Für unseren konkreten Fall ergibt sich der Befehl wie folgt: user@rpi201 ~/praktikum/dump1090 $ ssh -L 10254:localhost:5432 -p 8122 sshuser@ezs.kr.hsnr.de Das Passwort lautet sshuser. Lassen Sie das Terminalfenster oen und arbeiten Sie fortan in einem anderen Fenster. Ändern Sie auÿerdem (wie zuvor in Abschnitt 2.3.1) die MYSQL_HOST auf 127.0.0.1. Kompilieren Sie das Programm erneut. Möglicherweise müssen Sie zunächst einmal make clean eingeben, da ansonsten die Änderungen in der mysql.h nicht detektiert werden. user@rpi201 ~/praktikum/dump1090 $ make clean user@rpi201 ~/praktikum/dump1090 $ make Starten Sie wiederum das Programm mit den Modi - -interactive und - -mysql. Prüfen Sie, ob in der Datenbank weiterhin Ihre Werte eingetragen werden. Die Verbindung zur Datenbank kann vom Raspberry Pi aus auch über den SSH-Tunnel erfolgen. user@rpi201 ~/praktikum/dump1090 $ mysql praktikum -h 127.0.0.1 --port 10254 -u dbuser -p Nitsche, Kremer 3 Informationssysteme
Während Sie an den folgenden Aufgaben arbeiten lassen Sie das Programm im Hintergrund einfach weiterlaufen. 2.3.3. Startseite Die Daten des ADS-B Empfänger sollen nun auf einer Webseite dargestellt werden. Ihre Webseite soll die folgende Struktur haben: (Startseite) index.html impressum.html flights.php details.php Erstellen Sie zunächst eine Startseite für die Webpräsenz. Folgende Elemente soll die Seite mindestens enthalten: Titeldenition (im Head!) Überschrift Logo Links zu den beiden Unterseiten Die Überschrift (z.b. Flugraumüberwachung) soll als solche formatiert sein. Als Logo können Sie ein beliebiges Bild verwenden, beispielsweise das Logo des Fachbereichs. Bitte speichern Sie es im Unterordner images. user@rpi201 /var/www/images $ sudo wget --no-check-certificate http://lionel.kr.hsnr.de/~nitsche/ins/praktikum02/fb03.png Positionieren Sie es in der rechten oberen Ecke mit einer festen Breite von 200 Pixeln. Die Pfadangabe soll relativ erfolgen. Testen sie die Darstellung, indem Sie die Seite im Browser aufrufen. 2.3.4. Impressum Das Impressum sollte folgende Elemente enthalten: Titeldenition Nitsche, Kremer 4 Informationssysteme
Überschrift (Impressum) Den Text Diese Webseite wird betrieben von: gefolgt von Kontaktdaten. Link zurück zur Startseite Die Kontaktdaten sollen als ungeordnete Liste formatiert werden. Sie können Ihre echten Kontaktdaten verwenden oder auch Daten ernden. 2.3.5. Formular zur Flugauswahl In diesem Abschnitt gehen wir schrittweise vor. Legen Sie zunächst eine neue Datei ights.php mit folgendem Inhalt an: <?php $link = mysqli_connect('127.0.0.1', 'dbuser', 'dbuser', 'praktikum', '10254'); if (mysqli_connect_errno()){ die("failed to connect to MySQL: ". mysqli_connect_error()); } echo 'Erfolgreich verbunden'; mysqli_close($link);?> Rufen Sie das Skript mit Ihrem Browser das Skript auf. http://192.168.15.xxx/flights.php Im Erfolgsfall sollte dort Erfolgreich verbunden stehen. Falls dies nicht der Fall ist, prüfen Sie zunächst, ob der SSH-Tunnel noch besteht. Fügen Sie der Seite jetzt eine Überschrift und einen Link zurück zur Hauptseite hinzu und testen Sie diese. Das folgende SQL-Statement liefert die zehn aktuellsten Flüge. SELECT DISTINCT icao FROM flightdata ORDER BY id DESC LIMIT 10; Testen Sie die Abfrage zunächst direkt in der Datenbank. Erweitern Sie anschlieÿend ihr PHP-Skript um die Abfrage in der Variable $sql. Sie können den abgebildeten Code als Grundlage verwenden. Nitsche, Kremer 5 Informationssysteme
$res = mysqli_query( $link, $sql ); if (! $res ) { die('ungültige Abfrage: '. mysqli_error()); }... while ($row = mysqli_fetch_array( $res, MYSQL_ASSOC)) {... }... mysqli_free_result( $res ); Stellen Sie die gefundenen Daten auf einer Seite untereinander dar. Auf ein einzelnes Element einer Ergebniszeile $row können Sie beispielsweise mit $row['icao'] zugreifen. Erweitern Sie nun Ihr Skript so, dass die zehn Flüge jeweils als Elemente eines Formulars bestehend aus Radiobuttons darstellt werden. Geben Sie auch einen Submit- Button aus. Ziel des Formulars ist ein weiteres Skript mit dem Namen details.php. 2.3.6. Detailseite In der details.php sollen alle Informationen zum zuvor ausgewählten Flug dargestellt werden. Als Grundlage können Sie sich die Datei ights.php kopieren. Der ausgewählte Flug ist über die Variable $_POST['icao'] verfügbar 1. Erweitern bzw. verändern Sie den Code derart, dass die Elemente ICAO, Altitude, Latitude, Longitude, Timestamp und Submitter als Tabelle formatiert ausgegeben werden. Dazu müssen Sie sich ein neues SQL-Statement überlegen. Falls erforderlich begrenzen Sie die Anzeige auf 100 Einträge. Die Tabellenspalten sollen jeweils einen Titel haben und die gesamte Tabelle einen Rand erhalten (border=1). Fügen Sie zuletzt auch dieser Seite eine Überschrift und einen Link zur vorherigen Seite hinzu. 1 Je nach der von Ihnen gewählten Art der Parameterübergabe an den Webserver ist der ausgewählte Flug in der Variable $_POST['icao'] oder $_GET['icao'] verfügbar. Nitsche, Kremer 6 Informationssysteme