or
or
By clicking below, you agree to our terms of service.
New to HackMD? Sign up
Syntax | Example | Reference | |
---|---|---|---|
# Header | Header | 基本排版 | |
- Unordered List |
|
||
1. Ordered List |
|
||
- [ ] Todo List |
|
||
> Blockquote | Blockquote |
||
**Bold font** | Bold font | ||
*Italics font* | Italics font | ||
~~Strikethrough~~ | |||
19^th^ | 19th | ||
H~2~O | H2O | ||
++Inserted text++ | Inserted text | ||
==Marked text== | Marked text | ||
[link text](https:// "title") | Link | ||
 | Image | ||
`Code` | Code |
在筆記中貼入程式碼 | |
```javascript var i = 0; ``` |
|
||
:smile: | ![]() |
Emoji list | |
{%youtube youtube_id %} | Externals | ||
$L^aT_eX$ | LaTeX | ||
:::info This is a alert area. ::: |
This is a alert area. |
On a scale of 0-10, how likely is it that you would recommend HackMD to your friends, family or business associates?
Please give us some advice and help us improve HackMD.
Do you want to remove this version name and description?
Syncing
xxxxxxxxxx
I. INTRODUCTION
Dans le cadre de l'UE (Unité d'Enseignement) Internet des objets, il nous a été demandé de réaliser un système de surveillance d'examens. Il s'agit de créer une application qui communique avec un ordinateur selon le protocole client-serveur afin d'analyser le comportement d'un candidat pendant un examen.
En effet, l'ordinateur qui joue le rôle de serveur doit pouvoir analyser les données envoyées par l'application qui simule le client afin de déterminer les suspicions de fraude que nous énumérons plus tard. Pour ce faire, l'application possède deux modes principaux.
Ce projet a ainsi pour objectif de proposer un prototype d'outil d'aide à la prise de décision. Il retranscrit les suspiscions de fraude dans des fichiers Excel qui seront consultés par l'examinateur pour qu'il puisse en déduire s'il y a réellement eu au moins une fraude. Mais pour mieux comprendre la démarche entamée, nous avons rédigé ce rapport technique afin d'y décrire les fonctionnalités du système ainsi que les détails d'implémentation.
II. gRPC : Remote Procedure Call
gRPC est une technologie de communication open source développée par Google. Elle consiste en la création d'un service (avec ses méthodes, entrées et sorties) compatible avec de nombreux langages de programmation comme Java, Kotlin, Python, etc. Il permet ainsi de construire des liaisons client/serveur avec une très bonne prise en charge de la diffusion bidirectionnelle:
C'est pour ces raisons que nous avons utilisé le protocole gRPC. Pour qu'il puisse effectuer des communications entre notre programme Kotlin (application mobile) et notre serveur Python (ordinateur portable). Voici une représentation simplifiée de notre protocole client-Serveur:
Pour mettre en place un tel protocole, il faut dans un premier temps créer un IDL (Interface Definition Language) qui n'est rien de plus qu'un contrat de service rédigé sous la forme d'un fichier texte
.proto
. Ainsi, grâce à ce dernier, le compilateur Protobufprotoc
va pouvoir générer du code pour le client et le serveur.Dans le cas de notre système de surveillance d'examen, nous avons créé le fichier
envoie.proto
qui est composé :https://hackmd.io/S18oxuh6Tc6fCS1Hrfc1ZA?both#:~:text=variable)%20appel%C3%A9es%20champs.-,//%20Bloc%20pour%20cr%C3%A9er%20des%20messages,-message%20Envoie%20%7B%0A%20%20%20%20//%20%3E%20Membres
https://hackmd.io/S18oxuh6Tc6fCS1Hrfc1ZA?both#:~:text=communication client-serveur-,// Bloc pour créer un service,-service EnvoieService { rpc
Dans un second temps, il faut mettre à jour le code gRPC (utilisé par notre serveur python) pour qu'il puisse utiliser notre service. Pour ce faire, on se place sur le répertoire où se trouve notre fichier proto (ici SpyCheat) et on exécute les commandes suivantes :
https://hackmd.io/S18oxuh6Tc6fCS1Hrfc1ZA?both#:~:text=les commandes suivantes %3A-,%23 Installer,-python -m pip
Les fichiers
envoie_pb2.py
etenvoie_pb2_grpc.py
sont alors générés et seront utilisés pour implémenter les fonctions de notre serveur pour qu'il puisse communiquer avec notre application.III. SpyCheat : Application android
L'application SpyCheat joue le rôle de client dans notre système de surveillance d'examens. Elle se découpe en 3 parties principales où la première sert à créer des réunions en donnant la liste des utilisateurs qui auront le droit d'y accéder. La seconde est utilisée pour lancer une réunion quand l'application est posée sur la main. Et pour finir, la troisième partie permet de participer à une réunion en ayant mis l'application sur la tête. Finalement, ces trois parties sont utilisées pour de détecter les tentatives de fraudes en s'assurant que uniquement les personnes inscrites peuvent se connecter à la réunion et en analysant des photos et les mouvements d'un candidat.
Pour y parvenir, l'application à été crée sur Android Studio. Elle est composée de plusieurs fichiers dont :
envoie.proto
: le même fichier que nous avons présenté dans la première partie et qui est stocké dans un répertoire nomméproto
(lui même placé dans le répertoiremain
).build.gradle
: un fichier qui permet d'utiliser le compilateur protobuf (gRPC) et d'ajouter la caméra (caméraX) à notre code. Pour cela, il faut ajouter les lignes suivantes :id "com.google.protobuf" version "0.8.12"
id 'distribution'
https://hackmd.io/S18oxuh6Tc6fCS1Hrfc1ZA?both#:~:text=Dans le bloc des plugins
buildFeatures { viewBinding true }
https://hackmd.io/S18oxuh6Tc6fCS1Hrfc1ZA?both#:~:text=Dans le bloc android
https://hackmd.io/S18oxuh6Tc6fCS1Hrfc1ZA?both#:~:text=Dans le bloc des dependences
https://hackmd.io/S18oxuh6Tc6fCS1Hrfc1ZA?both#:~:text=bloc des dependences-,Pour finir%2C on ajoute à la fin du fichier ce nouveau bloc%3A,-protobuf { protoc { artifact
A cela s'ajoute un troisième et dernier fichier appelé
AndroidManifest.xml
. Il va servir à implémenter les permissions pour utiliser la caméra et la wifi :https://hackmd.io/S18oxuh6Tc6fCS1Hrfc1ZA?both#:~:text=xml. Il va servir à implémenter les-,permissions pour utiliser la caméra et la wifi,-%3A
Une fois que c'est trois fichiers sont modifiés, il faut exécuter la commande
gradlew build
sur le terminal d'android studio pour que les fichiers contenant les fonctions gRPC soit générés.Une fois que la liste des prérequis ait été respéctée, nous pouvons nous intéresser aux fonctionnalités de l'application. En effet, cette dernière est composée de :
https://hackmd.io/S18oxuh6Tc6fCS1Hrfc1ZA?both#:~:text=la méthode suivante %3A-,// Connexion au seveur,-val channel%3A ManagedChannel
Si la connexion a échouée un message rouge s'affichera sur l'écran sinon l'utilisateur sera redirigé vers la page suivante.
https://hackmd.io/S18oxuh6Tc6fCS1Hrfc1ZA?both#:~:text=envoyée au serveur %3A-,// Si la connexion est un succès%2C on envoie nos données au serveur,-val stub%3A EnvoieServiceGrpc
IV. Serveur : code python
Placé sur un ordinateur portable, le serveur python se découpe en plusieurs parties. La première consiste à gérér les inscriptions et les connexions des utilisateurs. La seconde partie intervient lorsqu'une réunion a débuté en analysant les données (photos et accéléromètre) envoyées par l'application. Et pour finir, une troisième partie dédiée à l'enregistrement vocal.
Pour lancer le serveur, il faut installer et importer un certain nombre de paquets :
https://hackmd.io/S18oxuh6Tc6fCS1Hrfc1ZA?both#:~:text=nombre de paquets %3A-,Pour gRPC il faut importer,-%3A
.jpg
une image envoyée par l'application sous forme de chaîne de caractères :https://hackmd.io/S18oxuh6Tc6fCS1Hrfc1ZA?both#:~:text=faut importer%2C-%253A-,Pour convertir,-en .jpg une
https://hackmd.io/S18oxuh6Tc6fCS1Hrfc1ZA?both#:~:text=en .jpg une-,Pour écrire et lire des fichiers CSV,-%3A
https://hackmd.io/S18oxuh6Tc6fCS1Hrfc1ZA?both#:~:text=fichiers CSV%2C-%253A-,Pour analyser les coordonnées de l’accéléromètre,-%3A
https://hackmd.io/S18oxuh6Tc6fCS1Hrfc1ZA?both#:~:text=de l’accéléromètre%2C-%253A-,Pour l’enregistrement vocal,-il faut installer
https://hackmd.io/S18oxuh6Tc6fCS1Hrfc1ZA?both#:~:text=de l’accéléromètre%2C-%253A-,Pour l’enregistrement vocal il faut installer et importer,-%3A
Une fois que la liste des prérequis ait été respecté, nous pouvons nous intéresser aux fonctionnalités du serveur. En effet, ce dernier est composé d'une fonction
server()
qui attend que des clients (maximum 10) se connectent sur son réseau. Dans ce cas là, il exécute la classeGreeter()
à chaque fois que le client (application) lui envoie des données:https://hackmd.io/S18oxuh6Tc6fCS1Hrfc1ZA?both#:~:text=envoie des données%3A-,%23 code server(),-def serve()%3A server
Les données subissent alors une série de traitement que nous allons énumérer. Mais pour mieux comprendre les phases de traitement, nous allons nous baser sur des scénarios :
def verifCandidat(reunion, mail)
. Dans le cas échéant, il est ajouté au fichier grâce à la fonctiondef ajoutCandidat(reunion, mail)
sinon l'inscription est ignorée.def encours_ou_termine(fileName, reunion, mail, colonne, statut)
: s'il y est marqué que le candidat a déjà terminé la réunion, alors il envoie un message à l'application pour donner son désaccord. En revanche, si rien n'est indiqué dans le fichier, alors le serveur donne son accord à l'application et le candidat sera redirigé vers la page de réunion en mode tête. Notons que l'application reçoit la réponse du serveur grâce à ces lignes de code :https://hackmd.io/S18oxuh6Tc6fCS1Hrfc1ZA?both#:~:text=lignes de code %3A-,var reply,-%3A Envoie %3D stub.getEnvoie
"Je suis un candidat et je participe à la réunion en mode main". Lorsque le candidat clique sur le bouton "commencer", plusieurs évènements entrent en jeu :
def inventaire(fileName, reunion, mail, colonne, etatReu)
. Ce même fichier est mis à jour lorsque le candiat quitte la réunion en écrivant "terminé".def record()
. Cette dernière lance un enregistrement toutes les 5 secondes et les concatènent au fur et à mesure pour ne former qu'un seul audio. Notons que l'enregistrement se termine lorsque le candidat a quitté la réunion.def calibrage(x, y ,z ,nb_ite)
. Cette dernière commence par faire une moyenne des 5 premières coordonnées envoyées par l'application. Ainsi si les nouveaux coordonnées s'éloigne de la moyenne (à partir d'un certains seuil), le serveur est en mesure de déterminer s'il y a eu un mouvement droite, gauche, haut ou bas de la tête.def base64_to_image (img_data)
la chaine de caractère est d'abord converti en image.jpg
. Puis, un algorithme est alors appliqué à cette image de façon a reconnaître les objets et les personnes présent sur la photo et les écrits dans le fichierObjects_Detection.csv
."Je suis un candidat et je participe à la réunion en mode main". Lorsque le candidat clique sur le bouton "commencer", seules les valeurs de l'accéléromètre sont envoyées au serveur. Mais par manque de temps, ces dernières ne sont pas traitées.
V. Reconnaissance Faciale : script python
Le but était d'implémenter une solution de reconnaissance faciale au niveau de la webcam de l'ordinateur. Cette dernière devait être capable de reconnaître la personne qui passait l'examen et d'enregistrer en cas de suspicion de fraude.
Il faut installer toutes les librairies suivantes dans votre environnement python pour permettre à l'utilisateur de lancer les scripts :
https://hackmd.io/S18oxuh6Tc6fCS1Hrfc1ZA?both#:~:text=suspicion de fraude.-,Prérequis,-Comment
Une fois que nous avons les prérequis nécessaire nous pouvons lancer le script python pour nous prendre en photo avant l'examen :
https://hackmd.io/S18oxuh6Tc6fCS1Hrfc1ZA?both#:~:text=%23-,Une fois que nous sommes dans le répertoire,-easy_facial_recognition-master%2C nous lançons sur le terminal ceci %3A python
Il faudra ensuite écrire votre nom puis appuyer sur entrée pour que la photo soit prise et enregistrée dans le dossier known_faces.
Ensuite, nous pouvons d'ores et déjà lancer la commande qui va nous permettre de lancer la webcam de l'ordinateur pour faire l'examen.
La commande est la suivante :
https://hackmd.io/S18oxuh6Tc6fCS1Hrfc1ZA?both#:~:text=pour faire l’examen.-,La commande est la suivante,-%3A
Des informations sont communiquées sur le terminal pour voir l'avancé du chargement. Un message sera affiché pour pouvoir entrer le nom de la personne qui passera l'examen.
Voici les différents scénarios que nous avons traité :
Si la personne n'entre pas le bon nom, elle se verra être enregistrée puis on stockera la personne que nous verrons dans un fichier qui se nommera comme le nom qu'elle a entré pour se connecter.
Si la personne entre le bon nom puis au cours de l'examen se lève pour aller ailleurs, un enregistrement sera pris (dans le dossier recording) et pourra servir de preuve. De plus sur le fichier csv (dans le dossier Students puis dans le dossier de l'élève en question ) généré à son nom il y aura un intervalle de temps où la personne ne saura pas notée (nom de la personne et la date(jour,heure,seconde)).
Si la personne entre le bon nom puis au cours de l'examen un autre élève entre dans le champs de vision de la webcam, un enregistrement sera pris (dans le dossier recording) et pourra servir de preuve. De plus sur le fichier csv (Attendance.csv) généré il y aura écrit soit le nom de la seconde personne si l'algorithme le reconnait soit comme étant un inconnu (nom de la personne et la date(jour,heure,seconde)).
====================================================================
Ce que j'ai fais :
- lecture du quickstart sur le langage Python
- installation de jdk 11
- installation de gRPC sur Windows
- test et compréhension du code fournis par quickstart
- une page d'accueil où on doit saisir ses identifiants et choisir entre créer ou rejoindre une réunion,
- Une seconde page pour lancer la réunion où il y aura la caméra, le chronomètre et un bouton pour quitter la réunion.
Puis on a créé une maquette de l'application SpyCheat sur ce site. Par la suite, nous nous sommes réparties les tâches (pour ma part, je devais m'occuper de la connexion gRPC ).
- J'ai testé le code HelloWorld et RouteGuide en python pour comprendre le code.
- J'ai effectué des test en mettant en commentaires des fonctions et en modifiant des valeurs pour qu'elle s'adapte à mes besoins.
- J'ai fait des recherches sur internet pour comprendre le rôle du fichier proto
- J'ai créé un serveur python pour que celui-ci affiche les valeurs envoyées par un client.
- Création d'un client python pour que celui-ci envoie 3 valeurs (comme ci c'était des coordonnées). L'objectif était de tester le bon fonctionnement de mon serveur et comprendre le rôle des fonctions gRPC.
- Première tentative de création d'un client kotlin sur android studio (échec). J'ai rencontré de nombreuse difficulté pour générer les bons fichiers gRPC. Il m'a fallut regarder plusieurs fois le code qui était mis à notre disposition dans le quickstart.
- J'ai ajouté des fonctions kotlin pour convertir les images (en format bitmap) en chaîne de caractères avant qu'elles soient envoyées au serveur
- J'ai modifié le serveur pour qu'il puisse convertir les chaînes de caractères en image
- J'ai rédigé des scénarios et j'ai redéfinis la maquette de l'application pour qu'elle réponde à nos attentes (j'ai fais des schémas en spécifiants les différentes conditions à respecter).
====================================================================
Sohayla
Ce que j'ai fais :
- lecture du quickstart sur le langage Python
- installation de jdk 11
- installation de gRPC sur Windows
- test et compréhension du code fournis par quickstart
- une page d'accueil où on doit saisir ses identifiants et choisir entre créer ou rejoindre une réunion,
- Une seconde page pour lancer la réunion où il y aura la caméra, le chronomètre et un bouton pour quitter la réunion.
Puis on a créé une maquette de l'application SpyCheat sur ce site. Par la suite, nous nous sommes réparties les tâches (pour ma part, je devais m'occuper de la reconnaissance faciale ).