UDP en TCP/IP

Gewoonlijk wordt de Raspberry Pi geprogrammeerd met behulp van Python. Python is een zeer krachtige taal, maar C wordt toch meer gebruikt onder programmeurs. Programmeren in C wordt ook onderwezen op bijna alle technische scholen en universiteiten. Dit artikel laat zien hoe we kunnen programmeren in C op de RPi, zodat u kunt zien wat daar bij komt kijken voor het ontwikkelen van uw eigen hardware-gebaseerde projecten. U kunt aan de slag in uw thuislab, gewapend met een boek en een Raspberry Pi. We gaan het gewoon proberen! 


 

Table 1: TCP and UDP packet communications.
Tabel 1: Communicatie via TCP en UDP.
 

UDP-communicatie

Figuur 1: UDP-communicatie.


Server

1. Maak een UDP-socket
2. Koppel het socket met het server-adres.
3. Wacht totdat er een datagram-pakket van een client binnenkomt.
4. Verwerk het datagram-pakket.
5. Stuur een antwoord naar de client of sluit het socket.
6. Ga terug naar stap 3 (als het socket niet gesloten is).


Client

1. Maak een UDP-socket
2. Stuur een bericht naar de server.
3. Wacht op een antwoord van de server.
4. Verwerk het antwoord.
5. Ga terug naar stap 2, of sluit het socket.  


Project 1: Communiceren met een Android-smartphone met UDP (RPi is de server)

In dit project gebruiken we UDP-communicatie om data te ontvangen van en te zenden naar een Android smartphone. In dit project is Raspberry Pi de server en de Android-smartphone de client.
 
Doel: Dit project laat zien hoe we UDP-communicatie kunnen opbouwen tussen een Raspberry Pi en een Android-smartphone.

Figuur 2: Blokschema van het project.


Programmalisting: Het programma MyServer.c is weergegeven in listing 1 en is te vinden in het softwarepakket bij het boek. Ga naar [1], scrol omlaag naar Downloads en klik op Software_C Programming on Raspberry Pi. Sla het .zip-bestand lokaal op en pak het uit, of pak alleen MyServer.c uit.
 

Listing 1: MyServer.c

 
Aan het begin van MyServer.c worden de benodigde headerfiles ge-include in het programma. Het bericht Hello from Raspberry Pi wordt opgeslagen in het character-array msg. Er wordt een UDP-socket aangemaakt door de functie socket() aan te roepen. De handle wordt opgeslagen in de variabele sock. Dan worden de details over de server (Raspberry Pi) gegeven. Het adres is INADDR_ANY dus elke computer op hetzelfde netwerk met poort 5000 zal verbinden met de Raspberry Pi. De details over de server worden met de opgegeven poort gekoppeld met de functie bind.
 
De rest van het programma draait in een lus. Binnen die lus wordt de functie recvfrom aangeroepen om te wachten op de aankomst van een datapakket van de client-computer (Android-smartphone). Dit is een blokkerende call: de functie blijft wachten totdat er data is ontvangen van de client. Het programma sluit af als het karakter x wordt ontvangen van de client. Er wordt een NULL-karakter toegevoegd aan de ontvangen data en de data wordt met behulp van de functie printf weergegeven op het scherm van de Raspberry Pi. Een integer-variabele count wordt omgezet in een karakter en aan het eind van het character-array msg geplakt. Dit wordt naar de client gestuurd. De eerste keer geeft de client dus Hello from Raspberry Pi 1 weer. De tweede keer krijgt hij Hello from Raspberry Pi 2 enzovoort. Het socket wordt gesloten vlak voor het einde van het programma. We kunnen het programma als volgt compileren en uitvoeren:

gcc –o MyServer MyServer.c

sudo ./MyServer


In de Play Store zijn veel gratis UDP-programma’s te vinden. In dit project gebruiken we UDP Terminal van mightyIT (zie figuur 3). Geef het poortnummer en IP-adres van uw Android-smartphone in en klik op Start Terminal zoals in figuur 4. In figuur 5 ziet u het programma in actie. Hier zijn zowel het scherm van de client als dat van de server weergegeven.
 

Figuur 3: UDP Terminal-apps op een Android-smartphone.

 
Figuur 4: Voer de poortnummers in.
 
Figuur 5: Voorbeeld van het programma in actie.



Opmerking: u kunt het IP-adres van uw Raspberry Pi vinden met het commando ifconfig.