![]() |
Praktikum Internet-Technologievon Prof. Jürgen Plate |
Die Domain für alle Rechner ist da.private.hm.edu. Dabei steht "da" für den Standort Dachauerstr./Lothstr. und "private" bedeutet, daß der Rechner im privaten (von aussen nicht erreichbaren) Netz steht.
Für einige Aufgaben ist die Root-Berechtigung notwendig. Der Wechsel in die Rolle des Superusers erfolgt mit dem Kommando sudo. Um eine Root-Shell zu erlangen, geben Sie demnach sudo su ein. Der Login auf anderen Rechnern erfolgt mittels der Secure Shell (ssh <user>@<rechner>) und zum Kopieren wird Secure Copy (scp) verwendet.
Falls unterschiedliche Portnummern nötig sein sollten, gilt im E 204 die folgende Zuordnung:
Port | Rechner | Port | Rechner | Port | Rechner | Port | Rechner |
---|---|---|---|---|---|---|---|
1201 | Merkur | 1202 | Venus | 1203 | Erde | 1204 | Mars |
1205 | Jupiter | 1206 | Saturn | 1207 | Uranus | 1208 | Neptun |
1209 | Pluto | 1210 | Ceres | 1211 | Eris | 1212 | Juno |
1213 | Pallas | 1214 | Vesta | 1215 | Xena |
Für Ihre Programme genügt in der Regel folgender "Vorspann" mit Header-Dateien:
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #include <time.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <netdb.h> #include <sys/stat.h>
Namen und IP-Adressen der Raspberry-Systeme:
|
Als Kommandos des Clients sind möglich:
|
Die Kommandos des Clients werden als ein String gesendet, z. B. "SET 2 0". Kommandos und Antworten des Servers werden immer mit Newline abgeschlossen.
Schreiben Sie nun einen Client, der eine Verbindung zum Server aufbaut und dann abhüngig von der Kommandozeilenoption eines der Kommandos 'SET' oder 'GET' sendet und die Antwort ausgibt. Als Kommandozeilenoptionen werden zwei Strings übergeben, zuerst der Servetrname und dann der GET- oder SET-Befehl. Denken Sie daran, dass Kommandozeilenparameter, die Leerzeichen enthalten, mit Apostrophen umgeben werden müssen (z. B. ./client pholus 'SET 2 1').
Damit nicht jeder die Systeme ansprechen kann, wird die an den Server gesendete Info verschlüsselt (die Antwort des Servers erfolgt im Klartext). Die Verschlüsselung der Nachricht erfolgt für das Praktikum mit einer einfachen Vigenère-Chiffre (siehe dazu Wikipedia und C-Programm zur Vigènere-Verschlüsselung). Dieses Verfahren wird in der Praktikumsaufgabe als Beispiel für Verschlüsselung verwendet, ist aber keinesfalls sicher genug für ein produktives System im Internet. Die Funktionen zum Codieren und Decodieren finden Sie neben einem Demo-Hauptprogramm unter beispiele/vigenere.c. Es werden alle Zeichen zwischen '0x32' und '0x127' verschlüsselt. Andere Zeichen werden einfach unverändert durchgereicht. Übernehmen Sie die Funktionen zusammen mit den Include-Anweisungen und Konstantendefinitionen in Ihr Clientprogramm. Zusammen mit den notwendigen Include-Dateien für den Client ergibt sich folgender Programmvorspann:
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <ctype.h> #include <stdio.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <netdb.h> #define PORT 7777 /* Port fuer die Requests */ #define BUFSIZE 4096 /* Puffergroesse */ #define SMAX 100 /* maximale Schluessellaenge */ #define ALPHA 96 /* Alphabetlaenge */ int keylen; /* Laenge des Schluesselwortes */ char key[SMAX]; /* Schluesselwort in Form von Offsets */ char secret[] = "xxx"; /* Codeschluessel, wird im Praktikum bekannt gegeben */ char buffer[BUFSIZE]; /* Textpuffer, Groesse passend waehlen */Als Basis für Ihr Clientprogramm verwenden Sie beispiele/tcp-client.c.
LED 1 | LED 2 | LED 3 | LED 4 |
---|---|---|---|
GPIO22 | GPIO23 | GPIO24 | GPIO25 |
ROT | GELB | GRUEN | BLAU |
Der Befehl ./client nessus 'SET 3 1' würde beispielsweise die grüne LED einschalten.
An einem weiteren Eingangsport, GPIO 17, ist ein Bewegungsmelder angeschlossen, der per GET-Befehl abgefragt werden soll. Auch hierzu gibt es ein Hilfsprogramm auf dem Server, PIR.py, das den Bewegungsmelder überwacht und beim Erkennen der Bewegung eine Nachricht mit Zeitstempel in die Datei /tmp/motion schreibt ("Bewegung erkannt: " + Zeitstempel). Das Programm wird einmal im Hintergrund gestartet (sudo ./PIR.py &) und läuft ständig. So kann der Netzwerk-Client auch über registrierte Bewegungen in der Vergangenheit informiert werden. Der aktuelle Wert kann mittels ./client nessus 'GET' abgerufen werden.
Angesteuert werden die o. g. LEDs per Python-Programm, so dass im Server kein Zugriff auf die GPIO-Pins erfolgen muss. Dieses Programm läuft nur mit Root-Berechtigung. Im C-Programm des Servers wird das entsprechende Kommando per system()-Funktion gestartet. Für GET genügt lesender Zugriff auf die Datei /tmp/motion.
Zur Information finden Sie beide Programme unter folgendem Link:
Dateiuebersicht