UDP und TCP/IP

Die Kommunikation über eine WLAN-Verbindung erfolgt in Form von Client und Server. Zum Senden und Empfangen von Datenpaketen werden Sockets verwendet. Das Gerät auf der Serverseite wartet normalerweise auf eine Verbindung von den Clients, und sobald diese hergestellt ist, kann eine Zwei-Wege-Kommunikation beginnen. Für das Senden und Empfangen von Datenpaketen über eine WLAN-Verbindung werden hauptsächlich zwei Protokolle verwendet: UDP und TCP. TCP ist ein verbindungsbasiertes Protokoll, das die Zustellung von Paketen garantiert. Die Pakete werden mit Sequenznummern versehen und der Empfang aller Pakete wird bestätigt, um zu verhindern, dass sie in falscher Reihenfolge ankommen. Aufgrund dieser Bestätigungen ist TCP in der Regel zwar langsam, aber zuverlässig, da es die Zustellung der Pakete garantiert. UDP hingegen ist nicht verbindungsbasiert. Die Pakete haben keine Sequenznummern und daher gibt es keine Garantie, dass sie an ihrem Ziel ankommen. UDP hat einen geringeren Overhead als TCP und ist daher schneller. In Tabelle 1 sind einige der Unterschiede zwischen den Protokollen TCP und UDP aufgeführt.


Tabelle 1. TCP- und UDP-Paketkommunikation

TCP UDP
Pakete haben Sequenznummern und die Zustellung jedes Pakets wird bestätigt Es gibt keine Zustellungsbestätigung
Langsam Schnell
Kein Paketverlust Pakete können verloren gehen
Großer Overhead Geringer Overhead
Benötigt mehr Ressourcen Benötigt weniger Ressourcen
Verbindungsbasiert Nicht verbindungsbasiert
Schwieriger zu programmieren
Einfacher zu programmieren
Beispiele: HTTP, HTTPS, FTP Beispiele: DNS, DHCP, Computer games


UDP-Kommunikation

Bild 1. UDP-Kommunikation.


Server
1. UDP-Socket erstellen
2. Binden des Sockets an die Serveradresse
3. Warten, bis das Datagramm-Paket vom Client eintrifft
4. Verarbeitung des Datagramm-Pakets
5. Senden einer Antwort an den Client oder Schließen des Sockets
6. Zurück zu Schritt 3 (falls nicht geschlossen)

Client
1. UDP-Socket erstellen
2. Senden einer Nachricht an den Server
3. Warten, bis eine Antwort vom Server eintrifft
4. Verarbeiten der Antwort
5. Zurück zu Schritt 2 oder Schließen des Sockets


Projekt 1: Kommunikation zwischen Raspberry Pi als Server mit einem Android-Smartphone über UDP

In diesem Projekt wird die UDP-Kommunikation verwendet, um Daten von und zu einem Android-Smartphone zu empfangen und zu senden. Der Raspberry Pi ist hier der Server und das Android-Smartphone der Client.
 
Ziel: Dieses Projekt soll zeigen, wie eine UDP-Kommunikation zwischen einem Raspberry Pi und einem Android-Smartphone hergestellt werden kann.

Bild 2. Blockdiagramm des Projekts.


Programmlisting: Das Programm MyServer.c ist in Listing 1 dargestellt und kann aus dem Software-Support-Paket für das Buch entnommen werden. Gehen Sie zu [1], scrollen Sie nach unten zu Downloads und klicken Sie dann auf Software_C Programming on Raspberry Pi. Speichern Sie die .zip-Datei lokal und extrahieren Sie dann entweder alle Dateien oder nur MyServer.c.
 

Listing 1: MyServer.c

 
Zu Beginn von MyServer.c werden die erforderlichen Header-Dateien in das Programm eingebunden. Die Nachricht Hello from Raspberry Pi wird in einem Zeichenarray msg gespeichert. Anschließend wird ein UDP-Socket erstellt, indem die Funktion socket aufgerufen und das Handle in der Variablen sock gespeichert wird. Dann werden die Details des Server-Computers, also des Raspberry Pis angegeben, wobei die Adresse auf INADDR_ANY gesetzt wird, so dass jeder andere Computer im selben Netzwerk mit der auf 5000 gesetzten Portnummer eine Kommunikation mit dem Raspberry Pi herstellen kann. Die Daten des Server-Computers werden dann durch den Aufruf der Funktion bind an den angegebenen Port gebunden.

Der Rest des Programms läuft in einer Schleife ab. Innerhalb dieser Schleife wird die Funktion recvfrom aufgerufen, um auf den Empfang eines Datenpakets vom Client-Computer (Android-Smartphone) zu warten. Beachten Sie, dass dies ein blockierender Call ist und die Funktion wartet, bis Daten vom Client empfangen werden. Das Programm wird beendet, wenn das Zeichen x vom Client-Computer empfangen wird. Ein NULL-Zeichen wird zu den empfangenen Daten hinzugefügt und mit der printf-Funktion auf dem PC-Bildschirm des Raspberry Pi als String angezeigt. Eine Integer-Variable namens count wird in ein Zeichen umgewandelt und an das Ende des Zeichenarrays msg gehängt. Dies wird an den Client-Computer gesendet, so dass beim ersten Mal in der Schleife der Client-Computer Hello from Raspberry Pi 1 anzeigt , beim zweiten Mal Hello from Raspberry Pi 2 und so weiter. Der Socket wird kurz vor Beendigung des Programms geschlossen. Das Programm kann wie folgt kompiliert und ausgeführt werden:

gcc –o MyServer MyServer.c

sudo ./MyServer


Es gibt viele UDP-Apps, die im Play-Store kostenlos erhältlich sind. In diesem Projekt wird das UDP-Terminal von mightyIT verwendet (siehe Bild 3). Geben Sie die Portnummer und die IP-Adresse Ihres Android-Smartphones ein und klicken Sie auf Start Terminal, wie in Bild 4 gezeigt. Ein Beispiel für die Ausführung des Programms ist in Bild 5 zu sehen, wo sowohl der Smartphone- als auch der PC-Bildschirm abgebildet sind.

Bild 3. UDP-Terminal-Apps auf einem Android-Smartphone.

 

Bild 4. Eingabe der Portnummern.

 

Bild 5. Beispielhafter Ablauf des Programms.

 

Hinweis: Sie können die IP-Adresse Ihres Raspberry Pi mit dem Befehl ipconfig herausfinden.

Das Buch C Programming on Raspberry Pi (E-book) ist im Elektor-Store erhältlich.