1 Description générale du projet
1.1 Objectif
L'objectif du projet est de concevoir et de réaliser un serveur de webcams
contrôlable par un administrateur.
Le serveur gère des webcams qui lui sont connectées physiquement. Les clients
peuvent demander à recevoir le flux vidéo d'une des caméras pour affichage sur
leur écran. Pour cela les clients se connectent sur le serveur par telnet
ou nc et utilisent des commandes ASCII. Les commandes permettent, entre
autres, de lister les caméras disponibles et de demander au serveur d'envoyer le
flux vidéo d'une caméra sur un serveur d'affichage. Le serveur d'affichage
se charge d'envoyer dans une fenêtre X11 les images qui lui sont envoyées
par la liaison TCP.
L'administrateur, chargé de la gestion des webcams et des utilisateurs, peut à
tout moment intervenir pour :
-
ajouter, configurer ou supprimer une webcam,
- sauver dans un fichier un cliché d'une webcam,
- lister les utilisateurs connectés sur le serveur,
- lister les utilisateur recevant le flux d'une caméra donnée,
- ...
1.2 Architecture générale de l'application
L'application est constituée de 3 exécutables : le serveur de webcams,
le client d'administration et le serveur d'affichage. Pour permettre de
traiter simultanément les requêtes de plusieurs clients ainsi que celles
de l'administrateur, le serveur doit être multithreadé. Un thread est lancé
pour chaque connexion de client, ce thread est chargé de satisfaire les
requêtes de ce client.
De même, un thread est chargé de traiter d'éventuelles requêtes de
l'administrateur. Pour chacune de ses requêtes, l'administrateur lance
le client d'administration. Celui-ci communique avec le serveur principal
par IPC (Files de messages).
1.3 Les requêtes client
Un client, ayant obtenu une connexion par nc <hote> <port> peut
émettre les requêtes suivantes au serveur :
-
lister_cams :
- lister les caméras configurées (avec le nombre
d'utilisateurs la visualisant),
- voir_cam <n> <mot de passe> [<hote>[<port>]] :
- demander
l'envoi du flux vidéo de la caméra numéro <n> (dont le mot de passe
d'accès est <mot de passe>) sur le serveur d'affichage écoutant sur
la machine <hote> (celle du client par défaut) et sur le port
<port> (le port 5000 par défaut),
- quitter :
- se déconnecter.
1.4 Les requêtes administrateur
L'administrateur lance le client d'administration chaque fois qu'il veut
effectuer une requête (la requête est fournie en argument). Dans un premier
temps, on suppose que les requêtes sont effectuées séquentiellement, c'est
à dire que l'administrateur ne lance qu'un client d'administration à la fois.
Les requêtes que peut effectuer l'administrateur sont les suivantes :
-
list_cams :
- lister toutes les webcams (configurées ou non),
- nouv_cam <fichier système> <largeur>x<hauteur> [<palette>] :
- ajouter
la webcam à la table du serveur avec le fichier spécial, la résolution et
éventuellement la palette spécifiés (si le numéro de palette n'est pas spécifié
le serveur tentera de le trouver),
- conf_cam <n> <description> <mot de passe> :
- rendre la webcam
numéro <n> décrite par le texte <description> disponible aux
utilisateurs (enfin à ceux connaissant le mot de passe spécifié),
- capt_cam <n> <fichier>:
- prendre un cliché sur la caméra
<n> et le sauver dans <fichier>,
- supp_cam <n> :
- supprimer la caméra numéro <n>,
- lister_clients :
- lister tous les utilisateurs connectés avec
le nom de la machine d'où ils se connectent et les webcams qu'ils visualisent,
- coup_client <n> <client> :
- arrêter l'envoi du flux vidéo de la
caméra <n> pour le client client,
- supp_client <client> :
- terminer la connexion du client,
- stop :
- stopper le serveur,
- aide :
- obtenir la liste des requêtes possibles.
Tout dialogue nécessaire entre le serveur principal et le client
d'administration est réalisé par des communications IPC (envoi et
réception de messages).
1.5 Le serveur principal
Le processus serveur tourne en tâche de fond. Il doit pouvoir traiter les
demandes de connexion des clients, les requêtes des clients connectés et les
requêtes du client d'administration. Pour cela, il lance un thread chargé de
traiter la file de messages dans laquelle sont déposées les requêtes de
l'administrateur et un thread "client" pour chaque connexion sur son port
d'écoute. Ce dernier thread est chargé de traiter les requêtes du client
connecté.