Serveur UDP

Suite à la réalisation de la simulation de l’Hélicostat par le biais de Code::Blocks et de Raydium ainsi que de l’application sous Android qui permettra aux utilisateurs d’un smartphone de prendre le contrôle et de diriger le vol de l’Hélicostat, nous avons dû trouver un moyen pour relier ces deux supports.

C’est pourquoi, nous nous sommes dirigés vers la programmation d’un serveur UDP (User Datagram Packet : protocole de datagramme utilisateur) en C sur ordinateur qui permettra d’effectuer la liaison avec le client créé sous Android.

Nous avons choisi un serveur UDP puisque nous avions vu en cours comment celui-ci fonctionnait et également car nous avons pu réaliser le nôtre en TP.
Nous avons également pu nous inspirer du projet Quadricoptère qui utilisait cette méthode.

De plus, le serveur UDP s’avère être une bonne alternative et est couramment utilisé lors de petits échanges ou bien encore lors de diffusion à de nombreux destinataires (jeu en réseau…).

Ainsi, nous avons décidé de structurer notre réseau de communication de manière à faire transmettre les données de l’application Android jusqu’au simulateur tout en passant par un routeur qui sera dans notre cas généré par notre pc. (Schéma ci-contre)

Tout d’abord, nous avons programmé ce serveur sous le système d’exploitation Linux.

Pour cela, différentes étapes sont à réaliser. Tout d’abord, il faut créer une socket UDP, cela s’effectue par l’appel système socket(2).
Puis il est nécessaire d’attacher cette socket à un port grâce à l’appel système bind(2).
Par la suite, le serveur va devoir se mettre en attente d’une requête en provenance d’un client et la traiter lorsqu’il la recevra.
Et enfin, le serveur va alors recevoir la réponse de l’émetteur de la requête, et renvoyer les données reçues à la simulation sous Raydium.

Comme nous avons effectué la simulation sous le système d’exploitation Windows, il nous a fallu adapter ce serveur UDP en conséquence.
Les sockets Windows étant très similaires à celles de Linux, il nous a seulement été nécessaire d’inclure les bibliothèques étant propre à Windows pour définir ces dernières.

Nous avons également dû réaliser différentes fonctions afin de rendre notre serveur opérationnel.

Une première fonction init() initialise une variable WSADATA qui contient des informations sur les sockets Windows et qui va également faire appel à WSAStartup(MAKEWORD, &WSAData) permettant de dire à notre ordinateur que nous allons utiliser des sockets et qui prend en paramètre la version de la socket Windows et la variable de type WSADATA définie.

A la fin de notre programme, il faut nettoyer notre WSA en faisant appel à WSACleanup() dans une fonction end().

Suite à cela, nous avons dû implémenter la fonction init_connection(), permettant d’initialiser la socket d’écoute du serveur UDP.
Cela passe par la création de cette dernière et aussi par son attachement à un port.

Nous avons aussi réalisé une fonction afin de savoir si un client est déjà existant ou pas.

La fonction get_client(), elle, va retourner la structure correspondant au client actuel qui parle.
Ensuite, la fonction read_client() va lire sur la socket du client par l’appel de recvfrom().

Et enfin, write_client() qui va écrire le buffer au client par le biais de sendto(), qui envoie donc les données à un point de terminaison spécifique.

Ainsi, après la mise en place de ce serveur UDP, nous sommes bien parvenus à obtenir et récupérer les données envoyées (Image ci-contre) par le Client Android dont son fonctionnement sera expliqué dans la partie suivante.

sch1.png (28.7 KB) David Martins, 03/22/2015 02:50 PM

libwind.png (2.96 KB) David Martins, 03/22/2015 02:52 PM

creatinosocket.png (3.54 KB) David Martins, 03/22/2015 02:54 PM

bindsocket.png (8.35 KB) David Martins, 03/22/2015 02:55 PM

recv.png (7.75 KB) David Martins, 03/22/2015 02:56 PM

sendto.png (7.55 KB) David Martins, 03/22/2015 02:57 PM

udp.png (13.1 KB) David Martins, 03/22/2015 03:22 PM