« SE2a4 Projet système/réseau 2023/2024 » : différence entre les versions
Ligne 58 : | Ligne 58 : | ||
Deux types de pages spécifiques doivent être implantés dans votre serveur Web sioux. | Deux types de pages spécifiques doivent être implantés dans votre serveur Web sioux. | ||
* Un premier type de page est référencé par le chemin <code></code>. | * Un premier type de page est référencé par le chemin <code>ecrans/liste.html</code>, elle liste les périphériques USB trouvés sur le réseau et présente des liens pour connaître l'état des écrans et agir dessus. Ces liens se font vers les pages spécifiques du second type. | ||
* Un second type de page est référencé par le chemin <code>ecrans/action.html</code> et génére une action sur un périphérique de contrôle d'écran précis. L'identifiant du périphérique est passé par URL (méthode <code>GET</code>) avec un nom de la variable <code>ID</code>. L'action à réaliser est aussi passée par URL avec un nom de variable <code>action</code>. | |||
== Fonctionnalité gestion des cartes USB == | == Fonctionnalité gestion des cartes USB == |
Version du 26 février 2024 à 17:05
Objectif
L'objectif est de concevoir un système permettant de gérer l'état des écrans d'une salle de travaux pratiques.
Le système est composé des éléments suivants :
- des cartes USB fixées sur les écrans et connectées en USB sur la station la plus proche ;
- des serveurs Web sur chaque station qui peuvent être accédés en utilisant un navigateur Web classique.
Le serveur Web d'une station, en plus de servir des pages Web, va gérer les cartes USB locales et écouter les requêtes UDP de gestion des écrans.
Il vous faut programmer à la fois le micro-contrôleur des cartes USB et le serveur Web.
Matériel
Vous devez concevoir et réaliser une carte électronique pour gérer un écran. Cette carte être conçue mécaniquement pour se fixer dans l'angle du moniteur où se trouvent le bouton permettant d'allumer et d'éteindre le moniteur et la LED de statut de ce même moniteur.
Un servo-moteur doit pouvoir se clipser sur la carte pour appuyer sur le bouton et un photo-récepteur doit pouvoir contrôler si la LED du moniteur est allumée ou non.
La carte doit être architecturée autour d'un ATmega16u4 et comporter quelques LED commandées en plus de l'écosystème du microcontrôleur et de ce qui est nécessaire pour faire fonctionner servo-moteur et photo-récepteur.
La conception de la carte se fait en utilisant le logiciel KiCAD
version 7.
Développement sur la carte
Il doit être possible de gérer les cartes par le protocole USB. Il est conseillé d'écrire un programme en utilisant la bibliothèque LUFA exposant une interface USB de classe spécifique liée à deux points d'accès par interruption : un entrant pour lire l'état du photo-récepteur et un sortant pour commander le servo-moteur et quelques LED.
Il est aussi demandé que l'état de la LED de statut soit répété sur une des LED commandées, le photo-récepteur pouvant masquer la LED du moniteur. Une autre LED doit servir à indiquer que la carte est prise en charge par une application, ce qui est facile à tester via la variables globale USB_DeviceState
.
Pour le principal, appuyez-vous sur votre travail en tutorat USB. La principale différence avec le tutorat est que les capteurs et actionneurs sont directement connectés sur l'ATmega16u4 cette fois. Faites attention, les broches PWM du minuteur 0 ne sont pas les mêmes par rapport à l'ATmega328p. Consultez la documentation du micro-contrôleur pour identifier ces broches.
Développement système et réseau sur la station
Fonctionnalité serveur Web
Serveur HTTP
La première étape du projet consiste à réaliser un serveur web minimaliste qui s’appelera sioux.
Ce programme peut prendre des arguments optionnels : -p <port>
ou –port <port>
pour spécifier un numéro de port différent de celui utilisé par défaut (port 80). Pour traiter les arguments, utilisez la fonction getopt_long
(voir la page de manuel correspondante). Si les arguments sont incorrects, le programme affichera un message qui précise la syntaxe. Pour plus de clarté, l’analyse des arguments et de l’affichage de la syntaxe seront écrits dans des fonctions séparées.
Vous devez décoder les requêtes HTTP. Vous pouvez vous limiter aux requêtes GET en HTTP version 1.1. Vous devez gérer les en-têtes de réponse Server
, Date
et Content-Type
. Les différentes pages HTML seront réalisées en utilisant HTML5.
Pour structurer le développement, nous proposons d’utiliser l’arboresence suivante :
PSR-2023-20224_Nom-binome1_Nom-binome2 |_Sioux |_Libs |_Reseau
Pour le développement des fonctions réseaux vous pouvez vous inspirer du code existant sur le cours de Monsieur Redon (https://rex.plil.fr/Enseignement/Reseau/Reseau.IMA4sc/reseau.html). Vous devez faire une bibliothéque réseau pour les fonctions génériques. Le code du serveur web devra être également séparé en plusieurs fichiers, a minima sioux.c
, http.c
et options.c
.
Serveur HTTP multi-flux
Vous allez ajouter du multi-flux à votre serveur sioux, pour cela vous utiliserez la bibliothèque pthreads. Pour faire les choses proprement et sans aller jusqu'à une bibliothèque vous circonscrirez l'utilisation de cette bibliothèque à une seule source C dédiée dans le répertoire sioux
(inclusion de pthreads.h
uniquement dans ce fichier ou dans un fichier .h
privé au fichier).
Pages spécifiques
Deux types de pages spécifiques doivent être implantés dans votre serveur Web sioux.
- Un premier type de page est référencé par le chemin
ecrans/liste.html
, elle liste les périphériques USB trouvés sur le réseau et présente des liens pour connaître l'état des écrans et agir dessus. Ces liens se font vers les pages spécifiques du second type.
- Un second type de page est référencé par le chemin
ecrans/action.html
et génére une action sur un périphérique de contrôle d'écran précis. L'identifiant du périphérique est passé par URL (méthodeGET
) avec un nom de la variableID
. L'action à réaliser est aussi passée par URL avec un nom de variableaction
.
Fonctionnalité gestion des cartes USB
A l'initialisation du serveur, les cartes USB de gestion d'écan doivent être détectées et mémorisées. Un identifiant unique sur un octet doit être programmé dans chaque carte. Cet identifiant doit pouvoir être récupéré par le point d'accès de contrôle. Il est conseillé de prévoir des détections régulières de cartes USB nouvellement insérées.
Quand cela lui est demandé le serveur doit pouvoir contacter une carte particulière, c'est à dire avec un identifiant précis, et lui demander l'état du moniteur, de changer l'état du moniteur, ou de changer l'état d'une LED commandée.
Pour toute cette partie, il est fortement conseillé de reprendre le travail effectué en tutorat USB.
Fonctionnalité serveur UDP
Votre serveur doit aussi écouter sur le port UDP 4242. Les requêtes reçues sont vérifiées pour s'assurer qu'elles sont bien légitimes, par exemple en utilisant un "nombre magique" sur lequel la promotion doit s'entendre. Les requêtes contiennent le numéro des cartes USB concernées, le numéro 255 indiquant que toutes les cartes du réseau sont concernées. La requête peut être de connaitre l'état du moniteur ou de changer cet état en un état précisé.