Atelier réseauXavier Redon |
Le but de ces travaux pratiques est de pratiquer la programmation réseau. Le prétexte est contrôler quelques LEDs d’une plateforme micro-contrôleur au travers d’un serveur Web que vous aurez programmé vous-même.
Vous allez utiliser une plateforme à base de micro-contrôleur Cortex M4. Si micro-python n’est pas installé sur votre plateforme, vous pouvez le faire avec les instructions à cette adresse : https://github.com/micropython/micropython/wiki/Board-STM32F407-Discovery.
Une fois micro-python disponible, connectez la plateforme uniquement avec un câble micro-USB. Pour que la platforme soit correctement alimentée, reliez les broches PA9 et 5V du connecteur P2.
Repérez l’interface série de votre plateforme en listant les fichiers du répertoire /dev. Connectez-vous sur la console micro-python en exécutant une commande du style minicom -D /dev/ttyACM0 dans un terminal en mode administrateur.
Repérez la partition correspondant à votre plateforme en utilisant l’utilitaire lsblk. C’est assez facile vu que c’est la seule avec une taille d’environ 100kB. Vous pouvez monter la partition avec une commande du style mount /dev/sdb1 /mnt dans un terminal en mode administrateur.
Vous pouvez déjà tester micro-python en écrivant des fonctions dans le fichier main.py, par exemple avec l’éditeur nano et en chargeant ces fonctions dans l’interpréteur par un simple CTRL-D.
Pour aller plus loin, il faut créer un port série sous micro-python avec la fonction pyb.UART et connecter un convertiseur USB/série sur les broches correspondant au port série. Documentez-vous sur la page http://docs.micropython.org/en/latest/library/pyb.UART.html.
Repérez l’interface série du convertisseur USB/série en listant les fichiers du répertoire /dev. Vous pouvez faire quelques tests de communication sur votre port série en lançant minicom sur cette seconde interface série dans un autre terminal en mode administrateur.
Vous pouvez ensuite créer l’interface réseau sl0 avec l’utilitaire slattach ci-dessous dans un nième terminal en mode administateur :
slattach -Ldv -p slip -s 9600 /dev/ttyUSB0
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 utiliser 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 plateforme micro-contrôleur.
Vous allez programmer le micro-contrôleur en micro-python pour analyser les paquets TCP/IP reçus et en générer d’autres.
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. Si ce caractère est présent dans le paquet lui-même, il est remplacé par les deux caractères 0xdb et 0xdc. Si le caractère d’échappement 0xdb est présent dans le paquet il est remplacé par les deux caractères 0xdb et 0xdd.
Pour contrôler les LEDs de la plateforme nous allons nous baser sur les données UDP. Commencez par vérifier que le paquet reçu est un paquet UDP vous concernant :
Si le paquet est le paquet UDP attendu, prenez les octets de données et effectuez l’action correspondante sur les LEDs.
Vous pouvez tester votre programme en utilisant la commande Unix ci-dessous :
echo -en "\xff" | nc -q0 -u <adresse IP plateforme> <port UDP>
Sur réception d’un paquet UDP particulier, par exemple sur un second port UDP, votre plateforme doit renvoyer un paquet UDP sur le même port avec comme données l’état du bouton de la plateforme.
Vous devez donc constituer 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’application de contrôle de la plateforme. Les aspects réseau sont à implanter en utilisant le paquetage Python des sockets.
Votre application doit, entre autre, se comporter comme un serveur Web. Faites en sorte d’utiliser le port 8888 et de décoder les requêtes HTTP qui sont envoyées à votre application. Vous n’avez besoin de gérer que la commande GET mais vous devez pouvoir retourner les pages de type HTML, javascript et les images. Dans votre réponse ajoutez, a minima, les entêtes Date, Server et Content-Type. Pour gérer le type des pages regardez du coté du paquetage Python magic.
Votre serveur Web doit permettre l’accès à une page particulière (par exemple /leds). Il doit être possible de passer des paramètres à cette page dans l’URL pour donner l’état des LEDs. Votre serveur doit analyser les paramètres et les transmettre à la plateforme. Pour ce faire vous devez écrire une fonction Python d’envoi d’octets par UDP. Ecrivez aussi une page HTML comportant un formulaire pour permettre un contrôle facile des LEDs.
Votre serveur Web doit permettre l’accès à une page particulière (par exemple /bouton). Cette page doit retourner une chaîne de caractères courte représentant l’état du bouton. Pour cela votre application doit envoyer un paquet UDP à la plateforme et lire la réponse.
Il n’est pas interdit de rajouter des feuilles de styles pour améliorer l’esthétique de votre application Web. Il n’est pas non plus interdit d’ajouter du javascript pour rendre l’application plus dynamique : modification de l’état des LED par simple clic, affichage automatiquement mis à jour de l’état du bouton.
Ce document a été traduit de LATEX par HEVEA