Atelier réseauXavier Redon |
Le but de ces travaux pratiques est d’entrevoir un aspect de la programmation réseau. Le prétexte est de gérer une manette pour l’utiliser dans un "jeu" C.
Vous allez utiliser des manettes conçues spécialement pour ces travaux pratiques.
Il s’agit, en fait, d’un microcontrôleur ATMega328p connectable à un PC au travers d’une liaison USB/série. Les paquets IP passeront sur cette connexion série en utilisant le protocole SLIP.
Commencez par repérer l’interface série de votre système embarqué en listant les fichiers du répertoire /dev.
Vous pouvez ensuite créer, en tant qu’administrateur, l’interface réseau sl0 avec l’utilitaire slattach.
slattach -Ldv -p slip -s 9600 /dev/ttyXXX
Utilisez ensuite l’utilitaire ip avec la syntaxe ci-dessous pour configurer les adresses IPv4 de votre interface sl0.
ip link set sl0 up ip address add dev sl0 <@IP1> peer <@IP2>
Vous pouvez utilisez des adresses IPv4 dans le réseau 192.168.0.0/24.
Pour tester votre connexion utilisez l’utilitaire ping sur l’adresse IPv4 de votre système embarqué. Vous devriez voir la LED RX de la connexion série clignoter.
Le déverminage de votre programme sur le microcontrôleur n’est pas évident quand il est connecté au PC en mode réseau. En effet, il est assez compliqué d’espionner ce qui passe sur la connexion série quand l’utilitaire slattach est lancé.
Il est conseillé de faire les premiers tests sans l’utilitaire slattach en simulant l’envoi d’un paquet à la main en utilisant l’utilitaire série cutecom.
Vous pouvez récupérer un paquet IPv4 avec l’utilitaire de scan réseau wireshark et l’envoyer au microcontrôleur avec cutecom, en l’ayant auparavant traduit selon le protocole SLIP.
L’intérêt de cette méthode est que vous pouvez faire en sorte d’envoyer des informations de déverminage par le microcontrôleur au travers de la liaison série. Ces informations seront affichées par cutecom. C’est plus pratique que de déverminer à l’aide des LED.
N’oubliez pas de configurer cutecom pour se connecter à 9600 bauds, pour afficher les octets en hexadécimal (case à cocher en bas de la fenêtre) et pour accepter les entrées en hexadécimal (menu déroulant à droite de la zone de saisie).
Vous allez programmer le microcontrôleur en C pour analyser les paquets TCP/IP reçus et en générer d’autres.
Pour vous faciliter la vie une grande partie du code vous est fourni : http://rex.plil.fr/Enseignement/Reseau/TP.Reseau.GIS3-postcovid/ManetteSerie.tgz. Vous y trouverez, dans serial.c, des fonctions de gestion du port série et, dans les autres sources des fonctions pour utiliser les éléments de la manette.
Un Makefile est disponible, pour compiler il suffit de taper make. Pour télécharger le programme sur le système embarqué, tapez make upload.
Si vous êtes un peu perdu, commencez par écrire des petits programmes de test.
Par exemple, vous pouvez écrier un programme permettant de faire clignoter une LED et un programme permettant d’allumer une LED sur pression d’un bouton.
Pour aller plus loin, vous pouvez écrire un programme recevant un octet par la liaison série et le renvoyant par la même liaison. Vous pouvez aussi écrire un programme qui lit un numéro de LED sur le port série et qui allume la LED correspondante.
Les programmes utilisant le port série peuvent être testés au travers de l’utilitaire cutecom.
L’utilitaire slattach est configuré pour utiliser le protocole SLIP. Ce protocole permet de marquer la fin des paquets avec l’octet de valeur 0xc0. À remarquer que le protocole SLIP de Linux met un 0xc0 aussi en début de paquet. Vous pouvez donc tomber sur deux 0xc0 de suite. Dans ce cas il ne faut pas penser avoir reçu un paquet vide. Si la valeur 0xc0 est présente dans le paquet lui-même, elle est remplacée par les deux caractères de valeurs 0xdb et 0xdc. Si la valeur d’échappement 0xdb est présente dans le paquet elle est remplacée par les deux caractères de valeurs 0xdb et 0xdd.
Pour contrôler les LED du système embarqué nous allons nous baser sur les données UDP. Commencez par vérifier que le paquet reçu est un paquet UDP vous concernant :
Vérifiez enfin qu’il s’agit bien d’un paquet UDP de modification de l’état des LED. Vous pouvez, par exemple, regarder la valeur du premier octet de données UDP. Si c’est bien le cas utilisez les autres octets des données UDP pour effectuer l’action correspondante sur les LED.
Vous pouvez tester votre programme en utilisant la commande Unix ci-dessous :
echo -ne "C\xff" | nc -q0 -u <adresse IPv4 système embarqué> <port UDP>
Sur réception d’un paquet UDP particulier, par exemple avec une autre valeur pour le premier octet des données UDP, votre système embarqué doit retourner à l’envoyeur un paquet UDP avec comme données l’état des boutons.
Vous devez donc forger un paquet IPv4 contenant un paquet UDP contenant les données. Ce paquet doit être envoyé sur le port série en utilisant le protocole SLIP. N’oubliez pas de calculer la somme de contrôle IPv4 et éventuellement la somme de contrôle UDP.
Vous pouvez tester votre programme en utilisant la commande Unix ci-dessous :
nc -u -l -p <port UDP> | od -tx1 -w1
Passons maintenant à l’interfaçage de la manette avec le jeu en C.
Le code d’un micro-moteur de déplacement dans un labyrinthe en 3D vous est fourni : http://rex.plil.fr/Enseignement/Reseau/TP.Reseau.GIS3-postcovid/XMaze.tgz.
Installez les bibliothèques graphiques (paquetages Debian libsdl2-dev et libsdl2-gfx-dev) et testez le programme.
Un Makefile est disponible, pour compiler il suffit de taper make.
Vous aurez à ajouter le code réseau pour utiliser la manette pour vous déplacer dans le labyrinthe. Les fonctions faisant appel à la bibliothèque des sockets sont à ajouter dans la bibliothèque libcom.a du répertoire Communication. Vous appelerez ces fonctions dans la fonction main du répertoire Labyrinthe.
Modifiez votre programme sur la manette pour accepter les paquets IPv4 de diffusion, donc à destination de l’adresse IPv4 255.255.255.255.
Dans le projet "labyrinthe" créez une socket en mode non connectée pour envoyer un paquet UDP en diffusion sur le port adéquat. Votre manette doit répondre avec l’état de ses boutons et surtout avec son adresse IPv4.
Stockez précieusement l’adresse de socket de réponse de la manette.
Le jeu doit envoyer régulièrement des paquets UDP à la manette pour provoquer une réponse comportant l’état de ses boutons. Cette réponse doit être lue et interprétée en terme de déplacements dans le labyrinthe.
Pour aller plus loin vous pouvez implanter une gestion des collisions dans le jeu pour éviter la traversée des murs. Vous pouvez aussi rendre le jeu plus intéressant en choisissant un point à atteindre dans le labyrinthe. Indiquez au joueur où se trouve le point en vous servant des LED. Si la LED centrale est allumée, le point à atteindre est droit devant. Sinon la position de la LED représente la rotation à effectuer pour cibler le point. Si le joueur se place très près du point faites clignoter les LED pour indiquer la victoire et retirez un point au hasard.
Ce document a été traduit de LATEX par HEVEA