<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="fr">
		<id>https://projets-ima.plil.fr/mediawiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Hdelatte</id>
		<title>Wiki de Projets IMA - Contributions de l’utilisateur [fr]</title>
		<link rel="self" type="application/atom+xml" href="https://projets-ima.plil.fr/mediawiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Hdelatte"/>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php/Sp%C3%A9cial:Contributions/Hdelatte"/>
		<updated>2026-05-13T23:46:36Z</updated>
		<subtitle>Contributions de l’utilisateur</subtitle>
		<generator>MediaWiki 1.29.2</generator>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=Projets_IMA5_2017/2018&amp;diff=51900</id>
		<title>Projets IMA5 2017/2018</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=Projets_IMA5_2017/2018&amp;diff=51900"/>
				<updated>2018-02-21T13:38:21Z</updated>
		
		<summary type="html">&lt;p&gt;Hdelatte : /* Répartition des binômes */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Merci de référencer vos pages de projets ici. Merci aussi d'uniformiser vos formats que ce soit en regardant la présentation des projets déjà créés ou en allant modifier le format des précédents si votre façon de faire vous semble la meilleure. Dans tous les cas un minimum de communication entre les binômes est conseillée.&lt;br /&gt;
&lt;br /&gt;
Toutes les sources doivent être déposées sur notre archive GIT. Le service est disponible à l'URL [https://archives.plil.fr archives.plil.fr]. Connectez-vous avec vos identifiants Polytech'Lille. Sauf indication contraire de vos encadrants, rendez le projet public et mettez le lien sur votre Wiki. Vous pouvez trouver de la documentation sur ce système d'archives sur ce [https://git-scm.com/book/fr/v1 site].&lt;br /&gt;
&lt;br /&gt;
== Répartition des binômes ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table border=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;th&amp;gt;Projet&amp;lt;/th&amp;gt;&lt;br /&gt;
  &amp;lt;th&amp;gt;Elèves&amp;lt;/th&amp;gt;&lt;br /&gt;
  &amp;lt;th&amp;gt;Encadrant Ecole&amp;lt;/th&amp;gt;&lt;br /&gt;
  &amp;lt;th&amp;gt;Rapport décembre&amp;lt;/th&amp;gt;&lt;br /&gt;
  &amp;lt;th&amp;gt;Rapports finaux&amp;lt;/th&amp;gt;&lt;br /&gt;
  &amp;lt;th&amp;gt;Vidéo&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[P1 Conception d'une pompe automatique à insuline]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Alice Coffin / Amina Fahem&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Belkacem Ould Bouamama&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[Fichier:rapport_mi_PFE_COFFIN_FAHEM.pdf]] &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[P18 Localisation of quadrotors]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Nicky UNG / Hugo Delatte&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Jérémie DEQUIDT / Gang ZHENG&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[Fichier:RapportMi-PFE-UNG DELATTE.pdf]] &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[Fichier:RapportPFE-UNG DELATTE-final.pdf]] &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[P25 Développement d'un cobot ]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Tristan HART&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Rodolphe Astori / Alexandre Boé / Xavier Redon / Thomas Vantroys &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[Fichier:RapportIntermédiaire_PFE25_HART.pdf]] &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[P29 QT pour tablette à retour tactile]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;lValentin BEAUCHAMP / Vivian SENAFFE&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Laurent GRISONI&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[Fichier:Rapport_pfe_BEAUCHAMP_SENAFFE.pdf]] &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; [[Fichier:BEAUCHAMP_SENAFFE_Rapport_Final_PFE.pdf]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[P30 patcher l’IoT par intrusion]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Alexis DORIAN&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Thomas Vantroys /Worldline&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[P33 Utilisation de Nao avec des enfants autistes]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Antoine ARNAUDET&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Thomas VANTROYS&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; [[Fichier:ARNAUDET_ANTOINE_RAPPORT_DECEMBRE_2017_PFE.pdf]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; [[Fichier:ANTOINE_ARNAUDET_P33_RAPPORT_PFE_FINAL.pdf]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[P34 Robot reconstructeur de mouvement]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Baptiste GRILLERE / Jean-Baptiste SAISON&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Rochdi MERZOUKI / Guillaume DEWAELE&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[P21 Projet bras déformable antagoniste]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Florian GIOVANNANGELI&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Thor BIEZE&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[P20 Projet marionnette déformable interactive ]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Bacem HAGUI&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Félix VANNESTE, Jeremie DEQUIDT&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; [[Fichier:bacem_mi_parcours.pdf]] &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; [[Fichier:Rapport_PFE_Hagui_Bacem.pdf]] &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[P5 Commande d’une centrale de production de biogaz ]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Cheikh Soilihi SAID AHMED&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Midzodzi PEKPE &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[Fichier:Rapport_intermediaire.pdf]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[P15 Réseau de capteurs temps réel ]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Edmur Lopes&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Alexandre Boé / Xavier Redon / Thomas Vantroys&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[Fichier:Rapport_mi_parcours.pdf ]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[Fichier:Rapport PFE15 LOPES.pdf]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[P23 Application de gestion de conteneurs pour sites Web]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Alexis MACHEREZ&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Xavier REDON / Thomas VANTROYS&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[P36 Robots Mobiles Chorégraphes]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Joshua LETELLIER&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Rochdi MERZOUKI&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[Fichier:RapportAvancementPFE_Letellier_Joshua.pdf]] &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[Fichier:RapportFinalPFE_Letellier.pdf]] &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[P26 Réseau de capteurs de pollution]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Marianne BUTAYE&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Alexandre BOE / Xavier REDON / Thomas VANTROYS&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[Fichier:Rapport p26 2018 marianne butaye.pdf]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[P32 Apprentissage automatique pour la détection d’attaques par déni de services ]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Robin Cavalieri&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Thomas VANTROYS&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[P27 Réseau LoRaWAN ]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;François Lefevre&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Alexandre BOE / Xavier REDON / Thomas VANTROYS&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[P38 Conception par fabrication additive des pièces en plastique à partir d’un robot]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Diana Marrucho&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;Rochdi MERZOUKI&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;[[Fichier:MARRUCHO Diana Rapport PFE.pdf]]&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Matériel nécessaires ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table border=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;th&amp;gt;Projet&amp;lt;/th&amp;gt;&lt;br /&gt;
  &amp;lt;th&amp;gt;Matériel&amp;lt;/th&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;P15&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt; 2 câbles usb&amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;50 Positions Embase Connecteur 0,100 po (2,54 mm) Trou traversant Or  [https://www.digikey.fr/products/fr?keywords=SFH11-PBPC-D25-ST-BK%20]&amp;lt;/span&amp;gt; &lt;br /&gt;
  &amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt; P27 Réseau LoRaWAN &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;td&amp;gt;&amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt; 1 Raspberry Pi 3 + boîtier + alimentation + câble USB &amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt; 3 STM32 Nucleo + 3 câbles mini-USB &amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt; 3 modules émetteurs LoRa &amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt; 1 module récepteur LoRa &amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt; 1 carte SD &amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt; 10 câbles de connexion &amp;lt;/span&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;/tr&amp;gt;&lt;/div&gt;</summary>
		<author><name>Hdelatte</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=P18_Localisation_of_quadrotors&amp;diff=51828</id>
		<title>P18 Localisation of quadrotors</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=P18_Localisation_of_quadrotors&amp;diff=51828"/>
				<updated>2018-02-21T11:36:25Z</updated>
		
		<summary type="html">&lt;p&gt;Hdelatte : /* Délivrables */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Cahier des charges'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;Présentation générale du projet&amp;lt;/span&amp;gt;=== &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Contexte&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
Dans un monde de plus en plus connecté, de nombreux drones sont déployés pour diverses applications comme l'espionnage, la surveillance, la cartographie de lieux et la livraison de colis. Les technologies nécessaires pour contrôler ces drones sont des sujets de recherche actuels. &lt;br /&gt;
&lt;br /&gt;
Le contrôle de ceux-ci passe tout d'abord par la maîtrise de leur position dans l'espace. Le développement des applications liées à l'utilisation de drones nécessite un travail important sur la localisation spatiale d'objets connectés. &lt;br /&gt;
&lt;br /&gt;
De plus, dans un souci d'utilisation, il est essentiel de développer des interfaces logicielles permettant d'exploiter ces données.&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Objectif du projet&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
L'objectif de ce projet est de développer une interface logicielle permettant de traiter en temps réel les informations de localisation d'un drone et de balises, dans le but de définir leur localisation dans l'espace, en intérieur.&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Description du projet&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
Pour réaliser le contrôle de drones, la première étape importante est de donner ses informations de position. Le but du projet est de développer une interface logicielle permettant de localiser le drone en temps réel en intérieur. Le drone se déplace dans un environnement dans lequel ont été installées de multiples balises. Il est équipé d'une carte, lui permettant de recevoir les distances relatives entre lui-même et les balises, sur laquelle différents algorithmes vont être implémentés pour effectuer la localisation en temps réel. Le projet requiert des compétences en développement hardware (Crazyflie 2.0, voir https://wiki.bitcraze.io/) et software (langage C/C++/Python/Javascript/HTML...).&lt;br /&gt;
&lt;br /&gt;
Il se divise en 4 étapes principales, qui sont:&lt;br /&gt;
*1) Choisir les technologies utilisées&lt;br /&gt;
*2) Choisir l'architecture (OS / APIs)&lt;br /&gt;
*3) Développer les différentes parties du projet&lt;br /&gt;
*4) Intégrer et connecter les différentes parties du projet&lt;br /&gt;
&lt;br /&gt;
La localisation étant en intérieur, le protocole GPS n'est donc pas assez précis pour les applications ciblées. La mise en place d'un tel dispositif permettrait grâce à l'utilisation d'un algorithme d'estimer avec une bonne précision les positions en intérieur d'une balise centrale (appelée Tag) et de balises (appelées Anchor). Le Tag scanne en temps réel la distance relative aux différentes balises, et il nous est retourné la position des balises et du Tag grâce à l'algorithme de localisation.&lt;br /&gt;
&lt;br /&gt;
Le projet se compose de 3 parties:&lt;br /&gt;
* Collect &amp;amp; parse: collecter les données envoyées par les balises en communiquant avec un serveur et récupérer les données adéquates par un tri&lt;br /&gt;
* Localise: déterminer la matrice de position des balises et du Tag en traitant les données récupérées&lt;br /&gt;
* Display: développer l'interface homme machine pour afficher, étudier et utiliser les données traitées&lt;br /&gt;
&lt;br /&gt;
Nous travaillerons dans un premier temps dans une optique temps différé avant de travailler en temps réel. Cela nous permettra d'acquérir des données utiles et réutilisables en aval. &lt;br /&gt;
&lt;br /&gt;
A l'aboutissement du projet, nous devrions être capable via l'interface homme machine développée d'afficher précisément la position spatiale des balises ainsi que du Tag, grâce àl'utilisation d'un algorithme de localisation et des données récupérées, et d'afficher d'autres données relatives au déplacement du Tag ou des balises dans l'espace. &lt;br /&gt;
&lt;br /&gt;
Si le temps le permet, nous pourrons aussi être amenés à adapter et utiliser l'interface développée pour l'utilisation d'un drone.&lt;br /&gt;
&lt;br /&gt;
''Sujet originel''&lt;br /&gt;
&lt;br /&gt;
To achieve the control of quadrotors, the first important task to give its position information. This project is to develop a software(GUI) to localize the quadrotors in real-time. The quadrotor is flying in an environment where several transmitters have been installed. The quadrotor is equipped with a deck to receive the relative distances between the deck and all transmitters, based on which different algorithms will be implemented to realize the real-time localization. The candidates need to have both experiences on hardware (Crazyflie 2.0, see https://wiki.bitcraze.io/) and software development (C/C , Python…). &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Calendrier prévisionnel&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
''[[Avant le 29/09/17]]'' - Élaboration du Cahier des charges, de la liste des tâches et du calendrier prévisionnel&lt;br /&gt;
&lt;br /&gt;
''[[Avant fin Octobre]]'' - Serveur de collecte et début du développement de l'interface logicielle&lt;br /&gt;
&lt;br /&gt;
''[[Avant fin Décembre]]'' - Interface logicielle&lt;br /&gt;
&lt;br /&gt;
''[[A la fin du PFE]]'' - Intégration finale des différentes parties (Serveur de collecte des données &amp;amp; Serveur de localisation &amp;amp; Interface logicielle)&lt;br /&gt;
&lt;br /&gt;
Répartition du volume de travail (***h):&lt;br /&gt;
&lt;br /&gt;
* Recherche sur les technologies à utiliser&lt;br /&gt;
* Développement du serveur de collecte de données&lt;br /&gt;
* Réalisation de l'interface logicielle (Web//Logiciel/Application)&lt;br /&gt;
* Intégration des différentes parties&lt;br /&gt;
* Test et débuggage&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Choix techniques : matériel et logiciel&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
Afin de développer ce dispositif, nous allons utiliser une Raspberry Pi 3 associée à une carte réceptrice, qui communique avec 4 balises composées chacune d'un microcontrôleur et d'une carte émettrice radio (UWB5C) et alimentées par batteries. La carte réceptrice joue le rôle du drone à localiser et communiquera les données émises par les balises vers l'ordinateur via Bluetooth.&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Choix technologiques&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
Voici les technologies que nous utilisons pour chacune des parties de ce projet.&lt;br /&gt;
&lt;br /&gt;
    1) Serveur de collecte des données:&lt;br /&gt;
       Scanne et parse les données récupérées pour fournir la matrice D des distances relatives du tag aux 4 balises&lt;br /&gt;
        - API&lt;br /&gt;
        - Python / Serveur Flask&lt;br /&gt;
&lt;br /&gt;
    2) Serveur de localisation (fourni):&lt;br /&gt;
       Calcule grâce à l'algorithme de localisation et la matrice D les positions spatiales des 4 noeuds et du tag&lt;br /&gt;
        - API&lt;br /&gt;
        - Bootstrap&lt;br /&gt;
        - Jquery&lt;br /&gt;
        - Python&lt;br /&gt;
&lt;br /&gt;
    3) Interface utilisateur:&lt;br /&gt;
       Affiche courbes, visualisation 3D, boutons ou données des fichiers envoyées par le serveur de localisation&lt;br /&gt;
        - HTML5 / Javascript&lt;br /&gt;
        - Fichiers JSON (serveurs de collecte et de localisation)&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Calendrier prévisionnel'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Liste des tâches à effectuer&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
# Se documenter sur le projet&lt;br /&gt;
##Langages et technologies utilisées&lt;br /&gt;
##Matériel utilisé&lt;br /&gt;
##Mettre en place du travail sur le Git&lt;br /&gt;
# Réaliser le serveur de collecte&lt;br /&gt;
##Récupérer les trames envoyées par bluetooth par le TAG via la Raspberry Pi&lt;br /&gt;
##Intégrer le serveur de localisation pour interpréter les trames&lt;br /&gt;
##Tester et optimiser&lt;br /&gt;
# Réaliser l'interface Web utilisateur&lt;br /&gt;
##Implémenter le serveur de collecte et de localisation&lt;br /&gt;
##Afficher et traiter les données stockées dans les fichiers JSON via le serveur (temps différé + temps réel)&lt;br /&gt;
##Tester et optimiser&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;Replanification du cahier des charges / calendrier&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Feuille d'heures'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Tâche !! Prélude !! Heures S1 !! Heures S2 !! Heures S3 !! Heures S4 !! Heures S5 !! Heures S6 !! Heures S7 !! Heures S8 !! Heures S9 !! Heures S10 !! Heures S11 !! Heures S12 !! Heures S13 !! Heures S14 !! Heures S15 !! Heures S16 !! Heures S17 !! Heures S18 !! Heures S19 !! Total&lt;br /&gt;
|-&lt;br /&gt;
| Cahier des charges / Wiki / Gitlab / Rapport&lt;br /&gt;
|  4h&lt;br /&gt;
|  3h&lt;br /&gt;
|  1h&lt;br /&gt;
|  x&lt;br /&gt;
|  1h30&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h30&lt;br /&gt;
|  1h&lt;br /&gt;
|  3h&lt;br /&gt;
|  3h30&lt;br /&gt;
|  2h&lt;br /&gt;
|  5h&lt;br /&gt;
|  x&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Documentation sur les technos utilisées&lt;br /&gt;
|  2h&lt;br /&gt;
|  4h&lt;br /&gt;
|  3h&lt;br /&gt;
|  2h&lt;br /&gt;
|  3h&lt;br /&gt;
|  4h&lt;br /&gt;
|  5h&lt;br /&gt;
|  5h30&lt;br /&gt;
|  4h30&lt;br /&gt;
|  3h30&lt;br /&gt;
|  2h&lt;br /&gt;
|  3h&lt;br /&gt;
|  1h&lt;br /&gt;
|  3h&lt;br /&gt;
|  4h&lt;br /&gt;
|  x&lt;br /&gt;
|  2h&lt;br /&gt;
|  &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Documentation sur le matériel&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  1h&lt;br /&gt;
|  1h&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Recherche et développement du serveur de collecte&lt;br /&gt;
|  x&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  3h&lt;br /&gt;
|  3h30&lt;br /&gt;
|  4h&lt;br /&gt;
|  5h&lt;br /&gt;
|  7h&lt;br /&gt;
|  4h30&lt;br /&gt;
|  0,5h&lt;br /&gt;
|  3h&lt;br /&gt;
|  4h&lt;br /&gt;
|  3h&lt;br /&gt;
|  x&lt;br /&gt;
|  4h&lt;br /&gt;
|  7h30&lt;br /&gt;
|  5h&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Recherche et développement de l'interface Web&lt;br /&gt;
|  x&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  3h&lt;br /&gt;
|  5h&lt;br /&gt;
|  6h&lt;br /&gt;
|  4h&lt;br /&gt;
|  7h&lt;br /&gt;
|  5h30&lt;br /&gt;
|  2h30&lt;br /&gt;
|  6h&lt;br /&gt;
|  8h&lt;br /&gt;
|  5h&lt;br /&gt;
|  1h&lt;br /&gt;
|  8h&lt;br /&gt;
|  4h&lt;br /&gt;
|  4h&lt;br /&gt;
|  &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Recherche et intégration du serveur de localisation&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x &lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  6h&lt;br /&gt;
|  5h&lt;br /&gt;
|  3h&lt;br /&gt;
|  &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Intégration des différentes parties&lt;br /&gt;
|  x&lt;br /&gt;
|  x  &lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  2h&lt;br /&gt;
|  2h&lt;br /&gt;
|  2h&lt;br /&gt;
|  3h&lt;br /&gt;
|  1h30&lt;br /&gt;
|  x&lt;br /&gt;
|  3h&lt;br /&gt;
|  6h&lt;br /&gt;
|  5h&lt;br /&gt;
|  x&lt;br /&gt;
|  3h30&lt;br /&gt;
|  2h&lt;br /&gt;
|  2h&lt;br /&gt;
|  &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Tests et débuggage&lt;br /&gt;
|  x&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  1h&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  3h&lt;br /&gt;
|  4h&lt;br /&gt;
|  0,5h&lt;br /&gt;
|  3h&lt;br /&gt;
|  1h&lt;br /&gt;
|  3h&lt;br /&gt;
|  3h&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  4h&lt;br /&gt;
|  &lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Optimisation/Correction des programmes&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Vidéo&lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Avancement du Projet'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Phase préparatoire'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Jeu 21/09/17 - Ven 22/09/17]]'' &lt;br /&gt;
*Rendez-vous de mise au point du cahier des charges avec les encadrants/intervenants (M. ZHENG Gang et M. DAGHER Roudy)&lt;br /&gt;
*Elaboration du cahier des charges&lt;br /&gt;
*Elaboration de la page Wiki (préparation de la mise en page et présentation du sujet)&lt;br /&gt;
*Préparation du travail sous forme de Mind Map&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous nous sommes tout d’abord rendus au laboratoire de l'INRIA afin de pouvoir définir le plus précisément possible le cahier des charges avec nos tuteurs.&lt;br /&gt;
Nous avons donc défini avec eux les technologies qu'il faudrait étudier. Vous retrouverez le choix des technologies dans la partie '''choix technologiques'''&lt;br /&gt;
&lt;br /&gt;
Nous avons en même temps créé notre page Wiki, et structurée celle-ci avec les parties qui nous seraient utiles pour développer nos explications par la suite.&lt;br /&gt;
&lt;br /&gt;
Nous avons de plus découpé le travail en sous-parties que nous avions mis dans une '''Mind map''' afin d'y voir plus clair sur la ligne à suivre.&lt;br /&gt;
&lt;br /&gt;
Vous trouverez cette Mind map juste ci-dessous. Nous ne mettrons pas à jour cette Mind map chaque semaine mais il est fort probable que nous en refaisions un en milieu de projet pour pouvoir cibler les objectifs réussis et ceux à atteindre. Nous pourrons de plus redéfinir certains objectifs qui nous auraient semblés trop vague au début du projet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Projet de fin d'étude.png|centre|600px]]&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 1'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Jeu 28/09/17 - Ven 29/09/17]]'' &lt;br /&gt;
*Revue du Cahier des Charges avec les encadrants&lt;br /&gt;
*Lecture et recherches sur les technologies adaptées&lt;br /&gt;
*Construction de la suite de la Mind Map&lt;br /&gt;
*Création du Gitlab&lt;br /&gt;
&lt;br /&gt;
Nous commençons les recherches sur le projet et sur les premières technologies engagées dans celui-ci. Nous en profitons pour formuler dès à présent des questions sur le bon choix de celles-ci. Nous commençons donc des tests ayant seulement pour but de nous familiariser avec l'environnement de travail et de réellement comprendre les fonctions déjà présentes qu'il faudra exploiter et implanter notre interface web.&lt;br /&gt;
Nous créons un dépôt Gitlab avec notre tuteur et commençons a définir les taches premières sur celui-ci.&lt;br /&gt;
Nous en profitons pour affiner le Mind Map.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 2'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Jeu 05/10/17 - Ven 06/10/17]]''  &lt;br /&gt;
*Précisions sur le cahier des charges&lt;br /&gt;
*Listage du matériel&lt;br /&gt;
*Recherche et détermination de solutions technologiques possibles pour les fonctions demandées&lt;br /&gt;
*Début du travail sur le serveur de collecte&lt;br /&gt;
*Apprentissage du langage Python et de l'utilisation du framework Flask&lt;br /&gt;
&lt;br /&gt;
Nous avons finalisé les précisions sur le cahier des charges. Nous avons donc pu cibler le matériel dont nous nous servirons pour ce Projet. Vous trouverez donc cette liste la section correspondante. Il est évident que le matériel utilisé est dans l'ensemble déjà fourni par le laboratoire et qu'il nous reste dans l'ensemble à créer l'interface web et les API qui nous permettrons de faire communiquer cette interface avec la Raspberry Pi et le serveur de position déjà créé.&lt;br /&gt;
Nous avons donc pu commencer à nous former sur les technologies qui nous serviraient par la suite. Nous avons donc utilisé le cours d'Openclassrooms sur les serveurs Flask pour en apprendre les bases. Ce serveur Flask est programmé en Python et nous permet donc une grande liberté au niveau de l’exécution de certains scripts. En effet, les scripts de connexion Bluetooth et de redirection de port qui nous permettent de récupérer les données de distance sont eux-mêmes codés en Python et sont directement appelés via le serveur.&lt;br /&gt;
Dans ce serveur, représentant notre interface web, vous retrouverez la page '''/collecte''' qui représentera notre partie collecte de données ainsi que l'affichage de ces distances. Nous appellerons cette partie le Serveur de Collecte.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 3'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 11/10/17 - Jeu 12/10/17]]''  &lt;br /&gt;
*Recherche et développement initial du serveur de collecte de données&lt;br /&gt;
*Complément du Git sur les tâches à effectuer&lt;br /&gt;
&lt;br /&gt;
Nous avons commencé à créer un serveur Flask renvoyant pour l'instant une matrice aléatoire. Lors de la requête URL &amp;quot;../matrice&amp;quot;, nous voyons bien une matrice aléatoire apparaître sur la page Web. Nous essayons de nous connecter à la Raspberry Pi en redirigeant son port série vers le Bluetooth de façon à récupérer de vraies matrices de distance entre le drone (ie commutateur central) et les balises. Nous pourrons afficher ensuite ces matrices, ou alors les stocker dans un fichier en attendant le traitement de celles-ci.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Requete s3.PNG|300px|serveur Flask]]&lt;br /&gt;
&lt;br /&gt;
Nous avons plusieurs problèmes avec le Bluetooth pour se connecter avec la Raspberry Pi. Quand nous aurons réussi à nous connecter au port série de la Raspberry Pi alors nous pourrons gérer le traitement des données récupérées.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 4'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 18/10/17 - Jeu 19/10/17]]''  &lt;br /&gt;
*Configuration de la Raspberry Pi car problèmes de connectivité Bluetooth rencontrés&lt;br /&gt;
**Nous arrivons à connecter la Raspberry Pi sous Windows mais la connexion sous Linux pose problème (travail en suspens en attendant la disponibilité de l'encadrant)&lt;br /&gt;
*Début du développement de l'interface Web&lt;br /&gt;
**Traitement d'une matrice dans un fichier JSON&lt;br /&gt;
**Affichage sous forme de tableau de la matrice&lt;br /&gt;
**Utilisation du serveur de requête en Python avec chargement de template HTML&lt;br /&gt;
**Mise en forme de la trame de la page en HTML/CSS avec le framework Bootstrap&lt;br /&gt;
**Ajout d'un set de distances (d1, d2, d3, d4) dans la matrice lors d'un appui sur un bouton Chargement en utilisant un fichier Javascript&lt;br /&gt;
&lt;br /&gt;
Nous avons reçu des fonctions Python de notre tuteur afin d'obtenir une connexion Bluetooth entre notre Raspberry Pi et notre ordinateur ainsi qu'une redirection de port de celle-ci vers la connexion. Nous n'arrivons pas à utiliser ces fonctions sous linux et nous nécessitons une explication de notre tuteur n'étant pas disponible à ce moment. Pour ne pas perdre de temps, nous attaquons la création de l'interface web à proprement parler, c'est à dire la création des pages HTML ainsi que le document Javascript qui nous servira de bibliothèque de fonctions. Chaque route de notre serveur est reliée à une série de fonctions Python s'exécutant à l'appel des url puis suivies d'un template de la page HTML en question. Nous en profitons de plus pour explorer le framework CSS bootstrap afin de mettre un premier design et une structure a notre page collecte qui sera la page principale de notre site pour ce début de projet.&lt;br /&gt;
&lt;br /&gt;
Nous nous essayons de plus à différents tests sur des fichiers de format '''JSON''' que nous devrons réussir à traiter correctement plus tard dans notre projet.&lt;br /&gt;
Nous récupérons une matrice que nous créons nous-mêmes en Python (simulation d'une série de distances récupérée) que nous transformons au format JSON pour ensuite l'afficher sur notre page web. Pour pouvoir proprement afficher ce fichier '''JSON''' renvoyé vers notre page, nous nous servons du fichier Javascript afin de créer du code HTML contenant la matrice.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 5'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 25/10/17 - Ven 27/10/17]]''  &lt;br /&gt;
*Résolution des problèmes de connectique Bluetooth sur la Raspberry Pi&lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Traitement d'une matrice dans un fichier JSON&lt;br /&gt;
**Début de l'ajout d'un set de distances depuis une matrice contenue dans un fichier JSON&lt;br /&gt;
&lt;br /&gt;
Nous avons pu nous entretenir avec notre tuteur et donc comprendre les fonctions de connexion et de redirection de port. Nous pouvons donc continuer le développement de notre interface web. Nous arrivons à traiter un set de données au format JSON et à l'afficher dans le code HTML. Toutefois nous créons nous-mêmes ce set, il est maintenant nécessaire que nous arrivions à récupérer les sets de distance réels reçus par la connexion Bluetooth. Nous commencerons par un traitement asynchrone. L'idée est d’enregistrer les sets de distances dans un fichier '''JSON''' stocké dans un dossier. Nous appellerons ce dossier plus tard via une requête Ajax.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 6'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 08/11/17 - Ven 10/11/17]]''  &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
**Mise en place de la communication entre le port série de notre machine et le port série de la carte via Bluetooth de la RPi3&lt;br /&gt;
**Récupération et traitement (parse) manuels des données de distances dans un fichier .log via TCP/IP&amp;lt;-&amp;gt;Bluetooth&lt;br /&gt;
**Début de l'automatisation du procédé par script Python (requete.py) et mise en place de sockets de communication&lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Chargement sur commande d'un set de distances depuis une matrice contenue dans un fichier JSON&lt;br /&gt;
*Travail sur le layout du site&lt;br /&gt;
&lt;br /&gt;
Après avoir regardé le code de ces différentes fonctions nous avons pu faire des tests manuels via le Shell pour récupérer des données de distances et les stocker dans un fichier '''JSON''' sur notre ordinateur.&lt;br /&gt;
&lt;br /&gt;
Nous utilisons les commandes suivantes pour se connecter via Bluetooth:&lt;br /&gt;
&lt;br /&gt;
 rfcomm connect /dev/rfcomm0 B8:27:EB:80:DC:89 1&lt;br /&gt;
&lt;br /&gt;
Rediriger le port de la Raspberrypi3 vers la connexion:&lt;br /&gt;
&lt;br /&gt;
 Python lps-collector/tcp_serial_redirect.py /dev/rfcomm0 9600&lt;br /&gt;
&lt;br /&gt;
Collecter les données dans un fichier dont nous définissons le nom:&lt;br /&gt;
&lt;br /&gt;
 echo &amp;quot;cu -s9600 -lttyACM0&amp;quot;| nc localhost 7777&lt;br /&gt;
 nc localhost 7777 | grep distance &amp;gt; static/log/dist-capture'+date+'.log&lt;br /&gt;
&lt;br /&gt;
Nous pouvons '''parser''' le flux de données avant de le stocker dans le fichier via cette commande:&lt;br /&gt;
&lt;br /&gt;
 Python lps-collector/lps_parse.py static/log/dist-capture&amp;quot;+date+&amp;quot;.log&lt;br /&gt;
&lt;br /&gt;
Il est donc nécessaire d'inclure via des '''thread''' ces différentes fonctions dans notre serveur Python (Flask) afin d'automatiser le processus. Le but est de pouvoir choisir sur l'interface web quels fonctions il faut exécuter et les déclencher via l'appui sur des boutons.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 7'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 15/11/17 - Ven 17/11/17]]''  &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
**Récupération et traitement (parse) manuels des données de distances dans un fichier .log via TCP/IP&amp;lt;-&amp;gt;Bluetooth&lt;br /&gt;
**Automatisation du procédé par script Python (requete.py)&lt;br /&gt;
***Mise en place de sockets de communication pour le contrôle de la collecte -&amp;gt; abandonné (servait à commander la collecte manuellement)&lt;br /&gt;
***Développement d'un script engine.py regroupant les commandes exécutables par l'utilisateur via la page Web&lt;br /&gt;
***Début du travail sur la fonction &amp;quot;STOP&amp;quot; manuel d'une action de collecte de données (liaison entre script HTML, Javascript, et script Python)&lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Chargement sur commande d'un set de distances depuis une matrice contenue dans un fichier JSON&lt;br /&gt;
**Travail sur le layout du site&lt;br /&gt;
***Ajout des différentes commandes (connexion Bluetooth, lancement commande cu, collecte des données, collecte durée donnée)&lt;br /&gt;
***Début de l'implémentation de la visualisation des fichiers .JSON obtenus après collecte et affichage dans un tableau matriciel du fichier sélectionné&lt;br /&gt;
&lt;br /&gt;
Nous avons continué à travailler sur le serveur de collecte: les données que nous avons récupérées via Bluetooth sont stockées dans un fichier .log. Apres avoir bien compris comment marchait la fonction '''parse''' manuellement (lors de son utilisation dans le Shell), nous l'avons implémentée dans notre serveur de collecte qui lance cette commande lors de l’appui sur un bouton via notre interface virtuelle. Un problème rencontré était de savoir quand la récolte des données devait s’arrêter. Nous avons donc rajouté un temps à entrer nous-même sur l'interface. La fonction '''parse''' est effectuée et le sous-processus va attendre le temps donné avant de lancer une commande permettant de tuer le processus et mettant donc fin au remplissage du fichier '''.log'''. Nous voulons de plus réussir à lancer une fonction de collecte sans temps. C'est à dire que nous coupons la collecte via un bouton par nous-mêmes. Nous voulions utiliser des Sockets pour pouvoir définir nous-mêmes la gestion de la communication mais l'idée a été abandonné car nous avons réussi à sauvegarder le PID du processus lancé. Il nous suffit donc de l’arrêter grâce à un autre bouton qui récupère cette variable et l’arrête ensuite. &lt;br /&gt;
&lt;br /&gt;
Toutes nos fonctions Pythons étant regroupées dans notre serveur '''requete.py''', nous avons décidé de créer un module qui regroupera toutes ces fonctions que nous pourrons utiliser dans '''requete.py'''. ceci nous permet de voir plus clair dans notre code et de faciliter le travail lorsque nous modifions le code tous les deux.&lt;br /&gt;
&lt;br /&gt;
Nous essayons en continu d'adapter le layout du site pour le rendre le plus attractif et simple possible, de façon à ce que chaque bouton et tableau soient clairs et compréhensibles.&lt;br /&gt;
&lt;br /&gt;
Nous avons commencé à récupérer les fichiers '''JSON''' créés à partir des fichier '''log''', c'est-à-dire que ces fichiers sont automatiquement stockés coté serveur dans un dossier nommé '''static/log'''. Notre but est de récupérer le nom des fichiers JSON et de les afficher dans un composant sur notre interface web. Il nous sera donc possible ensuite de sélectionner le nom d'un fichier. Lors de la sélection de ce nom de fichier, un tableau apparaît avec les valeurs de distances à l’intérieur.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 8'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 22/11/17 - Ven 24/11/17]]''  &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
**Automatisation du procédé de collecte par script Python (requete.py qui fait appel à engine.py)&lt;br /&gt;
***Développement d'un script engine.py regroupant les commandes exécutables par l'utilisateur via la page Web&lt;br /&gt;
***Travail sur la fonction &amp;quot;STOP&amp;quot; manuel d'une action de collecte de données (liaison entre script HTML, Javascript, et script Python)&lt;br /&gt;
***Mise en place d'un serveur HTTP Simple sous Python pour accéder aux fichiers de données à partir de la page Web&lt;br /&gt;
***Mise à jour de fonctions de connexion &lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Travail sur le layout du site (ajout de pages, navigation entre les pages, apparence, nettoyage des codes)&lt;br /&gt;
**Bon fonctionnement de l'ensemble serveur collecte + serveur HTTP + client Web&lt;br /&gt;
**Affichage de la liste des fichiers de données de distance (log, csv, JSON) via serveur HTTP en Python sur port 9999&lt;br /&gt;
*Corrections et nettoyage du dépôt GIT&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous continuons à développer les points énoncés la semaine dernière. Nous avons décidé de nous diriger vers un serveur HTTP Simple pour accéder à nos fichiers. Il s’avère que nous finirons par ne pas utiliser ce serveur. Nous irons récupérer les fichiers en question via des requêtes '''Ajax''' faites à la sélection du nom du fichier.&lt;br /&gt;
&lt;br /&gt;
Nous rencontrons depuis le début des problèmes avec les fonctions de connexion qui peuvent ne pas marcher à un moment donné. Nous essayons de trouver pourquoi ce bug est un bug qui ne se produit pas à chaque fois. Nous avons déterminé qu'il ne se produisait seulement lorsque les fonctions de connexions étaient lancée dans des threads. Nous ne savons toujours pas pourquoi ces thread bugguent seulement parfois et non à chaque essai de connexion.&lt;br /&gt;
&lt;br /&gt;
Nous avons nettoyé notre dépot '''Git''' car il s’avère que nous utilisions une mauvaise méthode de fusion et de stockage des documents.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 9'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 29/11/17 - Jeudi 30/11/17]]''  &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
**Automatisation du procédé de collecte par script Python (requete.py qui fait appel à engine.py)&lt;br /&gt;
***Travail sur la fonction &amp;quot;STOP&amp;quot; manuel d'une action de collecte de données (liaison entre script HTML, Javascript, et script Python)&lt;br /&gt;
***Recherches sur l'utilisation de fichiers JSON accessibles via le serveur HTTP&lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Travail sur le layout du site &lt;br /&gt;
**Travail sur la liaison entre fichiers JSON et affichage Web des données de distance&lt;br /&gt;
***Recherches et tests de solutions&lt;br /&gt;
****Affichage depuis un fichier&lt;br /&gt;
****Affichage à la volée lors d'une action de collecte&lt;br /&gt;
&lt;br /&gt;
*Revue de code avec Roudy DAGHER:&lt;br /&gt;
**Structure globale des codes ok&lt;br /&gt;
**Fonctionnement presque ok: fonctionnalités implémentées ok, mais parsage csv ne marche pas&lt;br /&gt;
**Refactoring nécessaire&lt;br /&gt;
**Correction de la fonction STOP et amélioration de la fonction de COLLECTE&lt;br /&gt;
**Faire plus de requêtes Javascript que de requêtes HTML&lt;br /&gt;
**Discussion pour l'implémentation du serveur de localisation (= algorithme de localisation) et des visualisations de données sur le site Web&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous avons d'abord revu l'ensemble de notre code et les méthodes utilisées avec notre tuteur '''Roudy Dagher'''. Nous nous approchons d'un serveur de collecte de données stable et fonctionnel. Nous avons refait les différentes connexions entre l'interface et le serveur afin de ne faire que des requêtes sur des '''WebServices'''. Il nous est possible de commencer la deuxième partie qui est l'envoi de ces tableaux de données afin de les envoyer vers le serveur de localisation via des API afin de recevoir des matrices de positions.&lt;br /&gt;
Nous pourrons grâce à ces matrices afficher une carte 3D des balises  et du TAG dans l'espace.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 10'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 06/12/17 - Jeudi 07/12/17]]'' &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
**Travail sur la fonction STOP&lt;br /&gt;
**Réalisation d'une expression régulière pour le parsage des fichiers log en fichier JSON&lt;br /&gt;
&lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Travail sur l'affichage des fichiers JSON&lt;br /&gt;
***Réalisation de toutes les requêtes Ajax&lt;br /&gt;
***Réalisation d'un menu déroulant dropdown pour charger le contenu des fichiers JSON dans le tableau de distances&lt;br /&gt;
&lt;br /&gt;
*Nettoyage du dépôt Git&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 11'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 13/12/17]]''  &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
&lt;br /&gt;
*Revue de code avec Roudy DAGHER:&lt;br /&gt;
**Discussion sur la partie système du projet et correction de certaines fonctions&lt;br /&gt;
&lt;br /&gt;
Nous nous sommes réunis avec l'un de nos tuteurs, qui a réalisé certains bouts de code de base, pour nous mettre au point sur les fonctions en question et leur utilisation.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 12'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 20/12/17 - Jeudi 21/12/17]]''&lt;br /&gt;
*Revue, correction et nettoyage des codes&lt;br /&gt;
*Finalisation du rapport&lt;br /&gt;
*Planification de semaines restantes&lt;br /&gt;
*Préparation de la soutenance&lt;br /&gt;
*Revue de mi-projet avec tous les tuteurs&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Cette dernière semaine a servi à finaliser le rapport et à discuter de l'avancée du projet, notamment avec nos tuteurs pour déterminer le travail restant, présenter le travail abouti et replanifier précisément les échéances pour le travail restant. Nous avons réalisé la soutenance de mi-projet le '''jeudi 21/12/17 à 8h'''.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 13'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 10/01/18 - Ven 12/01/18]]''  &lt;br /&gt;
*Travail sur la collecte des données (serveur de collecte et interface Web)&lt;br /&gt;
**Redéfinition du fichier de parsage car il crée des conflits et ne produit pas un fichier formaté de la façon attendue&lt;br /&gt;
***Nombre de balises réel n'est pas bien déterminé par le code&lt;br /&gt;
***ID de la première et de la dernière balise ne sont pas déterminés correctement&lt;br /&gt;
&lt;br /&gt;
**Automatisation de la collecte par un script Shell lançant toutes les commandes de CONNEXION, REDIRECTION, LANCEMENT CU, FERMETURE DU PROGRAMME (kill rfcomm / kill tcp_redirect)&lt;br /&gt;
***Dans le but d'automatiser la procédure&lt;br /&gt;
***Dans le but de résoudre un problème de gestion de ressources (le bug '''thread''' apparu plus tôt dans le projet)&lt;br /&gt;
&lt;br /&gt;
**Travail sur la résolution du bug thread car l'automatisation n'a pas résolu le problème&lt;br /&gt;
***Identification du ou des causes potentielles: gestion des ressources (synchrone, asynchrone ?), connexion Bluetooth, lancement des commandes dans le même script, lancement en fg/bg, conflit dû au temps d'exécution de chaque processus ?&lt;br /&gt;
***Lancement des commandes manuellement dans des terminaux ne pose aucun problème: solution la plus simple&lt;br /&gt;
&lt;br /&gt;
**Redesign de la page Collecte&lt;br /&gt;
***Remplacement des boutons de commande par un bouton unique d'initialisation&lt;br /&gt;
***Travail sur une mise à jour du menu déroulant dropdown régulière sans avoir à recharger la page Web&lt;br /&gt;
***Implémentation de plotly.js, un module Javascript qui permet d'afficher des graphes en 3D&lt;br /&gt;
&lt;br /&gt;
*Mise au point post-soutenance avec Roudy DAGHER pour valider le travail restant, effectué et redéfinir certains objectifs atteignables ou pas selon les éléments réalisés dans le projet&lt;br /&gt;
*Recherches et début de l'implémentation du serveur de localisation fourni par les tuteurs&lt;br /&gt;
*Gestion du Git pour créer des branches additionnelles&lt;br /&gt;
*Recréation du rapport de projet suite à une perte du fichier éditable d'origine + Mise à jour avec les remarques suite à la soutenance ainsi que les nouveaux éléments&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 14'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mar 16/01/18 - Ven 19/01/18]]''  &lt;br /&gt;
*Travail sur la collecte des données (serveur de collecte et interface Web)&lt;br /&gt;
**Redéfinition du fichier de parsage car il crée des conflits et ne produit pas un fichier formaté de la façon attendue&lt;br /&gt;
***Corrigé: Nombre de balises réel n'est pas bien déterminé par le code&lt;br /&gt;
***Corrigé: ID de la première et de la dernière balise ne sont pas déterminés correctement&lt;br /&gt;
***Reste à faire: Traiter le cas où il y a un ajout ou suppression d'une balise pendant la collecte (pour le moment, lorsque c'est le cas, toutes les données se décalent au lieu de laisser des trous)&lt;br /&gt;
&lt;br /&gt;
**Automatisation de la collecte par un script Shell lançant toutes les commandes de CONNEXION, REDIRECTION, LANCEMENT CU, FERMETURE DU PROGRAMME (kill rfcomm / kill tcp_redirect)&lt;br /&gt;
***Mis en suspens: pour le moment, on lance les commandes manuellement dans le terminal&lt;br /&gt;
&lt;br /&gt;
**Interface Web&lt;br /&gt;
***Implémentation de plotly.js, un module Javascript qui permet d'afficher des graphes en 3D&lt;br /&gt;
&lt;br /&gt;
*Implémentation du serveur de localisation fourni par les tuteurs (mais algorithme de localisation pas fonctionnel pour le moment)&lt;br /&gt;
**Mise à jour de l'affichage des positions des éléments: précédemment seule la matrice X de position du Tag s'affichait, et pas la matrice A des balises&lt;br /&gt;
**Requêtes manuelles à l'API avec la fonction curl OK: on arrive à récupérer les matrices X et A (aléatoires pour le moment) par une requête GET à l'API du serveur de localisation&lt;br /&gt;
**Implémentation des requêtes Ajax pour automatiser les requêtes au serveur de localisation&lt;br /&gt;
&lt;br /&gt;
*Mise à jour du rapport les nouveaux éléments du travail réalisé&lt;br /&gt;
*Réflexion sur la possibilité ou non de réaliser la partie temps réel du projet au vu des moyens à disposition&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 15'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mar 23/01/18 - Ven 26/01/18]]'' &lt;br /&gt;
*Travail sur la collecte des données (serveur de collecte et interface Web)&lt;br /&gt;
**Redéfinition du fichier de parsage car il crée des conflits et ne produit pas un fichier formaté de la façon attendue&lt;br /&gt;
***Fait: Si distance négative car Tag trop près, la valeur négative générée par une balise est remplacée par un &amp;quot;0&amp;quot; (cela modifie la position réelle modélisée dans plotly, mais évite une impossibilité de générer la position à partir de la distance -&amp;gt; par des tests, il faudra déterminer la valeur limite à partir de laquelle les cartes donnent des valeurs de distance négatives&lt;br /&gt;
***Reste à faire: Traiter le cas où il y a un ajout ou suppression d'une balise pendant la collecte (pour le moment, lorsque c'est le cas, toutes les données se décalent au lieu de laisser des trous); Ainsi que le cas où il y un saut/bug inattendu et donc une disparition d'une ou plusieurs valeurs de distance&lt;br /&gt;
***Début de résolution du cas où une distance n'est pas prise en compte, c'est à dire où il y a une valeur qui disparaît et désaligne les valeurs lors de la création du JSON&lt;br /&gt;
&lt;br /&gt;
**Automatisation de la collecte par un script Shell lançant toutes les commandes de CONNEXION, REDIRECTION, LANCEMENT CU, FERMETURE DU PROGRAMME (kill rfcomm / kill tcp_redirect)&lt;br /&gt;
***Mis en suspens: pour le moment, on lance les commandes manuellement dans le terminal&lt;br /&gt;
***Création d'un script bash /etc/init.d/autoconnect.sh pour connecter automatiquement la RPi au lancement du système (si la RPi est déjà allumée au démarrage)&lt;br /&gt;
&lt;br /&gt;
**Interface Web&lt;br /&gt;
***Perfectionnement de l'utilisation de Plotly pour les visualisations&lt;br /&gt;
&lt;br /&gt;
*Implémentation du serveur de localisation fourni par les tuteurs (algorithme de localisation pas fonctionnel pour le moment)&lt;br /&gt;
**Requêtes manuelles à l'API avec la fonction curl OK&lt;br /&gt;
**Fait: Implémentation des requêtes Ajax pour automatiser les requêtes au serveur de localisation&lt;br /&gt;
***Liaison entre les différentes requêtes ajax grâce à des variables: permet de stocker l'adresse du job récupérée par la méthode GET&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 16'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Lun 29/01/18 - Ven 02/02/18]]'' &lt;br /&gt;
*Travail sur la collecte des données (serveur de collecte et interface Web)&lt;br /&gt;
**Redéfinition du fichier de parsage car il crée des conflits et ne produit pas un fichier formaté de la façon attendue&lt;br /&gt;
***déterminer la valeur limite à partir de laquelle les cartes donnent des valeurs de distance négatives&lt;br /&gt;
***Reste à faire: Traiter le cas où il y a un ajout ou suppression d'une balise pendant la collecte (pour le moment, lorsque c'est le cas, toutes les données se décalent au lieu de laisser des trous); Ainsi que le cas où il y un saut/bug inattendu et donc une disparition d'une ou plusieurs valeurs de distance&lt;br /&gt;
***Fait: gestion des bugs/sauts de valeurs de balises - remplacement par une valeur nulle sur balise existe, par rien sinon (implémentation d'un tableau caractérisant l'existence ou pas de chaque balise 1 à 6), optimisation des temps de calculs/exécution dans le script&lt;br /&gt;
**Interface Web&lt;br /&gt;
***Ajout d'une barre de progression de la collecte remplaçant le bouton de Lancement de collecte lors de l'appui&lt;br /&gt;
***Ajout d'un bouton dropdown pour afficher les fichiers de position qu'on reçoit du serveur de localisation&lt;br /&gt;
***Ajout d'une scrollbar dans les deux dropdown&lt;br /&gt;
&lt;br /&gt;
*Implémentation du serveur de localisation fourni par les tuteurs (algorithme de localisation pas fonctionnel pour le moment)&lt;br /&gt;
**Fait: Implémentation des requêtes Ajax pour automatiser les requêtes au serveur de localisation&lt;br /&gt;
***Création d'une requête Ajax GET qui demande le fichier JSON de position au serveur de localisation jusqu'à ce qu'il soit retourné&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 17'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Lun 05/02/18 - Ven 09/02/18]]''&lt;br /&gt;
&lt;br /&gt;
*Algorithme de localisation mis en ligne par le tuteur&lt;br /&gt;
**test du bon fonctionnement des connections entre parties après intégration de l'algorithme&lt;br /&gt;
**test su la qualité de l'algorithme&lt;br /&gt;
**test sur la précision de l'algorithme&lt;br /&gt;
*Rapport partie Front-end&lt;br /&gt;
*Rapport partie Back-end&lt;br /&gt;
*Nettoyage du code requete.py&lt;br /&gt;
*Mise à jour final des de certes pages du site&lt;br /&gt;
** matrice.html à jour&lt;br /&gt;
**3D.html à jour&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 18'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Lun 12/02/18 - Ven 16/02/18]]''&lt;br /&gt;
&lt;br /&gt;
*Algorithme de localisation mis en ligne par le tuteur&lt;br /&gt;
**test de perturbation et des limites du systeme d'antenne Locopositioning&lt;br /&gt;
*Rapport partie III &lt;br /&gt;
*rapport partie I&lt;br /&gt;
*réalisation de la vidéo de présentation&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 19'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Lun 19/02/18 - Ven 23/02/18]]''&lt;br /&gt;
&lt;br /&gt;
*Présentation de l'application à l'un des chercheurs de l’INRIA en charge de la suite du projet et de l'algorithme de localisation&lt;br /&gt;
*création de la diapositive de la soutenance.&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Délivrables'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
Rapport de mi-PFE&lt;br /&gt;
[[Fichier:RapportMi-PFE-UNG DELATTE.pdf]]&lt;br /&gt;
&lt;br /&gt;
Rapport de PFE&lt;br /&gt;
[[Fichier:RapportPFE-UNG DELATTE-final.pdf]]&lt;br /&gt;
&lt;br /&gt;
Vidéo&lt;/div&gt;</summary>
		<author><name>Hdelatte</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=Fichier:RapportPFE-UNG_DELATTE-final.pdf&amp;diff=51826</id>
		<title>Fichier:RapportPFE-UNG DELATTE-final.pdf</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=Fichier:RapportPFE-UNG_DELATTE-final.pdf&amp;diff=51826"/>
				<updated>2018-02-21T11:36:00Z</updated>
		
		<summary type="html">&lt;p&gt;Hdelatte : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Hdelatte</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=P18_Localisation_of_quadrotors&amp;diff=51657</id>
		<title>P18 Localisation of quadrotors</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=P18_Localisation_of_quadrotors&amp;diff=51657"/>
				<updated>2018-02-20T19:23:57Z</updated>
		
		<summary type="html">&lt;p&gt;Hdelatte : /* Délivrables */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Cahier des charges'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;Présentation générale du projet&amp;lt;/span&amp;gt;=== &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Contexte&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
Dans un monde de plus en plus connecté, de nombreux drones sont déployés pour diverses applications comme l'espionnage, la surveillance, la cartographie de lieux et la livraison de colis. Les technologies nécessaires pour contrôler ces drones sont des sujets de recherche actuels. &lt;br /&gt;
&lt;br /&gt;
Le contrôle de ceux-ci passe tout d'abord par la maîtrise de leur position dans l'espace. Le développement des applications liées à l'utilisation de drones nécessite un travail important sur la localisation spatiale d'objets connectés. &lt;br /&gt;
&lt;br /&gt;
De plus, dans un souci d'utilisation, il est essentiel de développer des interfaces logicielles permettant d'exploiter ces données.&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Objectif du projet&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
L'objectif de ce projet est de développer une interface logicielle permettant de traiter en temps réel les informations de localisation d'un drone et de balises, dans le but de définir leur localisation dans l'espace, en intérieur.&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Description du projet&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
Pour réaliser le contrôle de drones, la première étape importante est de donner ses informations de position. Le but du projet est de développer une interface logicielle permettant de localiser le drone en temps réel en intérieur. Le drone se déplace dans un environnement dans lequel ont été installées de multiples balises. Il est équipé d'une carte, lui permettant de recevoir les distances relatives entre lui-même et les balises, sur laquelle différents algorithmes vont être implémentés pour effectuer la localisation en temps réel. Le projet requiert des compétences en développement hardware (Crazyflie 2.0, voir https://wiki.bitcraze.io/) et software (langage C/C++/Python/Javascript/HTML...).&lt;br /&gt;
&lt;br /&gt;
Il se divise en 4 étapes principales, qui sont:&lt;br /&gt;
*1) Choisir les technologies utilisées&lt;br /&gt;
*2) Choisir l'architecture (OS / APIs)&lt;br /&gt;
*3) Développer les différentes parties du projet&lt;br /&gt;
*4) Intégrer et connecter les différentes parties du projet&lt;br /&gt;
&lt;br /&gt;
La localisation étant en intérieur, le protocole GPS n'est donc pas assez précis pour les applications ciblées. La mise en place d'un tel dispositif permettrait grâce à l'utilisation d'un algorithme d'estimer avec une bonne précision les positions en intérieur d'une balise centrale (appelée Tag) et de balises (appelées Anchor). Le Tag scanne en temps réel la distance relative aux différentes balises, et il nous est retourné la position des balises et du Tag grâce à l'algorithme de localisation.&lt;br /&gt;
&lt;br /&gt;
Le projet se compose de 3 parties:&lt;br /&gt;
* Collect &amp;amp; parse: collecter les données envoyées par les balises en communiquant avec un serveur et récupérer les données adéquates par un tri&lt;br /&gt;
* Localise: déterminer la matrice de position des balises et du Tag en traitant les données récupérées&lt;br /&gt;
* Display: développer l'interface homme machine pour afficher, étudier et utiliser les données traitées&lt;br /&gt;
&lt;br /&gt;
Nous travaillerons dans un premier temps dans une optique temps différé avant de travailler en temps réel. Cela nous permettra d'acquérir des données utiles et réutilisables en aval. &lt;br /&gt;
&lt;br /&gt;
A l'aboutissement du projet, nous devrions être capable via l'interface homme machine développée d'afficher précisément la position spatiale des balises ainsi que du Tag, grâce àl'utilisation d'un algorithme de localisation et des données récupérées, et d'afficher d'autres données relatives au déplacement du Tag ou des balises dans l'espace. &lt;br /&gt;
&lt;br /&gt;
Si le temps le permet, nous pourrons aussi être amenés à adapter et utiliser l'interface développée pour l'utilisation d'un drone.&lt;br /&gt;
&lt;br /&gt;
''Sujet originel''&lt;br /&gt;
&lt;br /&gt;
To achieve the control of quadrotors, the first important task to give its position information. This project is to develop a software(GUI) to localize the quadrotors in real-time. The quadrotor is flying in an environment where several transmitters have been installed. The quadrotor is equipped with a deck to receive the relative distances between the deck and all transmitters, based on which different algorithms will be implemented to realize the real-time localization. The candidates need to have both experiences on hardware (Crazyflie 2.0, see https://wiki.bitcraze.io/) and software development (C/C , Python…). &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Calendrier prévisionnel&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
''[[Avant le 29/09/17]]'' - Élaboration du Cahier des charges, de la liste des tâches et du calendrier prévisionnel&lt;br /&gt;
&lt;br /&gt;
''[[Avant fin Octobre]]'' - Serveur de collecte et début du développement de l'interface logicielle&lt;br /&gt;
&lt;br /&gt;
''[[Avant fin Décembre]]'' - Interface logicielle&lt;br /&gt;
&lt;br /&gt;
''[[A la fin du PFE]]'' - Intégration finale des différentes parties (Serveur de collecte des données &amp;amp; Serveur de localisation &amp;amp; Interface logicielle)&lt;br /&gt;
&lt;br /&gt;
Répartition du volume de travail (***h):&lt;br /&gt;
&lt;br /&gt;
* Recherche sur les technologies à utiliser&lt;br /&gt;
* Développement du serveur de collecte de données&lt;br /&gt;
* Réalisation de l'interface logicielle (Web//Logiciel/Application)&lt;br /&gt;
* Intégration des différentes parties&lt;br /&gt;
* Test et débuggage&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Choix techniques : matériel et logiciel&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
Afin de développer ce dispositif, nous allons utiliser une Raspberry Pi 3 associée à une carte réceptrice, qui communique avec 4 balises composées chacune d'un microcontrôleur et d'une carte émettrice radio (UWB5C) et alimentées par batteries. La carte réceptrice joue le rôle du drone à localiser et communiquera les données émises par les balises vers l'ordinateur via Bluetooth.&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Choix technologiques&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
Voici les technologies que nous utilisons pour chacune des parties de ce projet.&lt;br /&gt;
&lt;br /&gt;
    1) Serveur de collecte des données:&lt;br /&gt;
       Scanne et parse les données récupérées pour fournir la matrice D des distances relatives du tag aux 4 balises&lt;br /&gt;
        - API&lt;br /&gt;
        - Python / Serveur Flask&lt;br /&gt;
&lt;br /&gt;
    2) Serveur de localisation (fourni):&lt;br /&gt;
       Calcule grâce à l'algorithme de localisation et la matrice D les positions spatiales des 4 noeuds et du tag&lt;br /&gt;
        - API&lt;br /&gt;
        - Bootstrap&lt;br /&gt;
        - Jquery&lt;br /&gt;
        - Python&lt;br /&gt;
&lt;br /&gt;
    3) Interface utilisateur:&lt;br /&gt;
       Affiche courbes, visualisation 3D, boutons ou données des fichiers envoyées par le serveur de localisation&lt;br /&gt;
        - HTML5 / Javascript&lt;br /&gt;
        - Fichiers JSON (serveurs de collecte et de localisation)&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Calendrier prévisionnel'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Liste des tâches à effectuer&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
# Se documenter sur le projet&lt;br /&gt;
##Langages et technologies utilisées&lt;br /&gt;
##Matériel utilisé&lt;br /&gt;
##Mettre en place du travail sur le Git&lt;br /&gt;
# Réaliser le serveur de collecte&lt;br /&gt;
##Récupérer les trames envoyées par bluetooth par le TAG via la Raspberry Pi&lt;br /&gt;
##Intégrer le serveur de localisation pour interpréter les trames&lt;br /&gt;
##Tester et optimiser&lt;br /&gt;
# Réaliser l'interface Web utilisateur&lt;br /&gt;
##Implémenter le serveur de collecte et de localisation&lt;br /&gt;
##Afficher et traiter les données stockées dans les fichiers JSON via le serveur (temps différé + temps réel)&lt;br /&gt;
##Tester et optimiser&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;Replanification du cahier des charges / calendrier&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Feuille d'heures'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Tâche !! Prélude !! Heures S1 !! Heures S2 !! Heures S3 !! Heures S4 !! Heures S5 !! Heures S6 !! Heures S7 !! Heures S8 !! Heures S9 !! Heures S10 !! Heures S11 !! Heures S12 !! Heures S13 !! Heures S14 !! Heures S15 !! Heures S16 !! Heures S17 !! Heures S18 !! Heures S19 !! Total&lt;br /&gt;
|-&lt;br /&gt;
| Cahier des charges / Wiki / Gitlab / Rapport&lt;br /&gt;
|  4h&lt;br /&gt;
|  3h&lt;br /&gt;
|  1h&lt;br /&gt;
|  x&lt;br /&gt;
|  1h30&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h30&lt;br /&gt;
|  1h&lt;br /&gt;
|  3h&lt;br /&gt;
|  3h30&lt;br /&gt;
|  2h&lt;br /&gt;
|  5h&lt;br /&gt;
|  x&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Documentation sur les technos utilisées&lt;br /&gt;
|  2h&lt;br /&gt;
|  4h&lt;br /&gt;
|  3h&lt;br /&gt;
|  2h&lt;br /&gt;
|  3h&lt;br /&gt;
|  4h&lt;br /&gt;
|  5h&lt;br /&gt;
|  5h30&lt;br /&gt;
|  4h30&lt;br /&gt;
|  3h30&lt;br /&gt;
|  2h&lt;br /&gt;
|  3h&lt;br /&gt;
|  1h&lt;br /&gt;
|  3h&lt;br /&gt;
|  4h&lt;br /&gt;
|  x&lt;br /&gt;
|  2h&lt;br /&gt;
|  &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Documentation sur le matériel&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  1h&lt;br /&gt;
|  1h&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Recherche et développement du serveur de collecte&lt;br /&gt;
|  x&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  3h&lt;br /&gt;
|  3h30&lt;br /&gt;
|  4h&lt;br /&gt;
|  5h&lt;br /&gt;
|  7h&lt;br /&gt;
|  4h30&lt;br /&gt;
|  0,5h&lt;br /&gt;
|  3h&lt;br /&gt;
|  4h&lt;br /&gt;
|  3h&lt;br /&gt;
|  x&lt;br /&gt;
|  4h&lt;br /&gt;
|  7h30&lt;br /&gt;
|  5h&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Recherche et développement de l'interface Web&lt;br /&gt;
|  x&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  3h&lt;br /&gt;
|  5h&lt;br /&gt;
|  6h&lt;br /&gt;
|  4h&lt;br /&gt;
|  7h&lt;br /&gt;
|  5h30&lt;br /&gt;
|  2h30&lt;br /&gt;
|  6h&lt;br /&gt;
|  8h&lt;br /&gt;
|  5h&lt;br /&gt;
|  1h&lt;br /&gt;
|  8h&lt;br /&gt;
|  4h&lt;br /&gt;
|  4h&lt;br /&gt;
|  &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Recherche et intégration du serveur de localisation&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x &lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  6h&lt;br /&gt;
|  5h&lt;br /&gt;
|  3h&lt;br /&gt;
|  &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Intégration des différentes parties&lt;br /&gt;
|  x&lt;br /&gt;
|  x  &lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  2h&lt;br /&gt;
|  2h&lt;br /&gt;
|  2h&lt;br /&gt;
|  3h&lt;br /&gt;
|  1h30&lt;br /&gt;
|  x&lt;br /&gt;
|  3h&lt;br /&gt;
|  6h&lt;br /&gt;
|  5h&lt;br /&gt;
|  x&lt;br /&gt;
|  3h30&lt;br /&gt;
|  2h&lt;br /&gt;
|  2h&lt;br /&gt;
|  &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Tests et débuggage&lt;br /&gt;
|  x&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  1h&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  3h&lt;br /&gt;
|  4h&lt;br /&gt;
|  0,5h&lt;br /&gt;
|  3h&lt;br /&gt;
|  1h&lt;br /&gt;
|  3h&lt;br /&gt;
|  3h&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  4h&lt;br /&gt;
|  &lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Optimisation/Correction des programmes&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Vidéo&lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Avancement du Projet'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Phase préparatoire'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Jeu 21/09/17 - Ven 22/09/17]]'' &lt;br /&gt;
*Rendez-vous de mise au point du cahier des charges avec les encadrants/intervenants (M. ZHENG Gang et M. DAGHER Roudy)&lt;br /&gt;
*Elaboration du cahier des charges&lt;br /&gt;
*Elaboration de la page Wiki (préparation de la mise en page et présentation du sujet)&lt;br /&gt;
*Préparation du travail sous forme de Mind Map&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous nous sommes tout d’abord rendus au laboratoire de l'INRIA afin de pouvoir définir le plus précisément possible le cahier des charges avec nos tuteurs.&lt;br /&gt;
Nous avons donc défini avec eux les technologies qu'il faudrait étudier. Vous retrouverez le choix des technologies dans la partie '''choix technologiques'''&lt;br /&gt;
&lt;br /&gt;
Nous avons en même temps créé notre page Wiki, et structurée celle-ci avec les parties qui nous seraient utiles pour développer nos explications par la suite.&lt;br /&gt;
&lt;br /&gt;
Nous avons de plus découpé le travail en sous-parties que nous avions mis dans une '''Mind map''' afin d'y voir plus clair sur la ligne à suivre.&lt;br /&gt;
&lt;br /&gt;
Vous trouverez cette Mind map juste ci-dessous. Nous ne mettrons pas à jour cette Mind map chaque semaine mais il est fort probable que nous en refaisions un en milieu de projet pour pouvoir cibler les objectifs réussis et ceux à atteindre. Nous pourrons de plus redéfinir certains objectifs qui nous auraient semblés trop vague au début du projet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Projet de fin d'étude.png|centre|600px]]&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 1'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Jeu 28/09/17 - Ven 29/09/17]]'' &lt;br /&gt;
*Revue du Cahier des Charges avec les encadrants&lt;br /&gt;
*Lecture et recherches sur les technologies adaptées&lt;br /&gt;
*Construction de la suite de la Mind Map&lt;br /&gt;
*Création du Gitlab&lt;br /&gt;
&lt;br /&gt;
Nous commençons les recherches sur le projet et sur les premières technologies engagées dans celui-ci. Nous en profitons pour formuler dès à présent des questions sur le bon choix de celles-ci. Nous commençons donc des tests ayant seulement pour but de nous familiariser avec l'environnement de travail et de réellement comprendre les fonctions déjà présentes qu'il faudra exploiter et implanter notre interface web.&lt;br /&gt;
Nous créons un dépôt Gitlab avec notre tuteur et commençons a définir les taches premières sur celui-ci.&lt;br /&gt;
Nous en profitons pour affiner le Mind Map.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 2'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Jeu 05/10/17 - Ven 06/10/17]]''  &lt;br /&gt;
*Précisions sur le cahier des charges&lt;br /&gt;
*Listage du matériel&lt;br /&gt;
*Recherche et détermination de solutions technologiques possibles pour les fonctions demandées&lt;br /&gt;
*Début du travail sur le serveur de collecte&lt;br /&gt;
*Apprentissage du langage Python et de l'utilisation du framework Flask&lt;br /&gt;
&lt;br /&gt;
Nous avons finalisé les précisions sur le cahier des charges. Nous avons donc pu cibler le matériel dont nous nous servirons pour ce Projet. Vous trouverez donc cette liste la section correspondante. Il est évident que le matériel utilisé est dans l'ensemble déjà fourni par le laboratoire et qu'il nous reste dans l'ensemble à créer l'interface web et les API qui nous permettrons de faire communiquer cette interface avec la Raspberry Pi et le serveur de position déjà créé.&lt;br /&gt;
Nous avons donc pu commencer à nous former sur les technologies qui nous serviraient par la suite. Nous avons donc utilisé le cours d'Openclassrooms sur les serveurs Flask pour en apprendre les bases. Ce serveur Flask est programmé en Python et nous permet donc une grande liberté au niveau de l’exécution de certains scripts. En effet, les scripts de connexion Bluetooth et de redirection de port qui nous permettent de récupérer les données de distance sont eux-mêmes codés en Python et sont directement appelés via le serveur.&lt;br /&gt;
Dans ce serveur, représentant notre interface web, vous retrouverez la page '''/collecte''' qui représentera notre partie collecte de données ainsi que l'affichage de ces distances. Nous appellerons cette partie le Serveur de Collecte.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 3'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 11/10/17 - Jeu 12/10/17]]''  &lt;br /&gt;
*Recherche et développement initial du serveur de collecte de données&lt;br /&gt;
*Complément du Git sur les tâches à effectuer&lt;br /&gt;
&lt;br /&gt;
Nous avons commencé à créer un serveur Flask renvoyant pour l'instant une matrice aléatoire. Lors de la requête URL &amp;quot;../matrice&amp;quot;, nous voyons bien une matrice aléatoire apparaître sur la page Web. Nous essayons de nous connecter à la Raspberry Pi en redirigeant son port série vers le Bluetooth de façon à récupérer de vraies matrices de distance entre le drone (ie commutateur central) et les balises. Nous pourrons afficher ensuite ces matrices, ou alors les stocker dans un fichier en attendant le traitement de celles-ci.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Requete s3.PNG|300px|serveur Flask]]&lt;br /&gt;
&lt;br /&gt;
Nous avons plusieurs problèmes avec le Bluetooth pour se connecter avec la Raspberry Pi. Quand nous aurons réussi à nous connecter au port série de la Raspberry Pi alors nous pourrons gérer le traitement des données récupérées.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 4'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 18/10/17 - Jeu 19/10/17]]''  &lt;br /&gt;
*Configuration de la Raspberry Pi car problèmes de connectivité Bluetooth rencontrés&lt;br /&gt;
**Nous arrivons à connecter la Raspberry Pi sous Windows mais la connexion sous Linux pose problème (travail en suspens en attendant la disponibilité de l'encadrant)&lt;br /&gt;
*Début du développement de l'interface Web&lt;br /&gt;
**Traitement d'une matrice dans un fichier JSON&lt;br /&gt;
**Affichage sous forme de tableau de la matrice&lt;br /&gt;
**Utilisation du serveur de requête en Python avec chargement de template HTML&lt;br /&gt;
**Mise en forme de la trame de la page en HTML/CSS avec le framework Bootstrap&lt;br /&gt;
**Ajout d'un set de distances (d1, d2, d3, d4) dans la matrice lors d'un appui sur un bouton Chargement en utilisant un fichier Javascript&lt;br /&gt;
&lt;br /&gt;
Nous avons reçu des fonctions Python de notre tuteur afin d'obtenir une connexion Bluetooth entre notre Raspberry Pi et notre ordinateur ainsi qu'une redirection de port de celle-ci vers la connexion. Nous n'arrivons pas à utiliser ces fonctions sous linux et nous nécessitons une explication de notre tuteur n'étant pas disponible à ce moment. Pour ne pas perdre de temps, nous attaquons la création de l'interface web à proprement parler, c'est à dire la création des pages HTML ainsi que le document Javascript qui nous servira de bibliothèque de fonctions. Chaque route de notre serveur est reliée à une série de fonctions Python s'exécutant à l'appel des url puis suivies d'un template de la page HTML en question. Nous en profitons de plus pour explorer le framework CSS bootstrap afin de mettre un premier design et une structure a notre page collecte qui sera la page principale de notre site pour ce début de projet.&lt;br /&gt;
&lt;br /&gt;
Nous nous essayons de plus à différents tests sur des fichiers de format '''JSON''' que nous devrons réussir à traiter correctement plus tard dans notre projet.&lt;br /&gt;
Nous récupérons une matrice que nous créons nous-mêmes en Python (simulation d'une série de distances récupérée) que nous transformons au format JSON pour ensuite l'afficher sur notre page web. Pour pouvoir proprement afficher ce fichier '''JSON''' renvoyé vers notre page, nous nous servons du fichier Javascript afin de créer du code HTML contenant la matrice.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 5'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 25/10/17 - Ven 27/10/17]]''  &lt;br /&gt;
*Résolution des problèmes de connectique Bluetooth sur la Raspberry Pi&lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Traitement d'une matrice dans un fichier JSON&lt;br /&gt;
**Début de l'ajout d'un set de distances depuis une matrice contenue dans un fichier JSON&lt;br /&gt;
&lt;br /&gt;
Nous avons pu nous entretenir avec notre tuteur et donc comprendre les fonctions de connexion et de redirection de port. Nous pouvons donc continuer le développement de notre interface web. Nous arrivons à traiter un set de données au format JSON et à l'afficher dans le code HTML. Toutefois nous créons nous-mêmes ce set, il est maintenant nécessaire que nous arrivions à récupérer les sets de distance réels reçus par la connexion Bluetooth. Nous commencerons par un traitement asynchrone. L'idée est d’enregistrer les sets de distances dans un fichier '''JSON''' stocké dans un dossier. Nous appellerons ce dossier plus tard via une requête Ajax.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 6'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 08/11/17 - Ven 10/11/17]]''  &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
**Mise en place de la communication entre le port série de notre machine et le port série de la carte via Bluetooth de la RPi3&lt;br /&gt;
**Récupération et traitement (parse) manuels des données de distances dans un fichier .log via TCP/IP&amp;lt;-&amp;gt;Bluetooth&lt;br /&gt;
**Début de l'automatisation du procédé par script Python (requete.py) et mise en place de sockets de communication&lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Chargement sur commande d'un set de distances depuis une matrice contenue dans un fichier JSON&lt;br /&gt;
*Travail sur le layout du site&lt;br /&gt;
&lt;br /&gt;
Après avoir regardé le code de ces différentes fonctions nous avons pu faire des tests manuels via le Shell pour récupérer des données de distances et les stocker dans un fichier '''JSON''' sur notre ordinateur.&lt;br /&gt;
&lt;br /&gt;
Nous utilisons les commandes suivantes pour se connecter via Bluetooth:&lt;br /&gt;
&lt;br /&gt;
 rfcomm connect /dev/rfcomm0 B8:27:EB:80:DC:89 1&lt;br /&gt;
&lt;br /&gt;
Rediriger le port de la Raspberrypi3 vers la connexion:&lt;br /&gt;
&lt;br /&gt;
 Python lps-collector/tcp_serial_redirect.py /dev/rfcomm0 9600&lt;br /&gt;
&lt;br /&gt;
Collecter les données dans un fichier dont nous définissons le nom:&lt;br /&gt;
&lt;br /&gt;
 echo &amp;quot;cu -s9600 -lttyACM0&amp;quot;| nc localhost 7777&lt;br /&gt;
 nc localhost 7777 | grep distance &amp;gt; static/log/dist-capture'+date+'.log&lt;br /&gt;
&lt;br /&gt;
Nous pouvons '''parser''' le flux de données avant de le stocker dans le fichier via cette commande:&lt;br /&gt;
&lt;br /&gt;
 Python lps-collector/lps_parse.py static/log/dist-capture&amp;quot;+date+&amp;quot;.log&lt;br /&gt;
&lt;br /&gt;
Il est donc nécessaire d'inclure via des '''thread''' ces différentes fonctions dans notre serveur Python (Flask) afin d'automatiser le processus. Le but est de pouvoir choisir sur l'interface web quels fonctions il faut exécuter et les déclencher via l'appui sur des boutons.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 7'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 15/11/17 - Ven 17/11/17]]''  &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
**Récupération et traitement (parse) manuels des données de distances dans un fichier .log via TCP/IP&amp;lt;-&amp;gt;Bluetooth&lt;br /&gt;
**Automatisation du procédé par script Python (requete.py)&lt;br /&gt;
***Mise en place de sockets de communication pour le contrôle de la collecte -&amp;gt; abandonné (servait à commander la collecte manuellement)&lt;br /&gt;
***Développement d'un script engine.py regroupant les commandes exécutables par l'utilisateur via la page Web&lt;br /&gt;
***Début du travail sur la fonction &amp;quot;STOP&amp;quot; manuel d'une action de collecte de données (liaison entre script HTML, Javascript, et script Python)&lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Chargement sur commande d'un set de distances depuis une matrice contenue dans un fichier JSON&lt;br /&gt;
**Travail sur le layout du site&lt;br /&gt;
***Ajout des différentes commandes (connexion Bluetooth, lancement commande cu, collecte des données, collecte durée donnée)&lt;br /&gt;
***Début de l'implémentation de la visualisation des fichiers .JSON obtenus après collecte et affichage dans un tableau matriciel du fichier sélectionné&lt;br /&gt;
&lt;br /&gt;
Nous avons continué à travailler sur le serveur de collecte: les données que nous avons récupérées via Bluetooth sont stockées dans un fichier .log. Apres avoir bien compris comment marchait la fonction '''parse''' manuellement (lors de son utilisation dans le Shell), nous l'avons implémentée dans notre serveur de collecte qui lance cette commande lors de l’appui sur un bouton via notre interface virtuelle. Un problème rencontré était de savoir quand la récolte des données devait s’arrêter. Nous avons donc rajouté un temps à entrer nous-même sur l'interface. La fonction '''parse''' est effectuée et le sous-processus va attendre le temps donné avant de lancer une commande permettant de tuer le processus et mettant donc fin au remplissage du fichier '''.log'''. Nous voulons de plus réussir à lancer une fonction de collecte sans temps. C'est à dire que nous coupons la collecte via un bouton par nous-mêmes. Nous voulions utiliser des Sockets pour pouvoir définir nous-mêmes la gestion de la communication mais l'idée a été abandonné car nous avons réussi à sauvegarder le PID du processus lancé. Il nous suffit donc de l’arrêter grâce à un autre bouton qui récupère cette variable et l’arrête ensuite. &lt;br /&gt;
&lt;br /&gt;
Toutes nos fonctions Pythons étant regroupées dans notre serveur '''requete.py''', nous avons décidé de créer un module qui regroupera toutes ces fonctions que nous pourrons utiliser dans '''requete.py'''. ceci nous permet de voir plus clair dans notre code et de faciliter le travail lorsque nous modifions le code tous les deux.&lt;br /&gt;
&lt;br /&gt;
Nous essayons en continu d'adapter le layout du site pour le rendre le plus attractif et simple possible, de façon à ce que chaque bouton et tableau soient clairs et compréhensibles.&lt;br /&gt;
&lt;br /&gt;
Nous avons commencé à récupérer les fichiers '''JSON''' créés à partir des fichier '''log''', c'est-à-dire que ces fichiers sont automatiquement stockés coté serveur dans un dossier nommé '''static/log'''. Notre but est de récupérer le nom des fichiers JSON et de les afficher dans un composant sur notre interface web. Il nous sera donc possible ensuite de sélectionner le nom d'un fichier. Lors de la sélection de ce nom de fichier, un tableau apparaît avec les valeurs de distances à l’intérieur.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 8'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 22/11/17 - Ven 24/11/17]]''  &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
**Automatisation du procédé de collecte par script Python (requete.py qui fait appel à engine.py)&lt;br /&gt;
***Développement d'un script engine.py regroupant les commandes exécutables par l'utilisateur via la page Web&lt;br /&gt;
***Travail sur la fonction &amp;quot;STOP&amp;quot; manuel d'une action de collecte de données (liaison entre script HTML, Javascript, et script Python)&lt;br /&gt;
***Mise en place d'un serveur HTTP Simple sous Python pour accéder aux fichiers de données à partir de la page Web&lt;br /&gt;
***Mise à jour de fonctions de connexion &lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Travail sur le layout du site (ajout de pages, navigation entre les pages, apparence, nettoyage des codes)&lt;br /&gt;
**Bon fonctionnement de l'ensemble serveur collecte + serveur HTTP + client Web&lt;br /&gt;
**Affichage de la liste des fichiers de données de distance (log, csv, JSON) via serveur HTTP en Python sur port 9999&lt;br /&gt;
*Corrections et nettoyage du dépôt GIT&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous continuons à développer les points énoncés la semaine dernière. Nous avons décidé de nous diriger vers un serveur HTTP Simple pour accéder à nos fichiers. Il s’avère que nous finirons par ne pas utiliser ce serveur. Nous irons récupérer les fichiers en question via des requêtes '''Ajax''' faites à la sélection du nom du fichier.&lt;br /&gt;
&lt;br /&gt;
Nous rencontrons depuis le début des problèmes avec les fonctions de connexion qui peuvent ne pas marcher à un moment donné. Nous essayons de trouver pourquoi ce bug est un bug qui ne se produit pas à chaque fois. Nous avons déterminé qu'il ne se produisait seulement lorsque les fonctions de connexions étaient lancée dans des threads. Nous ne savons toujours pas pourquoi ces thread bugguent seulement parfois et non à chaque essai de connexion.&lt;br /&gt;
&lt;br /&gt;
Nous avons nettoyé notre dépot '''Git''' car il s’avère que nous utilisions une mauvaise méthode de fusion et de stockage des documents.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 9'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 29/11/17 - Jeudi 30/11/17]]''  &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
**Automatisation du procédé de collecte par script Python (requete.py qui fait appel à engine.py)&lt;br /&gt;
***Travail sur la fonction &amp;quot;STOP&amp;quot; manuel d'une action de collecte de données (liaison entre script HTML, Javascript, et script Python)&lt;br /&gt;
***Recherches sur l'utilisation de fichiers JSON accessibles via le serveur HTTP&lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Travail sur le layout du site &lt;br /&gt;
**Travail sur la liaison entre fichiers JSON et affichage Web des données de distance&lt;br /&gt;
***Recherches et tests de solutions&lt;br /&gt;
****Affichage depuis un fichier&lt;br /&gt;
****Affichage à la volée lors d'une action de collecte&lt;br /&gt;
&lt;br /&gt;
*Revue de code avec Roudy DAGHER:&lt;br /&gt;
**Structure globale des codes ok&lt;br /&gt;
**Fonctionnement presque ok: fonctionnalités implémentées ok, mais parsage csv ne marche pas&lt;br /&gt;
**Refactoring nécessaire&lt;br /&gt;
**Correction de la fonction STOP et amélioration de la fonction de COLLECTE&lt;br /&gt;
**Faire plus de requêtes Javascript que de requêtes HTML&lt;br /&gt;
**Discussion pour l'implémentation du serveur de localisation (= algorithme de localisation) et des visualisations de données sur le site Web&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous avons d'abord revu l'ensemble de notre code et les méthodes utilisées avec notre tuteur '''Roudy Dagher'''. Nous nous approchons d'un serveur de collecte de données stable et fonctionnel. Nous avons refait les différentes connexions entre l'interface et le serveur afin de ne faire que des requêtes sur des '''WebServices'''. Il nous est possible de commencer la deuxième partie qui est l'envoi de ces tableaux de données afin de les envoyer vers le serveur de localisation via des API afin de recevoir des matrices de positions.&lt;br /&gt;
Nous pourrons grâce à ces matrices afficher une carte 3D des balises  et du TAG dans l'espace.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 10'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 06/12/17 - Jeudi 07/12/17]]'' &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
**Travail sur la fonction STOP&lt;br /&gt;
**Réalisation d'une expression régulière pour le parsage des fichiers log en fichier JSON&lt;br /&gt;
&lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Travail sur l'affichage des fichiers JSON&lt;br /&gt;
***Réalisation de toutes les requêtes Ajax&lt;br /&gt;
***Réalisation d'un menu déroulant dropdown pour charger le contenu des fichiers JSON dans le tableau de distances&lt;br /&gt;
&lt;br /&gt;
*Nettoyage du dépôt Git&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 11'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 13/12/17]]''  &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
&lt;br /&gt;
*Revue de code avec Roudy DAGHER:&lt;br /&gt;
**Discussion sur la partie système du projet et correction de certaines fonctions&lt;br /&gt;
&lt;br /&gt;
Nous nous sommes réunis avec l'un de nos tuteurs, qui a réalisé certains bouts de code de base, pour nous mettre au point sur les fonctions en question et leur utilisation.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 12'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 20/12/17 - Jeudi 21/12/17]]''&lt;br /&gt;
*Revue, correction et nettoyage des codes&lt;br /&gt;
*Finalisation du rapport&lt;br /&gt;
*Planification de semaines restantes&lt;br /&gt;
*Préparation de la soutenance&lt;br /&gt;
*Revue de mi-projet avec tous les tuteurs&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Cette dernière semaine a servi à finaliser le rapport et à discuter de l'avancée du projet, notamment avec nos tuteurs pour déterminer le travail restant, présenter le travail abouti et replanifier précisément les échéances pour le travail restant. Nous avons réalisé la soutenance de mi-projet le '''jeudi 21/12/17 à 8h'''.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 13'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 10/01/18 - Ven 12/01/18]]''  &lt;br /&gt;
*Travail sur la collecte des données (serveur de collecte et interface Web)&lt;br /&gt;
**Redéfinition du fichier de parsage car il crée des conflits et ne produit pas un fichier formaté de la façon attendue&lt;br /&gt;
***Nombre de balises réel n'est pas bien déterminé par le code&lt;br /&gt;
***ID de la première et de la dernière balise ne sont pas déterminés correctement&lt;br /&gt;
&lt;br /&gt;
**Automatisation de la collecte par un script Shell lançant toutes les commandes de CONNEXION, REDIRECTION, LANCEMENT CU, FERMETURE DU PROGRAMME (kill rfcomm / kill tcp_redirect)&lt;br /&gt;
***Dans le but d'automatiser la procédure&lt;br /&gt;
***Dans le but de résoudre un problème de gestion de ressources (le bug '''thread''' apparu plus tôt dans le projet)&lt;br /&gt;
&lt;br /&gt;
**Travail sur la résolution du bug thread car l'automatisation n'a pas résolu le problème&lt;br /&gt;
***Identification du ou des causes potentielles: gestion des ressources (synchrone, asynchrone ?), connexion Bluetooth, lancement des commandes dans le même script, lancement en fg/bg, conflit dû au temps d'exécution de chaque processus ?&lt;br /&gt;
***Lancement des commandes manuellement dans des terminaux ne pose aucun problème: solution la plus simple&lt;br /&gt;
&lt;br /&gt;
**Redesign de la page Collecte&lt;br /&gt;
***Remplacement des boutons de commande par un bouton unique d'initialisation&lt;br /&gt;
***Travail sur une mise à jour du menu déroulant dropdown régulière sans avoir à recharger la page Web&lt;br /&gt;
***Implémentation de plotly.js, un module Javascript qui permet d'afficher des graphes en 3D&lt;br /&gt;
&lt;br /&gt;
*Mise au point post-soutenance avec Roudy DAGHER pour valider le travail restant, effectué et redéfinir certains objectifs atteignables ou pas selon les éléments réalisés dans le projet&lt;br /&gt;
*Recherches et début de l'implémentation du serveur de localisation fourni par les tuteurs&lt;br /&gt;
*Gestion du Git pour créer des branches additionnelles&lt;br /&gt;
*Recréation du rapport de projet suite à une perte du fichier éditable d'origine + Mise à jour avec les remarques suite à la soutenance ainsi que les nouveaux éléments&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 14'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mar 16/01/18 - Ven 19/01/18]]''  &lt;br /&gt;
*Travail sur la collecte des données (serveur de collecte et interface Web)&lt;br /&gt;
**Redéfinition du fichier de parsage car il crée des conflits et ne produit pas un fichier formaté de la façon attendue&lt;br /&gt;
***Corrigé: Nombre de balises réel n'est pas bien déterminé par le code&lt;br /&gt;
***Corrigé: ID de la première et de la dernière balise ne sont pas déterminés correctement&lt;br /&gt;
***Reste à faire: Traiter le cas où il y a un ajout ou suppression d'une balise pendant la collecte (pour le moment, lorsque c'est le cas, toutes les données se décalent au lieu de laisser des trous)&lt;br /&gt;
&lt;br /&gt;
**Automatisation de la collecte par un script Shell lançant toutes les commandes de CONNEXION, REDIRECTION, LANCEMENT CU, FERMETURE DU PROGRAMME (kill rfcomm / kill tcp_redirect)&lt;br /&gt;
***Mis en suspens: pour le moment, on lance les commandes manuellement dans le terminal&lt;br /&gt;
&lt;br /&gt;
**Interface Web&lt;br /&gt;
***Implémentation de plotly.js, un module Javascript qui permet d'afficher des graphes en 3D&lt;br /&gt;
&lt;br /&gt;
*Implémentation du serveur de localisation fourni par les tuteurs (mais algorithme de localisation pas fonctionnel pour le moment)&lt;br /&gt;
**Mise à jour de l'affichage des positions des éléments: précédemment seule la matrice X de position du Tag s'affichait, et pas la matrice A des balises&lt;br /&gt;
**Requêtes manuelles à l'API avec la fonction curl OK: on arrive à récupérer les matrices X et A (aléatoires pour le moment) par une requête GET à l'API du serveur de localisation&lt;br /&gt;
**Implémentation des requêtes Ajax pour automatiser les requêtes au serveur de localisation&lt;br /&gt;
&lt;br /&gt;
*Mise à jour du rapport les nouveaux éléments du travail réalisé&lt;br /&gt;
*Réflexion sur la possibilité ou non de réaliser la partie temps réel du projet au vu des moyens à disposition&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 15'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mar 23/01/18 - Ven 26/01/18]]'' &lt;br /&gt;
*Travail sur la collecte des données (serveur de collecte et interface Web)&lt;br /&gt;
**Redéfinition du fichier de parsage car il crée des conflits et ne produit pas un fichier formaté de la façon attendue&lt;br /&gt;
***Fait: Si distance négative car Tag trop près, la valeur négative générée par une balise est remplacée par un &amp;quot;0&amp;quot; (cela modifie la position réelle modélisée dans plotly, mais évite une impossibilité de générer la position à partir de la distance -&amp;gt; par des tests, il faudra déterminer la valeur limite à partir de laquelle les cartes donnent des valeurs de distance négatives&lt;br /&gt;
***Reste à faire: Traiter le cas où il y a un ajout ou suppression d'une balise pendant la collecte (pour le moment, lorsque c'est le cas, toutes les données se décalent au lieu de laisser des trous); Ainsi que le cas où il y un saut/bug inattendu et donc une disparition d'une ou plusieurs valeurs de distance&lt;br /&gt;
***Début de résolution du cas où une distance n'est pas prise en compte, c'est à dire où il y a une valeur qui disparaît et désaligne les valeurs lors de la création du JSON&lt;br /&gt;
&lt;br /&gt;
**Automatisation de la collecte par un script Shell lançant toutes les commandes de CONNEXION, REDIRECTION, LANCEMENT CU, FERMETURE DU PROGRAMME (kill rfcomm / kill tcp_redirect)&lt;br /&gt;
***Mis en suspens: pour le moment, on lance les commandes manuellement dans le terminal&lt;br /&gt;
***Création d'un script bash /etc/init.d/autoconnect.sh pour connecter automatiquement la RPi au lancement du système (si la RPi est déjà allumée au démarrage)&lt;br /&gt;
&lt;br /&gt;
**Interface Web&lt;br /&gt;
***Perfectionnement de l'utilisation de Plotly pour les visualisations&lt;br /&gt;
&lt;br /&gt;
*Implémentation du serveur de localisation fourni par les tuteurs (algorithme de localisation pas fonctionnel pour le moment)&lt;br /&gt;
**Requêtes manuelles à l'API avec la fonction curl OK&lt;br /&gt;
**Fait: Implémentation des requêtes Ajax pour automatiser les requêtes au serveur de localisation&lt;br /&gt;
***Liaison entre les différentes requêtes ajax grâce à des variables: permet de stocker l'adresse du job récupérée par la méthode GET&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 16'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Lun 29/01/18 - Ven 02/02/18]]'' &lt;br /&gt;
*Travail sur la collecte des données (serveur de collecte et interface Web)&lt;br /&gt;
**Redéfinition du fichier de parsage car il crée des conflits et ne produit pas un fichier formaté de la façon attendue&lt;br /&gt;
***déterminer la valeur limite à partir de laquelle les cartes donnent des valeurs de distance négatives&lt;br /&gt;
***Reste à faire: Traiter le cas où il y a un ajout ou suppression d'une balise pendant la collecte (pour le moment, lorsque c'est le cas, toutes les données se décalent au lieu de laisser des trous); Ainsi que le cas où il y un saut/bug inattendu et donc une disparition d'une ou plusieurs valeurs de distance&lt;br /&gt;
***Fait: gestion des bugs/sauts de valeurs de balises - remplacement par une valeur nulle sur balise existe, par rien sinon (implémentation d'un tableau caractérisant l'existence ou pas de chaque balise 1 à 6), optimisation des temps de calculs/exécution dans le script&lt;br /&gt;
**Interface Web&lt;br /&gt;
***Ajout d'une barre de progression de la collecte remplaçant le bouton de Lancement de collecte lors de l'appui&lt;br /&gt;
***Ajout d'un bouton dropdown pour afficher les fichiers de position qu'on reçoit du serveur de localisation&lt;br /&gt;
***Ajout d'une scrollbar dans les deux dropdown&lt;br /&gt;
&lt;br /&gt;
*Implémentation du serveur de localisation fourni par les tuteurs (algorithme de localisation pas fonctionnel pour le moment)&lt;br /&gt;
**Fait: Implémentation des requêtes Ajax pour automatiser les requêtes au serveur de localisation&lt;br /&gt;
***Création d'une requête Ajax GET qui demande le fichier JSON de position au serveur de localisation jusqu'à ce qu'il soit retourné&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 17'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Lun 05/02/18 - Ven 09/02/18]]''&lt;br /&gt;
&lt;br /&gt;
*Algorithme de localisation mis en ligne par le tuteur&lt;br /&gt;
**test du bon fonctionnement des connections entre parties après intégration de l'algorithme&lt;br /&gt;
**test su la qualité de l'algorithme&lt;br /&gt;
**test sur la précision de l'algorithme&lt;br /&gt;
*Rapport partie Front-end&lt;br /&gt;
*Rapport partie Back-end&lt;br /&gt;
*Nettoyage du code requete.py&lt;br /&gt;
*Mise à jour final des de certes pages du site&lt;br /&gt;
** matrice.html à jour&lt;br /&gt;
**3D.html à jour&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 18'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Lun 12/02/18 - Ven 16/02/18]]''&lt;br /&gt;
&lt;br /&gt;
*Algorithme de localisation mis en ligne par le tuteur&lt;br /&gt;
**test de perturbation et des limites du systeme d'antenne Locopositioning&lt;br /&gt;
*Rapport partie III &lt;br /&gt;
*rapport partie I&lt;br /&gt;
*réalisation de la vidéo de présentation&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 19'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Lun 19/02/18 - Ven 23/02/18]]''&lt;br /&gt;
&lt;br /&gt;
*Présentation de l'application à l'un des chercheurs de l’INRIA en charge de la suite du projet et de l'algorithme de localisation&lt;br /&gt;
*création de la diapositive de la soutenance.&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Délivrables'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
Rapport de mi-PFE&lt;br /&gt;
[[Fichier:RapportMi-PFE-UNG DELATTE.pdf]]&lt;br /&gt;
&lt;br /&gt;
Rapport de PFE&lt;br /&gt;
[[Fichier:RapportPFE-UNG DELATTE.pdf]]&lt;br /&gt;
&lt;br /&gt;
Vidéo&lt;/div&gt;</summary>
		<author><name>Hdelatte</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=Fichier:RapportPFE-UNG_DELATTE.pdf&amp;diff=51656</id>
		<title>Fichier:RapportPFE-UNG DELATTE.pdf</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=Fichier:RapportPFE-UNG_DELATTE.pdf&amp;diff=51656"/>
				<updated>2018-02-20T19:23:26Z</updated>
		
		<summary type="html">&lt;p&gt;Hdelatte : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Hdelatte</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=P18_Localisation_of_quadrotors&amp;diff=51105</id>
		<title>P18 Localisation of quadrotors</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=P18_Localisation_of_quadrotors&amp;diff=51105"/>
				<updated>2018-02-16T16:07:25Z</updated>
		
		<summary type="html">&lt;p&gt;Hdelatte : /* Semaine 19 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Cahier des charges'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;Présentation générale du projet&amp;lt;/span&amp;gt;=== &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Contexte&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
Dans un monde de plus en plus connecté, de nombreux drones sont déployés pour diverses applications comme l'espionnage, la surveillance, la cartographie de lieux et la livraison de colis. Les technologies nécessaires pour contrôler ces drones sont des sujets de recherche actuels. &lt;br /&gt;
&lt;br /&gt;
Le contrôle de ceux-ci passe tout d'abord par la maîtrise de leur position dans l'espace. Le développement des applications liées à l'utilisation de drones nécessite un travail important sur la localisation spatiale d'objets connectés. &lt;br /&gt;
&lt;br /&gt;
De plus, dans un souci d'utilisation, il est essentiel de développer des interfaces logicielles permettant d'exploiter ces données.&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Objectif du projet&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
L'objectif de ce projet est de développer une interface logicielle permettant de traiter en temps réel les informations de localisation d'un drone et de balises, dans le but de définir leur localisation dans l'espace, en intérieur.&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Description du projet&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
Pour réaliser le contrôle de drones, la première étape importante est de donner ses informations de position. Le but du projet est de développer une interface logicielle permettant de localiser le drone en temps réel en intérieur. Le drone se déplace dans un environnement dans lequel ont été installées de multiples balises. Il est équipé d'une carte, lui permettant de recevoir les distances relatives entre lui-même et les balises, sur laquelle différents algorithmes vont être implémentés pour effectuer la localisation en temps réel. Le projet requiert des compétences en développement hardware (Crazyflie 2.0, voir https://wiki.bitcraze.io/) et software (langage C/C++/Python/Javascript/HTML...).&lt;br /&gt;
&lt;br /&gt;
Il se divise en 4 étapes principales, qui sont:&lt;br /&gt;
*1) Choisir les technologies utilisées&lt;br /&gt;
*2) Choisir l'architecture (OS / APIs)&lt;br /&gt;
*3) Développer les différentes parties du projet&lt;br /&gt;
*4) Intégrer et connecter les différentes parties du projet&lt;br /&gt;
&lt;br /&gt;
La localisation étant en intérieur, le protocole GPS n'est donc pas assez précis pour les applications ciblées. La mise en place d'un tel dispositif permettrait grâce à l'utilisation d'un algorithme d'estimer avec une bonne précision les positions en intérieur d'une balise centrale (appelée Tag) et de balises (appelées Anchor). Le Tag scanne en temps réel la distance relative aux différentes balises, et il nous est retourné la position des balises et du Tag grâce à l'algorithme de localisation.&lt;br /&gt;
&lt;br /&gt;
Le projet se compose de 3 parties:&lt;br /&gt;
* Collect &amp;amp; parse: collecter les données envoyées par les balises en communiquant avec un serveur et récupérer les données adéquates par un tri&lt;br /&gt;
* Localise: déterminer la matrice de position des balises et du Tag en traitant les données récupérées&lt;br /&gt;
* Display: développer l'interface homme machine pour afficher, étudier et utiliser les données traitées&lt;br /&gt;
&lt;br /&gt;
Nous travaillerons dans un premier temps dans une optique temps différé avant de travailler en temps réel. Cela nous permettra d'acquérir des données utiles et réutilisables en aval. &lt;br /&gt;
&lt;br /&gt;
A l'aboutissement du projet, nous devrions être capable via l'interface homme machine développée d'afficher précisément la position spatiale des balises ainsi que du Tag, grâce àl'utilisation d'un algorithme de localisation et des données récupérées, et d'afficher d'autres données relatives au déplacement du Tag ou des balises dans l'espace. &lt;br /&gt;
&lt;br /&gt;
Si le temps le permet, nous pourrons aussi être amenés à adapter et utiliser l'interface développée pour l'utilisation d'un drone.&lt;br /&gt;
&lt;br /&gt;
''Sujet originel''&lt;br /&gt;
&lt;br /&gt;
To achieve the control of quadrotors, the first important task to give its position information. This project is to develop a software(GUI) to localize the quadrotors in real-time. The quadrotor is flying in an environment where several transmitters have been installed. The quadrotor is equipped with a deck to receive the relative distances between the deck and all transmitters, based on which different algorithms will be implemented to realize the real-time localization. The candidates need to have both experiences on hardware (Crazyflie 2.0, see https://wiki.bitcraze.io/) and software development (C/C , Python…). &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Calendrier prévisionnel&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
''[[Avant le 29/09/17]]'' - Élaboration du Cahier des charges, de la liste des tâches et du calendrier prévisionnel&lt;br /&gt;
&lt;br /&gt;
''[[Avant fin Octobre]]'' - Serveur de collecte et début du développement de l'interface logicielle&lt;br /&gt;
&lt;br /&gt;
''[[Avant fin Décembre]]'' - Interface logicielle&lt;br /&gt;
&lt;br /&gt;
''[[A la fin du PFE]]'' - Intégration finale des différentes parties (Serveur de collecte des données &amp;amp; Serveur de localisation &amp;amp; Interface logicielle)&lt;br /&gt;
&lt;br /&gt;
Répartition du volume de travail (***h):&lt;br /&gt;
&lt;br /&gt;
* Recherche sur les technologies à utiliser&lt;br /&gt;
* Développement du serveur de collecte de données&lt;br /&gt;
* Réalisation de l'interface logicielle (Web//Logiciel/Application)&lt;br /&gt;
* Intégration des différentes parties&lt;br /&gt;
* Test et débuggage&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Choix techniques : matériel et logiciel&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
Afin de développer ce dispositif, nous allons utiliser une Raspberry Pi 3 associée à une carte réceptrice, qui communique avec 4 balises composées chacune d'un microcontrôleur et d'une carte émettrice radio (UWB5C) et alimentées par batteries. La carte réceptrice joue le rôle du drone à localiser et communiquera les données émises par les balises vers l'ordinateur via Bluetooth.&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Choix technologiques&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
Voici les technologies que nous utilisons pour chacune des parties de ce projet.&lt;br /&gt;
&lt;br /&gt;
    1) Serveur de collecte des données:&lt;br /&gt;
       Scanne et parse les données récupérées pour fournir la matrice D des distances relatives du tag aux 4 balises&lt;br /&gt;
        - API&lt;br /&gt;
        - Python / Serveur Flask&lt;br /&gt;
&lt;br /&gt;
    2) Serveur de localisation (fourni):&lt;br /&gt;
       Calcule grâce à l'algorithme de localisation et la matrice D les positions spatiales des 4 noeuds et du tag&lt;br /&gt;
        - API&lt;br /&gt;
        - Bootstrap&lt;br /&gt;
        - Jquery&lt;br /&gt;
        - Python&lt;br /&gt;
&lt;br /&gt;
    3) Interface utilisateur:&lt;br /&gt;
       Affiche courbes, visualisation 3D, boutons ou données des fichiers envoyées par le serveur de localisation&lt;br /&gt;
        - HTML5 / Javascript&lt;br /&gt;
        - Fichiers JSON (serveurs de collecte et de localisation)&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Calendrier prévisionnel'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Liste des tâches à effectuer&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
# Se documenter sur le projet&lt;br /&gt;
##Langages et technologies utilisées&lt;br /&gt;
##Matériel utilisé&lt;br /&gt;
##Mettre en place du travail sur le Git&lt;br /&gt;
# Réaliser le serveur de collecte&lt;br /&gt;
##Récupérer les trames envoyées par bluetooth par le TAG via la Raspberry Pi&lt;br /&gt;
##Intégrer le serveur de localisation pour interpréter les trames&lt;br /&gt;
##Tester et optimiser&lt;br /&gt;
# Réaliser l'interface Web utilisateur&lt;br /&gt;
##Implémenter le serveur de collecte et de localisation&lt;br /&gt;
##Afficher et traiter les données stockées dans les fichiers JSON via le serveur (temps différé + temps réel)&lt;br /&gt;
##Tester et optimiser&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;Replanification du cahier des charges / calendrier&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Feuille d'heures'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Tâche !! Prélude !! Heures S1 !! Heures S2 !! Heures S3 !! Heures S4 !! Heures S5 !! Heures S6 !! Heures S7 !! Heures S8 !! Heures S9 !! Heures S10 !! Heures S11 !! Heures S12 !! Heures S13 !! Heures S14 !! Heures S15 !! Heures S16 !! Heures S17 !! Heures S18 !! Heures S19 !! Total&lt;br /&gt;
|-&lt;br /&gt;
| Cahier des charges / Wiki / Gitlab / Rapport&lt;br /&gt;
|  4h&lt;br /&gt;
|  3h&lt;br /&gt;
|  1h&lt;br /&gt;
|  x&lt;br /&gt;
|  1h30&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h30&lt;br /&gt;
|  1h&lt;br /&gt;
|  3h&lt;br /&gt;
|  3h30&lt;br /&gt;
|  2h&lt;br /&gt;
|  5h&lt;br /&gt;
|  x&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Documentation sur les technos utilisées&lt;br /&gt;
|  2h&lt;br /&gt;
|  4h&lt;br /&gt;
|  3h&lt;br /&gt;
|  2h&lt;br /&gt;
|  3h&lt;br /&gt;
|  4h&lt;br /&gt;
|  5h&lt;br /&gt;
|  5h30&lt;br /&gt;
|  4h30&lt;br /&gt;
|  3h30&lt;br /&gt;
|  2h&lt;br /&gt;
|  3h&lt;br /&gt;
|  1h&lt;br /&gt;
|  3h&lt;br /&gt;
|  4h&lt;br /&gt;
|  x&lt;br /&gt;
|  2h&lt;br /&gt;
|  &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Documentation sur le matériel&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  1h&lt;br /&gt;
|  1h&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Recherche et développement du serveur de collecte&lt;br /&gt;
|  x&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  3h&lt;br /&gt;
|  3h30&lt;br /&gt;
|  4h&lt;br /&gt;
|  5h&lt;br /&gt;
|  7h&lt;br /&gt;
|  4h30&lt;br /&gt;
|  0,5h&lt;br /&gt;
|  3h&lt;br /&gt;
|  4h&lt;br /&gt;
|  3h&lt;br /&gt;
|  x&lt;br /&gt;
|  4h&lt;br /&gt;
|  7h30&lt;br /&gt;
|  5h&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Recherche et développement de l'interface Web&lt;br /&gt;
|  x&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  3h&lt;br /&gt;
|  5h&lt;br /&gt;
|  6h&lt;br /&gt;
|  4h&lt;br /&gt;
|  7h&lt;br /&gt;
|  5h30&lt;br /&gt;
|  2h30&lt;br /&gt;
|  6h&lt;br /&gt;
|  8h&lt;br /&gt;
|  5h&lt;br /&gt;
|  1h&lt;br /&gt;
|  8h&lt;br /&gt;
|  4h&lt;br /&gt;
|  4h&lt;br /&gt;
|  &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Recherche et intégration du serveur de localisation&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x &lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  6h&lt;br /&gt;
|  5h&lt;br /&gt;
|  3h&lt;br /&gt;
|  &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Intégration des différentes parties&lt;br /&gt;
|  x&lt;br /&gt;
|  x  &lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  2h&lt;br /&gt;
|  2h&lt;br /&gt;
|  2h&lt;br /&gt;
|  3h&lt;br /&gt;
|  1h30&lt;br /&gt;
|  x&lt;br /&gt;
|  3h&lt;br /&gt;
|  6h&lt;br /&gt;
|  5h&lt;br /&gt;
|  x&lt;br /&gt;
|  3h30&lt;br /&gt;
|  2h&lt;br /&gt;
|  2h&lt;br /&gt;
|  &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Tests et débuggage&lt;br /&gt;
|  x&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  1h&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  3h&lt;br /&gt;
|  4h&lt;br /&gt;
|  0,5h&lt;br /&gt;
|  3h&lt;br /&gt;
|  1h&lt;br /&gt;
|  3h&lt;br /&gt;
|  3h&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  4h&lt;br /&gt;
|  &lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Optimisation/Correction des programmes&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Vidéo&lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Avancement du Projet'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Phase préparatoire'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Jeu 21/09/17 - Ven 22/09/17]]'' &lt;br /&gt;
*Rendez-vous de mise au point du cahier des charges avec les encadrants/intervenants (M. ZHENG Gang et M. DAGHER Roudy)&lt;br /&gt;
*Elaboration du cahier des charges&lt;br /&gt;
*Elaboration de la page Wiki (préparation de la mise en page et présentation du sujet)&lt;br /&gt;
*Préparation du travail sous forme de Mind Map&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous nous sommes tout d’abord rendus au laboratoire de l'INRIA afin de pouvoir définir le plus précisément possible le cahier des charges avec nos tuteurs.&lt;br /&gt;
Nous avons donc défini avec eux les technologies qu'il faudrait étudier. Vous retrouverez le choix des technologies dans la partie '''choix technologiques'''&lt;br /&gt;
&lt;br /&gt;
Nous avons en même temps créé notre page Wiki, et structurée celle-ci avec les parties qui nous seraient utiles pour développer nos explications par la suite.&lt;br /&gt;
&lt;br /&gt;
Nous avons de plus découpé le travail en sous-parties que nous avions mis dans une '''Mind map''' afin d'y voir plus clair sur la ligne à suivre.&lt;br /&gt;
&lt;br /&gt;
Vous trouverez cette Mind map juste ci-dessous. Nous ne mettrons pas à jour cette Mind map chaque semaine mais il est fort probable que nous en refaisions un en milieu de projet pour pouvoir cibler les objectifs réussis et ceux à atteindre. Nous pourrons de plus redéfinir certains objectifs qui nous auraient semblés trop vague au début du projet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Projet de fin d'étude.png|centre|600px]]&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 1'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Jeu 28/09/17 - Ven 29/09/17]]'' &lt;br /&gt;
*Revue du Cahier des Charges avec les encadrants&lt;br /&gt;
*Lecture et recherches sur les technologies adaptées&lt;br /&gt;
*Construction de la suite de la Mind Map&lt;br /&gt;
*Création du Gitlab&lt;br /&gt;
&lt;br /&gt;
Nous commençons les recherches sur le projet et sur les premières technologies engagées dans celui-ci. Nous en profitons pour formuler dès à présent des questions sur le bon choix de celles-ci. Nous commençons donc des tests ayant seulement pour but de nous familiariser avec l'environnement de travail et de réellement comprendre les fonctions déjà présentes qu'il faudra exploiter et implanter notre interface web.&lt;br /&gt;
Nous créons un dépôt Gitlab avec notre tuteur et commençons a définir les taches premières sur celui-ci.&lt;br /&gt;
Nous en profitons pour affiner le Mind Map.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 2'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Jeu 05/10/17 - Ven 06/10/17]]''  &lt;br /&gt;
*Précisions sur le cahier des charges&lt;br /&gt;
*Listage du matériel&lt;br /&gt;
*Recherche et détermination de solutions technologiques possibles pour les fonctions demandées&lt;br /&gt;
*Début du travail sur le serveur de collecte&lt;br /&gt;
*Apprentissage du langage Python et de l'utilisation du framework Flask&lt;br /&gt;
&lt;br /&gt;
Nous avons finalisé les précisions sur le cahier des charges. Nous avons donc pu cibler le matériel dont nous nous servirons pour ce Projet. Vous trouverez donc cette liste la section correspondante. Il est évident que le matériel utilisé est dans l'ensemble déjà fourni par le laboratoire et qu'il nous reste dans l'ensemble à créer l'interface web et les API qui nous permettrons de faire communiquer cette interface avec la Raspberry Pi et le serveur de position déjà créé.&lt;br /&gt;
Nous avons donc pu commencer à nous former sur les technologies qui nous serviraient par la suite. Nous avons donc utilisé le cours d'Openclassrooms sur les serveurs Flask pour en apprendre les bases. Ce serveur Flask est programmé en Python et nous permet donc une grande liberté au niveau de l’exécution de certains scripts. En effet, les scripts de connexion Bluetooth et de redirection de port qui nous permettent de récupérer les données de distance sont eux-mêmes codés en Python et sont directement appelés via le serveur.&lt;br /&gt;
Dans ce serveur, représentant notre interface web, vous retrouverez la page '''/collecte''' qui représentera notre partie collecte de données ainsi que l'affichage de ces distances. Nous appellerons cette partie le Serveur de Collecte.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 3'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 11/10/17 - Jeu 12/10/17]]''  &lt;br /&gt;
*Recherche et développement initial du serveur de collecte de données&lt;br /&gt;
*Complément du Git sur les tâches à effectuer&lt;br /&gt;
&lt;br /&gt;
Nous avons commencé à créer un serveur Flask renvoyant pour l'instant une matrice aléatoire. Lors de la requête URL &amp;quot;../matrice&amp;quot;, nous voyons bien une matrice aléatoire apparaître sur la page Web. Nous essayons de nous connecter à la Raspberry Pi en redirigeant son port série vers le Bluetooth de façon à récupérer de vraies matrices de distance entre le drone (ie commutateur central) et les balises. Nous pourrons afficher ensuite ces matrices, ou alors les stocker dans un fichier en attendant le traitement de celles-ci.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Requete s3.PNG|300px|serveur Flask]]&lt;br /&gt;
&lt;br /&gt;
Nous avons plusieurs problèmes avec le Bluetooth pour se connecter avec la Raspberry Pi. Quand nous aurons réussi à nous connecter au port série de la Raspberry Pi alors nous pourrons gérer le traitement des données récupérées.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 4'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 18/10/17 - Jeu 19/10/17]]''  &lt;br /&gt;
*Configuration de la Raspberry Pi car problèmes de connectivité Bluetooth rencontrés&lt;br /&gt;
**Nous arrivons à connecter la Raspberry Pi sous Windows mais la connexion sous Linux pose problème (travail en suspens en attendant la disponibilité de l'encadrant)&lt;br /&gt;
*Début du développement de l'interface Web&lt;br /&gt;
**Traitement d'une matrice dans un fichier JSON&lt;br /&gt;
**Affichage sous forme de tableau de la matrice&lt;br /&gt;
**Utilisation du serveur de requête en Python avec chargement de template HTML&lt;br /&gt;
**Mise en forme de la trame de la page en HTML/CSS avec le framework Bootstrap&lt;br /&gt;
**Ajout d'un set de distances (d1, d2, d3, d4) dans la matrice lors d'un appui sur un bouton Chargement en utilisant un fichier Javascript&lt;br /&gt;
&lt;br /&gt;
Nous avons reçu des fonctions Python de notre tuteur afin d'obtenir une connexion Bluetooth entre notre Raspberry Pi et notre ordinateur ainsi qu'une redirection de port de celle-ci vers la connexion. Nous n'arrivons pas à utiliser ces fonctions sous linux et nous nécessitons une explication de notre tuteur n'étant pas disponible à ce moment. Pour ne pas perdre de temps, nous attaquons la création de l'interface web à proprement parler, c'est à dire la création des pages HTML ainsi que le document Javascript qui nous servira de bibliothèque de fonctions. Chaque route de notre serveur est reliée à une série de fonctions Python s'exécutant à l'appel des url puis suivies d'un template de la page HTML en question. Nous en profitons de plus pour explorer le framework CSS bootstrap afin de mettre un premier design et une structure a notre page collecte qui sera la page principale de notre site pour ce début de projet.&lt;br /&gt;
&lt;br /&gt;
Nous nous essayons de plus à différents tests sur des fichiers de format '''JSON''' que nous devrons réussir à traiter correctement plus tard dans notre projet.&lt;br /&gt;
Nous récupérons une matrice que nous créons nous-mêmes en Python (simulation d'une série de distances récupérée) que nous transformons au format JSON pour ensuite l'afficher sur notre page web. Pour pouvoir proprement afficher ce fichier '''JSON''' renvoyé vers notre page, nous nous servons du fichier Javascript afin de créer du code HTML contenant la matrice.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 5'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 25/10/17 - Ven 27/10/17]]''  &lt;br /&gt;
*Résolution des problèmes de connectique Bluetooth sur la Raspberry Pi&lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Traitement d'une matrice dans un fichier JSON&lt;br /&gt;
**Début de l'ajout d'un set de distances depuis une matrice contenue dans un fichier JSON&lt;br /&gt;
&lt;br /&gt;
Nous avons pu nous entretenir avec notre tuteur et donc comprendre les fonctions de connexion et de redirection de port. Nous pouvons donc continuer le développement de notre interface web. Nous arrivons à traiter un set de données au format JSON et à l'afficher dans le code HTML. Toutefois nous créons nous-mêmes ce set, il est maintenant nécessaire que nous arrivions à récupérer les sets de distance réels reçus par la connexion Bluetooth. Nous commencerons par un traitement asynchrone. L'idée est d’enregistrer les sets de distances dans un fichier '''JSON''' stocké dans un dossier. Nous appellerons ce dossier plus tard via une requête Ajax.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 6'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 08/11/17 - Ven 10/11/17]]''  &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
**Mise en place de la communication entre le port série de notre machine et le port série de la carte via Bluetooth de la RPi3&lt;br /&gt;
**Récupération et traitement (parse) manuels des données de distances dans un fichier .log via TCP/IP&amp;lt;-&amp;gt;Bluetooth&lt;br /&gt;
**Début de l'automatisation du procédé par script Python (requete.py) et mise en place de sockets de communication&lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Chargement sur commande d'un set de distances depuis une matrice contenue dans un fichier JSON&lt;br /&gt;
*Travail sur le layout du site&lt;br /&gt;
&lt;br /&gt;
Après avoir regardé le code de ces différentes fonctions nous avons pu faire des tests manuels via le Shell pour récupérer des données de distances et les stocker dans un fichier '''JSON''' sur notre ordinateur.&lt;br /&gt;
&lt;br /&gt;
Nous utilisons les commandes suivantes pour se connecter via Bluetooth:&lt;br /&gt;
&lt;br /&gt;
 rfcomm connect /dev/rfcomm0 B8:27:EB:80:DC:89 1&lt;br /&gt;
&lt;br /&gt;
Rediriger le port de la Raspberrypi3 vers la connexion:&lt;br /&gt;
&lt;br /&gt;
 Python lps-collector/tcp_serial_redirect.py /dev/rfcomm0 9600&lt;br /&gt;
&lt;br /&gt;
Collecter les données dans un fichier dont nous définissons le nom:&lt;br /&gt;
&lt;br /&gt;
 echo &amp;quot;cu -s9600 -lttyACM0&amp;quot;| nc localhost 7777&lt;br /&gt;
 nc localhost 7777 | grep distance &amp;gt; static/log/dist-capture'+date+'.log&lt;br /&gt;
&lt;br /&gt;
Nous pouvons '''parser''' le flux de données avant de le stocker dans le fichier via cette commande:&lt;br /&gt;
&lt;br /&gt;
 Python lps-collector/lps_parse.py static/log/dist-capture&amp;quot;+date+&amp;quot;.log&lt;br /&gt;
&lt;br /&gt;
Il est donc nécessaire d'inclure via des '''thread''' ces différentes fonctions dans notre serveur Python (Flask) afin d'automatiser le processus. Le but est de pouvoir choisir sur l'interface web quels fonctions il faut exécuter et les déclencher via l'appui sur des boutons.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 7'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 15/11/17 - Ven 17/11/17]]''  &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
**Récupération et traitement (parse) manuels des données de distances dans un fichier .log via TCP/IP&amp;lt;-&amp;gt;Bluetooth&lt;br /&gt;
**Automatisation du procédé par script Python (requete.py)&lt;br /&gt;
***Mise en place de sockets de communication pour le contrôle de la collecte -&amp;gt; abandonné (servait à commander la collecte manuellement)&lt;br /&gt;
***Développement d'un script engine.py regroupant les commandes exécutables par l'utilisateur via la page Web&lt;br /&gt;
***Début du travail sur la fonction &amp;quot;STOP&amp;quot; manuel d'une action de collecte de données (liaison entre script HTML, Javascript, et script Python)&lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Chargement sur commande d'un set de distances depuis une matrice contenue dans un fichier JSON&lt;br /&gt;
**Travail sur le layout du site&lt;br /&gt;
***Ajout des différentes commandes (connexion Bluetooth, lancement commande cu, collecte des données, collecte durée donnée)&lt;br /&gt;
***Début de l'implémentation de la visualisation des fichiers .JSON obtenus après collecte et affichage dans un tableau matriciel du fichier sélectionné&lt;br /&gt;
&lt;br /&gt;
Nous avons continué à travailler sur le serveur de collecte: les données que nous avons récupérées via Bluetooth sont stockées dans un fichier .log. Apres avoir bien compris comment marchait la fonction '''parse''' manuellement (lors de son utilisation dans le Shell), nous l'avons implémentée dans notre serveur de collecte qui lance cette commande lors de l’appui sur un bouton via notre interface virtuelle. Un problème rencontré était de savoir quand la récolte des données devait s’arrêter. Nous avons donc rajouté un temps à entrer nous-même sur l'interface. La fonction '''parse''' est effectuée et le sous-processus va attendre le temps donné avant de lancer une commande permettant de tuer le processus et mettant donc fin au remplissage du fichier '''.log'''. Nous voulons de plus réussir à lancer une fonction de collecte sans temps. C'est à dire que nous coupons la collecte via un bouton par nous-mêmes. Nous voulions utiliser des Sockets pour pouvoir définir nous-mêmes la gestion de la communication mais l'idée a été abandonné car nous avons réussi à sauvegarder le PID du processus lancé. Il nous suffit donc de l’arrêter grâce à un autre bouton qui récupère cette variable et l’arrête ensuite. &lt;br /&gt;
&lt;br /&gt;
Toutes nos fonctions Pythons étant regroupées dans notre serveur '''requete.py''', nous avons décidé de créer un module qui regroupera toutes ces fonctions que nous pourrons utiliser dans '''requete.py'''. ceci nous permet de voir plus clair dans notre code et de faciliter le travail lorsque nous modifions le code tous les deux.&lt;br /&gt;
&lt;br /&gt;
Nous essayons en continu d'adapter le layout du site pour le rendre le plus attractif et simple possible, de façon à ce que chaque bouton et tableau soient clairs et compréhensibles.&lt;br /&gt;
&lt;br /&gt;
Nous avons commencé à récupérer les fichiers '''JSON''' créés à partir des fichier '''log''', c'est-à-dire que ces fichiers sont automatiquement stockés coté serveur dans un dossier nommé '''static/log'''. Notre but est de récupérer le nom des fichiers JSON et de les afficher dans un composant sur notre interface web. Il nous sera donc possible ensuite de sélectionner le nom d'un fichier. Lors de la sélection de ce nom de fichier, un tableau apparaît avec les valeurs de distances à l’intérieur.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 8'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 22/11/17 - Ven 24/11/17]]''  &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
**Automatisation du procédé de collecte par script Python (requete.py qui fait appel à engine.py)&lt;br /&gt;
***Développement d'un script engine.py regroupant les commandes exécutables par l'utilisateur via la page Web&lt;br /&gt;
***Travail sur la fonction &amp;quot;STOP&amp;quot; manuel d'une action de collecte de données (liaison entre script HTML, Javascript, et script Python)&lt;br /&gt;
***Mise en place d'un serveur HTTP Simple sous Python pour accéder aux fichiers de données à partir de la page Web&lt;br /&gt;
***Mise à jour de fonctions de connexion &lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Travail sur le layout du site (ajout de pages, navigation entre les pages, apparence, nettoyage des codes)&lt;br /&gt;
**Bon fonctionnement de l'ensemble serveur collecte + serveur HTTP + client Web&lt;br /&gt;
**Affichage de la liste des fichiers de données de distance (log, csv, JSON) via serveur HTTP en Python sur port 9999&lt;br /&gt;
*Corrections et nettoyage du dépôt GIT&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous continuons à développer les points énoncés la semaine dernière. Nous avons décidé de nous diriger vers un serveur HTTP Simple pour accéder à nos fichiers. Il s’avère que nous finirons par ne pas utiliser ce serveur. Nous irons récupérer les fichiers en question via des requêtes '''Ajax''' faites à la sélection du nom du fichier.&lt;br /&gt;
&lt;br /&gt;
Nous rencontrons depuis le début des problèmes avec les fonctions de connexion qui peuvent ne pas marcher à un moment donné. Nous essayons de trouver pourquoi ce bug est un bug qui ne se produit pas à chaque fois. Nous avons déterminé qu'il ne se produisait seulement lorsque les fonctions de connexions étaient lancée dans des threads. Nous ne savons toujours pas pourquoi ces thread bugguent seulement parfois et non à chaque essai de connexion.&lt;br /&gt;
&lt;br /&gt;
Nous avons nettoyé notre dépot '''Git''' car il s’avère que nous utilisions une mauvaise méthode de fusion et de stockage des documents.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 9'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 29/11/17 - Jeudi 30/11/17]]''  &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
**Automatisation du procédé de collecte par script Python (requete.py qui fait appel à engine.py)&lt;br /&gt;
***Travail sur la fonction &amp;quot;STOP&amp;quot; manuel d'une action de collecte de données (liaison entre script HTML, Javascript, et script Python)&lt;br /&gt;
***Recherches sur l'utilisation de fichiers JSON accessibles via le serveur HTTP&lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Travail sur le layout du site &lt;br /&gt;
**Travail sur la liaison entre fichiers JSON et affichage Web des données de distance&lt;br /&gt;
***Recherches et tests de solutions&lt;br /&gt;
****Affichage depuis un fichier&lt;br /&gt;
****Affichage à la volée lors d'une action de collecte&lt;br /&gt;
&lt;br /&gt;
*Revue de code avec Roudy DAGHER:&lt;br /&gt;
**Structure globale des codes ok&lt;br /&gt;
**Fonctionnement presque ok: fonctionnalités implémentées ok, mais parsage csv ne marche pas&lt;br /&gt;
**Refactoring nécessaire&lt;br /&gt;
**Correction de la fonction STOP et amélioration de la fonction de COLLECTE&lt;br /&gt;
**Faire plus de requêtes Javascript que de requêtes HTML&lt;br /&gt;
**Discussion pour l'implémentation du serveur de localisation (= algorithme de localisation) et des visualisations de données sur le site Web&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous avons d'abord revu l'ensemble de notre code et les méthodes utilisées avec notre tuteur '''Roudy Dagher'''. Nous nous approchons d'un serveur de collecte de données stable et fonctionnel. Nous avons refait les différentes connexions entre l'interface et le serveur afin de ne faire que des requêtes sur des '''WebServices'''. Il nous est possible de commencer la deuxième partie qui est l'envoi de ces tableaux de données afin de les envoyer vers le serveur de localisation via des API afin de recevoir des matrices de positions.&lt;br /&gt;
Nous pourrons grâce à ces matrices afficher une carte 3D des balises  et du TAG dans l'espace.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 10'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 06/12/17 - Jeudi 07/12/17]]'' &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
**Travail sur la fonction STOP&lt;br /&gt;
**Réalisation d'une expression régulière pour le parsage des fichiers log en fichier JSON&lt;br /&gt;
&lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Travail sur l'affichage des fichiers JSON&lt;br /&gt;
***Réalisation de toutes les requêtes Ajax&lt;br /&gt;
***Réalisation d'un menu déroulant dropdown pour charger le contenu des fichiers JSON dans le tableau de distances&lt;br /&gt;
&lt;br /&gt;
*Nettoyage du dépôt Git&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 11'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 13/12/17]]''  &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
&lt;br /&gt;
*Revue de code avec Roudy DAGHER:&lt;br /&gt;
**Discussion sur la partie système du projet et correction de certaines fonctions&lt;br /&gt;
&lt;br /&gt;
Nous nous sommes réunis avec l'un de nos tuteurs, qui a réalisé certains bouts de code de base, pour nous mettre au point sur les fonctions en question et leur utilisation.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 12'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 20/12/17 - Jeudi 21/12/17]]''&lt;br /&gt;
*Revue, correction et nettoyage des codes&lt;br /&gt;
*Finalisation du rapport&lt;br /&gt;
*Planification de semaines restantes&lt;br /&gt;
*Préparation de la soutenance&lt;br /&gt;
*Revue de mi-projet avec tous les tuteurs&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Cette dernière semaine a servi à finaliser le rapport et à discuter de l'avancée du projet, notamment avec nos tuteurs pour déterminer le travail restant, présenter le travail abouti et replanifier précisément les échéances pour le travail restant. Nous avons réalisé la soutenance de mi-projet le '''jeudi 21/12/17 à 8h'''.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 13'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 10/01/18 - Ven 12/01/18]]''  &lt;br /&gt;
*Travail sur la collecte des données (serveur de collecte et interface Web)&lt;br /&gt;
**Redéfinition du fichier de parsage car il crée des conflits et ne produit pas un fichier formaté de la façon attendue&lt;br /&gt;
***Nombre de balises réel n'est pas bien déterminé par le code&lt;br /&gt;
***ID de la première et de la dernière balise ne sont pas déterminés correctement&lt;br /&gt;
&lt;br /&gt;
**Automatisation de la collecte par un script Shell lançant toutes les commandes de CONNEXION, REDIRECTION, LANCEMENT CU, FERMETURE DU PROGRAMME (kill rfcomm / kill tcp_redirect)&lt;br /&gt;
***Dans le but d'automatiser la procédure&lt;br /&gt;
***Dans le but de résoudre un problème de gestion de ressources (le bug '''thread''' apparu plus tôt dans le projet)&lt;br /&gt;
&lt;br /&gt;
**Travail sur la résolution du bug thread car l'automatisation n'a pas résolu le problème&lt;br /&gt;
***Identification du ou des causes potentielles: gestion des ressources (synchrone, asynchrone ?), connexion Bluetooth, lancement des commandes dans le même script, lancement en fg/bg, conflit dû au temps d'exécution de chaque processus ?&lt;br /&gt;
***Lancement des commandes manuellement dans des terminaux ne pose aucun problème: solution la plus simple&lt;br /&gt;
&lt;br /&gt;
**Redesign de la page Collecte&lt;br /&gt;
***Remplacement des boutons de commande par un bouton unique d'initialisation&lt;br /&gt;
***Travail sur une mise à jour du menu déroulant dropdown régulière sans avoir à recharger la page Web&lt;br /&gt;
***Implémentation de plotly.js, un module Javascript qui permet d'afficher des graphes en 3D&lt;br /&gt;
&lt;br /&gt;
*Mise au point post-soutenance avec Roudy DAGHER pour valider le travail restant, effectué et redéfinir certains objectifs atteignables ou pas selon les éléments réalisés dans le projet&lt;br /&gt;
*Recherches et début de l'implémentation du serveur de localisation fourni par les tuteurs&lt;br /&gt;
*Gestion du Git pour créer des branches additionnelles&lt;br /&gt;
*Recréation du rapport de projet suite à une perte du fichier éditable d'origine + Mise à jour avec les remarques suite à la soutenance ainsi que les nouveaux éléments&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 14'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mar 16/01/18 - Ven 19/01/18]]''  &lt;br /&gt;
*Travail sur la collecte des données (serveur de collecte et interface Web)&lt;br /&gt;
**Redéfinition du fichier de parsage car il crée des conflits et ne produit pas un fichier formaté de la façon attendue&lt;br /&gt;
***Corrigé: Nombre de balises réel n'est pas bien déterminé par le code&lt;br /&gt;
***Corrigé: ID de la première et de la dernière balise ne sont pas déterminés correctement&lt;br /&gt;
***Reste à faire: Traiter le cas où il y a un ajout ou suppression d'une balise pendant la collecte (pour le moment, lorsque c'est le cas, toutes les données se décalent au lieu de laisser des trous)&lt;br /&gt;
&lt;br /&gt;
**Automatisation de la collecte par un script Shell lançant toutes les commandes de CONNEXION, REDIRECTION, LANCEMENT CU, FERMETURE DU PROGRAMME (kill rfcomm / kill tcp_redirect)&lt;br /&gt;
***Mis en suspens: pour le moment, on lance les commandes manuellement dans le terminal&lt;br /&gt;
&lt;br /&gt;
**Interface Web&lt;br /&gt;
***Implémentation de plotly.js, un module Javascript qui permet d'afficher des graphes en 3D&lt;br /&gt;
&lt;br /&gt;
*Implémentation du serveur de localisation fourni par les tuteurs (mais algorithme de localisation pas fonctionnel pour le moment)&lt;br /&gt;
**Mise à jour de l'affichage des positions des éléments: précédemment seule la matrice X de position du Tag s'affichait, et pas la matrice A des balises&lt;br /&gt;
**Requêtes manuelles à l'API avec la fonction curl OK: on arrive à récupérer les matrices X et A (aléatoires pour le moment) par une requête GET à l'API du serveur de localisation&lt;br /&gt;
**Implémentation des requêtes Ajax pour automatiser les requêtes au serveur de localisation&lt;br /&gt;
&lt;br /&gt;
*Mise à jour du rapport les nouveaux éléments du travail réalisé&lt;br /&gt;
*Réflexion sur la possibilité ou non de réaliser la partie temps réel du projet au vu des moyens à disposition&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 15'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mar 23/01/18 - Ven 26/01/18]]'' &lt;br /&gt;
*Travail sur la collecte des données (serveur de collecte et interface Web)&lt;br /&gt;
**Redéfinition du fichier de parsage car il crée des conflits et ne produit pas un fichier formaté de la façon attendue&lt;br /&gt;
***Fait: Si distance négative car Tag trop près, la valeur négative générée par une balise est remplacée par un &amp;quot;0&amp;quot; (cela modifie la position réelle modélisée dans plotly, mais évite une impossibilité de générer la position à partir de la distance -&amp;gt; par des tests, il faudra déterminer la valeur limite à partir de laquelle les cartes donnent des valeurs de distance négatives&lt;br /&gt;
***Reste à faire: Traiter le cas où il y a un ajout ou suppression d'une balise pendant la collecte (pour le moment, lorsque c'est le cas, toutes les données se décalent au lieu de laisser des trous); Ainsi que le cas où il y un saut/bug inattendu et donc une disparition d'une ou plusieurs valeurs de distance&lt;br /&gt;
***Début de résolution du cas où une distance n'est pas prise en compte, c'est à dire où il y a une valeur qui disparaît et désaligne les valeurs lors de la création du JSON&lt;br /&gt;
&lt;br /&gt;
**Automatisation de la collecte par un script Shell lançant toutes les commandes de CONNEXION, REDIRECTION, LANCEMENT CU, FERMETURE DU PROGRAMME (kill rfcomm / kill tcp_redirect)&lt;br /&gt;
***Mis en suspens: pour le moment, on lance les commandes manuellement dans le terminal&lt;br /&gt;
***Création d'un script bash /etc/init.d/autoconnect.sh pour connecter automatiquement la RPi au lancement du système (si la RPi est déjà allumée au démarrage)&lt;br /&gt;
&lt;br /&gt;
**Interface Web&lt;br /&gt;
***Perfectionnement de l'utilisation de Plotly pour les visualisations&lt;br /&gt;
&lt;br /&gt;
*Implémentation du serveur de localisation fourni par les tuteurs (algorithme de localisation pas fonctionnel pour le moment)&lt;br /&gt;
**Requêtes manuelles à l'API avec la fonction curl OK&lt;br /&gt;
**Fait: Implémentation des requêtes Ajax pour automatiser les requêtes au serveur de localisation&lt;br /&gt;
***Liaison entre les différentes requêtes ajax grâce à des variables: permet de stocker l'adresse du job récupérée par la méthode GET&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 16'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Lun 29/01/18 - Ven 02/02/18]]'' &lt;br /&gt;
*Travail sur la collecte des données (serveur de collecte et interface Web)&lt;br /&gt;
**Redéfinition du fichier de parsage car il crée des conflits et ne produit pas un fichier formaté de la façon attendue&lt;br /&gt;
***déterminer la valeur limite à partir de laquelle les cartes donnent des valeurs de distance négatives&lt;br /&gt;
***Reste à faire: Traiter le cas où il y a un ajout ou suppression d'une balise pendant la collecte (pour le moment, lorsque c'est le cas, toutes les données se décalent au lieu de laisser des trous); Ainsi que le cas où il y un saut/bug inattendu et donc une disparition d'une ou plusieurs valeurs de distance&lt;br /&gt;
***Fait: gestion des bugs/sauts de valeurs de balises - remplacement par une valeur nulle sur balise existe, par rien sinon (implémentation d'un tableau caractérisant l'existence ou pas de chaque balise 1 à 6), optimisation des temps de calculs/exécution dans le script&lt;br /&gt;
**Interface Web&lt;br /&gt;
***Ajout d'une barre de progression de la collecte remplaçant le bouton de Lancement de collecte lors de l'appui&lt;br /&gt;
***Ajout d'un bouton dropdown pour afficher les fichiers de position qu'on reçoit du serveur de localisation&lt;br /&gt;
***Ajout d'une scrollbar dans les deux dropdown&lt;br /&gt;
&lt;br /&gt;
*Implémentation du serveur de localisation fourni par les tuteurs (algorithme de localisation pas fonctionnel pour le moment)&lt;br /&gt;
**Fait: Implémentation des requêtes Ajax pour automatiser les requêtes au serveur de localisation&lt;br /&gt;
***Création d'une requête Ajax GET qui demande le fichier JSON de position au serveur de localisation jusqu'à ce qu'il soit retourné&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 17'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Lun 05/02/18 - Ven 09/02/18]]''&lt;br /&gt;
&lt;br /&gt;
*Algorithme de localisation mis en ligne par le tuteur&lt;br /&gt;
**test du bon fonctionnement des connections entre parties après intégration de l'algorithme&lt;br /&gt;
**test su la qualité de l'algorithme&lt;br /&gt;
**test sur la précision de l'algorithme&lt;br /&gt;
*Rapport partie Front-end&lt;br /&gt;
*Rapport partie Back-end&lt;br /&gt;
*Nettoyage du code requete.py&lt;br /&gt;
*Mise à jour final des de certes pages du site&lt;br /&gt;
** matrice.html à jour&lt;br /&gt;
**3D.html à jour&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 18'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Lun 12/02/18 - Ven 16/02/18]]''&lt;br /&gt;
&lt;br /&gt;
*Algorithme de localisation mis en ligne par le tuteur&lt;br /&gt;
**test de perturbation et des limites du systeme d'antenne Locopositioning&lt;br /&gt;
*Rapport partie III &lt;br /&gt;
*rapport partie I&lt;br /&gt;
*réalisation de la vidéo de présentation&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 19'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Lun 19/02/18 - Ven 23/02/18]]''&lt;br /&gt;
&lt;br /&gt;
*Présentation de l'application à l'un des chercheurs de l’INRIA en charge de la suite du projet et de l'algorithme de localisation&lt;br /&gt;
*création de la diapositive de la soutenance.&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Délivrables'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
Rapport de mi-PFE&lt;br /&gt;
[[Fichier:RapportMi-PFE-UNG DELATTE.pdf]]&lt;br /&gt;
&lt;br /&gt;
Rapport de PFE&lt;br /&gt;
&lt;br /&gt;
Vidéo&lt;/div&gt;</summary>
		<author><name>Hdelatte</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=P18_Localisation_of_quadrotors&amp;diff=51104</id>
		<title>P18 Localisation of quadrotors</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=P18_Localisation_of_quadrotors&amp;diff=51104"/>
				<updated>2018-02-16T16:07:08Z</updated>
		
		<summary type="html">&lt;p&gt;Hdelatte : /* Semaine 19 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Cahier des charges'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;Présentation générale du projet&amp;lt;/span&amp;gt;=== &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Contexte&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
Dans un monde de plus en plus connecté, de nombreux drones sont déployés pour diverses applications comme l'espionnage, la surveillance, la cartographie de lieux et la livraison de colis. Les technologies nécessaires pour contrôler ces drones sont des sujets de recherche actuels. &lt;br /&gt;
&lt;br /&gt;
Le contrôle de ceux-ci passe tout d'abord par la maîtrise de leur position dans l'espace. Le développement des applications liées à l'utilisation de drones nécessite un travail important sur la localisation spatiale d'objets connectés. &lt;br /&gt;
&lt;br /&gt;
De plus, dans un souci d'utilisation, il est essentiel de développer des interfaces logicielles permettant d'exploiter ces données.&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Objectif du projet&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
L'objectif de ce projet est de développer une interface logicielle permettant de traiter en temps réel les informations de localisation d'un drone et de balises, dans le but de définir leur localisation dans l'espace, en intérieur.&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Description du projet&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
Pour réaliser le contrôle de drones, la première étape importante est de donner ses informations de position. Le but du projet est de développer une interface logicielle permettant de localiser le drone en temps réel en intérieur. Le drone se déplace dans un environnement dans lequel ont été installées de multiples balises. Il est équipé d'une carte, lui permettant de recevoir les distances relatives entre lui-même et les balises, sur laquelle différents algorithmes vont être implémentés pour effectuer la localisation en temps réel. Le projet requiert des compétences en développement hardware (Crazyflie 2.0, voir https://wiki.bitcraze.io/) et software (langage C/C++/Python/Javascript/HTML...).&lt;br /&gt;
&lt;br /&gt;
Il se divise en 4 étapes principales, qui sont:&lt;br /&gt;
*1) Choisir les technologies utilisées&lt;br /&gt;
*2) Choisir l'architecture (OS / APIs)&lt;br /&gt;
*3) Développer les différentes parties du projet&lt;br /&gt;
*4) Intégrer et connecter les différentes parties du projet&lt;br /&gt;
&lt;br /&gt;
La localisation étant en intérieur, le protocole GPS n'est donc pas assez précis pour les applications ciblées. La mise en place d'un tel dispositif permettrait grâce à l'utilisation d'un algorithme d'estimer avec une bonne précision les positions en intérieur d'une balise centrale (appelée Tag) et de balises (appelées Anchor). Le Tag scanne en temps réel la distance relative aux différentes balises, et il nous est retourné la position des balises et du Tag grâce à l'algorithme de localisation.&lt;br /&gt;
&lt;br /&gt;
Le projet se compose de 3 parties:&lt;br /&gt;
* Collect &amp;amp; parse: collecter les données envoyées par les balises en communiquant avec un serveur et récupérer les données adéquates par un tri&lt;br /&gt;
* Localise: déterminer la matrice de position des balises et du Tag en traitant les données récupérées&lt;br /&gt;
* Display: développer l'interface homme machine pour afficher, étudier et utiliser les données traitées&lt;br /&gt;
&lt;br /&gt;
Nous travaillerons dans un premier temps dans une optique temps différé avant de travailler en temps réel. Cela nous permettra d'acquérir des données utiles et réutilisables en aval. &lt;br /&gt;
&lt;br /&gt;
A l'aboutissement du projet, nous devrions être capable via l'interface homme machine développée d'afficher précisément la position spatiale des balises ainsi que du Tag, grâce àl'utilisation d'un algorithme de localisation et des données récupérées, et d'afficher d'autres données relatives au déplacement du Tag ou des balises dans l'espace. &lt;br /&gt;
&lt;br /&gt;
Si le temps le permet, nous pourrons aussi être amenés à adapter et utiliser l'interface développée pour l'utilisation d'un drone.&lt;br /&gt;
&lt;br /&gt;
''Sujet originel''&lt;br /&gt;
&lt;br /&gt;
To achieve the control of quadrotors, the first important task to give its position information. This project is to develop a software(GUI) to localize the quadrotors in real-time. The quadrotor is flying in an environment where several transmitters have been installed. The quadrotor is equipped with a deck to receive the relative distances between the deck and all transmitters, based on which different algorithms will be implemented to realize the real-time localization. The candidates need to have both experiences on hardware (Crazyflie 2.0, see https://wiki.bitcraze.io/) and software development (C/C , Python…). &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Calendrier prévisionnel&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
''[[Avant le 29/09/17]]'' - Élaboration du Cahier des charges, de la liste des tâches et du calendrier prévisionnel&lt;br /&gt;
&lt;br /&gt;
''[[Avant fin Octobre]]'' - Serveur de collecte et début du développement de l'interface logicielle&lt;br /&gt;
&lt;br /&gt;
''[[Avant fin Décembre]]'' - Interface logicielle&lt;br /&gt;
&lt;br /&gt;
''[[A la fin du PFE]]'' - Intégration finale des différentes parties (Serveur de collecte des données &amp;amp; Serveur de localisation &amp;amp; Interface logicielle)&lt;br /&gt;
&lt;br /&gt;
Répartition du volume de travail (***h):&lt;br /&gt;
&lt;br /&gt;
* Recherche sur les technologies à utiliser&lt;br /&gt;
* Développement du serveur de collecte de données&lt;br /&gt;
* Réalisation de l'interface logicielle (Web//Logiciel/Application)&lt;br /&gt;
* Intégration des différentes parties&lt;br /&gt;
* Test et débuggage&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Choix techniques : matériel et logiciel&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
Afin de développer ce dispositif, nous allons utiliser une Raspberry Pi 3 associée à une carte réceptrice, qui communique avec 4 balises composées chacune d'un microcontrôleur et d'une carte émettrice radio (UWB5C) et alimentées par batteries. La carte réceptrice joue le rôle du drone à localiser et communiquera les données émises par les balises vers l'ordinateur via Bluetooth.&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Choix technologiques&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
Voici les technologies que nous utilisons pour chacune des parties de ce projet.&lt;br /&gt;
&lt;br /&gt;
    1) Serveur de collecte des données:&lt;br /&gt;
       Scanne et parse les données récupérées pour fournir la matrice D des distances relatives du tag aux 4 balises&lt;br /&gt;
        - API&lt;br /&gt;
        - Python / Serveur Flask&lt;br /&gt;
&lt;br /&gt;
    2) Serveur de localisation (fourni):&lt;br /&gt;
       Calcule grâce à l'algorithme de localisation et la matrice D les positions spatiales des 4 noeuds et du tag&lt;br /&gt;
        - API&lt;br /&gt;
        - Bootstrap&lt;br /&gt;
        - Jquery&lt;br /&gt;
        - Python&lt;br /&gt;
&lt;br /&gt;
    3) Interface utilisateur:&lt;br /&gt;
       Affiche courbes, visualisation 3D, boutons ou données des fichiers envoyées par le serveur de localisation&lt;br /&gt;
        - HTML5 / Javascript&lt;br /&gt;
        - Fichiers JSON (serveurs de collecte et de localisation)&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Calendrier prévisionnel'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Liste des tâches à effectuer&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
# Se documenter sur le projet&lt;br /&gt;
##Langages et technologies utilisées&lt;br /&gt;
##Matériel utilisé&lt;br /&gt;
##Mettre en place du travail sur le Git&lt;br /&gt;
# Réaliser le serveur de collecte&lt;br /&gt;
##Récupérer les trames envoyées par bluetooth par le TAG via la Raspberry Pi&lt;br /&gt;
##Intégrer le serveur de localisation pour interpréter les trames&lt;br /&gt;
##Tester et optimiser&lt;br /&gt;
# Réaliser l'interface Web utilisateur&lt;br /&gt;
##Implémenter le serveur de collecte et de localisation&lt;br /&gt;
##Afficher et traiter les données stockées dans les fichiers JSON via le serveur (temps différé + temps réel)&lt;br /&gt;
##Tester et optimiser&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;Replanification du cahier des charges / calendrier&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Feuille d'heures'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Tâche !! Prélude !! Heures S1 !! Heures S2 !! Heures S3 !! Heures S4 !! Heures S5 !! Heures S6 !! Heures S7 !! Heures S8 !! Heures S9 !! Heures S10 !! Heures S11 !! Heures S12 !! Heures S13 !! Heures S14 !! Heures S15 !! Heures S16 !! Heures S17 !! Heures S18 !! Heures S19 !! Total&lt;br /&gt;
|-&lt;br /&gt;
| Cahier des charges / Wiki / Gitlab / Rapport&lt;br /&gt;
|  4h&lt;br /&gt;
|  3h&lt;br /&gt;
|  1h&lt;br /&gt;
|  x&lt;br /&gt;
|  1h30&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h30&lt;br /&gt;
|  1h&lt;br /&gt;
|  3h&lt;br /&gt;
|  3h30&lt;br /&gt;
|  2h&lt;br /&gt;
|  5h&lt;br /&gt;
|  x&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Documentation sur les technos utilisées&lt;br /&gt;
|  2h&lt;br /&gt;
|  4h&lt;br /&gt;
|  3h&lt;br /&gt;
|  2h&lt;br /&gt;
|  3h&lt;br /&gt;
|  4h&lt;br /&gt;
|  5h&lt;br /&gt;
|  5h30&lt;br /&gt;
|  4h30&lt;br /&gt;
|  3h30&lt;br /&gt;
|  2h&lt;br /&gt;
|  3h&lt;br /&gt;
|  1h&lt;br /&gt;
|  3h&lt;br /&gt;
|  4h&lt;br /&gt;
|  x&lt;br /&gt;
|  2h&lt;br /&gt;
|  &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Documentation sur le matériel&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  1h&lt;br /&gt;
|  1h&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Recherche et développement du serveur de collecte&lt;br /&gt;
|  x&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  3h&lt;br /&gt;
|  3h30&lt;br /&gt;
|  4h&lt;br /&gt;
|  5h&lt;br /&gt;
|  7h&lt;br /&gt;
|  4h30&lt;br /&gt;
|  0,5h&lt;br /&gt;
|  3h&lt;br /&gt;
|  4h&lt;br /&gt;
|  3h&lt;br /&gt;
|  x&lt;br /&gt;
|  4h&lt;br /&gt;
|  7h30&lt;br /&gt;
|  5h&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Recherche et développement de l'interface Web&lt;br /&gt;
|  x&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  3h&lt;br /&gt;
|  5h&lt;br /&gt;
|  6h&lt;br /&gt;
|  4h&lt;br /&gt;
|  7h&lt;br /&gt;
|  5h30&lt;br /&gt;
|  2h30&lt;br /&gt;
|  6h&lt;br /&gt;
|  8h&lt;br /&gt;
|  5h&lt;br /&gt;
|  1h&lt;br /&gt;
|  8h&lt;br /&gt;
|  4h&lt;br /&gt;
|  4h&lt;br /&gt;
|  &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Recherche et intégration du serveur de localisation&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x &lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  6h&lt;br /&gt;
|  5h&lt;br /&gt;
|  3h&lt;br /&gt;
|  &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Intégration des différentes parties&lt;br /&gt;
|  x&lt;br /&gt;
|  x  &lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  2h&lt;br /&gt;
|  2h&lt;br /&gt;
|  2h&lt;br /&gt;
|  3h&lt;br /&gt;
|  1h30&lt;br /&gt;
|  x&lt;br /&gt;
|  3h&lt;br /&gt;
|  6h&lt;br /&gt;
|  5h&lt;br /&gt;
|  x&lt;br /&gt;
|  3h30&lt;br /&gt;
|  2h&lt;br /&gt;
|  2h&lt;br /&gt;
|  &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Tests et débuggage&lt;br /&gt;
|  x&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  1h&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  3h&lt;br /&gt;
|  4h&lt;br /&gt;
|  0,5h&lt;br /&gt;
|  3h&lt;br /&gt;
|  1h&lt;br /&gt;
|  3h&lt;br /&gt;
|  3h&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  4h&lt;br /&gt;
|  &lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Optimisation/Correction des programmes&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Vidéo&lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Avancement du Projet'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Phase préparatoire'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Jeu 21/09/17 - Ven 22/09/17]]'' &lt;br /&gt;
*Rendez-vous de mise au point du cahier des charges avec les encadrants/intervenants (M. ZHENG Gang et M. DAGHER Roudy)&lt;br /&gt;
*Elaboration du cahier des charges&lt;br /&gt;
*Elaboration de la page Wiki (préparation de la mise en page et présentation du sujet)&lt;br /&gt;
*Préparation du travail sous forme de Mind Map&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous nous sommes tout d’abord rendus au laboratoire de l'INRIA afin de pouvoir définir le plus précisément possible le cahier des charges avec nos tuteurs.&lt;br /&gt;
Nous avons donc défini avec eux les technologies qu'il faudrait étudier. Vous retrouverez le choix des technologies dans la partie '''choix technologiques'''&lt;br /&gt;
&lt;br /&gt;
Nous avons en même temps créé notre page Wiki, et structurée celle-ci avec les parties qui nous seraient utiles pour développer nos explications par la suite.&lt;br /&gt;
&lt;br /&gt;
Nous avons de plus découpé le travail en sous-parties que nous avions mis dans une '''Mind map''' afin d'y voir plus clair sur la ligne à suivre.&lt;br /&gt;
&lt;br /&gt;
Vous trouverez cette Mind map juste ci-dessous. Nous ne mettrons pas à jour cette Mind map chaque semaine mais il est fort probable que nous en refaisions un en milieu de projet pour pouvoir cibler les objectifs réussis et ceux à atteindre. Nous pourrons de plus redéfinir certains objectifs qui nous auraient semblés trop vague au début du projet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Projet de fin d'étude.png|centre|600px]]&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 1'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Jeu 28/09/17 - Ven 29/09/17]]'' &lt;br /&gt;
*Revue du Cahier des Charges avec les encadrants&lt;br /&gt;
*Lecture et recherches sur les technologies adaptées&lt;br /&gt;
*Construction de la suite de la Mind Map&lt;br /&gt;
*Création du Gitlab&lt;br /&gt;
&lt;br /&gt;
Nous commençons les recherches sur le projet et sur les premières technologies engagées dans celui-ci. Nous en profitons pour formuler dès à présent des questions sur le bon choix de celles-ci. Nous commençons donc des tests ayant seulement pour but de nous familiariser avec l'environnement de travail et de réellement comprendre les fonctions déjà présentes qu'il faudra exploiter et implanter notre interface web.&lt;br /&gt;
Nous créons un dépôt Gitlab avec notre tuteur et commençons a définir les taches premières sur celui-ci.&lt;br /&gt;
Nous en profitons pour affiner le Mind Map.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 2'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Jeu 05/10/17 - Ven 06/10/17]]''  &lt;br /&gt;
*Précisions sur le cahier des charges&lt;br /&gt;
*Listage du matériel&lt;br /&gt;
*Recherche et détermination de solutions technologiques possibles pour les fonctions demandées&lt;br /&gt;
*Début du travail sur le serveur de collecte&lt;br /&gt;
*Apprentissage du langage Python et de l'utilisation du framework Flask&lt;br /&gt;
&lt;br /&gt;
Nous avons finalisé les précisions sur le cahier des charges. Nous avons donc pu cibler le matériel dont nous nous servirons pour ce Projet. Vous trouverez donc cette liste la section correspondante. Il est évident que le matériel utilisé est dans l'ensemble déjà fourni par le laboratoire et qu'il nous reste dans l'ensemble à créer l'interface web et les API qui nous permettrons de faire communiquer cette interface avec la Raspberry Pi et le serveur de position déjà créé.&lt;br /&gt;
Nous avons donc pu commencer à nous former sur les technologies qui nous serviraient par la suite. Nous avons donc utilisé le cours d'Openclassrooms sur les serveurs Flask pour en apprendre les bases. Ce serveur Flask est programmé en Python et nous permet donc une grande liberté au niveau de l’exécution de certains scripts. En effet, les scripts de connexion Bluetooth et de redirection de port qui nous permettent de récupérer les données de distance sont eux-mêmes codés en Python et sont directement appelés via le serveur.&lt;br /&gt;
Dans ce serveur, représentant notre interface web, vous retrouverez la page '''/collecte''' qui représentera notre partie collecte de données ainsi que l'affichage de ces distances. Nous appellerons cette partie le Serveur de Collecte.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 3'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 11/10/17 - Jeu 12/10/17]]''  &lt;br /&gt;
*Recherche et développement initial du serveur de collecte de données&lt;br /&gt;
*Complément du Git sur les tâches à effectuer&lt;br /&gt;
&lt;br /&gt;
Nous avons commencé à créer un serveur Flask renvoyant pour l'instant une matrice aléatoire. Lors de la requête URL &amp;quot;../matrice&amp;quot;, nous voyons bien une matrice aléatoire apparaître sur la page Web. Nous essayons de nous connecter à la Raspberry Pi en redirigeant son port série vers le Bluetooth de façon à récupérer de vraies matrices de distance entre le drone (ie commutateur central) et les balises. Nous pourrons afficher ensuite ces matrices, ou alors les stocker dans un fichier en attendant le traitement de celles-ci.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Requete s3.PNG|300px|serveur Flask]]&lt;br /&gt;
&lt;br /&gt;
Nous avons plusieurs problèmes avec le Bluetooth pour se connecter avec la Raspberry Pi. Quand nous aurons réussi à nous connecter au port série de la Raspberry Pi alors nous pourrons gérer le traitement des données récupérées.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 4'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 18/10/17 - Jeu 19/10/17]]''  &lt;br /&gt;
*Configuration de la Raspberry Pi car problèmes de connectivité Bluetooth rencontrés&lt;br /&gt;
**Nous arrivons à connecter la Raspberry Pi sous Windows mais la connexion sous Linux pose problème (travail en suspens en attendant la disponibilité de l'encadrant)&lt;br /&gt;
*Début du développement de l'interface Web&lt;br /&gt;
**Traitement d'une matrice dans un fichier JSON&lt;br /&gt;
**Affichage sous forme de tableau de la matrice&lt;br /&gt;
**Utilisation du serveur de requête en Python avec chargement de template HTML&lt;br /&gt;
**Mise en forme de la trame de la page en HTML/CSS avec le framework Bootstrap&lt;br /&gt;
**Ajout d'un set de distances (d1, d2, d3, d4) dans la matrice lors d'un appui sur un bouton Chargement en utilisant un fichier Javascript&lt;br /&gt;
&lt;br /&gt;
Nous avons reçu des fonctions Python de notre tuteur afin d'obtenir une connexion Bluetooth entre notre Raspberry Pi et notre ordinateur ainsi qu'une redirection de port de celle-ci vers la connexion. Nous n'arrivons pas à utiliser ces fonctions sous linux et nous nécessitons une explication de notre tuteur n'étant pas disponible à ce moment. Pour ne pas perdre de temps, nous attaquons la création de l'interface web à proprement parler, c'est à dire la création des pages HTML ainsi que le document Javascript qui nous servira de bibliothèque de fonctions. Chaque route de notre serveur est reliée à une série de fonctions Python s'exécutant à l'appel des url puis suivies d'un template de la page HTML en question. Nous en profitons de plus pour explorer le framework CSS bootstrap afin de mettre un premier design et une structure a notre page collecte qui sera la page principale de notre site pour ce début de projet.&lt;br /&gt;
&lt;br /&gt;
Nous nous essayons de plus à différents tests sur des fichiers de format '''JSON''' que nous devrons réussir à traiter correctement plus tard dans notre projet.&lt;br /&gt;
Nous récupérons une matrice que nous créons nous-mêmes en Python (simulation d'une série de distances récupérée) que nous transformons au format JSON pour ensuite l'afficher sur notre page web. Pour pouvoir proprement afficher ce fichier '''JSON''' renvoyé vers notre page, nous nous servons du fichier Javascript afin de créer du code HTML contenant la matrice.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 5'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 25/10/17 - Ven 27/10/17]]''  &lt;br /&gt;
*Résolution des problèmes de connectique Bluetooth sur la Raspberry Pi&lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Traitement d'une matrice dans un fichier JSON&lt;br /&gt;
**Début de l'ajout d'un set de distances depuis une matrice contenue dans un fichier JSON&lt;br /&gt;
&lt;br /&gt;
Nous avons pu nous entretenir avec notre tuteur et donc comprendre les fonctions de connexion et de redirection de port. Nous pouvons donc continuer le développement de notre interface web. Nous arrivons à traiter un set de données au format JSON et à l'afficher dans le code HTML. Toutefois nous créons nous-mêmes ce set, il est maintenant nécessaire que nous arrivions à récupérer les sets de distance réels reçus par la connexion Bluetooth. Nous commencerons par un traitement asynchrone. L'idée est d’enregistrer les sets de distances dans un fichier '''JSON''' stocké dans un dossier. Nous appellerons ce dossier plus tard via une requête Ajax.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 6'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 08/11/17 - Ven 10/11/17]]''  &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
**Mise en place de la communication entre le port série de notre machine et le port série de la carte via Bluetooth de la RPi3&lt;br /&gt;
**Récupération et traitement (parse) manuels des données de distances dans un fichier .log via TCP/IP&amp;lt;-&amp;gt;Bluetooth&lt;br /&gt;
**Début de l'automatisation du procédé par script Python (requete.py) et mise en place de sockets de communication&lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Chargement sur commande d'un set de distances depuis une matrice contenue dans un fichier JSON&lt;br /&gt;
*Travail sur le layout du site&lt;br /&gt;
&lt;br /&gt;
Après avoir regardé le code de ces différentes fonctions nous avons pu faire des tests manuels via le Shell pour récupérer des données de distances et les stocker dans un fichier '''JSON''' sur notre ordinateur.&lt;br /&gt;
&lt;br /&gt;
Nous utilisons les commandes suivantes pour se connecter via Bluetooth:&lt;br /&gt;
&lt;br /&gt;
 rfcomm connect /dev/rfcomm0 B8:27:EB:80:DC:89 1&lt;br /&gt;
&lt;br /&gt;
Rediriger le port de la Raspberrypi3 vers la connexion:&lt;br /&gt;
&lt;br /&gt;
 Python lps-collector/tcp_serial_redirect.py /dev/rfcomm0 9600&lt;br /&gt;
&lt;br /&gt;
Collecter les données dans un fichier dont nous définissons le nom:&lt;br /&gt;
&lt;br /&gt;
 echo &amp;quot;cu -s9600 -lttyACM0&amp;quot;| nc localhost 7777&lt;br /&gt;
 nc localhost 7777 | grep distance &amp;gt; static/log/dist-capture'+date+'.log&lt;br /&gt;
&lt;br /&gt;
Nous pouvons '''parser''' le flux de données avant de le stocker dans le fichier via cette commande:&lt;br /&gt;
&lt;br /&gt;
 Python lps-collector/lps_parse.py static/log/dist-capture&amp;quot;+date+&amp;quot;.log&lt;br /&gt;
&lt;br /&gt;
Il est donc nécessaire d'inclure via des '''thread''' ces différentes fonctions dans notre serveur Python (Flask) afin d'automatiser le processus. Le but est de pouvoir choisir sur l'interface web quels fonctions il faut exécuter et les déclencher via l'appui sur des boutons.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 7'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 15/11/17 - Ven 17/11/17]]''  &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
**Récupération et traitement (parse) manuels des données de distances dans un fichier .log via TCP/IP&amp;lt;-&amp;gt;Bluetooth&lt;br /&gt;
**Automatisation du procédé par script Python (requete.py)&lt;br /&gt;
***Mise en place de sockets de communication pour le contrôle de la collecte -&amp;gt; abandonné (servait à commander la collecte manuellement)&lt;br /&gt;
***Développement d'un script engine.py regroupant les commandes exécutables par l'utilisateur via la page Web&lt;br /&gt;
***Début du travail sur la fonction &amp;quot;STOP&amp;quot; manuel d'une action de collecte de données (liaison entre script HTML, Javascript, et script Python)&lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Chargement sur commande d'un set de distances depuis une matrice contenue dans un fichier JSON&lt;br /&gt;
**Travail sur le layout du site&lt;br /&gt;
***Ajout des différentes commandes (connexion Bluetooth, lancement commande cu, collecte des données, collecte durée donnée)&lt;br /&gt;
***Début de l'implémentation de la visualisation des fichiers .JSON obtenus après collecte et affichage dans un tableau matriciel du fichier sélectionné&lt;br /&gt;
&lt;br /&gt;
Nous avons continué à travailler sur le serveur de collecte: les données que nous avons récupérées via Bluetooth sont stockées dans un fichier .log. Apres avoir bien compris comment marchait la fonction '''parse''' manuellement (lors de son utilisation dans le Shell), nous l'avons implémentée dans notre serveur de collecte qui lance cette commande lors de l’appui sur un bouton via notre interface virtuelle. Un problème rencontré était de savoir quand la récolte des données devait s’arrêter. Nous avons donc rajouté un temps à entrer nous-même sur l'interface. La fonction '''parse''' est effectuée et le sous-processus va attendre le temps donné avant de lancer une commande permettant de tuer le processus et mettant donc fin au remplissage du fichier '''.log'''. Nous voulons de plus réussir à lancer une fonction de collecte sans temps. C'est à dire que nous coupons la collecte via un bouton par nous-mêmes. Nous voulions utiliser des Sockets pour pouvoir définir nous-mêmes la gestion de la communication mais l'idée a été abandonné car nous avons réussi à sauvegarder le PID du processus lancé. Il nous suffit donc de l’arrêter grâce à un autre bouton qui récupère cette variable et l’arrête ensuite. &lt;br /&gt;
&lt;br /&gt;
Toutes nos fonctions Pythons étant regroupées dans notre serveur '''requete.py''', nous avons décidé de créer un module qui regroupera toutes ces fonctions que nous pourrons utiliser dans '''requete.py'''. ceci nous permet de voir plus clair dans notre code et de faciliter le travail lorsque nous modifions le code tous les deux.&lt;br /&gt;
&lt;br /&gt;
Nous essayons en continu d'adapter le layout du site pour le rendre le plus attractif et simple possible, de façon à ce que chaque bouton et tableau soient clairs et compréhensibles.&lt;br /&gt;
&lt;br /&gt;
Nous avons commencé à récupérer les fichiers '''JSON''' créés à partir des fichier '''log''', c'est-à-dire que ces fichiers sont automatiquement stockés coté serveur dans un dossier nommé '''static/log'''. Notre but est de récupérer le nom des fichiers JSON et de les afficher dans un composant sur notre interface web. Il nous sera donc possible ensuite de sélectionner le nom d'un fichier. Lors de la sélection de ce nom de fichier, un tableau apparaît avec les valeurs de distances à l’intérieur.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 8'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 22/11/17 - Ven 24/11/17]]''  &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
**Automatisation du procédé de collecte par script Python (requete.py qui fait appel à engine.py)&lt;br /&gt;
***Développement d'un script engine.py regroupant les commandes exécutables par l'utilisateur via la page Web&lt;br /&gt;
***Travail sur la fonction &amp;quot;STOP&amp;quot; manuel d'une action de collecte de données (liaison entre script HTML, Javascript, et script Python)&lt;br /&gt;
***Mise en place d'un serveur HTTP Simple sous Python pour accéder aux fichiers de données à partir de la page Web&lt;br /&gt;
***Mise à jour de fonctions de connexion &lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Travail sur le layout du site (ajout de pages, navigation entre les pages, apparence, nettoyage des codes)&lt;br /&gt;
**Bon fonctionnement de l'ensemble serveur collecte + serveur HTTP + client Web&lt;br /&gt;
**Affichage de la liste des fichiers de données de distance (log, csv, JSON) via serveur HTTP en Python sur port 9999&lt;br /&gt;
*Corrections et nettoyage du dépôt GIT&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous continuons à développer les points énoncés la semaine dernière. Nous avons décidé de nous diriger vers un serveur HTTP Simple pour accéder à nos fichiers. Il s’avère que nous finirons par ne pas utiliser ce serveur. Nous irons récupérer les fichiers en question via des requêtes '''Ajax''' faites à la sélection du nom du fichier.&lt;br /&gt;
&lt;br /&gt;
Nous rencontrons depuis le début des problèmes avec les fonctions de connexion qui peuvent ne pas marcher à un moment donné. Nous essayons de trouver pourquoi ce bug est un bug qui ne se produit pas à chaque fois. Nous avons déterminé qu'il ne se produisait seulement lorsque les fonctions de connexions étaient lancée dans des threads. Nous ne savons toujours pas pourquoi ces thread bugguent seulement parfois et non à chaque essai de connexion.&lt;br /&gt;
&lt;br /&gt;
Nous avons nettoyé notre dépot '''Git''' car il s’avère que nous utilisions une mauvaise méthode de fusion et de stockage des documents.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 9'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 29/11/17 - Jeudi 30/11/17]]''  &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
**Automatisation du procédé de collecte par script Python (requete.py qui fait appel à engine.py)&lt;br /&gt;
***Travail sur la fonction &amp;quot;STOP&amp;quot; manuel d'une action de collecte de données (liaison entre script HTML, Javascript, et script Python)&lt;br /&gt;
***Recherches sur l'utilisation de fichiers JSON accessibles via le serveur HTTP&lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Travail sur le layout du site &lt;br /&gt;
**Travail sur la liaison entre fichiers JSON et affichage Web des données de distance&lt;br /&gt;
***Recherches et tests de solutions&lt;br /&gt;
****Affichage depuis un fichier&lt;br /&gt;
****Affichage à la volée lors d'une action de collecte&lt;br /&gt;
&lt;br /&gt;
*Revue de code avec Roudy DAGHER:&lt;br /&gt;
**Structure globale des codes ok&lt;br /&gt;
**Fonctionnement presque ok: fonctionnalités implémentées ok, mais parsage csv ne marche pas&lt;br /&gt;
**Refactoring nécessaire&lt;br /&gt;
**Correction de la fonction STOP et amélioration de la fonction de COLLECTE&lt;br /&gt;
**Faire plus de requêtes Javascript que de requêtes HTML&lt;br /&gt;
**Discussion pour l'implémentation du serveur de localisation (= algorithme de localisation) et des visualisations de données sur le site Web&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous avons d'abord revu l'ensemble de notre code et les méthodes utilisées avec notre tuteur '''Roudy Dagher'''. Nous nous approchons d'un serveur de collecte de données stable et fonctionnel. Nous avons refait les différentes connexions entre l'interface et le serveur afin de ne faire que des requêtes sur des '''WebServices'''. Il nous est possible de commencer la deuxième partie qui est l'envoi de ces tableaux de données afin de les envoyer vers le serveur de localisation via des API afin de recevoir des matrices de positions.&lt;br /&gt;
Nous pourrons grâce à ces matrices afficher une carte 3D des balises  et du TAG dans l'espace.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 10'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 06/12/17 - Jeudi 07/12/17]]'' &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
**Travail sur la fonction STOP&lt;br /&gt;
**Réalisation d'une expression régulière pour le parsage des fichiers log en fichier JSON&lt;br /&gt;
&lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Travail sur l'affichage des fichiers JSON&lt;br /&gt;
***Réalisation de toutes les requêtes Ajax&lt;br /&gt;
***Réalisation d'un menu déroulant dropdown pour charger le contenu des fichiers JSON dans le tableau de distances&lt;br /&gt;
&lt;br /&gt;
*Nettoyage du dépôt Git&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 11'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 13/12/17]]''  &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
&lt;br /&gt;
*Revue de code avec Roudy DAGHER:&lt;br /&gt;
**Discussion sur la partie système du projet et correction de certaines fonctions&lt;br /&gt;
&lt;br /&gt;
Nous nous sommes réunis avec l'un de nos tuteurs, qui a réalisé certains bouts de code de base, pour nous mettre au point sur les fonctions en question et leur utilisation.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 12'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 20/12/17 - Jeudi 21/12/17]]''&lt;br /&gt;
*Revue, correction et nettoyage des codes&lt;br /&gt;
*Finalisation du rapport&lt;br /&gt;
*Planification de semaines restantes&lt;br /&gt;
*Préparation de la soutenance&lt;br /&gt;
*Revue de mi-projet avec tous les tuteurs&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Cette dernière semaine a servi à finaliser le rapport et à discuter de l'avancée du projet, notamment avec nos tuteurs pour déterminer le travail restant, présenter le travail abouti et replanifier précisément les échéances pour le travail restant. Nous avons réalisé la soutenance de mi-projet le '''jeudi 21/12/17 à 8h'''.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 13'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 10/01/18 - Ven 12/01/18]]''  &lt;br /&gt;
*Travail sur la collecte des données (serveur de collecte et interface Web)&lt;br /&gt;
**Redéfinition du fichier de parsage car il crée des conflits et ne produit pas un fichier formaté de la façon attendue&lt;br /&gt;
***Nombre de balises réel n'est pas bien déterminé par le code&lt;br /&gt;
***ID de la première et de la dernière balise ne sont pas déterminés correctement&lt;br /&gt;
&lt;br /&gt;
**Automatisation de la collecte par un script Shell lançant toutes les commandes de CONNEXION, REDIRECTION, LANCEMENT CU, FERMETURE DU PROGRAMME (kill rfcomm / kill tcp_redirect)&lt;br /&gt;
***Dans le but d'automatiser la procédure&lt;br /&gt;
***Dans le but de résoudre un problème de gestion de ressources (le bug '''thread''' apparu plus tôt dans le projet)&lt;br /&gt;
&lt;br /&gt;
**Travail sur la résolution du bug thread car l'automatisation n'a pas résolu le problème&lt;br /&gt;
***Identification du ou des causes potentielles: gestion des ressources (synchrone, asynchrone ?), connexion Bluetooth, lancement des commandes dans le même script, lancement en fg/bg, conflit dû au temps d'exécution de chaque processus ?&lt;br /&gt;
***Lancement des commandes manuellement dans des terminaux ne pose aucun problème: solution la plus simple&lt;br /&gt;
&lt;br /&gt;
**Redesign de la page Collecte&lt;br /&gt;
***Remplacement des boutons de commande par un bouton unique d'initialisation&lt;br /&gt;
***Travail sur une mise à jour du menu déroulant dropdown régulière sans avoir à recharger la page Web&lt;br /&gt;
***Implémentation de plotly.js, un module Javascript qui permet d'afficher des graphes en 3D&lt;br /&gt;
&lt;br /&gt;
*Mise au point post-soutenance avec Roudy DAGHER pour valider le travail restant, effectué et redéfinir certains objectifs atteignables ou pas selon les éléments réalisés dans le projet&lt;br /&gt;
*Recherches et début de l'implémentation du serveur de localisation fourni par les tuteurs&lt;br /&gt;
*Gestion du Git pour créer des branches additionnelles&lt;br /&gt;
*Recréation du rapport de projet suite à une perte du fichier éditable d'origine + Mise à jour avec les remarques suite à la soutenance ainsi que les nouveaux éléments&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 14'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mar 16/01/18 - Ven 19/01/18]]''  &lt;br /&gt;
*Travail sur la collecte des données (serveur de collecte et interface Web)&lt;br /&gt;
**Redéfinition du fichier de parsage car il crée des conflits et ne produit pas un fichier formaté de la façon attendue&lt;br /&gt;
***Corrigé: Nombre de balises réel n'est pas bien déterminé par le code&lt;br /&gt;
***Corrigé: ID de la première et de la dernière balise ne sont pas déterminés correctement&lt;br /&gt;
***Reste à faire: Traiter le cas où il y a un ajout ou suppression d'une balise pendant la collecte (pour le moment, lorsque c'est le cas, toutes les données se décalent au lieu de laisser des trous)&lt;br /&gt;
&lt;br /&gt;
**Automatisation de la collecte par un script Shell lançant toutes les commandes de CONNEXION, REDIRECTION, LANCEMENT CU, FERMETURE DU PROGRAMME (kill rfcomm / kill tcp_redirect)&lt;br /&gt;
***Mis en suspens: pour le moment, on lance les commandes manuellement dans le terminal&lt;br /&gt;
&lt;br /&gt;
**Interface Web&lt;br /&gt;
***Implémentation de plotly.js, un module Javascript qui permet d'afficher des graphes en 3D&lt;br /&gt;
&lt;br /&gt;
*Implémentation du serveur de localisation fourni par les tuteurs (mais algorithme de localisation pas fonctionnel pour le moment)&lt;br /&gt;
**Mise à jour de l'affichage des positions des éléments: précédemment seule la matrice X de position du Tag s'affichait, et pas la matrice A des balises&lt;br /&gt;
**Requêtes manuelles à l'API avec la fonction curl OK: on arrive à récupérer les matrices X et A (aléatoires pour le moment) par une requête GET à l'API du serveur de localisation&lt;br /&gt;
**Implémentation des requêtes Ajax pour automatiser les requêtes au serveur de localisation&lt;br /&gt;
&lt;br /&gt;
*Mise à jour du rapport les nouveaux éléments du travail réalisé&lt;br /&gt;
*Réflexion sur la possibilité ou non de réaliser la partie temps réel du projet au vu des moyens à disposition&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 15'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mar 23/01/18 - Ven 26/01/18]]'' &lt;br /&gt;
*Travail sur la collecte des données (serveur de collecte et interface Web)&lt;br /&gt;
**Redéfinition du fichier de parsage car il crée des conflits et ne produit pas un fichier formaté de la façon attendue&lt;br /&gt;
***Fait: Si distance négative car Tag trop près, la valeur négative générée par une balise est remplacée par un &amp;quot;0&amp;quot; (cela modifie la position réelle modélisée dans plotly, mais évite une impossibilité de générer la position à partir de la distance -&amp;gt; par des tests, il faudra déterminer la valeur limite à partir de laquelle les cartes donnent des valeurs de distance négatives&lt;br /&gt;
***Reste à faire: Traiter le cas où il y a un ajout ou suppression d'une balise pendant la collecte (pour le moment, lorsque c'est le cas, toutes les données se décalent au lieu de laisser des trous); Ainsi que le cas où il y un saut/bug inattendu et donc une disparition d'une ou plusieurs valeurs de distance&lt;br /&gt;
***Début de résolution du cas où une distance n'est pas prise en compte, c'est à dire où il y a une valeur qui disparaît et désaligne les valeurs lors de la création du JSON&lt;br /&gt;
&lt;br /&gt;
**Automatisation de la collecte par un script Shell lançant toutes les commandes de CONNEXION, REDIRECTION, LANCEMENT CU, FERMETURE DU PROGRAMME (kill rfcomm / kill tcp_redirect)&lt;br /&gt;
***Mis en suspens: pour le moment, on lance les commandes manuellement dans le terminal&lt;br /&gt;
***Création d'un script bash /etc/init.d/autoconnect.sh pour connecter automatiquement la RPi au lancement du système (si la RPi est déjà allumée au démarrage)&lt;br /&gt;
&lt;br /&gt;
**Interface Web&lt;br /&gt;
***Perfectionnement de l'utilisation de Plotly pour les visualisations&lt;br /&gt;
&lt;br /&gt;
*Implémentation du serveur de localisation fourni par les tuteurs (algorithme de localisation pas fonctionnel pour le moment)&lt;br /&gt;
**Requêtes manuelles à l'API avec la fonction curl OK&lt;br /&gt;
**Fait: Implémentation des requêtes Ajax pour automatiser les requêtes au serveur de localisation&lt;br /&gt;
***Liaison entre les différentes requêtes ajax grâce à des variables: permet de stocker l'adresse du job récupérée par la méthode GET&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 16'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Lun 29/01/18 - Ven 02/02/18]]'' &lt;br /&gt;
*Travail sur la collecte des données (serveur de collecte et interface Web)&lt;br /&gt;
**Redéfinition du fichier de parsage car il crée des conflits et ne produit pas un fichier formaté de la façon attendue&lt;br /&gt;
***déterminer la valeur limite à partir de laquelle les cartes donnent des valeurs de distance négatives&lt;br /&gt;
***Reste à faire: Traiter le cas où il y a un ajout ou suppression d'une balise pendant la collecte (pour le moment, lorsque c'est le cas, toutes les données se décalent au lieu de laisser des trous); Ainsi que le cas où il y un saut/bug inattendu et donc une disparition d'une ou plusieurs valeurs de distance&lt;br /&gt;
***Fait: gestion des bugs/sauts de valeurs de balises - remplacement par une valeur nulle sur balise existe, par rien sinon (implémentation d'un tableau caractérisant l'existence ou pas de chaque balise 1 à 6), optimisation des temps de calculs/exécution dans le script&lt;br /&gt;
**Interface Web&lt;br /&gt;
***Ajout d'une barre de progression de la collecte remplaçant le bouton de Lancement de collecte lors de l'appui&lt;br /&gt;
***Ajout d'un bouton dropdown pour afficher les fichiers de position qu'on reçoit du serveur de localisation&lt;br /&gt;
***Ajout d'une scrollbar dans les deux dropdown&lt;br /&gt;
&lt;br /&gt;
*Implémentation du serveur de localisation fourni par les tuteurs (algorithme de localisation pas fonctionnel pour le moment)&lt;br /&gt;
**Fait: Implémentation des requêtes Ajax pour automatiser les requêtes au serveur de localisation&lt;br /&gt;
***Création d'une requête Ajax GET qui demande le fichier JSON de position au serveur de localisation jusqu'à ce qu'il soit retourné&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 17'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Lun 05/02/18 - Ven 09/02/18]]''&lt;br /&gt;
&lt;br /&gt;
*Algorithme de localisation mis en ligne par le tuteur&lt;br /&gt;
**test du bon fonctionnement des connections entre parties après intégration de l'algorithme&lt;br /&gt;
**test su la qualité de l'algorithme&lt;br /&gt;
**test sur la précision de l'algorithme&lt;br /&gt;
*Rapport partie Front-end&lt;br /&gt;
*Rapport partie Back-end&lt;br /&gt;
*Nettoyage du code requete.py&lt;br /&gt;
*Mise à jour final des de certes pages du site&lt;br /&gt;
** matrice.html à jour&lt;br /&gt;
**3D.html à jour&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 18'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Lun 12/02/18 - Ven 16/02/18]]''&lt;br /&gt;
&lt;br /&gt;
*Algorithme de localisation mis en ligne par le tuteur&lt;br /&gt;
**test de perturbation et des limites du systeme d'antenne Locopositioning&lt;br /&gt;
*Rapport partie III &lt;br /&gt;
*rapport partie I&lt;br /&gt;
*réalisation de la vidéo de présentation&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 19'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Lun 19/02/18 - Ven 23/02/18]]''&lt;br /&gt;
&lt;br /&gt;
*Présentation de l'application à l'un des chercheur de l’INRIA en charge de la suite du projet et de l'algorithme de localisation&lt;br /&gt;
*création de la diapositive de la soutenance.&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Délivrables'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
Rapport de mi-PFE&lt;br /&gt;
[[Fichier:RapportMi-PFE-UNG DELATTE.pdf]]&lt;br /&gt;
&lt;br /&gt;
Rapport de PFE&lt;br /&gt;
&lt;br /&gt;
Vidéo&lt;/div&gt;</summary>
		<author><name>Hdelatte</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=P18_Localisation_of_quadrotors&amp;diff=51102</id>
		<title>P18 Localisation of quadrotors</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=P18_Localisation_of_quadrotors&amp;diff=51102"/>
				<updated>2018-02-16T15:26:32Z</updated>
		
		<summary type="html">&lt;p&gt;Hdelatte : /* Observations */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Cahier des charges'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;Présentation générale du projet&amp;lt;/span&amp;gt;=== &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Contexte&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
Dans un monde de plus en plus connecté, de nombreux drones sont déployés pour diverses applications comme l'espionnage, la surveillance, la cartographie de lieux et la livraison de colis. Les technologies nécessaires pour contrôler ces drones sont des sujets de recherche actuels. &lt;br /&gt;
&lt;br /&gt;
Le contrôle de ceux-ci passe tout d'abord par la maîtrise de leur position dans l'espace. Le développement des applications liées à l'utilisation de drones nécessite un travail important sur la localisation spatiale d'objets connectés. &lt;br /&gt;
&lt;br /&gt;
De plus, dans un souci d'utilisation, il est essentiel de développer des interfaces logicielles permettant d'exploiter ces données.&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Objectif du projet&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
L'objectif de ce projet est de développer une interface logicielle permettant de traiter en temps réel les informations de localisation d'un drone et de balises, dans le but de définir leur localisation dans l'espace, en intérieur.&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Description du projet&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
Pour réaliser le contrôle de drones, la première étape importante est de donner ses informations de position. Le but du projet est de développer une interface logicielle permettant de localiser le drone en temps réel en intérieur. Le drone se déplace dans un environnement dans lequel ont été installées de multiples balises. Il est équipé d'une carte, lui permettant de recevoir les distances relatives entre lui-même et les balises, sur laquelle différents algorithmes vont être implémentés pour effectuer la localisation en temps réel. Le projet requiert des compétences en développement hardware (Crazyflie 2.0, voir https://wiki.bitcraze.io/) et software (langage C/C++/Python/Javascript/HTML...).&lt;br /&gt;
&lt;br /&gt;
Il se divise en 4 étapes principales, qui sont:&lt;br /&gt;
*1) Choisir les technologies utilisées&lt;br /&gt;
*2) Choisir l'architecture (OS / APIs)&lt;br /&gt;
*3) Développer les différentes parties du projet&lt;br /&gt;
*4) Intégrer et connecter les différentes parties du projet&lt;br /&gt;
&lt;br /&gt;
La localisation étant en intérieur, le protocole GPS n'est donc pas assez précis pour les applications ciblées. La mise en place d'un tel dispositif permettrait grâce à l'utilisation d'un algorithme d'estimer avec une bonne précision les positions en intérieur d'une balise centrale (appelée Tag) et de balises (appelées Anchor). Le Tag scanne en temps réel la distance relative aux différentes balises, et il nous est retourné la position des balises et du Tag grâce à l'algorithme de localisation.&lt;br /&gt;
&lt;br /&gt;
Le projet se compose de 3 parties:&lt;br /&gt;
* Collect &amp;amp; parse: collecter les données envoyées par les balises en communiquant avec un serveur et récupérer les données adéquates par un tri&lt;br /&gt;
* Localise: déterminer la matrice de position des balises et du Tag en traitant les données récupérées&lt;br /&gt;
* Display: développer l'interface homme machine pour afficher, étudier et utiliser les données traitées&lt;br /&gt;
&lt;br /&gt;
Nous travaillerons dans un premier temps dans une optique temps différé avant de travailler en temps réel. Cela nous permettra d'acquérir des données utiles et réutilisables en aval. &lt;br /&gt;
&lt;br /&gt;
A l'aboutissement du projet, nous devrions être capable via l'interface homme machine développée d'afficher précisément la position spatiale des balises ainsi que du Tag, grâce àl'utilisation d'un algorithme de localisation et des données récupérées, et d'afficher d'autres données relatives au déplacement du Tag ou des balises dans l'espace. &lt;br /&gt;
&lt;br /&gt;
Si le temps le permet, nous pourrons aussi être amenés à adapter et utiliser l'interface développée pour l'utilisation d'un drone.&lt;br /&gt;
&lt;br /&gt;
''Sujet originel''&lt;br /&gt;
&lt;br /&gt;
To achieve the control of quadrotors, the first important task to give its position information. This project is to develop a software(GUI) to localize the quadrotors in real-time. The quadrotor is flying in an environment where several transmitters have been installed. The quadrotor is equipped with a deck to receive the relative distances between the deck and all transmitters, based on which different algorithms will be implemented to realize the real-time localization. The candidates need to have both experiences on hardware (Crazyflie 2.0, see https://wiki.bitcraze.io/) and software development (C/C , Python…). &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Calendrier prévisionnel&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
''[[Avant le 29/09/17]]'' - Élaboration du Cahier des charges, de la liste des tâches et du calendrier prévisionnel&lt;br /&gt;
&lt;br /&gt;
''[[Avant fin Octobre]]'' - Serveur de collecte et début du développement de l'interface logicielle&lt;br /&gt;
&lt;br /&gt;
''[[Avant fin Décembre]]'' - Interface logicielle&lt;br /&gt;
&lt;br /&gt;
''[[A la fin du PFE]]'' - Intégration finale des différentes parties (Serveur de collecte des données &amp;amp; Serveur de localisation &amp;amp; Interface logicielle)&lt;br /&gt;
&lt;br /&gt;
Répartition du volume de travail (***h):&lt;br /&gt;
&lt;br /&gt;
* Recherche sur les technologies à utiliser&lt;br /&gt;
* Développement du serveur de collecte de données&lt;br /&gt;
* Réalisation de l'interface logicielle (Web//Logiciel/Application)&lt;br /&gt;
* Intégration des différentes parties&lt;br /&gt;
* Test et débuggage&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Choix techniques : matériel et logiciel&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
Afin de développer ce dispositif, nous allons utiliser une Raspberry Pi 3 associée à une carte réceptrice, qui communique avec 4 balises composées chacune d'un microcontrôleur et d'une carte émettrice radio (UWB5C) et alimentées par batteries. La carte réceptrice joue le rôle du drone à localiser et communiquera les données émises par les balises vers l'ordinateur via Bluetooth.&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Choix technologiques&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
Voici les technologies que nous utilisons pour chacune des parties de ce projet.&lt;br /&gt;
&lt;br /&gt;
    1) Serveur de collecte des données:&lt;br /&gt;
       Scanne et parse les données récupérées pour fournir la matrice D des distances relatives du tag aux 4 balises&lt;br /&gt;
        - API&lt;br /&gt;
        - Python / Serveur Flask&lt;br /&gt;
&lt;br /&gt;
    2) Serveur de localisation (fourni):&lt;br /&gt;
       Calcule grâce à l'algorithme de localisation et la matrice D les positions spatiales des 4 noeuds et du tag&lt;br /&gt;
        - API&lt;br /&gt;
        - Bootstrap&lt;br /&gt;
        - Jquery&lt;br /&gt;
        - Python&lt;br /&gt;
&lt;br /&gt;
    3) Interface utilisateur:&lt;br /&gt;
       Affiche courbes, visualisation 3D, boutons ou données des fichiers envoyées par le serveur de localisation&lt;br /&gt;
        - HTML5 / Javascript&lt;br /&gt;
        - Fichiers JSON (serveurs de collecte et de localisation)&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Calendrier prévisionnel'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Liste des tâches à effectuer&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
# Se documenter sur le projet&lt;br /&gt;
##Langages et technologies utilisées&lt;br /&gt;
##Matériel utilisé&lt;br /&gt;
##Mettre en place du travail sur le Git&lt;br /&gt;
# Réaliser le serveur de collecte&lt;br /&gt;
##Récupérer les trames envoyées par bluetooth par le TAG via la Raspberry Pi&lt;br /&gt;
##Intégrer le serveur de localisation pour interpréter les trames&lt;br /&gt;
##Tester et optimiser&lt;br /&gt;
# Réaliser l'interface Web utilisateur&lt;br /&gt;
##Implémenter le serveur de collecte et de localisation&lt;br /&gt;
##Afficher et traiter les données stockées dans les fichiers JSON via le serveur (temps différé + temps réel)&lt;br /&gt;
##Tester et optimiser&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;Replanification du cahier des charges / calendrier&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Feuille d'heures'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Tâche !! Prélude !! Heures S1 !! Heures S2 !! Heures S3 !! Heures S4 !! Heures S5 !! Heures S6 !! Heures S7 !! Heures S8 !! Heures S9 !! Heures S10 !! Heures S11 !! Heures S12 !! Heures S13 !! Heures S14 !! Heures S15 !! Heures S16 !! Heures S17 !! Heures S18 !! Heures S19 !! Total&lt;br /&gt;
|-&lt;br /&gt;
| Cahier des charges / Wiki / Gitlab / Rapport&lt;br /&gt;
|  4h&lt;br /&gt;
|  3h&lt;br /&gt;
|  1h&lt;br /&gt;
|  x&lt;br /&gt;
|  1h30&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h30&lt;br /&gt;
|  1h&lt;br /&gt;
|  3h&lt;br /&gt;
|  3h30&lt;br /&gt;
|  2h&lt;br /&gt;
|  5h&lt;br /&gt;
|  x&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Documentation sur les technos utilisées&lt;br /&gt;
|  2h&lt;br /&gt;
|  4h&lt;br /&gt;
|  3h&lt;br /&gt;
|  2h&lt;br /&gt;
|  3h&lt;br /&gt;
|  4h&lt;br /&gt;
|  5h&lt;br /&gt;
|  5h30&lt;br /&gt;
|  4h30&lt;br /&gt;
|  3h30&lt;br /&gt;
|  2h&lt;br /&gt;
|  3h&lt;br /&gt;
|  1h&lt;br /&gt;
|  3h&lt;br /&gt;
|  4h&lt;br /&gt;
|  x&lt;br /&gt;
|  2h&lt;br /&gt;
|  &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Documentation sur le matériel&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  1h&lt;br /&gt;
|  1h&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Recherche et développement du serveur de collecte&lt;br /&gt;
|  x&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  3h&lt;br /&gt;
|  3h30&lt;br /&gt;
|  4h&lt;br /&gt;
|  5h&lt;br /&gt;
|  7h&lt;br /&gt;
|  4h30&lt;br /&gt;
|  0,5h&lt;br /&gt;
|  3h&lt;br /&gt;
|  4h&lt;br /&gt;
|  3h&lt;br /&gt;
|  x&lt;br /&gt;
|  4h&lt;br /&gt;
|  7h30&lt;br /&gt;
|  5h&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Recherche et développement de l'interface Web&lt;br /&gt;
|  x&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  3h&lt;br /&gt;
|  5h&lt;br /&gt;
|  6h&lt;br /&gt;
|  4h&lt;br /&gt;
|  7h&lt;br /&gt;
|  5h30&lt;br /&gt;
|  2h30&lt;br /&gt;
|  6h&lt;br /&gt;
|  8h&lt;br /&gt;
|  5h&lt;br /&gt;
|  1h&lt;br /&gt;
|  8h&lt;br /&gt;
|  4h&lt;br /&gt;
|  4h&lt;br /&gt;
|  &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Recherche et intégration du serveur de localisation&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x &lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  6h&lt;br /&gt;
|  5h&lt;br /&gt;
|  3h&lt;br /&gt;
|  &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Intégration des différentes parties&lt;br /&gt;
|  x&lt;br /&gt;
|  x  &lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  2h&lt;br /&gt;
|  2h&lt;br /&gt;
|  2h&lt;br /&gt;
|  3h&lt;br /&gt;
|  1h30&lt;br /&gt;
|  x&lt;br /&gt;
|  3h&lt;br /&gt;
|  6h&lt;br /&gt;
|  5h&lt;br /&gt;
|  x&lt;br /&gt;
|  3h30&lt;br /&gt;
|  2h&lt;br /&gt;
|  2h&lt;br /&gt;
|  &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Tests et débuggage&lt;br /&gt;
|  x&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  1h&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  3h&lt;br /&gt;
|  4h&lt;br /&gt;
|  0,5h&lt;br /&gt;
|  3h&lt;br /&gt;
|  1h&lt;br /&gt;
|  3h&lt;br /&gt;
|  3h&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  4h&lt;br /&gt;
|  &lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Optimisation/Correction des programmes&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Vidéo&lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Avancement du Projet'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Phase préparatoire'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Jeu 21/09/17 - Ven 22/09/17]]'' &lt;br /&gt;
*Rendez-vous de mise au point du cahier des charges avec les encadrants/intervenants (M. ZHENG Gang et M. DAGHER Roudy)&lt;br /&gt;
*Elaboration du cahier des charges&lt;br /&gt;
*Elaboration de la page Wiki (préparation de la mise en page et présentation du sujet)&lt;br /&gt;
*Préparation du travail sous forme de Mind Map&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous nous sommes tout d’abord rendus au laboratoire de l'INRIA afin de pouvoir définir le plus précisément possible le cahier des charges avec nos tuteurs.&lt;br /&gt;
Nous avons donc défini avec eux les technologies qu'il faudrait étudier. Vous retrouverez le choix des technologies dans la partie '''choix technologiques'''&lt;br /&gt;
&lt;br /&gt;
Nous avons en même temps créé notre page Wiki, et structurée celle-ci avec les parties qui nous seraient utiles pour développer nos explications par la suite.&lt;br /&gt;
&lt;br /&gt;
Nous avons de plus découpé le travail en sous-parties que nous avions mis dans une '''Mind map''' afin d'y voir plus clair sur la ligne à suivre.&lt;br /&gt;
&lt;br /&gt;
Vous trouverez cette Mind map juste ci-dessous. Nous ne mettrons pas à jour cette Mind map chaque semaine mais il est fort probable que nous en refaisions un en milieu de projet pour pouvoir cibler les objectifs réussis et ceux à atteindre. Nous pourrons de plus redéfinir certains objectifs qui nous auraient semblés trop vague au début du projet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Projet de fin d'étude.png|centre|600px]]&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 1'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Jeu 28/09/17 - Ven 29/09/17]]'' &lt;br /&gt;
*Revue du Cahier des Charges avec les encadrants&lt;br /&gt;
*Lecture et recherches sur les technologies adaptées&lt;br /&gt;
*Construction de la suite de la Mind Map&lt;br /&gt;
*Création du Gitlab&lt;br /&gt;
&lt;br /&gt;
Nous commençons les recherches sur le projet et sur les premières technologies engagées dans celui-ci. Nous en profitons pour formuler dès à présent des questions sur le bon choix de celles-ci. Nous commençons donc des tests ayant seulement pour but de nous familiariser avec l'environnement de travail et de réellement comprendre les fonctions déjà présentes qu'il faudra exploiter et implanter notre interface web.&lt;br /&gt;
Nous créons un dépôt Gitlab avec notre tuteur et commençons a définir les taches premières sur celui-ci.&lt;br /&gt;
Nous en profitons pour affiner le Mind Map.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 2'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Jeu 05/10/17 - Ven 06/10/17]]''  &lt;br /&gt;
*Précisions sur le cahier des charges&lt;br /&gt;
*Listage du matériel&lt;br /&gt;
*Recherche et détermination de solutions technologiques possibles pour les fonctions demandées&lt;br /&gt;
*Début du travail sur le serveur de collecte&lt;br /&gt;
*Apprentissage du langage Python et de l'utilisation du framework Flask&lt;br /&gt;
&lt;br /&gt;
Nous avons finalisé les précisions sur le cahier des charges. Nous avons donc pu cibler le matériel dont nous nous servirons pour ce Projet. Vous trouverez donc cette liste la section correspondante. Il est évident que le matériel utilisé est dans l'ensemble déjà fourni par le laboratoire et qu'il nous reste dans l'ensemble à créer l'interface web et les API qui nous permettrons de faire communiquer cette interface avec la Raspberry Pi et le serveur de position déjà créé.&lt;br /&gt;
Nous avons donc pu commencer à nous former sur les technologies qui nous serviraient par la suite. Nous avons donc utilisé le cours d'Openclassrooms sur les serveurs Flask pour en apprendre les bases. Ce serveur Flask est programmé en Python et nous permet donc une grande liberté au niveau de l’exécution de certains scripts. En effet, les scripts de connexion Bluetooth et de redirection de port qui nous permettent de récupérer les données de distance sont eux-mêmes codés en Python et sont directement appelés via le serveur.&lt;br /&gt;
Dans ce serveur, représentant notre interface web, vous retrouverez la page '''/collecte''' qui représentera notre partie collecte de données ainsi que l'affichage de ces distances. Nous appellerons cette partie le Serveur de Collecte.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 3'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 11/10/17 - Jeu 12/10/17]]''  &lt;br /&gt;
*Recherche et développement initial du serveur de collecte de données&lt;br /&gt;
*Complément du Git sur les tâches à effectuer&lt;br /&gt;
&lt;br /&gt;
Nous avons commencé à créer un serveur Flask renvoyant pour l'instant une matrice aléatoire. Lors de la requête URL &amp;quot;../matrice&amp;quot;, nous voyons bien une matrice aléatoire apparaître sur la page Web. Nous essayons de nous connecter à la Raspberry Pi en redirigeant son port série vers le Bluetooth de façon à récupérer de vraies matrices de distance entre le drone (ie commutateur central) et les balises. Nous pourrons afficher ensuite ces matrices, ou alors les stocker dans un fichier en attendant le traitement de celles-ci.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Requete s3.PNG|300px|serveur Flask]]&lt;br /&gt;
&lt;br /&gt;
Nous avons plusieurs problèmes avec le Bluetooth pour se connecter avec la Raspberry Pi. Quand nous aurons réussi à nous connecter au port série de la Raspberry Pi alors nous pourrons gérer le traitement des données récupérées.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 4'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 18/10/17 - Jeu 19/10/17]]''  &lt;br /&gt;
*Configuration de la Raspberry Pi car problèmes de connectivité Bluetooth rencontrés&lt;br /&gt;
**Nous arrivons à connecter la Raspberry Pi sous Windows mais la connexion sous Linux pose problème (travail en suspens en attendant la disponibilité de l'encadrant)&lt;br /&gt;
*Début du développement de l'interface Web&lt;br /&gt;
**Traitement d'une matrice dans un fichier JSON&lt;br /&gt;
**Affichage sous forme de tableau de la matrice&lt;br /&gt;
**Utilisation du serveur de requête en Python avec chargement de template HTML&lt;br /&gt;
**Mise en forme de la trame de la page en HTML/CSS avec le framework Bootstrap&lt;br /&gt;
**Ajout d'un set de distances (d1, d2, d3, d4) dans la matrice lors d'un appui sur un bouton Chargement en utilisant un fichier Javascript&lt;br /&gt;
&lt;br /&gt;
Nous avons reçu des fonctions Python de notre tuteur afin d'obtenir une connexion Bluetooth entre notre Raspberry Pi et notre ordinateur ainsi qu'une redirection de port de celle-ci vers la connexion. Nous n'arrivons pas à utiliser ces fonctions sous linux et nous nécessitons une explication de notre tuteur n'étant pas disponible à ce moment. Pour ne pas perdre de temps, nous attaquons la création de l'interface web à proprement parler, c'est à dire la création des pages HTML ainsi que le document Javascript qui nous servira de bibliothèque de fonctions. Chaque route de notre serveur est reliée à une série de fonctions Python s'exécutant à l'appel des url puis suivies d'un template de la page HTML en question. Nous en profitons de plus pour explorer le framework CSS bootstrap afin de mettre un premier design et une structure a notre page collecte qui sera la page principale de notre site pour ce début de projet.&lt;br /&gt;
&lt;br /&gt;
Nous nous essayons de plus à différents tests sur des fichiers de format '''JSON''' que nous devrons réussir à traiter correctement plus tard dans notre projet.&lt;br /&gt;
Nous récupérons une matrice que nous créons nous-mêmes en Python (simulation d'une série de distances récupérée) que nous transformons au format JSON pour ensuite l'afficher sur notre page web. Pour pouvoir proprement afficher ce fichier '''JSON''' renvoyé vers notre page, nous nous servons du fichier Javascript afin de créer du code HTML contenant la matrice.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 5'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 25/10/17 - Ven 27/10/17]]''  &lt;br /&gt;
*Résolution des problèmes de connectique Bluetooth sur la Raspberry Pi&lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Traitement d'une matrice dans un fichier JSON&lt;br /&gt;
**Début de l'ajout d'un set de distances depuis une matrice contenue dans un fichier JSON&lt;br /&gt;
&lt;br /&gt;
Nous avons pu nous entretenir avec notre tuteur et donc comprendre les fonctions de connexion et de redirection de port. Nous pouvons donc continuer le développement de notre interface web. Nous arrivons à traiter un set de données au format JSON et à l'afficher dans le code HTML. Toutefois nous créons nous-mêmes ce set, il est maintenant nécessaire que nous arrivions à récupérer les sets de distance réels reçus par la connexion Bluetooth. Nous commencerons par un traitement asynchrone. L'idée est d’enregistrer les sets de distances dans un fichier '''JSON''' stocké dans un dossier. Nous appellerons ce dossier plus tard via une requête Ajax.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 6'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 08/11/17 - Ven 10/11/17]]''  &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
**Mise en place de la communication entre le port série de notre machine et le port série de la carte via Bluetooth de la RPi3&lt;br /&gt;
**Récupération et traitement (parse) manuels des données de distances dans un fichier .log via TCP/IP&amp;lt;-&amp;gt;Bluetooth&lt;br /&gt;
**Début de l'automatisation du procédé par script Python (requete.py) et mise en place de sockets de communication&lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Chargement sur commande d'un set de distances depuis une matrice contenue dans un fichier JSON&lt;br /&gt;
*Travail sur le layout du site&lt;br /&gt;
&lt;br /&gt;
Après avoir regardé le code de ces différentes fonctions nous avons pu faire des tests manuels via le Shell pour récupérer des données de distances et les stocker dans un fichier '''JSON''' sur notre ordinateur.&lt;br /&gt;
&lt;br /&gt;
Nous utilisons les commandes suivantes pour se connecter via Bluetooth:&lt;br /&gt;
&lt;br /&gt;
 rfcomm connect /dev/rfcomm0 B8:27:EB:80:DC:89 1&lt;br /&gt;
&lt;br /&gt;
Rediriger le port de la Raspberrypi3 vers la connexion:&lt;br /&gt;
&lt;br /&gt;
 Python lps-collector/tcp_serial_redirect.py /dev/rfcomm0 9600&lt;br /&gt;
&lt;br /&gt;
Collecter les données dans un fichier dont nous définissons le nom:&lt;br /&gt;
&lt;br /&gt;
 echo &amp;quot;cu -s9600 -lttyACM0&amp;quot;| nc localhost 7777&lt;br /&gt;
 nc localhost 7777 | grep distance &amp;gt; static/log/dist-capture'+date+'.log&lt;br /&gt;
&lt;br /&gt;
Nous pouvons '''parser''' le flux de données avant de le stocker dans le fichier via cette commande:&lt;br /&gt;
&lt;br /&gt;
 Python lps-collector/lps_parse.py static/log/dist-capture&amp;quot;+date+&amp;quot;.log&lt;br /&gt;
&lt;br /&gt;
Il est donc nécessaire d'inclure via des '''thread''' ces différentes fonctions dans notre serveur Python (Flask) afin d'automatiser le processus. Le but est de pouvoir choisir sur l'interface web quels fonctions il faut exécuter et les déclencher via l'appui sur des boutons.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 7'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 15/11/17 - Ven 17/11/17]]''  &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
**Récupération et traitement (parse) manuels des données de distances dans un fichier .log via TCP/IP&amp;lt;-&amp;gt;Bluetooth&lt;br /&gt;
**Automatisation du procédé par script Python (requete.py)&lt;br /&gt;
***Mise en place de sockets de communication pour le contrôle de la collecte -&amp;gt; abandonné (servait à commander la collecte manuellement)&lt;br /&gt;
***Développement d'un script engine.py regroupant les commandes exécutables par l'utilisateur via la page Web&lt;br /&gt;
***Début du travail sur la fonction &amp;quot;STOP&amp;quot; manuel d'une action de collecte de données (liaison entre script HTML, Javascript, et script Python)&lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Chargement sur commande d'un set de distances depuis une matrice contenue dans un fichier JSON&lt;br /&gt;
**Travail sur le layout du site&lt;br /&gt;
***Ajout des différentes commandes (connexion Bluetooth, lancement commande cu, collecte des données, collecte durée donnée)&lt;br /&gt;
***Début de l'implémentation de la visualisation des fichiers .JSON obtenus après collecte et affichage dans un tableau matriciel du fichier sélectionné&lt;br /&gt;
&lt;br /&gt;
Nous avons continué à travailler sur le serveur de collecte: les données que nous avons récupérées via Bluetooth sont stockées dans un fichier .log. Apres avoir bien compris comment marchait la fonction '''parse''' manuellement (lors de son utilisation dans le Shell), nous l'avons implémentée dans notre serveur de collecte qui lance cette commande lors de l’appui sur un bouton via notre interface virtuelle. Un problème rencontré était de savoir quand la récolte des données devait s’arrêter. Nous avons donc rajouté un temps à entrer nous-même sur l'interface. La fonction '''parse''' est effectuée et le sous-processus va attendre le temps donné avant de lancer une commande permettant de tuer le processus et mettant donc fin au remplissage du fichier '''.log'''. Nous voulons de plus réussir à lancer une fonction de collecte sans temps. C'est à dire que nous coupons la collecte via un bouton par nous-mêmes. Nous voulions utiliser des Sockets pour pouvoir définir nous-mêmes la gestion de la communication mais l'idée a été abandonné car nous avons réussi à sauvegarder le PID du processus lancé. Il nous suffit donc de l’arrêter grâce à un autre bouton qui récupère cette variable et l’arrête ensuite. &lt;br /&gt;
&lt;br /&gt;
Toutes nos fonctions Pythons étant regroupées dans notre serveur '''requete.py''', nous avons décidé de créer un module qui regroupera toutes ces fonctions que nous pourrons utiliser dans '''requete.py'''. ceci nous permet de voir plus clair dans notre code et de faciliter le travail lorsque nous modifions le code tous les deux.&lt;br /&gt;
&lt;br /&gt;
Nous essayons en continu d'adapter le layout du site pour le rendre le plus attractif et simple possible, de façon à ce que chaque bouton et tableau soient clairs et compréhensibles.&lt;br /&gt;
&lt;br /&gt;
Nous avons commencé à récupérer les fichiers '''JSON''' créés à partir des fichier '''log''', c'est-à-dire que ces fichiers sont automatiquement stockés coté serveur dans un dossier nommé '''static/log'''. Notre but est de récupérer le nom des fichiers JSON et de les afficher dans un composant sur notre interface web. Il nous sera donc possible ensuite de sélectionner le nom d'un fichier. Lors de la sélection de ce nom de fichier, un tableau apparaît avec les valeurs de distances à l’intérieur.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 8'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 22/11/17 - Ven 24/11/17]]''  &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
**Automatisation du procédé de collecte par script Python (requete.py qui fait appel à engine.py)&lt;br /&gt;
***Développement d'un script engine.py regroupant les commandes exécutables par l'utilisateur via la page Web&lt;br /&gt;
***Travail sur la fonction &amp;quot;STOP&amp;quot; manuel d'une action de collecte de données (liaison entre script HTML, Javascript, et script Python)&lt;br /&gt;
***Mise en place d'un serveur HTTP Simple sous Python pour accéder aux fichiers de données à partir de la page Web&lt;br /&gt;
***Mise à jour de fonctions de connexion &lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Travail sur le layout du site (ajout de pages, navigation entre les pages, apparence, nettoyage des codes)&lt;br /&gt;
**Bon fonctionnement de l'ensemble serveur collecte + serveur HTTP + client Web&lt;br /&gt;
**Affichage de la liste des fichiers de données de distance (log, csv, JSON) via serveur HTTP en Python sur port 9999&lt;br /&gt;
*Corrections et nettoyage du dépôt GIT&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous continuons à développer les points énoncés la semaine dernière. Nous avons décidé de nous diriger vers un serveur HTTP Simple pour accéder à nos fichiers. Il s’avère que nous finirons par ne pas utiliser ce serveur. Nous irons récupérer les fichiers en question via des requêtes '''Ajax''' faites à la sélection du nom du fichier.&lt;br /&gt;
&lt;br /&gt;
Nous rencontrons depuis le début des problèmes avec les fonctions de connexion qui peuvent ne pas marcher à un moment donné. Nous essayons de trouver pourquoi ce bug est un bug qui ne se produit pas à chaque fois. Nous avons déterminé qu'il ne se produisait seulement lorsque les fonctions de connexions étaient lancée dans des threads. Nous ne savons toujours pas pourquoi ces thread bugguent seulement parfois et non à chaque essai de connexion.&lt;br /&gt;
&lt;br /&gt;
Nous avons nettoyé notre dépot '''Git''' car il s’avère que nous utilisions une mauvaise méthode de fusion et de stockage des documents.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 9'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 29/11/17 - Jeudi 30/11/17]]''  &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
**Automatisation du procédé de collecte par script Python (requete.py qui fait appel à engine.py)&lt;br /&gt;
***Travail sur la fonction &amp;quot;STOP&amp;quot; manuel d'une action de collecte de données (liaison entre script HTML, Javascript, et script Python)&lt;br /&gt;
***Recherches sur l'utilisation de fichiers JSON accessibles via le serveur HTTP&lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Travail sur le layout du site &lt;br /&gt;
**Travail sur la liaison entre fichiers JSON et affichage Web des données de distance&lt;br /&gt;
***Recherches et tests de solutions&lt;br /&gt;
****Affichage depuis un fichier&lt;br /&gt;
****Affichage à la volée lors d'une action de collecte&lt;br /&gt;
&lt;br /&gt;
*Revue de code avec Roudy DAGHER:&lt;br /&gt;
**Structure globale des codes ok&lt;br /&gt;
**Fonctionnement presque ok: fonctionnalités implémentées ok, mais parsage csv ne marche pas&lt;br /&gt;
**Refactoring nécessaire&lt;br /&gt;
**Correction de la fonction STOP et amélioration de la fonction de COLLECTE&lt;br /&gt;
**Faire plus de requêtes Javascript que de requêtes HTML&lt;br /&gt;
**Discussion pour l'implémentation du serveur de localisation (= algorithme de localisation) et des visualisations de données sur le site Web&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous avons d'abord revu l'ensemble de notre code et les méthodes utilisées avec notre tuteur '''Roudy Dagher'''. Nous nous approchons d'un serveur de collecte de données stable et fonctionnel. Nous avons refait les différentes connexions entre l'interface et le serveur afin de ne faire que des requêtes sur des '''WebServices'''. Il nous est possible de commencer la deuxième partie qui est l'envoi de ces tableaux de données afin de les envoyer vers le serveur de localisation via des API afin de recevoir des matrices de positions.&lt;br /&gt;
Nous pourrons grâce à ces matrices afficher une carte 3D des balises  et du TAG dans l'espace.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 10'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 06/12/17 - Jeudi 07/12/17]]'' &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
**Travail sur la fonction STOP&lt;br /&gt;
**Réalisation d'une expression régulière pour le parsage des fichiers log en fichier JSON&lt;br /&gt;
&lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Travail sur l'affichage des fichiers JSON&lt;br /&gt;
***Réalisation de toutes les requêtes Ajax&lt;br /&gt;
***Réalisation d'un menu déroulant dropdown pour charger le contenu des fichiers JSON dans le tableau de distances&lt;br /&gt;
&lt;br /&gt;
*Nettoyage du dépôt Git&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 11'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 13/12/17]]''  &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
&lt;br /&gt;
*Revue de code avec Roudy DAGHER:&lt;br /&gt;
**Discussion sur la partie système du projet et correction de certaines fonctions&lt;br /&gt;
&lt;br /&gt;
Nous nous sommes réunis avec l'un de nos tuteurs, qui a réalisé certains bouts de code de base, pour nous mettre au point sur les fonctions en question et leur utilisation.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 12'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 20/12/17 - Jeudi 21/12/17]]''&lt;br /&gt;
*Revue, correction et nettoyage des codes&lt;br /&gt;
*Finalisation du rapport&lt;br /&gt;
*Planification de semaines restantes&lt;br /&gt;
*Préparation de la soutenance&lt;br /&gt;
*Revue de mi-projet avec tous les tuteurs&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Cette dernière semaine a servi à finaliser le rapport et à discuter de l'avancée du projet, notamment avec nos tuteurs pour déterminer le travail restant, présenter le travail abouti et replanifier précisément les échéances pour le travail restant. Nous avons réalisé la soutenance de mi-projet le '''jeudi 21/12/17 à 8h'''.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 13'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 10/01/18 - Ven 12/01/18]]''  &lt;br /&gt;
*Travail sur la collecte des données (serveur de collecte et interface Web)&lt;br /&gt;
**Redéfinition du fichier de parsage car il crée des conflits et ne produit pas un fichier formaté de la façon attendue&lt;br /&gt;
***Nombre de balises réel n'est pas bien déterminé par le code&lt;br /&gt;
***ID de la première et de la dernière balise ne sont pas déterminés correctement&lt;br /&gt;
&lt;br /&gt;
**Automatisation de la collecte par un script Shell lançant toutes les commandes de CONNEXION, REDIRECTION, LANCEMENT CU, FERMETURE DU PROGRAMME (kill rfcomm / kill tcp_redirect)&lt;br /&gt;
***Dans le but d'automatiser la procédure&lt;br /&gt;
***Dans le but de résoudre un problème de gestion de ressources (le bug '''thread''' apparu plus tôt dans le projet)&lt;br /&gt;
&lt;br /&gt;
**Travail sur la résolution du bug thread car l'automatisation n'a pas résolu le problème&lt;br /&gt;
***Identification du ou des causes potentielles: gestion des ressources (synchrone, asynchrone ?), connexion Bluetooth, lancement des commandes dans le même script, lancement en fg/bg, conflit dû au temps d'exécution de chaque processus ?&lt;br /&gt;
***Lancement des commandes manuellement dans des terminaux ne pose aucun problème: solution la plus simple&lt;br /&gt;
&lt;br /&gt;
**Redesign de la page Collecte&lt;br /&gt;
***Remplacement des boutons de commande par un bouton unique d'initialisation&lt;br /&gt;
***Travail sur une mise à jour du menu déroulant dropdown régulière sans avoir à recharger la page Web&lt;br /&gt;
***Implémentation de plotly.js, un module Javascript qui permet d'afficher des graphes en 3D&lt;br /&gt;
&lt;br /&gt;
*Mise au point post-soutenance avec Roudy DAGHER pour valider le travail restant, effectué et redéfinir certains objectifs atteignables ou pas selon les éléments réalisés dans le projet&lt;br /&gt;
*Recherches et début de l'implémentation du serveur de localisation fourni par les tuteurs&lt;br /&gt;
*Gestion du Git pour créer des branches additionnelles&lt;br /&gt;
*Recréation du rapport de projet suite à une perte du fichier éditable d'origine + Mise à jour avec les remarques suite à la soutenance ainsi que les nouveaux éléments&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 14'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mar 16/01/18 - Ven 19/01/18]]''  &lt;br /&gt;
*Travail sur la collecte des données (serveur de collecte et interface Web)&lt;br /&gt;
**Redéfinition du fichier de parsage car il crée des conflits et ne produit pas un fichier formaté de la façon attendue&lt;br /&gt;
***Corrigé: Nombre de balises réel n'est pas bien déterminé par le code&lt;br /&gt;
***Corrigé: ID de la première et de la dernière balise ne sont pas déterminés correctement&lt;br /&gt;
***Reste à faire: Traiter le cas où il y a un ajout ou suppression d'une balise pendant la collecte (pour le moment, lorsque c'est le cas, toutes les données se décalent au lieu de laisser des trous)&lt;br /&gt;
&lt;br /&gt;
**Automatisation de la collecte par un script Shell lançant toutes les commandes de CONNEXION, REDIRECTION, LANCEMENT CU, FERMETURE DU PROGRAMME (kill rfcomm / kill tcp_redirect)&lt;br /&gt;
***Mis en suspens: pour le moment, on lance les commandes manuellement dans le terminal&lt;br /&gt;
&lt;br /&gt;
**Interface Web&lt;br /&gt;
***Implémentation de plotly.js, un module Javascript qui permet d'afficher des graphes en 3D&lt;br /&gt;
&lt;br /&gt;
*Implémentation du serveur de localisation fourni par les tuteurs (mais algorithme de localisation pas fonctionnel pour le moment)&lt;br /&gt;
**Mise à jour de l'affichage des positions des éléments: précédemment seule la matrice X de position du Tag s'affichait, et pas la matrice A des balises&lt;br /&gt;
**Requêtes manuelles à l'API avec la fonction curl OK: on arrive à récupérer les matrices X et A (aléatoires pour le moment) par une requête GET à l'API du serveur de localisation&lt;br /&gt;
**Implémentation des requêtes Ajax pour automatiser les requêtes au serveur de localisation&lt;br /&gt;
&lt;br /&gt;
*Mise à jour du rapport les nouveaux éléments du travail réalisé&lt;br /&gt;
*Réflexion sur la possibilité ou non de réaliser la partie temps réel du projet au vu des moyens à disposition&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 15'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mar 23/01/18 - Ven 26/01/18]]'' &lt;br /&gt;
*Travail sur la collecte des données (serveur de collecte et interface Web)&lt;br /&gt;
**Redéfinition du fichier de parsage car il crée des conflits et ne produit pas un fichier formaté de la façon attendue&lt;br /&gt;
***Fait: Si distance négative car Tag trop près, la valeur négative générée par une balise est remplacée par un &amp;quot;0&amp;quot; (cela modifie la position réelle modélisée dans plotly, mais évite une impossibilité de générer la position à partir de la distance -&amp;gt; par des tests, il faudra déterminer la valeur limite à partir de laquelle les cartes donnent des valeurs de distance négatives&lt;br /&gt;
***Reste à faire: Traiter le cas où il y a un ajout ou suppression d'une balise pendant la collecte (pour le moment, lorsque c'est le cas, toutes les données se décalent au lieu de laisser des trous); Ainsi que le cas où il y un saut/bug inattendu et donc une disparition d'une ou plusieurs valeurs de distance&lt;br /&gt;
***Début de résolution du cas où une distance n'est pas prise en compte, c'est à dire où il y a une valeur qui disparaît et désaligne les valeurs lors de la création du JSON&lt;br /&gt;
&lt;br /&gt;
**Automatisation de la collecte par un script Shell lançant toutes les commandes de CONNEXION, REDIRECTION, LANCEMENT CU, FERMETURE DU PROGRAMME (kill rfcomm / kill tcp_redirect)&lt;br /&gt;
***Mis en suspens: pour le moment, on lance les commandes manuellement dans le terminal&lt;br /&gt;
***Création d'un script bash /etc/init.d/autoconnect.sh pour connecter automatiquement la RPi au lancement du système (si la RPi est déjà allumée au démarrage)&lt;br /&gt;
&lt;br /&gt;
**Interface Web&lt;br /&gt;
***Perfectionnement de l'utilisation de Plotly pour les visualisations&lt;br /&gt;
&lt;br /&gt;
*Implémentation du serveur de localisation fourni par les tuteurs (algorithme de localisation pas fonctionnel pour le moment)&lt;br /&gt;
**Requêtes manuelles à l'API avec la fonction curl OK&lt;br /&gt;
**Fait: Implémentation des requêtes Ajax pour automatiser les requêtes au serveur de localisation&lt;br /&gt;
***Liaison entre les différentes requêtes ajax grâce à des variables: permet de stocker l'adresse du job récupérée par la méthode GET&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 16'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Lun 29/01/18 - Ven 02/02/18]]'' &lt;br /&gt;
*Travail sur la collecte des données (serveur de collecte et interface Web)&lt;br /&gt;
**Redéfinition du fichier de parsage car il crée des conflits et ne produit pas un fichier formaté de la façon attendue&lt;br /&gt;
***déterminer la valeur limite à partir de laquelle les cartes donnent des valeurs de distance négatives&lt;br /&gt;
***Reste à faire: Traiter le cas où il y a un ajout ou suppression d'une balise pendant la collecte (pour le moment, lorsque c'est le cas, toutes les données se décalent au lieu de laisser des trous); Ainsi que le cas où il y un saut/bug inattendu et donc une disparition d'une ou plusieurs valeurs de distance&lt;br /&gt;
***Fait: gestion des bugs/sauts de valeurs de balises - remplacement par une valeur nulle sur balise existe, par rien sinon (implémentation d'un tableau caractérisant l'existence ou pas de chaque balise 1 à 6), optimisation des temps de calculs/exécution dans le script&lt;br /&gt;
**Interface Web&lt;br /&gt;
***Ajout d'une barre de progression de la collecte remplaçant le bouton de Lancement de collecte lors de l'appui&lt;br /&gt;
***Ajout d'un bouton dropdown pour afficher les fichiers de position qu'on reçoit du serveur de localisation&lt;br /&gt;
***Ajout d'une scrollbar dans les deux dropdown&lt;br /&gt;
&lt;br /&gt;
*Implémentation du serveur de localisation fourni par les tuteurs (algorithme de localisation pas fonctionnel pour le moment)&lt;br /&gt;
**Fait: Implémentation des requêtes Ajax pour automatiser les requêtes au serveur de localisation&lt;br /&gt;
***Création d'une requête Ajax GET qui demande le fichier JSON de position au serveur de localisation jusqu'à ce qu'il soit retourné&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 17'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Lun 05/02/18 - Ven 09/02/18]]''&lt;br /&gt;
&lt;br /&gt;
*Algorithme de localisation mis en ligne par le tuteur&lt;br /&gt;
**test du bon fonctionnement des connections entre parties après intégration de l'algorithme&lt;br /&gt;
**test su la qualité de l'algorithme&lt;br /&gt;
**test sur la précision de l'algorithme&lt;br /&gt;
*Rapport partie Front-end&lt;br /&gt;
*Rapport partie Back-end&lt;br /&gt;
*Nettoyage du code requete.py&lt;br /&gt;
*Mise à jour final des de certes pages du site&lt;br /&gt;
** matrice.html à jour&lt;br /&gt;
**3D.html à jour&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 18'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Lun 12/02/18 - Ven 16/02/18]]''&lt;br /&gt;
&lt;br /&gt;
*Algorithme de localisation mis en ligne par le tuteur&lt;br /&gt;
**test de perturbation et des limites du systeme d'antenne Locopositioning&lt;br /&gt;
*Rapport partie III &lt;br /&gt;
*rapport partie I&lt;br /&gt;
*réalisation de la vidéo de présentation&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 19'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Lun 19/02/18 - Ven 23/02/18]]''&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Délivrables'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
Rapport de mi-PFE&lt;br /&gt;
[[Fichier:RapportMi-PFE-UNG DELATTE.pdf]]&lt;br /&gt;
&lt;br /&gt;
Rapport de PFE&lt;br /&gt;
&lt;br /&gt;
Vidéo&lt;/div&gt;</summary>
		<author><name>Hdelatte</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=P18_Localisation_of_quadrotors&amp;diff=51101</id>
		<title>P18 Localisation of quadrotors</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=P18_Localisation_of_quadrotors&amp;diff=51101"/>
				<updated>2018-02-16T15:25:37Z</updated>
		
		<summary type="html">&lt;p&gt;Hdelatte : /* Semaine 18 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Cahier des charges'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;Présentation générale du projet&amp;lt;/span&amp;gt;=== &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Contexte&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
Dans un monde de plus en plus connecté, de nombreux drones sont déployés pour diverses applications comme l'espionnage, la surveillance, la cartographie de lieux et la livraison de colis. Les technologies nécessaires pour contrôler ces drones sont des sujets de recherche actuels. &lt;br /&gt;
&lt;br /&gt;
Le contrôle de ceux-ci passe tout d'abord par la maîtrise de leur position dans l'espace. Le développement des applications liées à l'utilisation de drones nécessite un travail important sur la localisation spatiale d'objets connectés. &lt;br /&gt;
&lt;br /&gt;
De plus, dans un souci d'utilisation, il est essentiel de développer des interfaces logicielles permettant d'exploiter ces données.&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Objectif du projet&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
L'objectif de ce projet est de développer une interface logicielle permettant de traiter en temps réel les informations de localisation d'un drone et de balises, dans le but de définir leur localisation dans l'espace, en intérieur.&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Description du projet&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
Pour réaliser le contrôle de drones, la première étape importante est de donner ses informations de position. Le but du projet est de développer une interface logicielle permettant de localiser le drone en temps réel en intérieur. Le drone se déplace dans un environnement dans lequel ont été installées de multiples balises. Il est équipé d'une carte, lui permettant de recevoir les distances relatives entre lui-même et les balises, sur laquelle différents algorithmes vont être implémentés pour effectuer la localisation en temps réel. Le projet requiert des compétences en développement hardware (Crazyflie 2.0, voir https://wiki.bitcraze.io/) et software (langage C/C++/Python/Javascript/HTML...).&lt;br /&gt;
&lt;br /&gt;
Il se divise en 4 étapes principales, qui sont:&lt;br /&gt;
*1) Choisir les technologies utilisées&lt;br /&gt;
*2) Choisir l'architecture (OS / APIs)&lt;br /&gt;
*3) Développer les différentes parties du projet&lt;br /&gt;
*4) Intégrer et connecter les différentes parties du projet&lt;br /&gt;
&lt;br /&gt;
La localisation étant en intérieur, le protocole GPS n'est donc pas assez précis pour les applications ciblées. La mise en place d'un tel dispositif permettrait grâce à l'utilisation d'un algorithme d'estimer avec une bonne précision les positions en intérieur d'une balise centrale (appelée Tag) et de balises (appelées Anchor). Le Tag scanne en temps réel la distance relative aux différentes balises, et il nous est retourné la position des balises et du Tag grâce à l'algorithme de localisation.&lt;br /&gt;
&lt;br /&gt;
Le projet se compose de 3 parties:&lt;br /&gt;
* Collect &amp;amp; parse: collecter les données envoyées par les balises en communiquant avec un serveur et récupérer les données adéquates par un tri&lt;br /&gt;
* Localise: déterminer la matrice de position des balises et du Tag en traitant les données récupérées&lt;br /&gt;
* Display: développer l'interface homme machine pour afficher, étudier et utiliser les données traitées&lt;br /&gt;
&lt;br /&gt;
Nous travaillerons dans un premier temps dans une optique temps différé avant de travailler en temps réel. Cela nous permettra d'acquérir des données utiles et réutilisables en aval. &lt;br /&gt;
&lt;br /&gt;
A l'aboutissement du projet, nous devrions être capable via l'interface homme machine développée d'afficher précisément la position spatiale des balises ainsi que du Tag, grâce àl'utilisation d'un algorithme de localisation et des données récupérées, et d'afficher d'autres données relatives au déplacement du Tag ou des balises dans l'espace. &lt;br /&gt;
&lt;br /&gt;
Si le temps le permet, nous pourrons aussi être amenés à adapter et utiliser l'interface développée pour l'utilisation d'un drone.&lt;br /&gt;
&lt;br /&gt;
''Sujet originel''&lt;br /&gt;
&lt;br /&gt;
To achieve the control of quadrotors, the first important task to give its position information. This project is to develop a software(GUI) to localize the quadrotors in real-time. The quadrotor is flying in an environment where several transmitters have been installed. The quadrotor is equipped with a deck to receive the relative distances between the deck and all transmitters, based on which different algorithms will be implemented to realize the real-time localization. The candidates need to have both experiences on hardware (Crazyflie 2.0, see https://wiki.bitcraze.io/) and software development (C/C , Python…). &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Calendrier prévisionnel&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
''[[Avant le 29/09/17]]'' - Élaboration du Cahier des charges, de la liste des tâches et du calendrier prévisionnel&lt;br /&gt;
&lt;br /&gt;
''[[Avant fin Octobre]]'' - Serveur de collecte et début du développement de l'interface logicielle&lt;br /&gt;
&lt;br /&gt;
''[[Avant fin Décembre]]'' - Interface logicielle&lt;br /&gt;
&lt;br /&gt;
''[[A la fin du PFE]]'' - Intégration finale des différentes parties (Serveur de collecte des données &amp;amp; Serveur de localisation &amp;amp; Interface logicielle)&lt;br /&gt;
&lt;br /&gt;
Répartition du volume de travail (***h):&lt;br /&gt;
&lt;br /&gt;
* Recherche sur les technologies à utiliser&lt;br /&gt;
* Développement du serveur de collecte de données&lt;br /&gt;
* Réalisation de l'interface logicielle (Web//Logiciel/Application)&lt;br /&gt;
* Intégration des différentes parties&lt;br /&gt;
* Test et débuggage&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Choix techniques : matériel et logiciel&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
Afin de développer ce dispositif, nous allons utiliser une Raspberry Pi 3 associée à une carte réceptrice, qui communique avec 4 balises composées chacune d'un microcontrôleur et d'une carte émettrice radio (UWB5C) et alimentées par batteries. La carte réceptrice joue le rôle du drone à localiser et communiquera les données émises par les balises vers l'ordinateur via Bluetooth.&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Choix technologiques&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
Voici les technologies que nous utilisons pour chacune des parties de ce projet.&lt;br /&gt;
&lt;br /&gt;
    1) Serveur de collecte des données:&lt;br /&gt;
       Scanne et parse les données récupérées pour fournir la matrice D des distances relatives du tag aux 4 balises&lt;br /&gt;
        - API&lt;br /&gt;
        - Python / Serveur Flask&lt;br /&gt;
&lt;br /&gt;
    2) Serveur de localisation (fourni):&lt;br /&gt;
       Calcule grâce à l'algorithme de localisation et la matrice D les positions spatiales des 4 noeuds et du tag&lt;br /&gt;
        - API&lt;br /&gt;
        - Bootstrap&lt;br /&gt;
        - Jquery&lt;br /&gt;
        - Python&lt;br /&gt;
&lt;br /&gt;
    3) Interface utilisateur:&lt;br /&gt;
       Affiche courbes, visualisation 3D, boutons ou données des fichiers envoyées par le serveur de localisation&lt;br /&gt;
        - HTML5 / Javascript&lt;br /&gt;
        - Fichiers JSON (serveurs de collecte et de localisation)&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Calendrier prévisionnel'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Liste des tâches à effectuer&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
# Se documenter sur le projet&lt;br /&gt;
##Langages et technologies utilisées&lt;br /&gt;
##Matériel utilisé&lt;br /&gt;
##Mettre en place du travail sur le Git&lt;br /&gt;
# Réaliser le serveur de collecte&lt;br /&gt;
##Récupérer les trames envoyées par bluetooth par le TAG via la Raspberry Pi&lt;br /&gt;
##Intégrer le serveur de localisation pour interpréter les trames&lt;br /&gt;
##Tester et optimiser&lt;br /&gt;
# Réaliser l'interface Web utilisateur&lt;br /&gt;
##Implémenter le serveur de collecte et de localisation&lt;br /&gt;
##Afficher et traiter les données stockées dans les fichiers JSON via le serveur (temps différé + temps réel)&lt;br /&gt;
##Tester et optimiser&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;Replanification du cahier des charges / calendrier&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Feuille d'heures'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Tâche !! Prélude !! Heures S1 !! Heures S2 !! Heures S3 !! Heures S4 !! Heures S5 !! Heures S6 !! Heures S7 !! Heures S8 !! Heures S9 !! Heures S10 !! Heures S11 !! Heures S12 !! Heures S13 !! Heures S14 !! Heures S15 !! Heures S16 !! Heures S17 !! Heures S18 !! Heures S19 !! Total&lt;br /&gt;
|-&lt;br /&gt;
| Cahier des charges / Wiki / Gitlab / Rapport&lt;br /&gt;
|  4h&lt;br /&gt;
|  3h&lt;br /&gt;
|  1h&lt;br /&gt;
|  x&lt;br /&gt;
|  1h30&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h30&lt;br /&gt;
|  1h&lt;br /&gt;
|  3h&lt;br /&gt;
|  3h30&lt;br /&gt;
|  2h&lt;br /&gt;
|  5h&lt;br /&gt;
|  x&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Documentation sur les technos utilisées&lt;br /&gt;
|  2h&lt;br /&gt;
|  4h&lt;br /&gt;
|  3h&lt;br /&gt;
|  2h&lt;br /&gt;
|  3h&lt;br /&gt;
|  4h&lt;br /&gt;
|  5h&lt;br /&gt;
|  5h30&lt;br /&gt;
|  4h30&lt;br /&gt;
|  3h30&lt;br /&gt;
|  2h&lt;br /&gt;
|  3h&lt;br /&gt;
|  1h&lt;br /&gt;
|  3h&lt;br /&gt;
|  4h&lt;br /&gt;
|  x&lt;br /&gt;
|  2h&lt;br /&gt;
|  &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Documentation sur le matériel&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  1h&lt;br /&gt;
|  1h&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Recherche et développement du serveur de collecte&lt;br /&gt;
|  x&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  3h&lt;br /&gt;
|  3h30&lt;br /&gt;
|  4h&lt;br /&gt;
|  5h&lt;br /&gt;
|  7h&lt;br /&gt;
|  4h30&lt;br /&gt;
|  0,5h&lt;br /&gt;
|  3h&lt;br /&gt;
|  4h&lt;br /&gt;
|  3h&lt;br /&gt;
|  x&lt;br /&gt;
|  4h&lt;br /&gt;
|  7h30&lt;br /&gt;
|  5h&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Recherche et développement de l'interface Web&lt;br /&gt;
|  x&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  3h&lt;br /&gt;
|  5h&lt;br /&gt;
|  6h&lt;br /&gt;
|  4h&lt;br /&gt;
|  7h&lt;br /&gt;
|  5h30&lt;br /&gt;
|  2h30&lt;br /&gt;
|  6h&lt;br /&gt;
|  8h&lt;br /&gt;
|  5h&lt;br /&gt;
|  1h&lt;br /&gt;
|  8h&lt;br /&gt;
|  4h&lt;br /&gt;
|  4h&lt;br /&gt;
|  &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Recherche et intégration du serveur de localisation&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x &lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  6h&lt;br /&gt;
|  5h&lt;br /&gt;
|  3h&lt;br /&gt;
|  &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Intégration des différentes parties&lt;br /&gt;
|  x&lt;br /&gt;
|  x  &lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  2h&lt;br /&gt;
|  2h&lt;br /&gt;
|  2h&lt;br /&gt;
|  3h&lt;br /&gt;
|  1h30&lt;br /&gt;
|  x&lt;br /&gt;
|  3h&lt;br /&gt;
|  6h&lt;br /&gt;
|  5h&lt;br /&gt;
|  x&lt;br /&gt;
|  3h30&lt;br /&gt;
|  2h&lt;br /&gt;
|  2h&lt;br /&gt;
|  &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Tests et débuggage&lt;br /&gt;
|  x&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  1h&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  3h&lt;br /&gt;
|  4h&lt;br /&gt;
|  0,5h&lt;br /&gt;
|  3h&lt;br /&gt;
|  1h&lt;br /&gt;
|  3h&lt;br /&gt;
|  3h&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  4h&lt;br /&gt;
|  &lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Optimisation/Correction des programmes&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Vidéo&lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Avancement du Projet'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Phase préparatoire'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Jeu 21/09/17 - Ven 22/09/17]]'' &lt;br /&gt;
*Rendez-vous de mise au point du cahier des charges avec les encadrants/intervenants (M. ZHENG Gang et M. DAGHER Roudy)&lt;br /&gt;
*Elaboration du cahier des charges&lt;br /&gt;
*Elaboration de la page Wiki (préparation de la mise en page et présentation du sujet)&lt;br /&gt;
*Préparation du travail sous forme de Mind Map&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous nous sommes tout d’abord rendus au laboratoire de l'INRIA afin de pouvoir définir le plus précisément possible le cahier des charges avec nos tuteurs.&lt;br /&gt;
Nous avons donc défini avec eux les technologies qu'il faudrait étudier. Vous retrouverez le choix des technologies dans la partie '''choix technologiques'''&lt;br /&gt;
&lt;br /&gt;
Nous avons en même temps créé notre page Wiki, et structurée celle-ci avec les parties qui nous seraient utiles pour développer nos explications par la suite.&lt;br /&gt;
&lt;br /&gt;
Nous avons de plus découpé le travail en sous-parties que nous avions mis dans une '''Mind map''' afin d'y voir plus clair sur la ligne à suivre.&lt;br /&gt;
&lt;br /&gt;
Vous trouverez cette Mind map juste ci-dessous. Nous ne mettrons pas à jour cette Mind map chaque semaine mais il est fort probable que nous en refaisions un en milieu de projet pour pouvoir cibler les objectifs réussis et ceux à atteindre. Nous pourrons de plus redéfinir certains objectifs qui nous auraient semblés trop vague au début du projet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Projet de fin d'étude.png|centre|600px]]&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 1'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Jeu 28/09/17 - Ven 29/09/17]]'' &lt;br /&gt;
*Revue du Cahier des Charges avec les encadrants&lt;br /&gt;
*Lecture et recherches sur les technologies adaptées&lt;br /&gt;
*Construction de la suite de la Mind Map&lt;br /&gt;
*Création du Gitlab&lt;br /&gt;
&lt;br /&gt;
Nous commençons les recherches sur le projet et sur les premières technologies engagées dans celui-ci. Nous en profitons pour formuler dès à présent des questions sur le bon choix de celles-ci. Nous commençons donc des tests ayant seulement pour but de nous familiariser avec l'environnement de travail et de réellement comprendre les fonctions déjà présentes qu'il faudra exploiter et implanter notre interface web.&lt;br /&gt;
Nous créons un dépôt Gitlab avec notre tuteur et commençons a définir les taches premières sur celui-ci.&lt;br /&gt;
Nous en profitons pour affiner le Mind Map.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 2'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Jeu 05/10/17 - Ven 06/10/17]]''  &lt;br /&gt;
*Précisions sur le cahier des charges&lt;br /&gt;
*Listage du matériel&lt;br /&gt;
*Recherche et détermination de solutions technologiques possibles pour les fonctions demandées&lt;br /&gt;
*Début du travail sur le serveur de collecte&lt;br /&gt;
*Apprentissage du langage Python et de l'utilisation du framework Flask&lt;br /&gt;
&lt;br /&gt;
Nous avons finalisé les précisions sur le cahier des charges. Nous avons donc pu cibler le matériel dont nous nous servirons pour ce Projet. Vous trouverez donc cette liste la section correspondante. Il est évident que le matériel utilisé est dans l'ensemble déjà fourni par le laboratoire et qu'il nous reste dans l'ensemble à créer l'interface web et les API qui nous permettrons de faire communiquer cette interface avec la Raspberry Pi et le serveur de position déjà créé.&lt;br /&gt;
Nous avons donc pu commencer à nous former sur les technologies qui nous serviraient par la suite. Nous avons donc utilisé le cours d'Openclassrooms sur les serveurs Flask pour en apprendre les bases. Ce serveur Flask est programmé en Python et nous permet donc une grande liberté au niveau de l’exécution de certains scripts. En effet, les scripts de connexion Bluetooth et de redirection de port qui nous permettent de récupérer les données de distance sont eux-mêmes codés en Python et sont directement appelés via le serveur.&lt;br /&gt;
Dans ce serveur, représentant notre interface web, vous retrouverez la page '''/collecte''' qui représentera notre partie collecte de données ainsi que l'affichage de ces distances. Nous appellerons cette partie le Serveur de Collecte.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 3'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 11/10/17 - Jeu 12/10/17]]''  &lt;br /&gt;
*Recherche et développement initial du serveur de collecte de données&lt;br /&gt;
*Complément du Git sur les tâches à effectuer&lt;br /&gt;
&lt;br /&gt;
Nous avons commencé à créer un serveur Flask renvoyant pour l'instant une matrice aléatoire. Lors de la requête URL &amp;quot;../matrice&amp;quot;, nous voyons bien une matrice aléatoire apparaître sur la page Web. Nous essayons de nous connecter à la Raspberry Pi en redirigeant son port série vers le Bluetooth de façon à récupérer de vraies matrices de distance entre le drone (ie commutateur central) et les balises. Nous pourrons afficher ensuite ces matrices, ou alors les stocker dans un fichier en attendant le traitement de celles-ci.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Requete s3.PNG|300px|serveur Flask]]&lt;br /&gt;
&lt;br /&gt;
Nous avons plusieurs problèmes avec le Bluetooth pour se connecter avec la Raspberry Pi. Quand nous aurons réussi à nous connecter au port série de la Raspberry Pi alors nous pourrons gérer le traitement des données récupérées.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 4'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 18/10/17 - Jeu 19/10/17]]''  &lt;br /&gt;
*Configuration de la Raspberry Pi car problèmes de connectivité Bluetooth rencontrés&lt;br /&gt;
**Nous arrivons à connecter la Raspberry Pi sous Windows mais la connexion sous Linux pose problème (travail en suspens en attendant la disponibilité de l'encadrant)&lt;br /&gt;
*Début du développement de l'interface Web&lt;br /&gt;
**Traitement d'une matrice dans un fichier JSON&lt;br /&gt;
**Affichage sous forme de tableau de la matrice&lt;br /&gt;
**Utilisation du serveur de requête en Python avec chargement de template HTML&lt;br /&gt;
**Mise en forme de la trame de la page en HTML/CSS avec le framework Bootstrap&lt;br /&gt;
**Ajout d'un set de distances (d1, d2, d3, d4) dans la matrice lors d'un appui sur un bouton Chargement en utilisant un fichier Javascript&lt;br /&gt;
&lt;br /&gt;
Nous avons reçu des fonctions Python de notre tuteur afin d'obtenir une connexion Bluetooth entre notre Raspberry Pi et notre ordinateur ainsi qu'une redirection de port de celle-ci vers la connexion. Nous n'arrivons pas à utiliser ces fonctions sous linux et nous nécessitons une explication de notre tuteur n'étant pas disponible à ce moment. Pour ne pas perdre de temps, nous attaquons la création de l'interface web à proprement parler, c'est à dire la création des pages HTML ainsi que le document Javascript qui nous servira de bibliothèque de fonctions. Chaque route de notre serveur est reliée à une série de fonctions Python s'exécutant à l'appel des url puis suivies d'un template de la page HTML en question. Nous en profitons de plus pour explorer le framework CSS bootstrap afin de mettre un premier design et une structure a notre page collecte qui sera la page principale de notre site pour ce début de projet.&lt;br /&gt;
&lt;br /&gt;
Nous nous essayons de plus à différents tests sur des fichiers de format '''JSON''' que nous devrons réussir à traiter correctement plus tard dans notre projet.&lt;br /&gt;
Nous récupérons une matrice que nous créons nous-mêmes en Python (simulation d'une série de distances récupérée) que nous transformons au format JSON pour ensuite l'afficher sur notre page web. Pour pouvoir proprement afficher ce fichier '''JSON''' renvoyé vers notre page, nous nous servons du fichier Javascript afin de créer du code HTML contenant la matrice.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 5'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 25/10/17 - Ven 27/10/17]]''  &lt;br /&gt;
*Résolution des problèmes de connectique Bluetooth sur la Raspberry Pi&lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Traitement d'une matrice dans un fichier JSON&lt;br /&gt;
**Début de l'ajout d'un set de distances depuis une matrice contenue dans un fichier JSON&lt;br /&gt;
&lt;br /&gt;
Nous avons pu nous entretenir avec notre tuteur et donc comprendre les fonctions de connexion et de redirection de port. Nous pouvons donc continuer le développement de notre interface web. Nous arrivons à traiter un set de données au format JSON et à l'afficher dans le code HTML. Toutefois nous créons nous-mêmes ce set, il est maintenant nécessaire que nous arrivions à récupérer les sets de distance réels reçus par la connexion Bluetooth. Nous commencerons par un traitement asynchrone. L'idée est d’enregistrer les sets de distances dans un fichier '''JSON''' stocké dans un dossier. Nous appellerons ce dossier plus tard via une requête Ajax.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 6'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 08/11/17 - Ven 10/11/17]]''  &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
**Mise en place de la communication entre le port série de notre machine et le port série de la carte via Bluetooth de la RPi3&lt;br /&gt;
**Récupération et traitement (parse) manuels des données de distances dans un fichier .log via TCP/IP&amp;lt;-&amp;gt;Bluetooth&lt;br /&gt;
**Début de l'automatisation du procédé par script Python (requete.py) et mise en place de sockets de communication&lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Chargement sur commande d'un set de distances depuis une matrice contenue dans un fichier JSON&lt;br /&gt;
*Travail sur le layout du site&lt;br /&gt;
&lt;br /&gt;
Après avoir regardé le code de ces différentes fonctions nous avons pu faire des tests manuels via le Shell pour récupérer des données de distances et les stocker dans un fichier '''JSON''' sur notre ordinateur.&lt;br /&gt;
&lt;br /&gt;
Nous utilisons les commandes suivantes pour se connecter via Bluetooth:&lt;br /&gt;
&lt;br /&gt;
 rfcomm connect /dev/rfcomm0 B8:27:EB:80:DC:89 1&lt;br /&gt;
&lt;br /&gt;
Rediriger le port de la Raspberrypi3 vers la connexion:&lt;br /&gt;
&lt;br /&gt;
 Python lps-collector/tcp_serial_redirect.py /dev/rfcomm0 9600&lt;br /&gt;
&lt;br /&gt;
Collecter les données dans un fichier dont nous définissons le nom:&lt;br /&gt;
&lt;br /&gt;
 echo &amp;quot;cu -s9600 -lttyACM0&amp;quot;| nc localhost 7777&lt;br /&gt;
 nc localhost 7777 | grep distance &amp;gt; static/log/dist-capture'+date+'.log&lt;br /&gt;
&lt;br /&gt;
Nous pouvons '''parser''' le flux de données avant de le stocker dans le fichier via cette commande:&lt;br /&gt;
&lt;br /&gt;
 Python lps-collector/lps_parse.py static/log/dist-capture&amp;quot;+date+&amp;quot;.log&lt;br /&gt;
&lt;br /&gt;
Il est donc nécessaire d'inclure via des '''thread''' ces différentes fonctions dans notre serveur Python (Flask) afin d'automatiser le processus. Le but est de pouvoir choisir sur l'interface web quels fonctions il faut exécuter et les déclencher via l'appui sur des boutons.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 7'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 15/11/17 - Ven 17/11/17]]''  &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
**Récupération et traitement (parse) manuels des données de distances dans un fichier .log via TCP/IP&amp;lt;-&amp;gt;Bluetooth&lt;br /&gt;
**Automatisation du procédé par script Python (requete.py)&lt;br /&gt;
***Mise en place de sockets de communication pour le contrôle de la collecte -&amp;gt; abandonné (servait à commander la collecte manuellement)&lt;br /&gt;
***Développement d'un script engine.py regroupant les commandes exécutables par l'utilisateur via la page Web&lt;br /&gt;
***Début du travail sur la fonction &amp;quot;STOP&amp;quot; manuel d'une action de collecte de données (liaison entre script HTML, Javascript, et script Python)&lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Chargement sur commande d'un set de distances depuis une matrice contenue dans un fichier JSON&lt;br /&gt;
**Travail sur le layout du site&lt;br /&gt;
***Ajout des différentes commandes (connexion Bluetooth, lancement commande cu, collecte des données, collecte durée donnée)&lt;br /&gt;
***Début de l'implémentation de la visualisation des fichiers .JSON obtenus après collecte et affichage dans un tableau matriciel du fichier sélectionné&lt;br /&gt;
&lt;br /&gt;
Nous avons continué à travailler sur le serveur de collecte: les données que nous avons récupérées via Bluetooth sont stockées dans un fichier .log. Apres avoir bien compris comment marchait la fonction '''parse''' manuellement (lors de son utilisation dans le Shell), nous l'avons implémentée dans notre serveur de collecte qui lance cette commande lors de l’appui sur un bouton via notre interface virtuelle. Un problème rencontré était de savoir quand la récolte des données devait s’arrêter. Nous avons donc rajouté un temps à entrer nous-même sur l'interface. La fonction '''parse''' est effectuée et le sous-processus va attendre le temps donné avant de lancer une commande permettant de tuer le processus et mettant donc fin au remplissage du fichier '''.log'''. Nous voulons de plus réussir à lancer une fonction de collecte sans temps. C'est à dire que nous coupons la collecte via un bouton par nous-mêmes. Nous voulions utiliser des Sockets pour pouvoir définir nous-mêmes la gestion de la communication mais l'idée a été abandonné car nous avons réussi à sauvegarder le PID du processus lancé. Il nous suffit donc de l’arrêter grâce à un autre bouton qui récupère cette variable et l’arrête ensuite. &lt;br /&gt;
&lt;br /&gt;
Toutes nos fonctions Pythons étant regroupées dans notre serveur '''requete.py''', nous avons décidé de créer un module qui regroupera toutes ces fonctions que nous pourrons utiliser dans '''requete.py'''. ceci nous permet de voir plus clair dans notre code et de faciliter le travail lorsque nous modifions le code tous les deux.&lt;br /&gt;
&lt;br /&gt;
Nous essayons en continu d'adapter le layout du site pour le rendre le plus attractif et simple possible, de façon à ce que chaque bouton et tableau soient clairs et compréhensibles.&lt;br /&gt;
&lt;br /&gt;
Nous avons commencé à récupérer les fichiers '''JSON''' créés à partir des fichier '''log''', c'est-à-dire que ces fichiers sont automatiquement stockés coté serveur dans un dossier nommé '''static/log'''. Notre but est de récupérer le nom des fichiers JSON et de les afficher dans un composant sur notre interface web. Il nous sera donc possible ensuite de sélectionner le nom d'un fichier. Lors de la sélection de ce nom de fichier, un tableau apparaît avec les valeurs de distances à l’intérieur.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 8'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 22/11/17 - Ven 24/11/17]]''  &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
**Automatisation du procédé de collecte par script Python (requete.py qui fait appel à engine.py)&lt;br /&gt;
***Développement d'un script engine.py regroupant les commandes exécutables par l'utilisateur via la page Web&lt;br /&gt;
***Travail sur la fonction &amp;quot;STOP&amp;quot; manuel d'une action de collecte de données (liaison entre script HTML, Javascript, et script Python)&lt;br /&gt;
***Mise en place d'un serveur HTTP Simple sous Python pour accéder aux fichiers de données à partir de la page Web&lt;br /&gt;
***Mise à jour de fonctions de connexion &lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Travail sur le layout du site (ajout de pages, navigation entre les pages, apparence, nettoyage des codes)&lt;br /&gt;
**Bon fonctionnement de l'ensemble serveur collecte + serveur HTTP + client Web&lt;br /&gt;
**Affichage de la liste des fichiers de données de distance (log, csv, JSON) via serveur HTTP en Python sur port 9999&lt;br /&gt;
*Corrections et nettoyage du dépôt GIT&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous continuons à développer les points énoncés la semaine dernière. Nous avons décidé de nous diriger vers un serveur HTTP Simple pour accéder à nos fichiers. Il s’avère que nous finirons par ne pas utiliser ce serveur. Nous irons récupérer les fichiers en question via des requêtes '''Ajax''' faites à la sélection du nom du fichier.&lt;br /&gt;
&lt;br /&gt;
Nous rencontrons depuis le début des problèmes avec les fonctions de connexion qui peuvent ne pas marcher à un moment donné. Nous essayons de trouver pourquoi ce bug est un bug qui ne se produit pas à chaque fois. Nous avons déterminé qu'il ne se produisait seulement lorsque les fonctions de connexions étaient lancée dans des threads. Nous ne savons toujours pas pourquoi ces thread bugguent seulement parfois et non à chaque essai de connexion.&lt;br /&gt;
&lt;br /&gt;
Nous avons nettoyé notre dépot '''Git''' car il s’avère que nous utilisions une mauvaise méthode de fusion et de stockage des documents.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 9'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 29/11/17 - Jeudi 30/11/17]]''  &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
**Automatisation du procédé de collecte par script Python (requete.py qui fait appel à engine.py)&lt;br /&gt;
***Travail sur la fonction &amp;quot;STOP&amp;quot; manuel d'une action de collecte de données (liaison entre script HTML, Javascript, et script Python)&lt;br /&gt;
***Recherches sur l'utilisation de fichiers JSON accessibles via le serveur HTTP&lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Travail sur le layout du site &lt;br /&gt;
**Travail sur la liaison entre fichiers JSON et affichage Web des données de distance&lt;br /&gt;
***Recherches et tests de solutions&lt;br /&gt;
****Affichage depuis un fichier&lt;br /&gt;
****Affichage à la volée lors d'une action de collecte&lt;br /&gt;
&lt;br /&gt;
*Revue de code avec Roudy DAGHER:&lt;br /&gt;
**Structure globale des codes ok&lt;br /&gt;
**Fonctionnement presque ok: fonctionnalités implémentées ok, mais parsage csv ne marche pas&lt;br /&gt;
**Refactoring nécessaire&lt;br /&gt;
**Correction de la fonction STOP et amélioration de la fonction de COLLECTE&lt;br /&gt;
**Faire plus de requêtes Javascript que de requêtes HTML&lt;br /&gt;
**Discussion pour l'implémentation du serveur de localisation (= algorithme de localisation) et des visualisations de données sur le site Web&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous avons d'abord revu l'ensemble de notre code et les méthodes utilisées avec notre tuteur '''Roudy Dagher'''. Nous nous approchons d'un serveur de collecte de données stable et fonctionnel. Nous avons refait les différentes connexions entre l'interface et le serveur afin de ne faire que des requêtes sur des '''WebServices'''. Il nous est possible de commencer la deuxième partie qui est l'envoi de ces tableaux de données afin de les envoyer vers le serveur de localisation via des API afin de recevoir des matrices de positions.&lt;br /&gt;
Nous pourrons grâce à ces matrices afficher une carte 3D des balises  et du TAG dans l'espace.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 10'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 06/12/17 - Jeudi 07/12/17]]'' &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
**Travail sur la fonction STOP&lt;br /&gt;
**Réalisation d'une expression régulière pour le parsage des fichiers log en fichier JSON&lt;br /&gt;
&lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Travail sur l'affichage des fichiers JSON&lt;br /&gt;
***Réalisation de toutes les requêtes Ajax&lt;br /&gt;
***Réalisation d'un menu déroulant dropdown pour charger le contenu des fichiers JSON dans le tableau de distances&lt;br /&gt;
&lt;br /&gt;
*Nettoyage du dépôt Git&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 11'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 13/12/17]]''  &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
&lt;br /&gt;
*Revue de code avec Roudy DAGHER:&lt;br /&gt;
**Discussion sur la partie système du projet et correction de certaines fonctions&lt;br /&gt;
&lt;br /&gt;
Nous nous sommes réunis avec l'un de nos tuteurs, qui a réalisé certains bouts de code de base, pour nous mettre au point sur les fonctions en question et leur utilisation.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 12'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 20/12/17 - Jeudi 21/12/17]]''&lt;br /&gt;
*Revue, correction et nettoyage des codes&lt;br /&gt;
*Finalisation du rapport&lt;br /&gt;
*Planification de semaines restantes&lt;br /&gt;
*Préparation de la soutenance&lt;br /&gt;
*Revue de mi-projet avec tous les tuteurs&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Cette dernière semaine a servi à finaliser le rapport et à discuter de l'avancée du projet, notamment avec nos tuteurs pour déterminer le travail restant, présenter le travail abouti et replanifier précisément les échéances pour le travail restant. Nous avons réalisé la soutenance de mi-projet le '''jeudi 21/12/17 à 8h'''.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 13'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 10/01/18 - Ven 12/01/18]]''  &lt;br /&gt;
*Travail sur la collecte des données (serveur de collecte et interface Web)&lt;br /&gt;
**Redéfinition du fichier de parsage car il crée des conflits et ne produit pas un fichier formaté de la façon attendue&lt;br /&gt;
***Nombre de balises réel n'est pas bien déterminé par le code&lt;br /&gt;
***ID de la première et de la dernière balise ne sont pas déterminés correctement&lt;br /&gt;
&lt;br /&gt;
**Automatisation de la collecte par un script Shell lançant toutes les commandes de CONNEXION, REDIRECTION, LANCEMENT CU, FERMETURE DU PROGRAMME (kill rfcomm / kill tcp_redirect)&lt;br /&gt;
***Dans le but d'automatiser la procédure&lt;br /&gt;
***Dans le but de résoudre un problème de gestion de ressources (le bug '''thread''' apparu plus tôt dans le projet)&lt;br /&gt;
&lt;br /&gt;
**Travail sur la résolution du bug thread car l'automatisation n'a pas résolu le problème&lt;br /&gt;
***Identification du ou des causes potentielles: gestion des ressources (synchrone, asynchrone ?), connexion Bluetooth, lancement des commandes dans le même script, lancement en fg/bg, conflit dû au temps d'exécution de chaque processus ?&lt;br /&gt;
***Lancement des commandes manuellement dans des terminaux ne pose aucun problème: solution la plus simple&lt;br /&gt;
&lt;br /&gt;
**Redesign de la page Collecte&lt;br /&gt;
***Remplacement des boutons de commande par un bouton unique d'initialisation&lt;br /&gt;
***Travail sur une mise à jour du menu déroulant dropdown régulière sans avoir à recharger la page Web&lt;br /&gt;
***Implémentation de plotly.js, un module Javascript qui permet d'afficher des graphes en 3D&lt;br /&gt;
&lt;br /&gt;
*Mise au point post-soutenance avec Roudy DAGHER pour valider le travail restant, effectué et redéfinir certains objectifs atteignables ou pas selon les éléments réalisés dans le projet&lt;br /&gt;
*Recherches et début de l'implémentation du serveur de localisation fourni par les tuteurs&lt;br /&gt;
*Gestion du Git pour créer des branches additionnelles&lt;br /&gt;
*Recréation du rapport de projet suite à une perte du fichier éditable d'origine + Mise à jour avec les remarques suite à la soutenance ainsi que les nouveaux éléments&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 14'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mar 16/01/18 - Ven 19/01/18]]''  &lt;br /&gt;
*Travail sur la collecte des données (serveur de collecte et interface Web)&lt;br /&gt;
**Redéfinition du fichier de parsage car il crée des conflits et ne produit pas un fichier formaté de la façon attendue&lt;br /&gt;
***Corrigé: Nombre de balises réel n'est pas bien déterminé par le code&lt;br /&gt;
***Corrigé: ID de la première et de la dernière balise ne sont pas déterminés correctement&lt;br /&gt;
***Reste à faire: Traiter le cas où il y a un ajout ou suppression d'une balise pendant la collecte (pour le moment, lorsque c'est le cas, toutes les données se décalent au lieu de laisser des trous)&lt;br /&gt;
&lt;br /&gt;
**Automatisation de la collecte par un script Shell lançant toutes les commandes de CONNEXION, REDIRECTION, LANCEMENT CU, FERMETURE DU PROGRAMME (kill rfcomm / kill tcp_redirect)&lt;br /&gt;
***Mis en suspens: pour le moment, on lance les commandes manuellement dans le terminal&lt;br /&gt;
&lt;br /&gt;
**Interface Web&lt;br /&gt;
***Implémentation de plotly.js, un module Javascript qui permet d'afficher des graphes en 3D&lt;br /&gt;
&lt;br /&gt;
*Implémentation du serveur de localisation fourni par les tuteurs (mais algorithme de localisation pas fonctionnel pour le moment)&lt;br /&gt;
**Mise à jour de l'affichage des positions des éléments: précédemment seule la matrice X de position du Tag s'affichait, et pas la matrice A des balises&lt;br /&gt;
**Requêtes manuelles à l'API avec la fonction curl OK: on arrive à récupérer les matrices X et A (aléatoires pour le moment) par une requête GET à l'API du serveur de localisation&lt;br /&gt;
**Implémentation des requêtes Ajax pour automatiser les requêtes au serveur de localisation&lt;br /&gt;
&lt;br /&gt;
*Mise à jour du rapport les nouveaux éléments du travail réalisé&lt;br /&gt;
*Réflexion sur la possibilité ou non de réaliser la partie temps réel du projet au vu des moyens à disposition&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 15'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mar 23/01/18 - Ven 26/01/18]]'' &lt;br /&gt;
*Travail sur la collecte des données (serveur de collecte et interface Web)&lt;br /&gt;
**Redéfinition du fichier de parsage car il crée des conflits et ne produit pas un fichier formaté de la façon attendue&lt;br /&gt;
***Fait: Si distance négative car Tag trop près, la valeur négative générée par une balise est remplacée par un &amp;quot;0&amp;quot; (cela modifie la position réelle modélisée dans plotly, mais évite une impossibilité de générer la position à partir de la distance -&amp;gt; par des tests, il faudra déterminer la valeur limite à partir de laquelle les cartes donnent des valeurs de distance négatives&lt;br /&gt;
***Reste à faire: Traiter le cas où il y a un ajout ou suppression d'une balise pendant la collecte (pour le moment, lorsque c'est le cas, toutes les données se décalent au lieu de laisser des trous); Ainsi que le cas où il y un saut/bug inattendu et donc une disparition d'une ou plusieurs valeurs de distance&lt;br /&gt;
***Début de résolution du cas où une distance n'est pas prise en compte, c'est à dire où il y a une valeur qui disparaît et désaligne les valeurs lors de la création du JSON&lt;br /&gt;
&lt;br /&gt;
**Automatisation de la collecte par un script Shell lançant toutes les commandes de CONNEXION, REDIRECTION, LANCEMENT CU, FERMETURE DU PROGRAMME (kill rfcomm / kill tcp_redirect)&lt;br /&gt;
***Mis en suspens: pour le moment, on lance les commandes manuellement dans le terminal&lt;br /&gt;
***Création d'un script bash /etc/init.d/autoconnect.sh pour connecter automatiquement la RPi au lancement du système (si la RPi est déjà allumée au démarrage)&lt;br /&gt;
&lt;br /&gt;
**Interface Web&lt;br /&gt;
***Perfectionnement de l'utilisation de Plotly pour les visualisations&lt;br /&gt;
&lt;br /&gt;
*Implémentation du serveur de localisation fourni par les tuteurs (algorithme de localisation pas fonctionnel pour le moment)&lt;br /&gt;
**Requêtes manuelles à l'API avec la fonction curl OK&lt;br /&gt;
**Fait: Implémentation des requêtes Ajax pour automatiser les requêtes au serveur de localisation&lt;br /&gt;
***Liaison entre les différentes requêtes ajax grâce à des variables: permet de stocker l'adresse du job récupérée par la méthode GET&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 16'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Lun 29/01/18 - Ven 02/02/18]]'' &lt;br /&gt;
*Travail sur la collecte des données (serveur de collecte et interface Web)&lt;br /&gt;
**Redéfinition du fichier de parsage car il crée des conflits et ne produit pas un fichier formaté de la façon attendue&lt;br /&gt;
***déterminer la valeur limite à partir de laquelle les cartes donnent des valeurs de distance négatives&lt;br /&gt;
***Reste à faire: Traiter le cas où il y a un ajout ou suppression d'une balise pendant la collecte (pour le moment, lorsque c'est le cas, toutes les données se décalent au lieu de laisser des trous); Ainsi que le cas où il y un saut/bug inattendu et donc une disparition d'une ou plusieurs valeurs de distance&lt;br /&gt;
***Fait: gestion des bugs/sauts de valeurs de balises - remplacement par une valeur nulle sur balise existe, par rien sinon (implémentation d'un tableau caractérisant l'existence ou pas de chaque balise 1 à 6), optimisation des temps de calculs/exécution dans le script&lt;br /&gt;
**Interface Web&lt;br /&gt;
***Ajout d'une barre de progression de la collecte remplaçant le bouton de Lancement de collecte lors de l'appui&lt;br /&gt;
***Ajout d'un bouton dropdown pour afficher les fichiers de position qu'on reçoit du serveur de localisation&lt;br /&gt;
***Ajout d'une scrollbar dans les deux dropdown&lt;br /&gt;
&lt;br /&gt;
*Implémentation du serveur de localisation fourni par les tuteurs (algorithme de localisation pas fonctionnel pour le moment)&lt;br /&gt;
**Fait: Implémentation des requêtes Ajax pour automatiser les requêtes au serveur de localisation&lt;br /&gt;
***Création d'une requête Ajax GET qui demande le fichier JSON de position au serveur de localisation jusqu'à ce qu'il soit retourné&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 17'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Lun 05/02/18 - Ven 09/02/18]]''&lt;br /&gt;
&lt;br /&gt;
*Algorithme de localisation mis en ligne par le tuteur&lt;br /&gt;
**test du bon fonctionnement des connections entre parties après intégration de l'algorithme&lt;br /&gt;
**test su la qualité de l'algorithme&lt;br /&gt;
**test sur la précision de l'algorithme&lt;br /&gt;
*Rapport partie Front-end&lt;br /&gt;
*Rapport partie Back-end&lt;br /&gt;
*Nettoyage du code requete.py&lt;br /&gt;
*Mise à jour final des de certes pages du site&lt;br /&gt;
** matrice.html à jour&lt;br /&gt;
**3D.html à jour&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 18'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Lun 12/02/18 - Ven 16/02/18]]''&lt;br /&gt;
&lt;br /&gt;
*Algorithme de localisation mis en ligne par le tuteur&lt;br /&gt;
**test de perturbation et des limites du systeme d'antenne Locopositioning&lt;br /&gt;
*Rapport partie III &lt;br /&gt;
*rapport partie I&lt;br /&gt;
*réalisation de la vidéo de présentation&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 19'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Lun 19/02/18 - Ven 23/02/18]]''&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Observations'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Problèmes rencontrés'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Solutions apportées'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Délivrables'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
Rapport de mi-PFE&lt;br /&gt;
[[Fichier:RapportMi-PFE-UNG DELATTE.pdf]]&lt;br /&gt;
&lt;br /&gt;
Rapport de PFE&lt;br /&gt;
&lt;br /&gt;
Vidéo&lt;/div&gt;</summary>
		<author><name>Hdelatte</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=P18_Localisation_of_quadrotors&amp;diff=51100</id>
		<title>P18 Localisation of quadrotors</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=P18_Localisation_of_quadrotors&amp;diff=51100"/>
				<updated>2018-02-16T15:25:01Z</updated>
		
		<summary type="html">&lt;p&gt;Hdelatte : /* Semaine 18 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Cahier des charges'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;Présentation générale du projet&amp;lt;/span&amp;gt;=== &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Contexte&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
Dans un monde de plus en plus connecté, de nombreux drones sont déployés pour diverses applications comme l'espionnage, la surveillance, la cartographie de lieux et la livraison de colis. Les technologies nécessaires pour contrôler ces drones sont des sujets de recherche actuels. &lt;br /&gt;
&lt;br /&gt;
Le contrôle de ceux-ci passe tout d'abord par la maîtrise de leur position dans l'espace. Le développement des applications liées à l'utilisation de drones nécessite un travail important sur la localisation spatiale d'objets connectés. &lt;br /&gt;
&lt;br /&gt;
De plus, dans un souci d'utilisation, il est essentiel de développer des interfaces logicielles permettant d'exploiter ces données.&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Objectif du projet&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
L'objectif de ce projet est de développer une interface logicielle permettant de traiter en temps réel les informations de localisation d'un drone et de balises, dans le but de définir leur localisation dans l'espace, en intérieur.&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Description du projet&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
Pour réaliser le contrôle de drones, la première étape importante est de donner ses informations de position. Le but du projet est de développer une interface logicielle permettant de localiser le drone en temps réel en intérieur. Le drone se déplace dans un environnement dans lequel ont été installées de multiples balises. Il est équipé d'une carte, lui permettant de recevoir les distances relatives entre lui-même et les balises, sur laquelle différents algorithmes vont être implémentés pour effectuer la localisation en temps réel. Le projet requiert des compétences en développement hardware (Crazyflie 2.0, voir https://wiki.bitcraze.io/) et software (langage C/C++/Python/Javascript/HTML...).&lt;br /&gt;
&lt;br /&gt;
Il se divise en 4 étapes principales, qui sont:&lt;br /&gt;
*1) Choisir les technologies utilisées&lt;br /&gt;
*2) Choisir l'architecture (OS / APIs)&lt;br /&gt;
*3) Développer les différentes parties du projet&lt;br /&gt;
*4) Intégrer et connecter les différentes parties du projet&lt;br /&gt;
&lt;br /&gt;
La localisation étant en intérieur, le protocole GPS n'est donc pas assez précis pour les applications ciblées. La mise en place d'un tel dispositif permettrait grâce à l'utilisation d'un algorithme d'estimer avec une bonne précision les positions en intérieur d'une balise centrale (appelée Tag) et de balises (appelées Anchor). Le Tag scanne en temps réel la distance relative aux différentes balises, et il nous est retourné la position des balises et du Tag grâce à l'algorithme de localisation.&lt;br /&gt;
&lt;br /&gt;
Le projet se compose de 3 parties:&lt;br /&gt;
* Collect &amp;amp; parse: collecter les données envoyées par les balises en communiquant avec un serveur et récupérer les données adéquates par un tri&lt;br /&gt;
* Localise: déterminer la matrice de position des balises et du Tag en traitant les données récupérées&lt;br /&gt;
* Display: développer l'interface homme machine pour afficher, étudier et utiliser les données traitées&lt;br /&gt;
&lt;br /&gt;
Nous travaillerons dans un premier temps dans une optique temps différé avant de travailler en temps réel. Cela nous permettra d'acquérir des données utiles et réutilisables en aval. &lt;br /&gt;
&lt;br /&gt;
A l'aboutissement du projet, nous devrions être capable via l'interface homme machine développée d'afficher précisément la position spatiale des balises ainsi que du Tag, grâce àl'utilisation d'un algorithme de localisation et des données récupérées, et d'afficher d'autres données relatives au déplacement du Tag ou des balises dans l'espace. &lt;br /&gt;
&lt;br /&gt;
Si le temps le permet, nous pourrons aussi être amenés à adapter et utiliser l'interface développée pour l'utilisation d'un drone.&lt;br /&gt;
&lt;br /&gt;
''Sujet originel''&lt;br /&gt;
&lt;br /&gt;
To achieve the control of quadrotors, the first important task to give its position information. This project is to develop a software(GUI) to localize the quadrotors in real-time. The quadrotor is flying in an environment where several transmitters have been installed. The quadrotor is equipped with a deck to receive the relative distances between the deck and all transmitters, based on which different algorithms will be implemented to realize the real-time localization. The candidates need to have both experiences on hardware (Crazyflie 2.0, see https://wiki.bitcraze.io/) and software development (C/C , Python…). &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Calendrier prévisionnel&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
''[[Avant le 29/09/17]]'' - Élaboration du Cahier des charges, de la liste des tâches et du calendrier prévisionnel&lt;br /&gt;
&lt;br /&gt;
''[[Avant fin Octobre]]'' - Serveur de collecte et début du développement de l'interface logicielle&lt;br /&gt;
&lt;br /&gt;
''[[Avant fin Décembre]]'' - Interface logicielle&lt;br /&gt;
&lt;br /&gt;
''[[A la fin du PFE]]'' - Intégration finale des différentes parties (Serveur de collecte des données &amp;amp; Serveur de localisation &amp;amp; Interface logicielle)&lt;br /&gt;
&lt;br /&gt;
Répartition du volume de travail (***h):&lt;br /&gt;
&lt;br /&gt;
* Recherche sur les technologies à utiliser&lt;br /&gt;
* Développement du serveur de collecte de données&lt;br /&gt;
* Réalisation de l'interface logicielle (Web//Logiciel/Application)&lt;br /&gt;
* Intégration des différentes parties&lt;br /&gt;
* Test et débuggage&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Choix techniques : matériel et logiciel&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
Afin de développer ce dispositif, nous allons utiliser une Raspberry Pi 3 associée à une carte réceptrice, qui communique avec 4 balises composées chacune d'un microcontrôleur et d'une carte émettrice radio (UWB5C) et alimentées par batteries. La carte réceptrice joue le rôle du drone à localiser et communiquera les données émises par les balises vers l'ordinateur via Bluetooth.&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Choix technologiques&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
Voici les technologies que nous utilisons pour chacune des parties de ce projet.&lt;br /&gt;
&lt;br /&gt;
    1) Serveur de collecte des données:&lt;br /&gt;
       Scanne et parse les données récupérées pour fournir la matrice D des distances relatives du tag aux 4 balises&lt;br /&gt;
        - API&lt;br /&gt;
        - Python / Serveur Flask&lt;br /&gt;
&lt;br /&gt;
    2) Serveur de localisation (fourni):&lt;br /&gt;
       Calcule grâce à l'algorithme de localisation et la matrice D les positions spatiales des 4 noeuds et du tag&lt;br /&gt;
        - API&lt;br /&gt;
        - Bootstrap&lt;br /&gt;
        - Jquery&lt;br /&gt;
        - Python&lt;br /&gt;
&lt;br /&gt;
    3) Interface utilisateur:&lt;br /&gt;
       Affiche courbes, visualisation 3D, boutons ou données des fichiers envoyées par le serveur de localisation&lt;br /&gt;
        - HTML5 / Javascript&lt;br /&gt;
        - Fichiers JSON (serveurs de collecte et de localisation)&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Calendrier prévisionnel'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Liste des tâches à effectuer&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
# Se documenter sur le projet&lt;br /&gt;
##Langages et technologies utilisées&lt;br /&gt;
##Matériel utilisé&lt;br /&gt;
##Mettre en place du travail sur le Git&lt;br /&gt;
# Réaliser le serveur de collecte&lt;br /&gt;
##Récupérer les trames envoyées par bluetooth par le TAG via la Raspberry Pi&lt;br /&gt;
##Intégrer le serveur de localisation pour interpréter les trames&lt;br /&gt;
##Tester et optimiser&lt;br /&gt;
# Réaliser l'interface Web utilisateur&lt;br /&gt;
##Implémenter le serveur de collecte et de localisation&lt;br /&gt;
##Afficher et traiter les données stockées dans les fichiers JSON via le serveur (temps différé + temps réel)&lt;br /&gt;
##Tester et optimiser&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;Replanification du cahier des charges / calendrier&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Feuille d'heures'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Tâche !! Prélude !! Heures S1 !! Heures S2 !! Heures S3 !! Heures S4 !! Heures S5 !! Heures S6 !! Heures S7 !! Heures S8 !! Heures S9 !! Heures S10 !! Heures S11 !! Heures S12 !! Heures S13 !! Heures S14 !! Heures S15 !! Heures S16 !! Heures S17 !! Heures S18 !! Heures S19 !! Total&lt;br /&gt;
|-&lt;br /&gt;
| Cahier des charges / Wiki / Gitlab / Rapport&lt;br /&gt;
|  4h&lt;br /&gt;
|  3h&lt;br /&gt;
|  1h&lt;br /&gt;
|  x&lt;br /&gt;
|  1h30&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h30&lt;br /&gt;
|  1h&lt;br /&gt;
|  3h&lt;br /&gt;
|  3h30&lt;br /&gt;
|  2h&lt;br /&gt;
|  5h&lt;br /&gt;
|  x&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Documentation sur les technos utilisées&lt;br /&gt;
|  2h&lt;br /&gt;
|  4h&lt;br /&gt;
|  3h&lt;br /&gt;
|  2h&lt;br /&gt;
|  3h&lt;br /&gt;
|  4h&lt;br /&gt;
|  5h&lt;br /&gt;
|  5h30&lt;br /&gt;
|  4h30&lt;br /&gt;
|  3h30&lt;br /&gt;
|  2h&lt;br /&gt;
|  3h&lt;br /&gt;
|  1h&lt;br /&gt;
|  3h&lt;br /&gt;
|  4h&lt;br /&gt;
|  x&lt;br /&gt;
|  2h&lt;br /&gt;
|  &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Documentation sur le matériel&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  1h&lt;br /&gt;
|  1h&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Recherche et développement du serveur de collecte&lt;br /&gt;
|  x&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  3h&lt;br /&gt;
|  3h30&lt;br /&gt;
|  4h&lt;br /&gt;
|  5h&lt;br /&gt;
|  7h&lt;br /&gt;
|  4h30&lt;br /&gt;
|  0,5h&lt;br /&gt;
|  3h&lt;br /&gt;
|  4h&lt;br /&gt;
|  3h&lt;br /&gt;
|  x&lt;br /&gt;
|  4h&lt;br /&gt;
|  7h30&lt;br /&gt;
|  5h&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Recherche et développement de l'interface Web&lt;br /&gt;
|  x&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  3h&lt;br /&gt;
|  5h&lt;br /&gt;
|  6h&lt;br /&gt;
|  4h&lt;br /&gt;
|  7h&lt;br /&gt;
|  5h30&lt;br /&gt;
|  2h30&lt;br /&gt;
|  6h&lt;br /&gt;
|  8h&lt;br /&gt;
|  5h&lt;br /&gt;
|  1h&lt;br /&gt;
|  8h&lt;br /&gt;
|  4h&lt;br /&gt;
|  4h&lt;br /&gt;
|  &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Recherche et intégration du serveur de localisation&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x &lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  6h&lt;br /&gt;
|  5h&lt;br /&gt;
|  3h&lt;br /&gt;
|  &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Intégration des différentes parties&lt;br /&gt;
|  x&lt;br /&gt;
|  x  &lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  2h&lt;br /&gt;
|  2h&lt;br /&gt;
|  2h&lt;br /&gt;
|  3h&lt;br /&gt;
|  1h30&lt;br /&gt;
|  x&lt;br /&gt;
|  3h&lt;br /&gt;
|  6h&lt;br /&gt;
|  5h&lt;br /&gt;
|  x&lt;br /&gt;
|  3h30&lt;br /&gt;
|  2h&lt;br /&gt;
|  2h&lt;br /&gt;
|  &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Tests et débuggage&lt;br /&gt;
|  x&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  1h&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  3h&lt;br /&gt;
|  4h&lt;br /&gt;
|  0,5h&lt;br /&gt;
|  3h&lt;br /&gt;
|  1h&lt;br /&gt;
|  3h&lt;br /&gt;
|  3h&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  4h&lt;br /&gt;
|  &lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Optimisation/Correction des programmes&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Vidéo&lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Avancement du Projet'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Phase préparatoire'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Jeu 21/09/17 - Ven 22/09/17]]'' &lt;br /&gt;
*Rendez-vous de mise au point du cahier des charges avec les encadrants/intervenants (M. ZHENG Gang et M. DAGHER Roudy)&lt;br /&gt;
*Elaboration du cahier des charges&lt;br /&gt;
*Elaboration de la page Wiki (préparation de la mise en page et présentation du sujet)&lt;br /&gt;
*Préparation du travail sous forme de Mind Map&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous nous sommes tout d’abord rendus au laboratoire de l'INRIA afin de pouvoir définir le plus précisément possible le cahier des charges avec nos tuteurs.&lt;br /&gt;
Nous avons donc défini avec eux les technologies qu'il faudrait étudier. Vous retrouverez le choix des technologies dans la partie '''choix technologiques'''&lt;br /&gt;
&lt;br /&gt;
Nous avons en même temps créé notre page Wiki, et structurée celle-ci avec les parties qui nous seraient utiles pour développer nos explications par la suite.&lt;br /&gt;
&lt;br /&gt;
Nous avons de plus découpé le travail en sous-parties que nous avions mis dans une '''Mind map''' afin d'y voir plus clair sur la ligne à suivre.&lt;br /&gt;
&lt;br /&gt;
Vous trouverez cette Mind map juste ci-dessous. Nous ne mettrons pas à jour cette Mind map chaque semaine mais il est fort probable que nous en refaisions un en milieu de projet pour pouvoir cibler les objectifs réussis et ceux à atteindre. Nous pourrons de plus redéfinir certains objectifs qui nous auraient semblés trop vague au début du projet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Projet de fin d'étude.png|centre|600px]]&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 1'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Jeu 28/09/17 - Ven 29/09/17]]'' &lt;br /&gt;
*Revue du Cahier des Charges avec les encadrants&lt;br /&gt;
*Lecture et recherches sur les technologies adaptées&lt;br /&gt;
*Construction de la suite de la Mind Map&lt;br /&gt;
*Création du Gitlab&lt;br /&gt;
&lt;br /&gt;
Nous commençons les recherches sur le projet et sur les premières technologies engagées dans celui-ci. Nous en profitons pour formuler dès à présent des questions sur le bon choix de celles-ci. Nous commençons donc des tests ayant seulement pour but de nous familiariser avec l'environnement de travail et de réellement comprendre les fonctions déjà présentes qu'il faudra exploiter et implanter notre interface web.&lt;br /&gt;
Nous créons un dépôt Gitlab avec notre tuteur et commençons a définir les taches premières sur celui-ci.&lt;br /&gt;
Nous en profitons pour affiner le Mind Map.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 2'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Jeu 05/10/17 - Ven 06/10/17]]''  &lt;br /&gt;
*Précisions sur le cahier des charges&lt;br /&gt;
*Listage du matériel&lt;br /&gt;
*Recherche et détermination de solutions technologiques possibles pour les fonctions demandées&lt;br /&gt;
*Début du travail sur le serveur de collecte&lt;br /&gt;
*Apprentissage du langage Python et de l'utilisation du framework Flask&lt;br /&gt;
&lt;br /&gt;
Nous avons finalisé les précisions sur le cahier des charges. Nous avons donc pu cibler le matériel dont nous nous servirons pour ce Projet. Vous trouverez donc cette liste la section correspondante. Il est évident que le matériel utilisé est dans l'ensemble déjà fourni par le laboratoire et qu'il nous reste dans l'ensemble à créer l'interface web et les API qui nous permettrons de faire communiquer cette interface avec la Raspberry Pi et le serveur de position déjà créé.&lt;br /&gt;
Nous avons donc pu commencer à nous former sur les technologies qui nous serviraient par la suite. Nous avons donc utilisé le cours d'Openclassrooms sur les serveurs Flask pour en apprendre les bases. Ce serveur Flask est programmé en Python et nous permet donc une grande liberté au niveau de l’exécution de certains scripts. En effet, les scripts de connexion Bluetooth et de redirection de port qui nous permettent de récupérer les données de distance sont eux-mêmes codés en Python et sont directement appelés via le serveur.&lt;br /&gt;
Dans ce serveur, représentant notre interface web, vous retrouverez la page '''/collecte''' qui représentera notre partie collecte de données ainsi que l'affichage de ces distances. Nous appellerons cette partie le Serveur de Collecte.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 3'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 11/10/17 - Jeu 12/10/17]]''  &lt;br /&gt;
*Recherche et développement initial du serveur de collecte de données&lt;br /&gt;
*Complément du Git sur les tâches à effectuer&lt;br /&gt;
&lt;br /&gt;
Nous avons commencé à créer un serveur Flask renvoyant pour l'instant une matrice aléatoire. Lors de la requête URL &amp;quot;../matrice&amp;quot;, nous voyons bien une matrice aléatoire apparaître sur la page Web. Nous essayons de nous connecter à la Raspberry Pi en redirigeant son port série vers le Bluetooth de façon à récupérer de vraies matrices de distance entre le drone (ie commutateur central) et les balises. Nous pourrons afficher ensuite ces matrices, ou alors les stocker dans un fichier en attendant le traitement de celles-ci.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Requete s3.PNG|300px|serveur Flask]]&lt;br /&gt;
&lt;br /&gt;
Nous avons plusieurs problèmes avec le Bluetooth pour se connecter avec la Raspberry Pi. Quand nous aurons réussi à nous connecter au port série de la Raspberry Pi alors nous pourrons gérer le traitement des données récupérées.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 4'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 18/10/17 - Jeu 19/10/17]]''  &lt;br /&gt;
*Configuration de la Raspberry Pi car problèmes de connectivité Bluetooth rencontrés&lt;br /&gt;
**Nous arrivons à connecter la Raspberry Pi sous Windows mais la connexion sous Linux pose problème (travail en suspens en attendant la disponibilité de l'encadrant)&lt;br /&gt;
*Début du développement de l'interface Web&lt;br /&gt;
**Traitement d'une matrice dans un fichier JSON&lt;br /&gt;
**Affichage sous forme de tableau de la matrice&lt;br /&gt;
**Utilisation du serveur de requête en Python avec chargement de template HTML&lt;br /&gt;
**Mise en forme de la trame de la page en HTML/CSS avec le framework Bootstrap&lt;br /&gt;
**Ajout d'un set de distances (d1, d2, d3, d4) dans la matrice lors d'un appui sur un bouton Chargement en utilisant un fichier Javascript&lt;br /&gt;
&lt;br /&gt;
Nous avons reçu des fonctions Python de notre tuteur afin d'obtenir une connexion Bluetooth entre notre Raspberry Pi et notre ordinateur ainsi qu'une redirection de port de celle-ci vers la connexion. Nous n'arrivons pas à utiliser ces fonctions sous linux et nous nécessitons une explication de notre tuteur n'étant pas disponible à ce moment. Pour ne pas perdre de temps, nous attaquons la création de l'interface web à proprement parler, c'est à dire la création des pages HTML ainsi que le document Javascript qui nous servira de bibliothèque de fonctions. Chaque route de notre serveur est reliée à une série de fonctions Python s'exécutant à l'appel des url puis suivies d'un template de la page HTML en question. Nous en profitons de plus pour explorer le framework CSS bootstrap afin de mettre un premier design et une structure a notre page collecte qui sera la page principale de notre site pour ce début de projet.&lt;br /&gt;
&lt;br /&gt;
Nous nous essayons de plus à différents tests sur des fichiers de format '''JSON''' que nous devrons réussir à traiter correctement plus tard dans notre projet.&lt;br /&gt;
Nous récupérons une matrice que nous créons nous-mêmes en Python (simulation d'une série de distances récupérée) que nous transformons au format JSON pour ensuite l'afficher sur notre page web. Pour pouvoir proprement afficher ce fichier '''JSON''' renvoyé vers notre page, nous nous servons du fichier Javascript afin de créer du code HTML contenant la matrice.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 5'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 25/10/17 - Ven 27/10/17]]''  &lt;br /&gt;
*Résolution des problèmes de connectique Bluetooth sur la Raspberry Pi&lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Traitement d'une matrice dans un fichier JSON&lt;br /&gt;
**Début de l'ajout d'un set de distances depuis une matrice contenue dans un fichier JSON&lt;br /&gt;
&lt;br /&gt;
Nous avons pu nous entretenir avec notre tuteur et donc comprendre les fonctions de connexion et de redirection de port. Nous pouvons donc continuer le développement de notre interface web. Nous arrivons à traiter un set de données au format JSON et à l'afficher dans le code HTML. Toutefois nous créons nous-mêmes ce set, il est maintenant nécessaire que nous arrivions à récupérer les sets de distance réels reçus par la connexion Bluetooth. Nous commencerons par un traitement asynchrone. L'idée est d’enregistrer les sets de distances dans un fichier '''JSON''' stocké dans un dossier. Nous appellerons ce dossier plus tard via une requête Ajax.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 6'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 08/11/17 - Ven 10/11/17]]''  &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
**Mise en place de la communication entre le port série de notre machine et le port série de la carte via Bluetooth de la RPi3&lt;br /&gt;
**Récupération et traitement (parse) manuels des données de distances dans un fichier .log via TCP/IP&amp;lt;-&amp;gt;Bluetooth&lt;br /&gt;
**Début de l'automatisation du procédé par script Python (requete.py) et mise en place de sockets de communication&lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Chargement sur commande d'un set de distances depuis une matrice contenue dans un fichier JSON&lt;br /&gt;
*Travail sur le layout du site&lt;br /&gt;
&lt;br /&gt;
Après avoir regardé le code de ces différentes fonctions nous avons pu faire des tests manuels via le Shell pour récupérer des données de distances et les stocker dans un fichier '''JSON''' sur notre ordinateur.&lt;br /&gt;
&lt;br /&gt;
Nous utilisons les commandes suivantes pour se connecter via Bluetooth:&lt;br /&gt;
&lt;br /&gt;
 rfcomm connect /dev/rfcomm0 B8:27:EB:80:DC:89 1&lt;br /&gt;
&lt;br /&gt;
Rediriger le port de la Raspberrypi3 vers la connexion:&lt;br /&gt;
&lt;br /&gt;
 Python lps-collector/tcp_serial_redirect.py /dev/rfcomm0 9600&lt;br /&gt;
&lt;br /&gt;
Collecter les données dans un fichier dont nous définissons le nom:&lt;br /&gt;
&lt;br /&gt;
 echo &amp;quot;cu -s9600 -lttyACM0&amp;quot;| nc localhost 7777&lt;br /&gt;
 nc localhost 7777 | grep distance &amp;gt; static/log/dist-capture'+date+'.log&lt;br /&gt;
&lt;br /&gt;
Nous pouvons '''parser''' le flux de données avant de le stocker dans le fichier via cette commande:&lt;br /&gt;
&lt;br /&gt;
 Python lps-collector/lps_parse.py static/log/dist-capture&amp;quot;+date+&amp;quot;.log&lt;br /&gt;
&lt;br /&gt;
Il est donc nécessaire d'inclure via des '''thread''' ces différentes fonctions dans notre serveur Python (Flask) afin d'automatiser le processus. Le but est de pouvoir choisir sur l'interface web quels fonctions il faut exécuter et les déclencher via l'appui sur des boutons.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 7'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 15/11/17 - Ven 17/11/17]]''  &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
**Récupération et traitement (parse) manuels des données de distances dans un fichier .log via TCP/IP&amp;lt;-&amp;gt;Bluetooth&lt;br /&gt;
**Automatisation du procédé par script Python (requete.py)&lt;br /&gt;
***Mise en place de sockets de communication pour le contrôle de la collecte -&amp;gt; abandonné (servait à commander la collecte manuellement)&lt;br /&gt;
***Développement d'un script engine.py regroupant les commandes exécutables par l'utilisateur via la page Web&lt;br /&gt;
***Début du travail sur la fonction &amp;quot;STOP&amp;quot; manuel d'une action de collecte de données (liaison entre script HTML, Javascript, et script Python)&lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Chargement sur commande d'un set de distances depuis une matrice contenue dans un fichier JSON&lt;br /&gt;
**Travail sur le layout du site&lt;br /&gt;
***Ajout des différentes commandes (connexion Bluetooth, lancement commande cu, collecte des données, collecte durée donnée)&lt;br /&gt;
***Début de l'implémentation de la visualisation des fichiers .JSON obtenus après collecte et affichage dans un tableau matriciel du fichier sélectionné&lt;br /&gt;
&lt;br /&gt;
Nous avons continué à travailler sur le serveur de collecte: les données que nous avons récupérées via Bluetooth sont stockées dans un fichier .log. Apres avoir bien compris comment marchait la fonction '''parse''' manuellement (lors de son utilisation dans le Shell), nous l'avons implémentée dans notre serveur de collecte qui lance cette commande lors de l’appui sur un bouton via notre interface virtuelle. Un problème rencontré était de savoir quand la récolte des données devait s’arrêter. Nous avons donc rajouté un temps à entrer nous-même sur l'interface. La fonction '''parse''' est effectuée et le sous-processus va attendre le temps donné avant de lancer une commande permettant de tuer le processus et mettant donc fin au remplissage du fichier '''.log'''. Nous voulons de plus réussir à lancer une fonction de collecte sans temps. C'est à dire que nous coupons la collecte via un bouton par nous-mêmes. Nous voulions utiliser des Sockets pour pouvoir définir nous-mêmes la gestion de la communication mais l'idée a été abandonné car nous avons réussi à sauvegarder le PID du processus lancé. Il nous suffit donc de l’arrêter grâce à un autre bouton qui récupère cette variable et l’arrête ensuite. &lt;br /&gt;
&lt;br /&gt;
Toutes nos fonctions Pythons étant regroupées dans notre serveur '''requete.py''', nous avons décidé de créer un module qui regroupera toutes ces fonctions que nous pourrons utiliser dans '''requete.py'''. ceci nous permet de voir plus clair dans notre code et de faciliter le travail lorsque nous modifions le code tous les deux.&lt;br /&gt;
&lt;br /&gt;
Nous essayons en continu d'adapter le layout du site pour le rendre le plus attractif et simple possible, de façon à ce que chaque bouton et tableau soient clairs et compréhensibles.&lt;br /&gt;
&lt;br /&gt;
Nous avons commencé à récupérer les fichiers '''JSON''' créés à partir des fichier '''log''', c'est-à-dire que ces fichiers sont automatiquement stockés coté serveur dans un dossier nommé '''static/log'''. Notre but est de récupérer le nom des fichiers JSON et de les afficher dans un composant sur notre interface web. Il nous sera donc possible ensuite de sélectionner le nom d'un fichier. Lors de la sélection de ce nom de fichier, un tableau apparaît avec les valeurs de distances à l’intérieur.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 8'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 22/11/17 - Ven 24/11/17]]''  &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
**Automatisation du procédé de collecte par script Python (requete.py qui fait appel à engine.py)&lt;br /&gt;
***Développement d'un script engine.py regroupant les commandes exécutables par l'utilisateur via la page Web&lt;br /&gt;
***Travail sur la fonction &amp;quot;STOP&amp;quot; manuel d'une action de collecte de données (liaison entre script HTML, Javascript, et script Python)&lt;br /&gt;
***Mise en place d'un serveur HTTP Simple sous Python pour accéder aux fichiers de données à partir de la page Web&lt;br /&gt;
***Mise à jour de fonctions de connexion &lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Travail sur le layout du site (ajout de pages, navigation entre les pages, apparence, nettoyage des codes)&lt;br /&gt;
**Bon fonctionnement de l'ensemble serveur collecte + serveur HTTP + client Web&lt;br /&gt;
**Affichage de la liste des fichiers de données de distance (log, csv, JSON) via serveur HTTP en Python sur port 9999&lt;br /&gt;
*Corrections et nettoyage du dépôt GIT&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous continuons à développer les points énoncés la semaine dernière. Nous avons décidé de nous diriger vers un serveur HTTP Simple pour accéder à nos fichiers. Il s’avère que nous finirons par ne pas utiliser ce serveur. Nous irons récupérer les fichiers en question via des requêtes '''Ajax''' faites à la sélection du nom du fichier.&lt;br /&gt;
&lt;br /&gt;
Nous rencontrons depuis le début des problèmes avec les fonctions de connexion qui peuvent ne pas marcher à un moment donné. Nous essayons de trouver pourquoi ce bug est un bug qui ne se produit pas à chaque fois. Nous avons déterminé qu'il ne se produisait seulement lorsque les fonctions de connexions étaient lancée dans des threads. Nous ne savons toujours pas pourquoi ces thread bugguent seulement parfois et non à chaque essai de connexion.&lt;br /&gt;
&lt;br /&gt;
Nous avons nettoyé notre dépot '''Git''' car il s’avère que nous utilisions une mauvaise méthode de fusion et de stockage des documents.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 9'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 29/11/17 - Jeudi 30/11/17]]''  &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
**Automatisation du procédé de collecte par script Python (requete.py qui fait appel à engine.py)&lt;br /&gt;
***Travail sur la fonction &amp;quot;STOP&amp;quot; manuel d'une action de collecte de données (liaison entre script HTML, Javascript, et script Python)&lt;br /&gt;
***Recherches sur l'utilisation de fichiers JSON accessibles via le serveur HTTP&lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Travail sur le layout du site &lt;br /&gt;
**Travail sur la liaison entre fichiers JSON et affichage Web des données de distance&lt;br /&gt;
***Recherches et tests de solutions&lt;br /&gt;
****Affichage depuis un fichier&lt;br /&gt;
****Affichage à la volée lors d'une action de collecte&lt;br /&gt;
&lt;br /&gt;
*Revue de code avec Roudy DAGHER:&lt;br /&gt;
**Structure globale des codes ok&lt;br /&gt;
**Fonctionnement presque ok: fonctionnalités implémentées ok, mais parsage csv ne marche pas&lt;br /&gt;
**Refactoring nécessaire&lt;br /&gt;
**Correction de la fonction STOP et amélioration de la fonction de COLLECTE&lt;br /&gt;
**Faire plus de requêtes Javascript que de requêtes HTML&lt;br /&gt;
**Discussion pour l'implémentation du serveur de localisation (= algorithme de localisation) et des visualisations de données sur le site Web&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous avons d'abord revu l'ensemble de notre code et les méthodes utilisées avec notre tuteur '''Roudy Dagher'''. Nous nous approchons d'un serveur de collecte de données stable et fonctionnel. Nous avons refait les différentes connexions entre l'interface et le serveur afin de ne faire que des requêtes sur des '''WebServices'''. Il nous est possible de commencer la deuxième partie qui est l'envoi de ces tableaux de données afin de les envoyer vers le serveur de localisation via des API afin de recevoir des matrices de positions.&lt;br /&gt;
Nous pourrons grâce à ces matrices afficher une carte 3D des balises  et du TAG dans l'espace.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 10'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 06/12/17 - Jeudi 07/12/17]]'' &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
**Travail sur la fonction STOP&lt;br /&gt;
**Réalisation d'une expression régulière pour le parsage des fichiers log en fichier JSON&lt;br /&gt;
&lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Travail sur l'affichage des fichiers JSON&lt;br /&gt;
***Réalisation de toutes les requêtes Ajax&lt;br /&gt;
***Réalisation d'un menu déroulant dropdown pour charger le contenu des fichiers JSON dans le tableau de distances&lt;br /&gt;
&lt;br /&gt;
*Nettoyage du dépôt Git&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 11'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 13/12/17]]''  &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
&lt;br /&gt;
*Revue de code avec Roudy DAGHER:&lt;br /&gt;
**Discussion sur la partie système du projet et correction de certaines fonctions&lt;br /&gt;
&lt;br /&gt;
Nous nous sommes réunis avec l'un de nos tuteurs, qui a réalisé certains bouts de code de base, pour nous mettre au point sur les fonctions en question et leur utilisation.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 12'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 20/12/17 - Jeudi 21/12/17]]''&lt;br /&gt;
*Revue, correction et nettoyage des codes&lt;br /&gt;
*Finalisation du rapport&lt;br /&gt;
*Planification de semaines restantes&lt;br /&gt;
*Préparation de la soutenance&lt;br /&gt;
*Revue de mi-projet avec tous les tuteurs&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Cette dernière semaine a servi à finaliser le rapport et à discuter de l'avancée du projet, notamment avec nos tuteurs pour déterminer le travail restant, présenter le travail abouti et replanifier précisément les échéances pour le travail restant. Nous avons réalisé la soutenance de mi-projet le '''jeudi 21/12/17 à 8h'''.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 13'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 10/01/18 - Ven 12/01/18]]''  &lt;br /&gt;
*Travail sur la collecte des données (serveur de collecte et interface Web)&lt;br /&gt;
**Redéfinition du fichier de parsage car il crée des conflits et ne produit pas un fichier formaté de la façon attendue&lt;br /&gt;
***Nombre de balises réel n'est pas bien déterminé par le code&lt;br /&gt;
***ID de la première et de la dernière balise ne sont pas déterminés correctement&lt;br /&gt;
&lt;br /&gt;
**Automatisation de la collecte par un script Shell lançant toutes les commandes de CONNEXION, REDIRECTION, LANCEMENT CU, FERMETURE DU PROGRAMME (kill rfcomm / kill tcp_redirect)&lt;br /&gt;
***Dans le but d'automatiser la procédure&lt;br /&gt;
***Dans le but de résoudre un problème de gestion de ressources (le bug '''thread''' apparu plus tôt dans le projet)&lt;br /&gt;
&lt;br /&gt;
**Travail sur la résolution du bug thread car l'automatisation n'a pas résolu le problème&lt;br /&gt;
***Identification du ou des causes potentielles: gestion des ressources (synchrone, asynchrone ?), connexion Bluetooth, lancement des commandes dans le même script, lancement en fg/bg, conflit dû au temps d'exécution de chaque processus ?&lt;br /&gt;
***Lancement des commandes manuellement dans des terminaux ne pose aucun problème: solution la plus simple&lt;br /&gt;
&lt;br /&gt;
**Redesign de la page Collecte&lt;br /&gt;
***Remplacement des boutons de commande par un bouton unique d'initialisation&lt;br /&gt;
***Travail sur une mise à jour du menu déroulant dropdown régulière sans avoir à recharger la page Web&lt;br /&gt;
***Implémentation de plotly.js, un module Javascript qui permet d'afficher des graphes en 3D&lt;br /&gt;
&lt;br /&gt;
*Mise au point post-soutenance avec Roudy DAGHER pour valider le travail restant, effectué et redéfinir certains objectifs atteignables ou pas selon les éléments réalisés dans le projet&lt;br /&gt;
*Recherches et début de l'implémentation du serveur de localisation fourni par les tuteurs&lt;br /&gt;
*Gestion du Git pour créer des branches additionnelles&lt;br /&gt;
*Recréation du rapport de projet suite à une perte du fichier éditable d'origine + Mise à jour avec les remarques suite à la soutenance ainsi que les nouveaux éléments&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 14'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mar 16/01/18 - Ven 19/01/18]]''  &lt;br /&gt;
*Travail sur la collecte des données (serveur de collecte et interface Web)&lt;br /&gt;
**Redéfinition du fichier de parsage car il crée des conflits et ne produit pas un fichier formaté de la façon attendue&lt;br /&gt;
***Corrigé: Nombre de balises réel n'est pas bien déterminé par le code&lt;br /&gt;
***Corrigé: ID de la première et de la dernière balise ne sont pas déterminés correctement&lt;br /&gt;
***Reste à faire: Traiter le cas où il y a un ajout ou suppression d'une balise pendant la collecte (pour le moment, lorsque c'est le cas, toutes les données se décalent au lieu de laisser des trous)&lt;br /&gt;
&lt;br /&gt;
**Automatisation de la collecte par un script Shell lançant toutes les commandes de CONNEXION, REDIRECTION, LANCEMENT CU, FERMETURE DU PROGRAMME (kill rfcomm / kill tcp_redirect)&lt;br /&gt;
***Mis en suspens: pour le moment, on lance les commandes manuellement dans le terminal&lt;br /&gt;
&lt;br /&gt;
**Interface Web&lt;br /&gt;
***Implémentation de plotly.js, un module Javascript qui permet d'afficher des graphes en 3D&lt;br /&gt;
&lt;br /&gt;
*Implémentation du serveur de localisation fourni par les tuteurs (mais algorithme de localisation pas fonctionnel pour le moment)&lt;br /&gt;
**Mise à jour de l'affichage des positions des éléments: précédemment seule la matrice X de position du Tag s'affichait, et pas la matrice A des balises&lt;br /&gt;
**Requêtes manuelles à l'API avec la fonction curl OK: on arrive à récupérer les matrices X et A (aléatoires pour le moment) par une requête GET à l'API du serveur de localisation&lt;br /&gt;
**Implémentation des requêtes Ajax pour automatiser les requêtes au serveur de localisation&lt;br /&gt;
&lt;br /&gt;
*Mise à jour du rapport les nouveaux éléments du travail réalisé&lt;br /&gt;
*Réflexion sur la possibilité ou non de réaliser la partie temps réel du projet au vu des moyens à disposition&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 15'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mar 23/01/18 - Ven 26/01/18]]'' &lt;br /&gt;
*Travail sur la collecte des données (serveur de collecte et interface Web)&lt;br /&gt;
**Redéfinition du fichier de parsage car il crée des conflits et ne produit pas un fichier formaté de la façon attendue&lt;br /&gt;
***Fait: Si distance négative car Tag trop près, la valeur négative générée par une balise est remplacée par un &amp;quot;0&amp;quot; (cela modifie la position réelle modélisée dans plotly, mais évite une impossibilité de générer la position à partir de la distance -&amp;gt; par des tests, il faudra déterminer la valeur limite à partir de laquelle les cartes donnent des valeurs de distance négatives&lt;br /&gt;
***Reste à faire: Traiter le cas où il y a un ajout ou suppression d'une balise pendant la collecte (pour le moment, lorsque c'est le cas, toutes les données se décalent au lieu de laisser des trous); Ainsi que le cas où il y un saut/bug inattendu et donc une disparition d'une ou plusieurs valeurs de distance&lt;br /&gt;
***Début de résolution du cas où une distance n'est pas prise en compte, c'est à dire où il y a une valeur qui disparaît et désaligne les valeurs lors de la création du JSON&lt;br /&gt;
&lt;br /&gt;
**Automatisation de la collecte par un script Shell lançant toutes les commandes de CONNEXION, REDIRECTION, LANCEMENT CU, FERMETURE DU PROGRAMME (kill rfcomm / kill tcp_redirect)&lt;br /&gt;
***Mis en suspens: pour le moment, on lance les commandes manuellement dans le terminal&lt;br /&gt;
***Création d'un script bash /etc/init.d/autoconnect.sh pour connecter automatiquement la RPi au lancement du système (si la RPi est déjà allumée au démarrage)&lt;br /&gt;
&lt;br /&gt;
**Interface Web&lt;br /&gt;
***Perfectionnement de l'utilisation de Plotly pour les visualisations&lt;br /&gt;
&lt;br /&gt;
*Implémentation du serveur de localisation fourni par les tuteurs (algorithme de localisation pas fonctionnel pour le moment)&lt;br /&gt;
**Requêtes manuelles à l'API avec la fonction curl OK&lt;br /&gt;
**Fait: Implémentation des requêtes Ajax pour automatiser les requêtes au serveur de localisation&lt;br /&gt;
***Liaison entre les différentes requêtes ajax grâce à des variables: permet de stocker l'adresse du job récupérée par la méthode GET&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 16'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Lun 29/01/18 - Ven 02/02/18]]'' &lt;br /&gt;
*Travail sur la collecte des données (serveur de collecte et interface Web)&lt;br /&gt;
**Redéfinition du fichier de parsage car il crée des conflits et ne produit pas un fichier formaté de la façon attendue&lt;br /&gt;
***déterminer la valeur limite à partir de laquelle les cartes donnent des valeurs de distance négatives&lt;br /&gt;
***Reste à faire: Traiter le cas où il y a un ajout ou suppression d'une balise pendant la collecte (pour le moment, lorsque c'est le cas, toutes les données se décalent au lieu de laisser des trous); Ainsi que le cas où il y un saut/bug inattendu et donc une disparition d'une ou plusieurs valeurs de distance&lt;br /&gt;
***Fait: gestion des bugs/sauts de valeurs de balises - remplacement par une valeur nulle sur balise existe, par rien sinon (implémentation d'un tableau caractérisant l'existence ou pas de chaque balise 1 à 6), optimisation des temps de calculs/exécution dans le script&lt;br /&gt;
**Interface Web&lt;br /&gt;
***Ajout d'une barre de progression de la collecte remplaçant le bouton de Lancement de collecte lors de l'appui&lt;br /&gt;
***Ajout d'un bouton dropdown pour afficher les fichiers de position qu'on reçoit du serveur de localisation&lt;br /&gt;
***Ajout d'une scrollbar dans les deux dropdown&lt;br /&gt;
&lt;br /&gt;
*Implémentation du serveur de localisation fourni par les tuteurs (algorithme de localisation pas fonctionnel pour le moment)&lt;br /&gt;
**Fait: Implémentation des requêtes Ajax pour automatiser les requêtes au serveur de localisation&lt;br /&gt;
***Création d'une requête Ajax GET qui demande le fichier JSON de position au serveur de localisation jusqu'à ce qu'il soit retourné&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 17'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Lun 05/02/18 - Ven 09/02/18]]''&lt;br /&gt;
&lt;br /&gt;
*Algorithme de localisation mis en ligne par le tuteur&lt;br /&gt;
**test du bon fonctionnement des connections entre parties après intégration de l'algorithme&lt;br /&gt;
**test su la qualité de l'algorithme&lt;br /&gt;
**test sur la précision de l'algorithme&lt;br /&gt;
*Rapport partie Front-end&lt;br /&gt;
*Rapport partie Back-end&lt;br /&gt;
*Nettoyage du code requete.py&lt;br /&gt;
*Mise à jour final des de certes pages du site&lt;br /&gt;
** matrice.html à jour&lt;br /&gt;
**3D.html à jour&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 18'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Lun 12/02/18 - Ven 16/02/18]]''&lt;br /&gt;
&lt;br /&gt;
*Algorithme de localisation mis en ligne par le tuteur&lt;br /&gt;
**test de perturbation et des limites du systeme d'antenne Locopositioning&lt;br /&gt;
*Rapport partie résultat obtenus &lt;br /&gt;
*réalisation de la vidéo de présentation&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 19'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Lun 19/02/18 - Ven 23/02/18]]''&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Observations'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Problèmes rencontrés'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Solutions apportées'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Délivrables'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
Rapport de mi-PFE&lt;br /&gt;
[[Fichier:RapportMi-PFE-UNG DELATTE.pdf]]&lt;br /&gt;
&lt;br /&gt;
Rapport de PFE&lt;br /&gt;
&lt;br /&gt;
Vidéo&lt;/div&gt;</summary>
		<author><name>Hdelatte</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=P18_Localisation_of_quadrotors&amp;diff=51098</id>
		<title>P18 Localisation of quadrotors</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=P18_Localisation_of_quadrotors&amp;diff=51098"/>
				<updated>2018-02-16T15:23:24Z</updated>
		
		<summary type="html">&lt;p&gt;Hdelatte : /* Semaine 17 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Cahier des charges'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;Présentation générale du projet&amp;lt;/span&amp;gt;=== &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Contexte&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
Dans un monde de plus en plus connecté, de nombreux drones sont déployés pour diverses applications comme l'espionnage, la surveillance, la cartographie de lieux et la livraison de colis. Les technologies nécessaires pour contrôler ces drones sont des sujets de recherche actuels. &lt;br /&gt;
&lt;br /&gt;
Le contrôle de ceux-ci passe tout d'abord par la maîtrise de leur position dans l'espace. Le développement des applications liées à l'utilisation de drones nécessite un travail important sur la localisation spatiale d'objets connectés. &lt;br /&gt;
&lt;br /&gt;
De plus, dans un souci d'utilisation, il est essentiel de développer des interfaces logicielles permettant d'exploiter ces données.&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Objectif du projet&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
L'objectif de ce projet est de développer une interface logicielle permettant de traiter en temps réel les informations de localisation d'un drone et de balises, dans le but de définir leur localisation dans l'espace, en intérieur.&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Description du projet&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
Pour réaliser le contrôle de drones, la première étape importante est de donner ses informations de position. Le but du projet est de développer une interface logicielle permettant de localiser le drone en temps réel en intérieur. Le drone se déplace dans un environnement dans lequel ont été installées de multiples balises. Il est équipé d'une carte, lui permettant de recevoir les distances relatives entre lui-même et les balises, sur laquelle différents algorithmes vont être implémentés pour effectuer la localisation en temps réel. Le projet requiert des compétences en développement hardware (Crazyflie 2.0, voir https://wiki.bitcraze.io/) et software (langage C/C++/Python/Javascript/HTML...).&lt;br /&gt;
&lt;br /&gt;
Il se divise en 4 étapes principales, qui sont:&lt;br /&gt;
*1) Choisir les technologies utilisées&lt;br /&gt;
*2) Choisir l'architecture (OS / APIs)&lt;br /&gt;
*3) Développer les différentes parties du projet&lt;br /&gt;
*4) Intégrer et connecter les différentes parties du projet&lt;br /&gt;
&lt;br /&gt;
La localisation étant en intérieur, le protocole GPS n'est donc pas assez précis pour les applications ciblées. La mise en place d'un tel dispositif permettrait grâce à l'utilisation d'un algorithme d'estimer avec une bonne précision les positions en intérieur d'une balise centrale (appelée Tag) et de balises (appelées Anchor). Le Tag scanne en temps réel la distance relative aux différentes balises, et il nous est retourné la position des balises et du Tag grâce à l'algorithme de localisation.&lt;br /&gt;
&lt;br /&gt;
Le projet se compose de 3 parties:&lt;br /&gt;
* Collect &amp;amp; parse: collecter les données envoyées par les balises en communiquant avec un serveur et récupérer les données adéquates par un tri&lt;br /&gt;
* Localise: déterminer la matrice de position des balises et du Tag en traitant les données récupérées&lt;br /&gt;
* Display: développer l'interface homme machine pour afficher, étudier et utiliser les données traitées&lt;br /&gt;
&lt;br /&gt;
Nous travaillerons dans un premier temps dans une optique temps différé avant de travailler en temps réel. Cela nous permettra d'acquérir des données utiles et réutilisables en aval. &lt;br /&gt;
&lt;br /&gt;
A l'aboutissement du projet, nous devrions être capable via l'interface homme machine développée d'afficher précisément la position spatiale des balises ainsi que du Tag, grâce àl'utilisation d'un algorithme de localisation et des données récupérées, et d'afficher d'autres données relatives au déplacement du Tag ou des balises dans l'espace. &lt;br /&gt;
&lt;br /&gt;
Si le temps le permet, nous pourrons aussi être amenés à adapter et utiliser l'interface développée pour l'utilisation d'un drone.&lt;br /&gt;
&lt;br /&gt;
''Sujet originel''&lt;br /&gt;
&lt;br /&gt;
To achieve the control of quadrotors, the first important task to give its position information. This project is to develop a software(GUI) to localize the quadrotors in real-time. The quadrotor is flying in an environment where several transmitters have been installed. The quadrotor is equipped with a deck to receive the relative distances between the deck and all transmitters, based on which different algorithms will be implemented to realize the real-time localization. The candidates need to have both experiences on hardware (Crazyflie 2.0, see https://wiki.bitcraze.io/) and software development (C/C , Python…). &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Calendrier prévisionnel&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
''[[Avant le 29/09/17]]'' - Élaboration du Cahier des charges, de la liste des tâches et du calendrier prévisionnel&lt;br /&gt;
&lt;br /&gt;
''[[Avant fin Octobre]]'' - Serveur de collecte et début du développement de l'interface logicielle&lt;br /&gt;
&lt;br /&gt;
''[[Avant fin Décembre]]'' - Interface logicielle&lt;br /&gt;
&lt;br /&gt;
''[[A la fin du PFE]]'' - Intégration finale des différentes parties (Serveur de collecte des données &amp;amp; Serveur de localisation &amp;amp; Interface logicielle)&lt;br /&gt;
&lt;br /&gt;
Répartition du volume de travail (***h):&lt;br /&gt;
&lt;br /&gt;
* Recherche sur les technologies à utiliser&lt;br /&gt;
* Développement du serveur de collecte de données&lt;br /&gt;
* Réalisation de l'interface logicielle (Web//Logiciel/Application)&lt;br /&gt;
* Intégration des différentes parties&lt;br /&gt;
* Test et débuggage&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Choix techniques : matériel et logiciel&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
Afin de développer ce dispositif, nous allons utiliser une Raspberry Pi 3 associée à une carte réceptrice, qui communique avec 4 balises composées chacune d'un microcontrôleur et d'une carte émettrice radio (UWB5C) et alimentées par batteries. La carte réceptrice joue le rôle du drone à localiser et communiquera les données émises par les balises vers l'ordinateur via Bluetooth.&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Choix technologiques&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
Voici les technologies que nous utilisons pour chacune des parties de ce projet.&lt;br /&gt;
&lt;br /&gt;
    1) Serveur de collecte des données:&lt;br /&gt;
       Scanne et parse les données récupérées pour fournir la matrice D des distances relatives du tag aux 4 balises&lt;br /&gt;
        - API&lt;br /&gt;
        - Python / Serveur Flask&lt;br /&gt;
&lt;br /&gt;
    2) Serveur de localisation (fourni):&lt;br /&gt;
       Calcule grâce à l'algorithme de localisation et la matrice D les positions spatiales des 4 noeuds et du tag&lt;br /&gt;
        - API&lt;br /&gt;
        - Bootstrap&lt;br /&gt;
        - Jquery&lt;br /&gt;
        - Python&lt;br /&gt;
&lt;br /&gt;
    3) Interface utilisateur:&lt;br /&gt;
       Affiche courbes, visualisation 3D, boutons ou données des fichiers envoyées par le serveur de localisation&lt;br /&gt;
        - HTML5 / Javascript&lt;br /&gt;
        - Fichiers JSON (serveurs de collecte et de localisation)&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Calendrier prévisionnel'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Liste des tâches à effectuer&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
# Se documenter sur le projet&lt;br /&gt;
##Langages et technologies utilisées&lt;br /&gt;
##Matériel utilisé&lt;br /&gt;
##Mettre en place du travail sur le Git&lt;br /&gt;
# Réaliser le serveur de collecte&lt;br /&gt;
##Récupérer les trames envoyées par bluetooth par le TAG via la Raspberry Pi&lt;br /&gt;
##Intégrer le serveur de localisation pour interpréter les trames&lt;br /&gt;
##Tester et optimiser&lt;br /&gt;
# Réaliser l'interface Web utilisateur&lt;br /&gt;
##Implémenter le serveur de collecte et de localisation&lt;br /&gt;
##Afficher et traiter les données stockées dans les fichiers JSON via le serveur (temps différé + temps réel)&lt;br /&gt;
##Tester et optimiser&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;Replanification du cahier des charges / calendrier&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Feuille d'heures'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Tâche !! Prélude !! Heures S1 !! Heures S2 !! Heures S3 !! Heures S4 !! Heures S5 !! Heures S6 !! Heures S7 !! Heures S8 !! Heures S9 !! Heures S10 !! Heures S11 !! Heures S12 !! Heures S13 !! Heures S14 !! Heures S15 !! Heures S16 !! Heures S17 !! Heures S18 !! Heures S19 !! Total&lt;br /&gt;
|-&lt;br /&gt;
| Cahier des charges / Wiki / Gitlab / Rapport&lt;br /&gt;
|  4h&lt;br /&gt;
|  3h&lt;br /&gt;
|  1h&lt;br /&gt;
|  x&lt;br /&gt;
|  1h30&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h30&lt;br /&gt;
|  1h&lt;br /&gt;
|  3h&lt;br /&gt;
|  3h30&lt;br /&gt;
|  2h&lt;br /&gt;
|  5h&lt;br /&gt;
|  x&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Documentation sur les technos utilisées&lt;br /&gt;
|  2h&lt;br /&gt;
|  4h&lt;br /&gt;
|  3h&lt;br /&gt;
|  2h&lt;br /&gt;
|  3h&lt;br /&gt;
|  4h&lt;br /&gt;
|  5h&lt;br /&gt;
|  5h30&lt;br /&gt;
|  4h30&lt;br /&gt;
|  3h30&lt;br /&gt;
|  2h&lt;br /&gt;
|  3h&lt;br /&gt;
|  1h&lt;br /&gt;
|  3h&lt;br /&gt;
|  4h&lt;br /&gt;
|  x&lt;br /&gt;
|  2h&lt;br /&gt;
|  &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Documentation sur le matériel&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  1h&lt;br /&gt;
|  1h&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Recherche et développement du serveur de collecte&lt;br /&gt;
|  x&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  3h&lt;br /&gt;
|  3h30&lt;br /&gt;
|  4h&lt;br /&gt;
|  5h&lt;br /&gt;
|  7h&lt;br /&gt;
|  4h30&lt;br /&gt;
|  0,5h&lt;br /&gt;
|  3h&lt;br /&gt;
|  4h&lt;br /&gt;
|  3h&lt;br /&gt;
|  x&lt;br /&gt;
|  4h&lt;br /&gt;
|  7h30&lt;br /&gt;
|  5h&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Recherche et développement de l'interface Web&lt;br /&gt;
|  x&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  3h&lt;br /&gt;
|  5h&lt;br /&gt;
|  6h&lt;br /&gt;
|  4h&lt;br /&gt;
|  7h&lt;br /&gt;
|  5h30&lt;br /&gt;
|  2h30&lt;br /&gt;
|  6h&lt;br /&gt;
|  8h&lt;br /&gt;
|  5h&lt;br /&gt;
|  1h&lt;br /&gt;
|  8h&lt;br /&gt;
|  4h&lt;br /&gt;
|  4h&lt;br /&gt;
|  &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Recherche et intégration du serveur de localisation&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x &lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  6h&lt;br /&gt;
|  5h&lt;br /&gt;
|  3h&lt;br /&gt;
|  &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Intégration des différentes parties&lt;br /&gt;
|  x&lt;br /&gt;
|  x  &lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  2h&lt;br /&gt;
|  2h&lt;br /&gt;
|  2h&lt;br /&gt;
|  3h&lt;br /&gt;
|  1h30&lt;br /&gt;
|  x&lt;br /&gt;
|  3h&lt;br /&gt;
|  6h&lt;br /&gt;
|  5h&lt;br /&gt;
|  x&lt;br /&gt;
|  3h30&lt;br /&gt;
|  2h&lt;br /&gt;
|  2h&lt;br /&gt;
|  &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Tests et débuggage&lt;br /&gt;
|  x&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  1h&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  3h&lt;br /&gt;
|  4h&lt;br /&gt;
|  0,5h&lt;br /&gt;
|  3h&lt;br /&gt;
|  1h&lt;br /&gt;
|  3h&lt;br /&gt;
|  3h&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  4h&lt;br /&gt;
|  &lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Optimisation/Correction des programmes&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Vidéo&lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Avancement du Projet'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Phase préparatoire'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Jeu 21/09/17 - Ven 22/09/17]]'' &lt;br /&gt;
*Rendez-vous de mise au point du cahier des charges avec les encadrants/intervenants (M. ZHENG Gang et M. DAGHER Roudy)&lt;br /&gt;
*Elaboration du cahier des charges&lt;br /&gt;
*Elaboration de la page Wiki (préparation de la mise en page et présentation du sujet)&lt;br /&gt;
*Préparation du travail sous forme de Mind Map&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous nous sommes tout d’abord rendus au laboratoire de l'INRIA afin de pouvoir définir le plus précisément possible le cahier des charges avec nos tuteurs.&lt;br /&gt;
Nous avons donc défini avec eux les technologies qu'il faudrait étudier. Vous retrouverez le choix des technologies dans la partie '''choix technologiques'''&lt;br /&gt;
&lt;br /&gt;
Nous avons en même temps créé notre page Wiki, et structurée celle-ci avec les parties qui nous seraient utiles pour développer nos explications par la suite.&lt;br /&gt;
&lt;br /&gt;
Nous avons de plus découpé le travail en sous-parties que nous avions mis dans une '''Mind map''' afin d'y voir plus clair sur la ligne à suivre.&lt;br /&gt;
&lt;br /&gt;
Vous trouverez cette Mind map juste ci-dessous. Nous ne mettrons pas à jour cette Mind map chaque semaine mais il est fort probable que nous en refaisions un en milieu de projet pour pouvoir cibler les objectifs réussis et ceux à atteindre. Nous pourrons de plus redéfinir certains objectifs qui nous auraient semblés trop vague au début du projet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Projet de fin d'étude.png|centre|600px]]&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 1'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Jeu 28/09/17 - Ven 29/09/17]]'' &lt;br /&gt;
*Revue du Cahier des Charges avec les encadrants&lt;br /&gt;
*Lecture et recherches sur les technologies adaptées&lt;br /&gt;
*Construction de la suite de la Mind Map&lt;br /&gt;
*Création du Gitlab&lt;br /&gt;
&lt;br /&gt;
Nous commençons les recherches sur le projet et sur les premières technologies engagées dans celui-ci. Nous en profitons pour formuler dès à présent des questions sur le bon choix de celles-ci. Nous commençons donc des tests ayant seulement pour but de nous familiariser avec l'environnement de travail et de réellement comprendre les fonctions déjà présentes qu'il faudra exploiter et implanter notre interface web.&lt;br /&gt;
Nous créons un dépôt Gitlab avec notre tuteur et commençons a définir les taches premières sur celui-ci.&lt;br /&gt;
Nous en profitons pour affiner le Mind Map.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 2'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Jeu 05/10/17 - Ven 06/10/17]]''  &lt;br /&gt;
*Précisions sur le cahier des charges&lt;br /&gt;
*Listage du matériel&lt;br /&gt;
*Recherche et détermination de solutions technologiques possibles pour les fonctions demandées&lt;br /&gt;
*Début du travail sur le serveur de collecte&lt;br /&gt;
*Apprentissage du langage Python et de l'utilisation du framework Flask&lt;br /&gt;
&lt;br /&gt;
Nous avons finalisé les précisions sur le cahier des charges. Nous avons donc pu cibler le matériel dont nous nous servirons pour ce Projet. Vous trouverez donc cette liste la section correspondante. Il est évident que le matériel utilisé est dans l'ensemble déjà fourni par le laboratoire et qu'il nous reste dans l'ensemble à créer l'interface web et les API qui nous permettrons de faire communiquer cette interface avec la Raspberry Pi et le serveur de position déjà créé.&lt;br /&gt;
Nous avons donc pu commencer à nous former sur les technologies qui nous serviraient par la suite. Nous avons donc utilisé le cours d'Openclassrooms sur les serveurs Flask pour en apprendre les bases. Ce serveur Flask est programmé en Python et nous permet donc une grande liberté au niveau de l’exécution de certains scripts. En effet, les scripts de connexion Bluetooth et de redirection de port qui nous permettent de récupérer les données de distance sont eux-mêmes codés en Python et sont directement appelés via le serveur.&lt;br /&gt;
Dans ce serveur, représentant notre interface web, vous retrouverez la page '''/collecte''' qui représentera notre partie collecte de données ainsi que l'affichage de ces distances. Nous appellerons cette partie le Serveur de Collecte.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 3'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 11/10/17 - Jeu 12/10/17]]''  &lt;br /&gt;
*Recherche et développement initial du serveur de collecte de données&lt;br /&gt;
*Complément du Git sur les tâches à effectuer&lt;br /&gt;
&lt;br /&gt;
Nous avons commencé à créer un serveur Flask renvoyant pour l'instant une matrice aléatoire. Lors de la requête URL &amp;quot;../matrice&amp;quot;, nous voyons bien une matrice aléatoire apparaître sur la page Web. Nous essayons de nous connecter à la Raspberry Pi en redirigeant son port série vers le Bluetooth de façon à récupérer de vraies matrices de distance entre le drone (ie commutateur central) et les balises. Nous pourrons afficher ensuite ces matrices, ou alors les stocker dans un fichier en attendant le traitement de celles-ci.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Requete s3.PNG|300px|serveur Flask]]&lt;br /&gt;
&lt;br /&gt;
Nous avons plusieurs problèmes avec le Bluetooth pour se connecter avec la Raspberry Pi. Quand nous aurons réussi à nous connecter au port série de la Raspberry Pi alors nous pourrons gérer le traitement des données récupérées.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 4'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 18/10/17 - Jeu 19/10/17]]''  &lt;br /&gt;
*Configuration de la Raspberry Pi car problèmes de connectivité Bluetooth rencontrés&lt;br /&gt;
**Nous arrivons à connecter la Raspberry Pi sous Windows mais la connexion sous Linux pose problème (travail en suspens en attendant la disponibilité de l'encadrant)&lt;br /&gt;
*Début du développement de l'interface Web&lt;br /&gt;
**Traitement d'une matrice dans un fichier JSON&lt;br /&gt;
**Affichage sous forme de tableau de la matrice&lt;br /&gt;
**Utilisation du serveur de requête en Python avec chargement de template HTML&lt;br /&gt;
**Mise en forme de la trame de la page en HTML/CSS avec le framework Bootstrap&lt;br /&gt;
**Ajout d'un set de distances (d1, d2, d3, d4) dans la matrice lors d'un appui sur un bouton Chargement en utilisant un fichier Javascript&lt;br /&gt;
&lt;br /&gt;
Nous avons reçu des fonctions Python de notre tuteur afin d'obtenir une connexion Bluetooth entre notre Raspberry Pi et notre ordinateur ainsi qu'une redirection de port de celle-ci vers la connexion. Nous n'arrivons pas à utiliser ces fonctions sous linux et nous nécessitons une explication de notre tuteur n'étant pas disponible à ce moment. Pour ne pas perdre de temps, nous attaquons la création de l'interface web à proprement parler, c'est à dire la création des pages HTML ainsi que le document Javascript qui nous servira de bibliothèque de fonctions. Chaque route de notre serveur est reliée à une série de fonctions Python s'exécutant à l'appel des url puis suivies d'un template de la page HTML en question. Nous en profitons de plus pour explorer le framework CSS bootstrap afin de mettre un premier design et une structure a notre page collecte qui sera la page principale de notre site pour ce début de projet.&lt;br /&gt;
&lt;br /&gt;
Nous nous essayons de plus à différents tests sur des fichiers de format '''JSON''' que nous devrons réussir à traiter correctement plus tard dans notre projet.&lt;br /&gt;
Nous récupérons une matrice que nous créons nous-mêmes en Python (simulation d'une série de distances récupérée) que nous transformons au format JSON pour ensuite l'afficher sur notre page web. Pour pouvoir proprement afficher ce fichier '''JSON''' renvoyé vers notre page, nous nous servons du fichier Javascript afin de créer du code HTML contenant la matrice.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 5'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 25/10/17 - Ven 27/10/17]]''  &lt;br /&gt;
*Résolution des problèmes de connectique Bluetooth sur la Raspberry Pi&lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Traitement d'une matrice dans un fichier JSON&lt;br /&gt;
**Début de l'ajout d'un set de distances depuis une matrice contenue dans un fichier JSON&lt;br /&gt;
&lt;br /&gt;
Nous avons pu nous entretenir avec notre tuteur et donc comprendre les fonctions de connexion et de redirection de port. Nous pouvons donc continuer le développement de notre interface web. Nous arrivons à traiter un set de données au format JSON et à l'afficher dans le code HTML. Toutefois nous créons nous-mêmes ce set, il est maintenant nécessaire que nous arrivions à récupérer les sets de distance réels reçus par la connexion Bluetooth. Nous commencerons par un traitement asynchrone. L'idée est d’enregistrer les sets de distances dans un fichier '''JSON''' stocké dans un dossier. Nous appellerons ce dossier plus tard via une requête Ajax.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 6'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 08/11/17 - Ven 10/11/17]]''  &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
**Mise en place de la communication entre le port série de notre machine et le port série de la carte via Bluetooth de la RPi3&lt;br /&gt;
**Récupération et traitement (parse) manuels des données de distances dans un fichier .log via TCP/IP&amp;lt;-&amp;gt;Bluetooth&lt;br /&gt;
**Début de l'automatisation du procédé par script Python (requete.py) et mise en place de sockets de communication&lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Chargement sur commande d'un set de distances depuis une matrice contenue dans un fichier JSON&lt;br /&gt;
*Travail sur le layout du site&lt;br /&gt;
&lt;br /&gt;
Après avoir regardé le code de ces différentes fonctions nous avons pu faire des tests manuels via le Shell pour récupérer des données de distances et les stocker dans un fichier '''JSON''' sur notre ordinateur.&lt;br /&gt;
&lt;br /&gt;
Nous utilisons les commandes suivantes pour se connecter via Bluetooth:&lt;br /&gt;
&lt;br /&gt;
 rfcomm connect /dev/rfcomm0 B8:27:EB:80:DC:89 1&lt;br /&gt;
&lt;br /&gt;
Rediriger le port de la Raspberrypi3 vers la connexion:&lt;br /&gt;
&lt;br /&gt;
 Python lps-collector/tcp_serial_redirect.py /dev/rfcomm0 9600&lt;br /&gt;
&lt;br /&gt;
Collecter les données dans un fichier dont nous définissons le nom:&lt;br /&gt;
&lt;br /&gt;
 echo &amp;quot;cu -s9600 -lttyACM0&amp;quot;| nc localhost 7777&lt;br /&gt;
 nc localhost 7777 | grep distance &amp;gt; static/log/dist-capture'+date+'.log&lt;br /&gt;
&lt;br /&gt;
Nous pouvons '''parser''' le flux de données avant de le stocker dans le fichier via cette commande:&lt;br /&gt;
&lt;br /&gt;
 Python lps-collector/lps_parse.py static/log/dist-capture&amp;quot;+date+&amp;quot;.log&lt;br /&gt;
&lt;br /&gt;
Il est donc nécessaire d'inclure via des '''thread''' ces différentes fonctions dans notre serveur Python (Flask) afin d'automatiser le processus. Le but est de pouvoir choisir sur l'interface web quels fonctions il faut exécuter et les déclencher via l'appui sur des boutons.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 7'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 15/11/17 - Ven 17/11/17]]''  &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
**Récupération et traitement (parse) manuels des données de distances dans un fichier .log via TCP/IP&amp;lt;-&amp;gt;Bluetooth&lt;br /&gt;
**Automatisation du procédé par script Python (requete.py)&lt;br /&gt;
***Mise en place de sockets de communication pour le contrôle de la collecte -&amp;gt; abandonné (servait à commander la collecte manuellement)&lt;br /&gt;
***Développement d'un script engine.py regroupant les commandes exécutables par l'utilisateur via la page Web&lt;br /&gt;
***Début du travail sur la fonction &amp;quot;STOP&amp;quot; manuel d'une action de collecte de données (liaison entre script HTML, Javascript, et script Python)&lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Chargement sur commande d'un set de distances depuis une matrice contenue dans un fichier JSON&lt;br /&gt;
**Travail sur le layout du site&lt;br /&gt;
***Ajout des différentes commandes (connexion Bluetooth, lancement commande cu, collecte des données, collecte durée donnée)&lt;br /&gt;
***Début de l'implémentation de la visualisation des fichiers .JSON obtenus après collecte et affichage dans un tableau matriciel du fichier sélectionné&lt;br /&gt;
&lt;br /&gt;
Nous avons continué à travailler sur le serveur de collecte: les données que nous avons récupérées via Bluetooth sont stockées dans un fichier .log. Apres avoir bien compris comment marchait la fonction '''parse''' manuellement (lors de son utilisation dans le Shell), nous l'avons implémentée dans notre serveur de collecte qui lance cette commande lors de l’appui sur un bouton via notre interface virtuelle. Un problème rencontré était de savoir quand la récolte des données devait s’arrêter. Nous avons donc rajouté un temps à entrer nous-même sur l'interface. La fonction '''parse''' est effectuée et le sous-processus va attendre le temps donné avant de lancer une commande permettant de tuer le processus et mettant donc fin au remplissage du fichier '''.log'''. Nous voulons de plus réussir à lancer une fonction de collecte sans temps. C'est à dire que nous coupons la collecte via un bouton par nous-mêmes. Nous voulions utiliser des Sockets pour pouvoir définir nous-mêmes la gestion de la communication mais l'idée a été abandonné car nous avons réussi à sauvegarder le PID du processus lancé. Il nous suffit donc de l’arrêter grâce à un autre bouton qui récupère cette variable et l’arrête ensuite. &lt;br /&gt;
&lt;br /&gt;
Toutes nos fonctions Pythons étant regroupées dans notre serveur '''requete.py''', nous avons décidé de créer un module qui regroupera toutes ces fonctions que nous pourrons utiliser dans '''requete.py'''. ceci nous permet de voir plus clair dans notre code et de faciliter le travail lorsque nous modifions le code tous les deux.&lt;br /&gt;
&lt;br /&gt;
Nous essayons en continu d'adapter le layout du site pour le rendre le plus attractif et simple possible, de façon à ce que chaque bouton et tableau soient clairs et compréhensibles.&lt;br /&gt;
&lt;br /&gt;
Nous avons commencé à récupérer les fichiers '''JSON''' créés à partir des fichier '''log''', c'est-à-dire que ces fichiers sont automatiquement stockés coté serveur dans un dossier nommé '''static/log'''. Notre but est de récupérer le nom des fichiers JSON et de les afficher dans un composant sur notre interface web. Il nous sera donc possible ensuite de sélectionner le nom d'un fichier. Lors de la sélection de ce nom de fichier, un tableau apparaît avec les valeurs de distances à l’intérieur.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 8'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 22/11/17 - Ven 24/11/17]]''  &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
**Automatisation du procédé de collecte par script Python (requete.py qui fait appel à engine.py)&lt;br /&gt;
***Développement d'un script engine.py regroupant les commandes exécutables par l'utilisateur via la page Web&lt;br /&gt;
***Travail sur la fonction &amp;quot;STOP&amp;quot; manuel d'une action de collecte de données (liaison entre script HTML, Javascript, et script Python)&lt;br /&gt;
***Mise en place d'un serveur HTTP Simple sous Python pour accéder aux fichiers de données à partir de la page Web&lt;br /&gt;
***Mise à jour de fonctions de connexion &lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Travail sur le layout du site (ajout de pages, navigation entre les pages, apparence, nettoyage des codes)&lt;br /&gt;
**Bon fonctionnement de l'ensemble serveur collecte + serveur HTTP + client Web&lt;br /&gt;
**Affichage de la liste des fichiers de données de distance (log, csv, JSON) via serveur HTTP en Python sur port 9999&lt;br /&gt;
*Corrections et nettoyage du dépôt GIT&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous continuons à développer les points énoncés la semaine dernière. Nous avons décidé de nous diriger vers un serveur HTTP Simple pour accéder à nos fichiers. Il s’avère que nous finirons par ne pas utiliser ce serveur. Nous irons récupérer les fichiers en question via des requêtes '''Ajax''' faites à la sélection du nom du fichier.&lt;br /&gt;
&lt;br /&gt;
Nous rencontrons depuis le début des problèmes avec les fonctions de connexion qui peuvent ne pas marcher à un moment donné. Nous essayons de trouver pourquoi ce bug est un bug qui ne se produit pas à chaque fois. Nous avons déterminé qu'il ne se produisait seulement lorsque les fonctions de connexions étaient lancée dans des threads. Nous ne savons toujours pas pourquoi ces thread bugguent seulement parfois et non à chaque essai de connexion.&lt;br /&gt;
&lt;br /&gt;
Nous avons nettoyé notre dépot '''Git''' car il s’avère que nous utilisions une mauvaise méthode de fusion et de stockage des documents.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 9'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 29/11/17 - Jeudi 30/11/17]]''  &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
**Automatisation du procédé de collecte par script Python (requete.py qui fait appel à engine.py)&lt;br /&gt;
***Travail sur la fonction &amp;quot;STOP&amp;quot; manuel d'une action de collecte de données (liaison entre script HTML, Javascript, et script Python)&lt;br /&gt;
***Recherches sur l'utilisation de fichiers JSON accessibles via le serveur HTTP&lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Travail sur le layout du site &lt;br /&gt;
**Travail sur la liaison entre fichiers JSON et affichage Web des données de distance&lt;br /&gt;
***Recherches et tests de solutions&lt;br /&gt;
****Affichage depuis un fichier&lt;br /&gt;
****Affichage à la volée lors d'une action de collecte&lt;br /&gt;
&lt;br /&gt;
*Revue de code avec Roudy DAGHER:&lt;br /&gt;
**Structure globale des codes ok&lt;br /&gt;
**Fonctionnement presque ok: fonctionnalités implémentées ok, mais parsage csv ne marche pas&lt;br /&gt;
**Refactoring nécessaire&lt;br /&gt;
**Correction de la fonction STOP et amélioration de la fonction de COLLECTE&lt;br /&gt;
**Faire plus de requêtes Javascript que de requêtes HTML&lt;br /&gt;
**Discussion pour l'implémentation du serveur de localisation (= algorithme de localisation) et des visualisations de données sur le site Web&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous avons d'abord revu l'ensemble de notre code et les méthodes utilisées avec notre tuteur '''Roudy Dagher'''. Nous nous approchons d'un serveur de collecte de données stable et fonctionnel. Nous avons refait les différentes connexions entre l'interface et le serveur afin de ne faire que des requêtes sur des '''WebServices'''. Il nous est possible de commencer la deuxième partie qui est l'envoi de ces tableaux de données afin de les envoyer vers le serveur de localisation via des API afin de recevoir des matrices de positions.&lt;br /&gt;
Nous pourrons grâce à ces matrices afficher une carte 3D des balises  et du TAG dans l'espace.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 10'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 06/12/17 - Jeudi 07/12/17]]'' &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
**Travail sur la fonction STOP&lt;br /&gt;
**Réalisation d'une expression régulière pour le parsage des fichiers log en fichier JSON&lt;br /&gt;
&lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Travail sur l'affichage des fichiers JSON&lt;br /&gt;
***Réalisation de toutes les requêtes Ajax&lt;br /&gt;
***Réalisation d'un menu déroulant dropdown pour charger le contenu des fichiers JSON dans le tableau de distances&lt;br /&gt;
&lt;br /&gt;
*Nettoyage du dépôt Git&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 11'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 13/12/17]]''  &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
&lt;br /&gt;
*Revue de code avec Roudy DAGHER:&lt;br /&gt;
**Discussion sur la partie système du projet et correction de certaines fonctions&lt;br /&gt;
&lt;br /&gt;
Nous nous sommes réunis avec l'un de nos tuteurs, qui a réalisé certains bouts de code de base, pour nous mettre au point sur les fonctions en question et leur utilisation.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 12'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 20/12/17 - Jeudi 21/12/17]]''&lt;br /&gt;
*Revue, correction et nettoyage des codes&lt;br /&gt;
*Finalisation du rapport&lt;br /&gt;
*Planification de semaines restantes&lt;br /&gt;
*Préparation de la soutenance&lt;br /&gt;
*Revue de mi-projet avec tous les tuteurs&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Cette dernière semaine a servi à finaliser le rapport et à discuter de l'avancée du projet, notamment avec nos tuteurs pour déterminer le travail restant, présenter le travail abouti et replanifier précisément les échéances pour le travail restant. Nous avons réalisé la soutenance de mi-projet le '''jeudi 21/12/17 à 8h'''.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 13'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 10/01/18 - Ven 12/01/18]]''  &lt;br /&gt;
*Travail sur la collecte des données (serveur de collecte et interface Web)&lt;br /&gt;
**Redéfinition du fichier de parsage car il crée des conflits et ne produit pas un fichier formaté de la façon attendue&lt;br /&gt;
***Nombre de balises réel n'est pas bien déterminé par le code&lt;br /&gt;
***ID de la première et de la dernière balise ne sont pas déterminés correctement&lt;br /&gt;
&lt;br /&gt;
**Automatisation de la collecte par un script Shell lançant toutes les commandes de CONNEXION, REDIRECTION, LANCEMENT CU, FERMETURE DU PROGRAMME (kill rfcomm / kill tcp_redirect)&lt;br /&gt;
***Dans le but d'automatiser la procédure&lt;br /&gt;
***Dans le but de résoudre un problème de gestion de ressources (le bug '''thread''' apparu plus tôt dans le projet)&lt;br /&gt;
&lt;br /&gt;
**Travail sur la résolution du bug thread car l'automatisation n'a pas résolu le problème&lt;br /&gt;
***Identification du ou des causes potentielles: gestion des ressources (synchrone, asynchrone ?), connexion Bluetooth, lancement des commandes dans le même script, lancement en fg/bg, conflit dû au temps d'exécution de chaque processus ?&lt;br /&gt;
***Lancement des commandes manuellement dans des terminaux ne pose aucun problème: solution la plus simple&lt;br /&gt;
&lt;br /&gt;
**Redesign de la page Collecte&lt;br /&gt;
***Remplacement des boutons de commande par un bouton unique d'initialisation&lt;br /&gt;
***Travail sur une mise à jour du menu déroulant dropdown régulière sans avoir à recharger la page Web&lt;br /&gt;
***Implémentation de plotly.js, un module Javascript qui permet d'afficher des graphes en 3D&lt;br /&gt;
&lt;br /&gt;
*Mise au point post-soutenance avec Roudy DAGHER pour valider le travail restant, effectué et redéfinir certains objectifs atteignables ou pas selon les éléments réalisés dans le projet&lt;br /&gt;
*Recherches et début de l'implémentation du serveur de localisation fourni par les tuteurs&lt;br /&gt;
*Gestion du Git pour créer des branches additionnelles&lt;br /&gt;
*Recréation du rapport de projet suite à une perte du fichier éditable d'origine + Mise à jour avec les remarques suite à la soutenance ainsi que les nouveaux éléments&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 14'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mar 16/01/18 - Ven 19/01/18]]''  &lt;br /&gt;
*Travail sur la collecte des données (serveur de collecte et interface Web)&lt;br /&gt;
**Redéfinition du fichier de parsage car il crée des conflits et ne produit pas un fichier formaté de la façon attendue&lt;br /&gt;
***Corrigé: Nombre de balises réel n'est pas bien déterminé par le code&lt;br /&gt;
***Corrigé: ID de la première et de la dernière balise ne sont pas déterminés correctement&lt;br /&gt;
***Reste à faire: Traiter le cas où il y a un ajout ou suppression d'une balise pendant la collecte (pour le moment, lorsque c'est le cas, toutes les données se décalent au lieu de laisser des trous)&lt;br /&gt;
&lt;br /&gt;
**Automatisation de la collecte par un script Shell lançant toutes les commandes de CONNEXION, REDIRECTION, LANCEMENT CU, FERMETURE DU PROGRAMME (kill rfcomm / kill tcp_redirect)&lt;br /&gt;
***Mis en suspens: pour le moment, on lance les commandes manuellement dans le terminal&lt;br /&gt;
&lt;br /&gt;
**Interface Web&lt;br /&gt;
***Implémentation de plotly.js, un module Javascript qui permet d'afficher des graphes en 3D&lt;br /&gt;
&lt;br /&gt;
*Implémentation du serveur de localisation fourni par les tuteurs (mais algorithme de localisation pas fonctionnel pour le moment)&lt;br /&gt;
**Mise à jour de l'affichage des positions des éléments: précédemment seule la matrice X de position du Tag s'affichait, et pas la matrice A des balises&lt;br /&gt;
**Requêtes manuelles à l'API avec la fonction curl OK: on arrive à récupérer les matrices X et A (aléatoires pour le moment) par une requête GET à l'API du serveur de localisation&lt;br /&gt;
**Implémentation des requêtes Ajax pour automatiser les requêtes au serveur de localisation&lt;br /&gt;
&lt;br /&gt;
*Mise à jour du rapport les nouveaux éléments du travail réalisé&lt;br /&gt;
*Réflexion sur la possibilité ou non de réaliser la partie temps réel du projet au vu des moyens à disposition&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 15'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mar 23/01/18 - Ven 26/01/18]]'' &lt;br /&gt;
*Travail sur la collecte des données (serveur de collecte et interface Web)&lt;br /&gt;
**Redéfinition du fichier de parsage car il crée des conflits et ne produit pas un fichier formaté de la façon attendue&lt;br /&gt;
***Fait: Si distance négative car Tag trop près, la valeur négative générée par une balise est remplacée par un &amp;quot;0&amp;quot; (cela modifie la position réelle modélisée dans plotly, mais évite une impossibilité de générer la position à partir de la distance -&amp;gt; par des tests, il faudra déterminer la valeur limite à partir de laquelle les cartes donnent des valeurs de distance négatives&lt;br /&gt;
***Reste à faire: Traiter le cas où il y a un ajout ou suppression d'une balise pendant la collecte (pour le moment, lorsque c'est le cas, toutes les données se décalent au lieu de laisser des trous); Ainsi que le cas où il y un saut/bug inattendu et donc une disparition d'une ou plusieurs valeurs de distance&lt;br /&gt;
***Début de résolution du cas où une distance n'est pas prise en compte, c'est à dire où il y a une valeur qui disparaît et désaligne les valeurs lors de la création du JSON&lt;br /&gt;
&lt;br /&gt;
**Automatisation de la collecte par un script Shell lançant toutes les commandes de CONNEXION, REDIRECTION, LANCEMENT CU, FERMETURE DU PROGRAMME (kill rfcomm / kill tcp_redirect)&lt;br /&gt;
***Mis en suspens: pour le moment, on lance les commandes manuellement dans le terminal&lt;br /&gt;
***Création d'un script bash /etc/init.d/autoconnect.sh pour connecter automatiquement la RPi au lancement du système (si la RPi est déjà allumée au démarrage)&lt;br /&gt;
&lt;br /&gt;
**Interface Web&lt;br /&gt;
***Perfectionnement de l'utilisation de Plotly pour les visualisations&lt;br /&gt;
&lt;br /&gt;
*Implémentation du serveur de localisation fourni par les tuteurs (algorithme de localisation pas fonctionnel pour le moment)&lt;br /&gt;
**Requêtes manuelles à l'API avec la fonction curl OK&lt;br /&gt;
**Fait: Implémentation des requêtes Ajax pour automatiser les requêtes au serveur de localisation&lt;br /&gt;
***Liaison entre les différentes requêtes ajax grâce à des variables: permet de stocker l'adresse du job récupérée par la méthode GET&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 16'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Lun 29/01/18 - Ven 02/02/18]]'' &lt;br /&gt;
*Travail sur la collecte des données (serveur de collecte et interface Web)&lt;br /&gt;
**Redéfinition du fichier de parsage car il crée des conflits et ne produit pas un fichier formaté de la façon attendue&lt;br /&gt;
***déterminer la valeur limite à partir de laquelle les cartes donnent des valeurs de distance négatives&lt;br /&gt;
***Reste à faire: Traiter le cas où il y a un ajout ou suppression d'une balise pendant la collecte (pour le moment, lorsque c'est le cas, toutes les données se décalent au lieu de laisser des trous); Ainsi que le cas où il y un saut/bug inattendu et donc une disparition d'une ou plusieurs valeurs de distance&lt;br /&gt;
***Fait: gestion des bugs/sauts de valeurs de balises - remplacement par une valeur nulle sur balise existe, par rien sinon (implémentation d'un tableau caractérisant l'existence ou pas de chaque balise 1 à 6), optimisation des temps de calculs/exécution dans le script&lt;br /&gt;
**Interface Web&lt;br /&gt;
***Ajout d'une barre de progression de la collecte remplaçant le bouton de Lancement de collecte lors de l'appui&lt;br /&gt;
***Ajout d'un bouton dropdown pour afficher les fichiers de position qu'on reçoit du serveur de localisation&lt;br /&gt;
***Ajout d'une scrollbar dans les deux dropdown&lt;br /&gt;
&lt;br /&gt;
*Implémentation du serveur de localisation fourni par les tuteurs (algorithme de localisation pas fonctionnel pour le moment)&lt;br /&gt;
**Fait: Implémentation des requêtes Ajax pour automatiser les requêtes au serveur de localisation&lt;br /&gt;
***Création d'une requête Ajax GET qui demande le fichier JSON de position au serveur de localisation jusqu'à ce qu'il soit retourné&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 17'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Lun 05/02/18 - Ven 09/02/18]]''&lt;br /&gt;
&lt;br /&gt;
*Algorithme de localisation mis en ligne par le tuteur&lt;br /&gt;
**test du bon fonctionnement des connections entre parties après intégration de l'algorithme&lt;br /&gt;
**test su la qualité de l'algorithme&lt;br /&gt;
**test sur la précision de l'algorithme&lt;br /&gt;
*Rapport partie Front-end&lt;br /&gt;
*Rapport partie Back-end&lt;br /&gt;
*Nettoyage du code requete.py&lt;br /&gt;
*Mise à jour final des de certes pages du site&lt;br /&gt;
** matrice.html à jour&lt;br /&gt;
**3D.html à jour&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 18'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Lun 12/02/18 - Ven 16/02/18]]''&lt;br /&gt;
&lt;br /&gt;
*Rapport partie résultat obtenus &lt;br /&gt;
*réalisation de la vidéo de présentation&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 19'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Lun 19/02/18 - Ven 23/02/18]]''&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Observations'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Problèmes rencontrés'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Solutions apportées'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Délivrables'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
Rapport de mi-PFE&lt;br /&gt;
[[Fichier:RapportMi-PFE-UNG DELATTE.pdf]]&lt;br /&gt;
&lt;br /&gt;
Rapport de PFE&lt;br /&gt;
&lt;br /&gt;
Vidéo&lt;/div&gt;</summary>
		<author><name>Hdelatte</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=P18_Localisation_of_quadrotors&amp;diff=51097</id>
		<title>P18 Localisation of quadrotors</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=P18_Localisation_of_quadrotors&amp;diff=51097"/>
				<updated>2018-02-16T15:21:30Z</updated>
		
		<summary type="html">&lt;p&gt;Hdelatte : /* Semaine 18 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Cahier des charges'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;Présentation générale du projet&amp;lt;/span&amp;gt;=== &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Contexte&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
Dans un monde de plus en plus connecté, de nombreux drones sont déployés pour diverses applications comme l'espionnage, la surveillance, la cartographie de lieux et la livraison de colis. Les technologies nécessaires pour contrôler ces drones sont des sujets de recherche actuels. &lt;br /&gt;
&lt;br /&gt;
Le contrôle de ceux-ci passe tout d'abord par la maîtrise de leur position dans l'espace. Le développement des applications liées à l'utilisation de drones nécessite un travail important sur la localisation spatiale d'objets connectés. &lt;br /&gt;
&lt;br /&gt;
De plus, dans un souci d'utilisation, il est essentiel de développer des interfaces logicielles permettant d'exploiter ces données.&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Objectif du projet&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
L'objectif de ce projet est de développer une interface logicielle permettant de traiter en temps réel les informations de localisation d'un drone et de balises, dans le but de définir leur localisation dans l'espace, en intérieur.&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Description du projet&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
Pour réaliser le contrôle de drones, la première étape importante est de donner ses informations de position. Le but du projet est de développer une interface logicielle permettant de localiser le drone en temps réel en intérieur. Le drone se déplace dans un environnement dans lequel ont été installées de multiples balises. Il est équipé d'une carte, lui permettant de recevoir les distances relatives entre lui-même et les balises, sur laquelle différents algorithmes vont être implémentés pour effectuer la localisation en temps réel. Le projet requiert des compétences en développement hardware (Crazyflie 2.0, voir https://wiki.bitcraze.io/) et software (langage C/C++/Python/Javascript/HTML...).&lt;br /&gt;
&lt;br /&gt;
Il se divise en 4 étapes principales, qui sont:&lt;br /&gt;
*1) Choisir les technologies utilisées&lt;br /&gt;
*2) Choisir l'architecture (OS / APIs)&lt;br /&gt;
*3) Développer les différentes parties du projet&lt;br /&gt;
*4) Intégrer et connecter les différentes parties du projet&lt;br /&gt;
&lt;br /&gt;
La localisation étant en intérieur, le protocole GPS n'est donc pas assez précis pour les applications ciblées. La mise en place d'un tel dispositif permettrait grâce à l'utilisation d'un algorithme d'estimer avec une bonne précision les positions en intérieur d'une balise centrale (appelée Tag) et de balises (appelées Anchor). Le Tag scanne en temps réel la distance relative aux différentes balises, et il nous est retourné la position des balises et du Tag grâce à l'algorithme de localisation.&lt;br /&gt;
&lt;br /&gt;
Le projet se compose de 3 parties:&lt;br /&gt;
* Collect &amp;amp; parse: collecter les données envoyées par les balises en communiquant avec un serveur et récupérer les données adéquates par un tri&lt;br /&gt;
* Localise: déterminer la matrice de position des balises et du Tag en traitant les données récupérées&lt;br /&gt;
* Display: développer l'interface homme machine pour afficher, étudier et utiliser les données traitées&lt;br /&gt;
&lt;br /&gt;
Nous travaillerons dans un premier temps dans une optique temps différé avant de travailler en temps réel. Cela nous permettra d'acquérir des données utiles et réutilisables en aval. &lt;br /&gt;
&lt;br /&gt;
A l'aboutissement du projet, nous devrions être capable via l'interface homme machine développée d'afficher précisément la position spatiale des balises ainsi que du Tag, grâce àl'utilisation d'un algorithme de localisation et des données récupérées, et d'afficher d'autres données relatives au déplacement du Tag ou des balises dans l'espace. &lt;br /&gt;
&lt;br /&gt;
Si le temps le permet, nous pourrons aussi être amenés à adapter et utiliser l'interface développée pour l'utilisation d'un drone.&lt;br /&gt;
&lt;br /&gt;
''Sujet originel''&lt;br /&gt;
&lt;br /&gt;
To achieve the control of quadrotors, the first important task to give its position information. This project is to develop a software(GUI) to localize the quadrotors in real-time. The quadrotor is flying in an environment where several transmitters have been installed. The quadrotor is equipped with a deck to receive the relative distances between the deck and all transmitters, based on which different algorithms will be implemented to realize the real-time localization. The candidates need to have both experiences on hardware (Crazyflie 2.0, see https://wiki.bitcraze.io/) and software development (C/C , Python…). &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Calendrier prévisionnel&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
''[[Avant le 29/09/17]]'' - Élaboration du Cahier des charges, de la liste des tâches et du calendrier prévisionnel&lt;br /&gt;
&lt;br /&gt;
''[[Avant fin Octobre]]'' - Serveur de collecte et début du développement de l'interface logicielle&lt;br /&gt;
&lt;br /&gt;
''[[Avant fin Décembre]]'' - Interface logicielle&lt;br /&gt;
&lt;br /&gt;
''[[A la fin du PFE]]'' - Intégration finale des différentes parties (Serveur de collecte des données &amp;amp; Serveur de localisation &amp;amp; Interface logicielle)&lt;br /&gt;
&lt;br /&gt;
Répartition du volume de travail (***h):&lt;br /&gt;
&lt;br /&gt;
* Recherche sur les technologies à utiliser&lt;br /&gt;
* Développement du serveur de collecte de données&lt;br /&gt;
* Réalisation de l'interface logicielle (Web//Logiciel/Application)&lt;br /&gt;
* Intégration des différentes parties&lt;br /&gt;
* Test et débuggage&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Choix techniques : matériel et logiciel&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
Afin de développer ce dispositif, nous allons utiliser une Raspberry Pi 3 associée à une carte réceptrice, qui communique avec 4 balises composées chacune d'un microcontrôleur et d'une carte émettrice radio (UWB5C) et alimentées par batteries. La carte réceptrice joue le rôle du drone à localiser et communiquera les données émises par les balises vers l'ordinateur via Bluetooth.&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Choix technologiques&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
Voici les technologies que nous utilisons pour chacune des parties de ce projet.&lt;br /&gt;
&lt;br /&gt;
    1) Serveur de collecte des données:&lt;br /&gt;
       Scanne et parse les données récupérées pour fournir la matrice D des distances relatives du tag aux 4 balises&lt;br /&gt;
        - API&lt;br /&gt;
        - Python / Serveur Flask&lt;br /&gt;
&lt;br /&gt;
    2) Serveur de localisation (fourni):&lt;br /&gt;
       Calcule grâce à l'algorithme de localisation et la matrice D les positions spatiales des 4 noeuds et du tag&lt;br /&gt;
        - API&lt;br /&gt;
        - Bootstrap&lt;br /&gt;
        - Jquery&lt;br /&gt;
        - Python&lt;br /&gt;
&lt;br /&gt;
    3) Interface utilisateur:&lt;br /&gt;
       Affiche courbes, visualisation 3D, boutons ou données des fichiers envoyées par le serveur de localisation&lt;br /&gt;
        - HTML5 / Javascript&lt;br /&gt;
        - Fichiers JSON (serveurs de collecte et de localisation)&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Calendrier prévisionnel'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Liste des tâches à effectuer&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
# Se documenter sur le projet&lt;br /&gt;
##Langages et technologies utilisées&lt;br /&gt;
##Matériel utilisé&lt;br /&gt;
##Mettre en place du travail sur le Git&lt;br /&gt;
# Réaliser le serveur de collecte&lt;br /&gt;
##Récupérer les trames envoyées par bluetooth par le TAG via la Raspberry Pi&lt;br /&gt;
##Intégrer le serveur de localisation pour interpréter les trames&lt;br /&gt;
##Tester et optimiser&lt;br /&gt;
# Réaliser l'interface Web utilisateur&lt;br /&gt;
##Implémenter le serveur de collecte et de localisation&lt;br /&gt;
##Afficher et traiter les données stockées dans les fichiers JSON via le serveur (temps différé + temps réel)&lt;br /&gt;
##Tester et optimiser&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;Replanification du cahier des charges / calendrier&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Feuille d'heures'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Tâche !! Prélude !! Heures S1 !! Heures S2 !! Heures S3 !! Heures S4 !! Heures S5 !! Heures S6 !! Heures S7 !! Heures S8 !! Heures S9 !! Heures S10 !! Heures S11 !! Heures S12 !! Heures S13 !! Heures S14 !! Heures S15 !! Heures S16 !! Heures S17 !! Heures S18 !! Heures S19 !! Total&lt;br /&gt;
|-&lt;br /&gt;
| Cahier des charges / Wiki / Gitlab / Rapport&lt;br /&gt;
|  4h&lt;br /&gt;
|  3h&lt;br /&gt;
|  1h&lt;br /&gt;
|  x&lt;br /&gt;
|  1h30&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h30&lt;br /&gt;
|  1h&lt;br /&gt;
|  3h&lt;br /&gt;
|  3h30&lt;br /&gt;
|  2h&lt;br /&gt;
|  5h&lt;br /&gt;
|  x&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Documentation sur les technos utilisées&lt;br /&gt;
|  2h&lt;br /&gt;
|  4h&lt;br /&gt;
|  3h&lt;br /&gt;
|  2h&lt;br /&gt;
|  3h&lt;br /&gt;
|  4h&lt;br /&gt;
|  5h&lt;br /&gt;
|  5h30&lt;br /&gt;
|  4h30&lt;br /&gt;
|  3h30&lt;br /&gt;
|  2h&lt;br /&gt;
|  3h&lt;br /&gt;
|  1h&lt;br /&gt;
|  3h&lt;br /&gt;
|  4h&lt;br /&gt;
|  x&lt;br /&gt;
|  2h&lt;br /&gt;
|  &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Documentation sur le matériel&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  1h&lt;br /&gt;
|  1h&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Recherche et développement du serveur de collecte&lt;br /&gt;
|  x&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  3h&lt;br /&gt;
|  3h30&lt;br /&gt;
|  4h&lt;br /&gt;
|  5h&lt;br /&gt;
|  7h&lt;br /&gt;
|  4h30&lt;br /&gt;
|  0,5h&lt;br /&gt;
|  3h&lt;br /&gt;
|  4h&lt;br /&gt;
|  3h&lt;br /&gt;
|  x&lt;br /&gt;
|  4h&lt;br /&gt;
|  7h30&lt;br /&gt;
|  5h&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Recherche et développement de l'interface Web&lt;br /&gt;
|  x&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  3h&lt;br /&gt;
|  5h&lt;br /&gt;
|  6h&lt;br /&gt;
|  4h&lt;br /&gt;
|  7h&lt;br /&gt;
|  5h30&lt;br /&gt;
|  2h30&lt;br /&gt;
|  6h&lt;br /&gt;
|  8h&lt;br /&gt;
|  5h&lt;br /&gt;
|  1h&lt;br /&gt;
|  8h&lt;br /&gt;
|  4h&lt;br /&gt;
|  4h&lt;br /&gt;
|  &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Recherche et intégration du serveur de localisation&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x &lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  6h&lt;br /&gt;
|  5h&lt;br /&gt;
|  3h&lt;br /&gt;
|  &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Intégration des différentes parties&lt;br /&gt;
|  x&lt;br /&gt;
|  x  &lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  2h&lt;br /&gt;
|  2h&lt;br /&gt;
|  2h&lt;br /&gt;
|  3h&lt;br /&gt;
|  1h30&lt;br /&gt;
|  x&lt;br /&gt;
|  3h&lt;br /&gt;
|  6h&lt;br /&gt;
|  5h&lt;br /&gt;
|  x&lt;br /&gt;
|  3h30&lt;br /&gt;
|  2h&lt;br /&gt;
|  2h&lt;br /&gt;
|  &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Tests et débuggage&lt;br /&gt;
|  x&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  1h&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  3h&lt;br /&gt;
|  4h&lt;br /&gt;
|  0,5h&lt;br /&gt;
|  3h&lt;br /&gt;
|  1h&lt;br /&gt;
|  3h&lt;br /&gt;
|  3h&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  4h&lt;br /&gt;
|  &lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Optimisation/Correction des programmes&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Vidéo&lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Avancement du Projet'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Phase préparatoire'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Jeu 21/09/17 - Ven 22/09/17]]'' &lt;br /&gt;
*Rendez-vous de mise au point du cahier des charges avec les encadrants/intervenants (M. ZHENG Gang et M. DAGHER Roudy)&lt;br /&gt;
*Elaboration du cahier des charges&lt;br /&gt;
*Elaboration de la page Wiki (préparation de la mise en page et présentation du sujet)&lt;br /&gt;
*Préparation du travail sous forme de Mind Map&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous nous sommes tout d’abord rendus au laboratoire de l'INRIA afin de pouvoir définir le plus précisément possible le cahier des charges avec nos tuteurs.&lt;br /&gt;
Nous avons donc défini avec eux les technologies qu'il faudrait étudier. Vous retrouverez le choix des technologies dans la partie '''choix technologiques'''&lt;br /&gt;
&lt;br /&gt;
Nous avons en même temps créé notre page Wiki, et structurée celle-ci avec les parties qui nous seraient utiles pour développer nos explications par la suite.&lt;br /&gt;
&lt;br /&gt;
Nous avons de plus découpé le travail en sous-parties que nous avions mis dans une '''Mind map''' afin d'y voir plus clair sur la ligne à suivre.&lt;br /&gt;
&lt;br /&gt;
Vous trouverez cette Mind map juste ci-dessous. Nous ne mettrons pas à jour cette Mind map chaque semaine mais il est fort probable que nous en refaisions un en milieu de projet pour pouvoir cibler les objectifs réussis et ceux à atteindre. Nous pourrons de plus redéfinir certains objectifs qui nous auraient semblés trop vague au début du projet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Projet de fin d'étude.png|centre|600px]]&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 1'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Jeu 28/09/17 - Ven 29/09/17]]'' &lt;br /&gt;
*Revue du Cahier des Charges avec les encadrants&lt;br /&gt;
*Lecture et recherches sur les technologies adaptées&lt;br /&gt;
*Construction de la suite de la Mind Map&lt;br /&gt;
*Création du Gitlab&lt;br /&gt;
&lt;br /&gt;
Nous commençons les recherches sur le projet et sur les premières technologies engagées dans celui-ci. Nous en profitons pour formuler dès à présent des questions sur le bon choix de celles-ci. Nous commençons donc des tests ayant seulement pour but de nous familiariser avec l'environnement de travail et de réellement comprendre les fonctions déjà présentes qu'il faudra exploiter et implanter notre interface web.&lt;br /&gt;
Nous créons un dépôt Gitlab avec notre tuteur et commençons a définir les taches premières sur celui-ci.&lt;br /&gt;
Nous en profitons pour affiner le Mind Map.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 2'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Jeu 05/10/17 - Ven 06/10/17]]''  &lt;br /&gt;
*Précisions sur le cahier des charges&lt;br /&gt;
*Listage du matériel&lt;br /&gt;
*Recherche et détermination de solutions technologiques possibles pour les fonctions demandées&lt;br /&gt;
*Début du travail sur le serveur de collecte&lt;br /&gt;
*Apprentissage du langage Python et de l'utilisation du framework Flask&lt;br /&gt;
&lt;br /&gt;
Nous avons finalisé les précisions sur le cahier des charges. Nous avons donc pu cibler le matériel dont nous nous servirons pour ce Projet. Vous trouverez donc cette liste la section correspondante. Il est évident que le matériel utilisé est dans l'ensemble déjà fourni par le laboratoire et qu'il nous reste dans l'ensemble à créer l'interface web et les API qui nous permettrons de faire communiquer cette interface avec la Raspberry Pi et le serveur de position déjà créé.&lt;br /&gt;
Nous avons donc pu commencer à nous former sur les technologies qui nous serviraient par la suite. Nous avons donc utilisé le cours d'Openclassrooms sur les serveurs Flask pour en apprendre les bases. Ce serveur Flask est programmé en Python et nous permet donc une grande liberté au niveau de l’exécution de certains scripts. En effet, les scripts de connexion Bluetooth et de redirection de port qui nous permettent de récupérer les données de distance sont eux-mêmes codés en Python et sont directement appelés via le serveur.&lt;br /&gt;
Dans ce serveur, représentant notre interface web, vous retrouverez la page '''/collecte''' qui représentera notre partie collecte de données ainsi que l'affichage de ces distances. Nous appellerons cette partie le Serveur de Collecte.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 3'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 11/10/17 - Jeu 12/10/17]]''  &lt;br /&gt;
*Recherche et développement initial du serveur de collecte de données&lt;br /&gt;
*Complément du Git sur les tâches à effectuer&lt;br /&gt;
&lt;br /&gt;
Nous avons commencé à créer un serveur Flask renvoyant pour l'instant une matrice aléatoire. Lors de la requête URL &amp;quot;../matrice&amp;quot;, nous voyons bien une matrice aléatoire apparaître sur la page Web. Nous essayons de nous connecter à la Raspberry Pi en redirigeant son port série vers le Bluetooth de façon à récupérer de vraies matrices de distance entre le drone (ie commutateur central) et les balises. Nous pourrons afficher ensuite ces matrices, ou alors les stocker dans un fichier en attendant le traitement de celles-ci.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Requete s3.PNG|300px|serveur Flask]]&lt;br /&gt;
&lt;br /&gt;
Nous avons plusieurs problèmes avec le Bluetooth pour se connecter avec la Raspberry Pi. Quand nous aurons réussi à nous connecter au port série de la Raspberry Pi alors nous pourrons gérer le traitement des données récupérées.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 4'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 18/10/17 - Jeu 19/10/17]]''  &lt;br /&gt;
*Configuration de la Raspberry Pi car problèmes de connectivité Bluetooth rencontrés&lt;br /&gt;
**Nous arrivons à connecter la Raspberry Pi sous Windows mais la connexion sous Linux pose problème (travail en suspens en attendant la disponibilité de l'encadrant)&lt;br /&gt;
*Début du développement de l'interface Web&lt;br /&gt;
**Traitement d'une matrice dans un fichier JSON&lt;br /&gt;
**Affichage sous forme de tableau de la matrice&lt;br /&gt;
**Utilisation du serveur de requête en Python avec chargement de template HTML&lt;br /&gt;
**Mise en forme de la trame de la page en HTML/CSS avec le framework Bootstrap&lt;br /&gt;
**Ajout d'un set de distances (d1, d2, d3, d4) dans la matrice lors d'un appui sur un bouton Chargement en utilisant un fichier Javascript&lt;br /&gt;
&lt;br /&gt;
Nous avons reçu des fonctions Python de notre tuteur afin d'obtenir une connexion Bluetooth entre notre Raspberry Pi et notre ordinateur ainsi qu'une redirection de port de celle-ci vers la connexion. Nous n'arrivons pas à utiliser ces fonctions sous linux et nous nécessitons une explication de notre tuteur n'étant pas disponible à ce moment. Pour ne pas perdre de temps, nous attaquons la création de l'interface web à proprement parler, c'est à dire la création des pages HTML ainsi que le document Javascript qui nous servira de bibliothèque de fonctions. Chaque route de notre serveur est reliée à une série de fonctions Python s'exécutant à l'appel des url puis suivies d'un template de la page HTML en question. Nous en profitons de plus pour explorer le framework CSS bootstrap afin de mettre un premier design et une structure a notre page collecte qui sera la page principale de notre site pour ce début de projet.&lt;br /&gt;
&lt;br /&gt;
Nous nous essayons de plus à différents tests sur des fichiers de format '''JSON''' que nous devrons réussir à traiter correctement plus tard dans notre projet.&lt;br /&gt;
Nous récupérons une matrice que nous créons nous-mêmes en Python (simulation d'une série de distances récupérée) que nous transformons au format JSON pour ensuite l'afficher sur notre page web. Pour pouvoir proprement afficher ce fichier '''JSON''' renvoyé vers notre page, nous nous servons du fichier Javascript afin de créer du code HTML contenant la matrice.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 5'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 25/10/17 - Ven 27/10/17]]''  &lt;br /&gt;
*Résolution des problèmes de connectique Bluetooth sur la Raspberry Pi&lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Traitement d'une matrice dans un fichier JSON&lt;br /&gt;
**Début de l'ajout d'un set de distances depuis une matrice contenue dans un fichier JSON&lt;br /&gt;
&lt;br /&gt;
Nous avons pu nous entretenir avec notre tuteur et donc comprendre les fonctions de connexion et de redirection de port. Nous pouvons donc continuer le développement de notre interface web. Nous arrivons à traiter un set de données au format JSON et à l'afficher dans le code HTML. Toutefois nous créons nous-mêmes ce set, il est maintenant nécessaire que nous arrivions à récupérer les sets de distance réels reçus par la connexion Bluetooth. Nous commencerons par un traitement asynchrone. L'idée est d’enregistrer les sets de distances dans un fichier '''JSON''' stocké dans un dossier. Nous appellerons ce dossier plus tard via une requête Ajax.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 6'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 08/11/17 - Ven 10/11/17]]''  &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
**Mise en place de la communication entre le port série de notre machine et le port série de la carte via Bluetooth de la RPi3&lt;br /&gt;
**Récupération et traitement (parse) manuels des données de distances dans un fichier .log via TCP/IP&amp;lt;-&amp;gt;Bluetooth&lt;br /&gt;
**Début de l'automatisation du procédé par script Python (requete.py) et mise en place de sockets de communication&lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Chargement sur commande d'un set de distances depuis une matrice contenue dans un fichier JSON&lt;br /&gt;
*Travail sur le layout du site&lt;br /&gt;
&lt;br /&gt;
Après avoir regardé le code de ces différentes fonctions nous avons pu faire des tests manuels via le Shell pour récupérer des données de distances et les stocker dans un fichier '''JSON''' sur notre ordinateur.&lt;br /&gt;
&lt;br /&gt;
Nous utilisons les commandes suivantes pour se connecter via Bluetooth:&lt;br /&gt;
&lt;br /&gt;
 rfcomm connect /dev/rfcomm0 B8:27:EB:80:DC:89 1&lt;br /&gt;
&lt;br /&gt;
Rediriger le port de la Raspberrypi3 vers la connexion:&lt;br /&gt;
&lt;br /&gt;
 Python lps-collector/tcp_serial_redirect.py /dev/rfcomm0 9600&lt;br /&gt;
&lt;br /&gt;
Collecter les données dans un fichier dont nous définissons le nom:&lt;br /&gt;
&lt;br /&gt;
 echo &amp;quot;cu -s9600 -lttyACM0&amp;quot;| nc localhost 7777&lt;br /&gt;
 nc localhost 7777 | grep distance &amp;gt; static/log/dist-capture'+date+'.log&lt;br /&gt;
&lt;br /&gt;
Nous pouvons '''parser''' le flux de données avant de le stocker dans le fichier via cette commande:&lt;br /&gt;
&lt;br /&gt;
 Python lps-collector/lps_parse.py static/log/dist-capture&amp;quot;+date+&amp;quot;.log&lt;br /&gt;
&lt;br /&gt;
Il est donc nécessaire d'inclure via des '''thread''' ces différentes fonctions dans notre serveur Python (Flask) afin d'automatiser le processus. Le but est de pouvoir choisir sur l'interface web quels fonctions il faut exécuter et les déclencher via l'appui sur des boutons.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 7'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 15/11/17 - Ven 17/11/17]]''  &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
**Récupération et traitement (parse) manuels des données de distances dans un fichier .log via TCP/IP&amp;lt;-&amp;gt;Bluetooth&lt;br /&gt;
**Automatisation du procédé par script Python (requete.py)&lt;br /&gt;
***Mise en place de sockets de communication pour le contrôle de la collecte -&amp;gt; abandonné (servait à commander la collecte manuellement)&lt;br /&gt;
***Développement d'un script engine.py regroupant les commandes exécutables par l'utilisateur via la page Web&lt;br /&gt;
***Début du travail sur la fonction &amp;quot;STOP&amp;quot; manuel d'une action de collecte de données (liaison entre script HTML, Javascript, et script Python)&lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Chargement sur commande d'un set de distances depuis une matrice contenue dans un fichier JSON&lt;br /&gt;
**Travail sur le layout du site&lt;br /&gt;
***Ajout des différentes commandes (connexion Bluetooth, lancement commande cu, collecte des données, collecte durée donnée)&lt;br /&gt;
***Début de l'implémentation de la visualisation des fichiers .JSON obtenus après collecte et affichage dans un tableau matriciel du fichier sélectionné&lt;br /&gt;
&lt;br /&gt;
Nous avons continué à travailler sur le serveur de collecte: les données que nous avons récupérées via Bluetooth sont stockées dans un fichier .log. Apres avoir bien compris comment marchait la fonction '''parse''' manuellement (lors de son utilisation dans le Shell), nous l'avons implémentée dans notre serveur de collecte qui lance cette commande lors de l’appui sur un bouton via notre interface virtuelle. Un problème rencontré était de savoir quand la récolte des données devait s’arrêter. Nous avons donc rajouté un temps à entrer nous-même sur l'interface. La fonction '''parse''' est effectuée et le sous-processus va attendre le temps donné avant de lancer une commande permettant de tuer le processus et mettant donc fin au remplissage du fichier '''.log'''. Nous voulons de plus réussir à lancer une fonction de collecte sans temps. C'est à dire que nous coupons la collecte via un bouton par nous-mêmes. Nous voulions utiliser des Sockets pour pouvoir définir nous-mêmes la gestion de la communication mais l'idée a été abandonné car nous avons réussi à sauvegarder le PID du processus lancé. Il nous suffit donc de l’arrêter grâce à un autre bouton qui récupère cette variable et l’arrête ensuite. &lt;br /&gt;
&lt;br /&gt;
Toutes nos fonctions Pythons étant regroupées dans notre serveur '''requete.py''', nous avons décidé de créer un module qui regroupera toutes ces fonctions que nous pourrons utiliser dans '''requete.py'''. ceci nous permet de voir plus clair dans notre code et de faciliter le travail lorsque nous modifions le code tous les deux.&lt;br /&gt;
&lt;br /&gt;
Nous essayons en continu d'adapter le layout du site pour le rendre le plus attractif et simple possible, de façon à ce que chaque bouton et tableau soient clairs et compréhensibles.&lt;br /&gt;
&lt;br /&gt;
Nous avons commencé à récupérer les fichiers '''JSON''' créés à partir des fichier '''log''', c'est-à-dire que ces fichiers sont automatiquement stockés coté serveur dans un dossier nommé '''static/log'''. Notre but est de récupérer le nom des fichiers JSON et de les afficher dans un composant sur notre interface web. Il nous sera donc possible ensuite de sélectionner le nom d'un fichier. Lors de la sélection de ce nom de fichier, un tableau apparaît avec les valeurs de distances à l’intérieur.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 8'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 22/11/17 - Ven 24/11/17]]''  &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
**Automatisation du procédé de collecte par script Python (requete.py qui fait appel à engine.py)&lt;br /&gt;
***Développement d'un script engine.py regroupant les commandes exécutables par l'utilisateur via la page Web&lt;br /&gt;
***Travail sur la fonction &amp;quot;STOP&amp;quot; manuel d'une action de collecte de données (liaison entre script HTML, Javascript, et script Python)&lt;br /&gt;
***Mise en place d'un serveur HTTP Simple sous Python pour accéder aux fichiers de données à partir de la page Web&lt;br /&gt;
***Mise à jour de fonctions de connexion &lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Travail sur le layout du site (ajout de pages, navigation entre les pages, apparence, nettoyage des codes)&lt;br /&gt;
**Bon fonctionnement de l'ensemble serveur collecte + serveur HTTP + client Web&lt;br /&gt;
**Affichage de la liste des fichiers de données de distance (log, csv, JSON) via serveur HTTP en Python sur port 9999&lt;br /&gt;
*Corrections et nettoyage du dépôt GIT&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous continuons à développer les points énoncés la semaine dernière. Nous avons décidé de nous diriger vers un serveur HTTP Simple pour accéder à nos fichiers. Il s’avère que nous finirons par ne pas utiliser ce serveur. Nous irons récupérer les fichiers en question via des requêtes '''Ajax''' faites à la sélection du nom du fichier.&lt;br /&gt;
&lt;br /&gt;
Nous rencontrons depuis le début des problèmes avec les fonctions de connexion qui peuvent ne pas marcher à un moment donné. Nous essayons de trouver pourquoi ce bug est un bug qui ne se produit pas à chaque fois. Nous avons déterminé qu'il ne se produisait seulement lorsque les fonctions de connexions étaient lancée dans des threads. Nous ne savons toujours pas pourquoi ces thread bugguent seulement parfois et non à chaque essai de connexion.&lt;br /&gt;
&lt;br /&gt;
Nous avons nettoyé notre dépot '''Git''' car il s’avère que nous utilisions une mauvaise méthode de fusion et de stockage des documents.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 9'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 29/11/17 - Jeudi 30/11/17]]''  &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
**Automatisation du procédé de collecte par script Python (requete.py qui fait appel à engine.py)&lt;br /&gt;
***Travail sur la fonction &amp;quot;STOP&amp;quot; manuel d'une action de collecte de données (liaison entre script HTML, Javascript, et script Python)&lt;br /&gt;
***Recherches sur l'utilisation de fichiers JSON accessibles via le serveur HTTP&lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Travail sur le layout du site &lt;br /&gt;
**Travail sur la liaison entre fichiers JSON et affichage Web des données de distance&lt;br /&gt;
***Recherches et tests de solutions&lt;br /&gt;
****Affichage depuis un fichier&lt;br /&gt;
****Affichage à la volée lors d'une action de collecte&lt;br /&gt;
&lt;br /&gt;
*Revue de code avec Roudy DAGHER:&lt;br /&gt;
**Structure globale des codes ok&lt;br /&gt;
**Fonctionnement presque ok: fonctionnalités implémentées ok, mais parsage csv ne marche pas&lt;br /&gt;
**Refactoring nécessaire&lt;br /&gt;
**Correction de la fonction STOP et amélioration de la fonction de COLLECTE&lt;br /&gt;
**Faire plus de requêtes Javascript que de requêtes HTML&lt;br /&gt;
**Discussion pour l'implémentation du serveur de localisation (= algorithme de localisation) et des visualisations de données sur le site Web&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous avons d'abord revu l'ensemble de notre code et les méthodes utilisées avec notre tuteur '''Roudy Dagher'''. Nous nous approchons d'un serveur de collecte de données stable et fonctionnel. Nous avons refait les différentes connexions entre l'interface et le serveur afin de ne faire que des requêtes sur des '''WebServices'''. Il nous est possible de commencer la deuxième partie qui est l'envoi de ces tableaux de données afin de les envoyer vers le serveur de localisation via des API afin de recevoir des matrices de positions.&lt;br /&gt;
Nous pourrons grâce à ces matrices afficher une carte 3D des balises  et du TAG dans l'espace.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 10'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 06/12/17 - Jeudi 07/12/17]]'' &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
**Travail sur la fonction STOP&lt;br /&gt;
**Réalisation d'une expression régulière pour le parsage des fichiers log en fichier JSON&lt;br /&gt;
&lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Travail sur l'affichage des fichiers JSON&lt;br /&gt;
***Réalisation de toutes les requêtes Ajax&lt;br /&gt;
***Réalisation d'un menu déroulant dropdown pour charger le contenu des fichiers JSON dans le tableau de distances&lt;br /&gt;
&lt;br /&gt;
*Nettoyage du dépôt Git&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 11'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 13/12/17]]''  &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
&lt;br /&gt;
*Revue de code avec Roudy DAGHER:&lt;br /&gt;
**Discussion sur la partie système du projet et correction de certaines fonctions&lt;br /&gt;
&lt;br /&gt;
Nous nous sommes réunis avec l'un de nos tuteurs, qui a réalisé certains bouts de code de base, pour nous mettre au point sur les fonctions en question et leur utilisation.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 12'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 20/12/17 - Jeudi 21/12/17]]''&lt;br /&gt;
*Revue, correction et nettoyage des codes&lt;br /&gt;
*Finalisation du rapport&lt;br /&gt;
*Planification de semaines restantes&lt;br /&gt;
*Préparation de la soutenance&lt;br /&gt;
*Revue de mi-projet avec tous les tuteurs&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Cette dernière semaine a servi à finaliser le rapport et à discuter de l'avancée du projet, notamment avec nos tuteurs pour déterminer le travail restant, présenter le travail abouti et replanifier précisément les échéances pour le travail restant. Nous avons réalisé la soutenance de mi-projet le '''jeudi 21/12/17 à 8h'''.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 13'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 10/01/18 - Ven 12/01/18]]''  &lt;br /&gt;
*Travail sur la collecte des données (serveur de collecte et interface Web)&lt;br /&gt;
**Redéfinition du fichier de parsage car il crée des conflits et ne produit pas un fichier formaté de la façon attendue&lt;br /&gt;
***Nombre de balises réel n'est pas bien déterminé par le code&lt;br /&gt;
***ID de la première et de la dernière balise ne sont pas déterminés correctement&lt;br /&gt;
&lt;br /&gt;
**Automatisation de la collecte par un script Shell lançant toutes les commandes de CONNEXION, REDIRECTION, LANCEMENT CU, FERMETURE DU PROGRAMME (kill rfcomm / kill tcp_redirect)&lt;br /&gt;
***Dans le but d'automatiser la procédure&lt;br /&gt;
***Dans le but de résoudre un problème de gestion de ressources (le bug '''thread''' apparu plus tôt dans le projet)&lt;br /&gt;
&lt;br /&gt;
**Travail sur la résolution du bug thread car l'automatisation n'a pas résolu le problème&lt;br /&gt;
***Identification du ou des causes potentielles: gestion des ressources (synchrone, asynchrone ?), connexion Bluetooth, lancement des commandes dans le même script, lancement en fg/bg, conflit dû au temps d'exécution de chaque processus ?&lt;br /&gt;
***Lancement des commandes manuellement dans des terminaux ne pose aucun problème: solution la plus simple&lt;br /&gt;
&lt;br /&gt;
**Redesign de la page Collecte&lt;br /&gt;
***Remplacement des boutons de commande par un bouton unique d'initialisation&lt;br /&gt;
***Travail sur une mise à jour du menu déroulant dropdown régulière sans avoir à recharger la page Web&lt;br /&gt;
***Implémentation de plotly.js, un module Javascript qui permet d'afficher des graphes en 3D&lt;br /&gt;
&lt;br /&gt;
*Mise au point post-soutenance avec Roudy DAGHER pour valider le travail restant, effectué et redéfinir certains objectifs atteignables ou pas selon les éléments réalisés dans le projet&lt;br /&gt;
*Recherches et début de l'implémentation du serveur de localisation fourni par les tuteurs&lt;br /&gt;
*Gestion du Git pour créer des branches additionnelles&lt;br /&gt;
*Recréation du rapport de projet suite à une perte du fichier éditable d'origine + Mise à jour avec les remarques suite à la soutenance ainsi que les nouveaux éléments&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 14'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mar 16/01/18 - Ven 19/01/18]]''  &lt;br /&gt;
*Travail sur la collecte des données (serveur de collecte et interface Web)&lt;br /&gt;
**Redéfinition du fichier de parsage car il crée des conflits et ne produit pas un fichier formaté de la façon attendue&lt;br /&gt;
***Corrigé: Nombre de balises réel n'est pas bien déterminé par le code&lt;br /&gt;
***Corrigé: ID de la première et de la dernière balise ne sont pas déterminés correctement&lt;br /&gt;
***Reste à faire: Traiter le cas où il y a un ajout ou suppression d'une balise pendant la collecte (pour le moment, lorsque c'est le cas, toutes les données se décalent au lieu de laisser des trous)&lt;br /&gt;
&lt;br /&gt;
**Automatisation de la collecte par un script Shell lançant toutes les commandes de CONNEXION, REDIRECTION, LANCEMENT CU, FERMETURE DU PROGRAMME (kill rfcomm / kill tcp_redirect)&lt;br /&gt;
***Mis en suspens: pour le moment, on lance les commandes manuellement dans le terminal&lt;br /&gt;
&lt;br /&gt;
**Interface Web&lt;br /&gt;
***Implémentation de plotly.js, un module Javascript qui permet d'afficher des graphes en 3D&lt;br /&gt;
&lt;br /&gt;
*Implémentation du serveur de localisation fourni par les tuteurs (mais algorithme de localisation pas fonctionnel pour le moment)&lt;br /&gt;
**Mise à jour de l'affichage des positions des éléments: précédemment seule la matrice X de position du Tag s'affichait, et pas la matrice A des balises&lt;br /&gt;
**Requêtes manuelles à l'API avec la fonction curl OK: on arrive à récupérer les matrices X et A (aléatoires pour le moment) par une requête GET à l'API du serveur de localisation&lt;br /&gt;
**Implémentation des requêtes Ajax pour automatiser les requêtes au serveur de localisation&lt;br /&gt;
&lt;br /&gt;
*Mise à jour du rapport les nouveaux éléments du travail réalisé&lt;br /&gt;
*Réflexion sur la possibilité ou non de réaliser la partie temps réel du projet au vu des moyens à disposition&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 15'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mar 23/01/18 - Ven 26/01/18]]'' &lt;br /&gt;
*Travail sur la collecte des données (serveur de collecte et interface Web)&lt;br /&gt;
**Redéfinition du fichier de parsage car il crée des conflits et ne produit pas un fichier formaté de la façon attendue&lt;br /&gt;
***Fait: Si distance négative car Tag trop près, la valeur négative générée par une balise est remplacée par un &amp;quot;0&amp;quot; (cela modifie la position réelle modélisée dans plotly, mais évite une impossibilité de générer la position à partir de la distance -&amp;gt; par des tests, il faudra déterminer la valeur limite à partir de laquelle les cartes donnent des valeurs de distance négatives&lt;br /&gt;
***Reste à faire: Traiter le cas où il y a un ajout ou suppression d'une balise pendant la collecte (pour le moment, lorsque c'est le cas, toutes les données se décalent au lieu de laisser des trous); Ainsi que le cas où il y un saut/bug inattendu et donc une disparition d'une ou plusieurs valeurs de distance&lt;br /&gt;
***Début de résolution du cas où une distance n'est pas prise en compte, c'est à dire où il y a une valeur qui disparaît et désaligne les valeurs lors de la création du JSON&lt;br /&gt;
&lt;br /&gt;
**Automatisation de la collecte par un script Shell lançant toutes les commandes de CONNEXION, REDIRECTION, LANCEMENT CU, FERMETURE DU PROGRAMME (kill rfcomm / kill tcp_redirect)&lt;br /&gt;
***Mis en suspens: pour le moment, on lance les commandes manuellement dans le terminal&lt;br /&gt;
***Création d'un script bash /etc/init.d/autoconnect.sh pour connecter automatiquement la RPi au lancement du système (si la RPi est déjà allumée au démarrage)&lt;br /&gt;
&lt;br /&gt;
**Interface Web&lt;br /&gt;
***Perfectionnement de l'utilisation de Plotly pour les visualisations&lt;br /&gt;
&lt;br /&gt;
*Implémentation du serveur de localisation fourni par les tuteurs (algorithme de localisation pas fonctionnel pour le moment)&lt;br /&gt;
**Requêtes manuelles à l'API avec la fonction curl OK&lt;br /&gt;
**Fait: Implémentation des requêtes Ajax pour automatiser les requêtes au serveur de localisation&lt;br /&gt;
***Liaison entre les différentes requêtes ajax grâce à des variables: permet de stocker l'adresse du job récupérée par la méthode GET&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 16'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Lun 29/01/18 - Ven 02/02/18]]'' &lt;br /&gt;
*Travail sur la collecte des données (serveur de collecte et interface Web)&lt;br /&gt;
**Redéfinition du fichier de parsage car il crée des conflits et ne produit pas un fichier formaté de la façon attendue&lt;br /&gt;
***déterminer la valeur limite à partir de laquelle les cartes donnent des valeurs de distance négatives&lt;br /&gt;
***Reste à faire: Traiter le cas où il y a un ajout ou suppression d'une balise pendant la collecte (pour le moment, lorsque c'est le cas, toutes les données se décalent au lieu de laisser des trous); Ainsi que le cas où il y un saut/bug inattendu et donc une disparition d'une ou plusieurs valeurs de distance&lt;br /&gt;
***Fait: gestion des bugs/sauts de valeurs de balises - remplacement par une valeur nulle sur balise existe, par rien sinon (implémentation d'un tableau caractérisant l'existence ou pas de chaque balise 1 à 6), optimisation des temps de calculs/exécution dans le script&lt;br /&gt;
**Interface Web&lt;br /&gt;
***Ajout d'une barre de progression de la collecte remplaçant le bouton de Lancement de collecte lors de l'appui&lt;br /&gt;
***Ajout d'un bouton dropdown pour afficher les fichiers de position qu'on reçoit du serveur de localisation&lt;br /&gt;
***Ajout d'une scrollbar dans les deux dropdown&lt;br /&gt;
&lt;br /&gt;
*Implémentation du serveur de localisation fourni par les tuteurs (algorithme de localisation pas fonctionnel pour le moment)&lt;br /&gt;
**Fait: Implémentation des requêtes Ajax pour automatiser les requêtes au serveur de localisation&lt;br /&gt;
***Création d'une requête Ajax GET qui demande le fichier JSON de position au serveur de localisation jusqu'à ce qu'il soit retourné&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 17'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Lun 05/02/18 - Ven 09/02/18]]''&lt;br /&gt;
&lt;br /&gt;
*Rapport partie Front-end&lt;br /&gt;
*Rapport partie Back-end&lt;br /&gt;
*Nettoyage du code requete.py&lt;br /&gt;
*Mise à jour final des de certes pages du site&lt;br /&gt;
** matrice.html à jour&lt;br /&gt;
**3D.html à jour&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 18'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Lun 12/02/18 - Ven 16/02/18]]''&lt;br /&gt;
&lt;br /&gt;
*Rapport partie résultat obtenus &lt;br /&gt;
*réalisation de la vidéo de présentation&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 19'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Lun 19/02/18 - Ven 23/02/18]]''&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Observations'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Problèmes rencontrés'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Solutions apportées'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Délivrables'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
Rapport de mi-PFE&lt;br /&gt;
[[Fichier:RapportMi-PFE-UNG DELATTE.pdf]]&lt;br /&gt;
&lt;br /&gt;
Rapport de PFE&lt;br /&gt;
&lt;br /&gt;
Vidéo&lt;/div&gt;</summary>
		<author><name>Hdelatte</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=P18_Localisation_of_quadrotors&amp;diff=51096</id>
		<title>P18 Localisation of quadrotors</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=P18_Localisation_of_quadrotors&amp;diff=51096"/>
				<updated>2018-02-16T15:19:33Z</updated>
		
		<summary type="html">&lt;p&gt;Hdelatte : /* Semaine 17 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Cahier des charges'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;Présentation générale du projet&amp;lt;/span&amp;gt;=== &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Contexte&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
Dans un monde de plus en plus connecté, de nombreux drones sont déployés pour diverses applications comme l'espionnage, la surveillance, la cartographie de lieux et la livraison de colis. Les technologies nécessaires pour contrôler ces drones sont des sujets de recherche actuels. &lt;br /&gt;
&lt;br /&gt;
Le contrôle de ceux-ci passe tout d'abord par la maîtrise de leur position dans l'espace. Le développement des applications liées à l'utilisation de drones nécessite un travail important sur la localisation spatiale d'objets connectés. &lt;br /&gt;
&lt;br /&gt;
De plus, dans un souci d'utilisation, il est essentiel de développer des interfaces logicielles permettant d'exploiter ces données.&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Objectif du projet&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
L'objectif de ce projet est de développer une interface logicielle permettant de traiter en temps réel les informations de localisation d'un drone et de balises, dans le but de définir leur localisation dans l'espace, en intérieur.&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Description du projet&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
Pour réaliser le contrôle de drones, la première étape importante est de donner ses informations de position. Le but du projet est de développer une interface logicielle permettant de localiser le drone en temps réel en intérieur. Le drone se déplace dans un environnement dans lequel ont été installées de multiples balises. Il est équipé d'une carte, lui permettant de recevoir les distances relatives entre lui-même et les balises, sur laquelle différents algorithmes vont être implémentés pour effectuer la localisation en temps réel. Le projet requiert des compétences en développement hardware (Crazyflie 2.0, voir https://wiki.bitcraze.io/) et software (langage C/C++/Python/Javascript/HTML...).&lt;br /&gt;
&lt;br /&gt;
Il se divise en 4 étapes principales, qui sont:&lt;br /&gt;
*1) Choisir les technologies utilisées&lt;br /&gt;
*2) Choisir l'architecture (OS / APIs)&lt;br /&gt;
*3) Développer les différentes parties du projet&lt;br /&gt;
*4) Intégrer et connecter les différentes parties du projet&lt;br /&gt;
&lt;br /&gt;
La localisation étant en intérieur, le protocole GPS n'est donc pas assez précis pour les applications ciblées. La mise en place d'un tel dispositif permettrait grâce à l'utilisation d'un algorithme d'estimer avec une bonne précision les positions en intérieur d'une balise centrale (appelée Tag) et de balises (appelées Anchor). Le Tag scanne en temps réel la distance relative aux différentes balises, et il nous est retourné la position des balises et du Tag grâce à l'algorithme de localisation.&lt;br /&gt;
&lt;br /&gt;
Le projet se compose de 3 parties:&lt;br /&gt;
* Collect &amp;amp; parse: collecter les données envoyées par les balises en communiquant avec un serveur et récupérer les données adéquates par un tri&lt;br /&gt;
* Localise: déterminer la matrice de position des balises et du Tag en traitant les données récupérées&lt;br /&gt;
* Display: développer l'interface homme machine pour afficher, étudier et utiliser les données traitées&lt;br /&gt;
&lt;br /&gt;
Nous travaillerons dans un premier temps dans une optique temps différé avant de travailler en temps réel. Cela nous permettra d'acquérir des données utiles et réutilisables en aval. &lt;br /&gt;
&lt;br /&gt;
A l'aboutissement du projet, nous devrions être capable via l'interface homme machine développée d'afficher précisément la position spatiale des balises ainsi que du Tag, grâce àl'utilisation d'un algorithme de localisation et des données récupérées, et d'afficher d'autres données relatives au déplacement du Tag ou des balises dans l'espace. &lt;br /&gt;
&lt;br /&gt;
Si le temps le permet, nous pourrons aussi être amenés à adapter et utiliser l'interface développée pour l'utilisation d'un drone.&lt;br /&gt;
&lt;br /&gt;
''Sujet originel''&lt;br /&gt;
&lt;br /&gt;
To achieve the control of quadrotors, the first important task to give its position information. This project is to develop a software(GUI) to localize the quadrotors in real-time. The quadrotor is flying in an environment where several transmitters have been installed. The quadrotor is equipped with a deck to receive the relative distances between the deck and all transmitters, based on which different algorithms will be implemented to realize the real-time localization. The candidates need to have both experiences on hardware (Crazyflie 2.0, see https://wiki.bitcraze.io/) and software development (C/C , Python…). &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Calendrier prévisionnel&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
''[[Avant le 29/09/17]]'' - Élaboration du Cahier des charges, de la liste des tâches et du calendrier prévisionnel&lt;br /&gt;
&lt;br /&gt;
''[[Avant fin Octobre]]'' - Serveur de collecte et début du développement de l'interface logicielle&lt;br /&gt;
&lt;br /&gt;
''[[Avant fin Décembre]]'' - Interface logicielle&lt;br /&gt;
&lt;br /&gt;
''[[A la fin du PFE]]'' - Intégration finale des différentes parties (Serveur de collecte des données &amp;amp; Serveur de localisation &amp;amp; Interface logicielle)&lt;br /&gt;
&lt;br /&gt;
Répartition du volume de travail (***h):&lt;br /&gt;
&lt;br /&gt;
* Recherche sur les technologies à utiliser&lt;br /&gt;
* Développement du serveur de collecte de données&lt;br /&gt;
* Réalisation de l'interface logicielle (Web//Logiciel/Application)&lt;br /&gt;
* Intégration des différentes parties&lt;br /&gt;
* Test et débuggage&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Choix techniques : matériel et logiciel&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
Afin de développer ce dispositif, nous allons utiliser une Raspberry Pi 3 associée à une carte réceptrice, qui communique avec 4 balises composées chacune d'un microcontrôleur et d'une carte émettrice radio (UWB5C) et alimentées par batteries. La carte réceptrice joue le rôle du drone à localiser et communiquera les données émises par les balises vers l'ordinateur via Bluetooth.&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Choix technologiques&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
Voici les technologies que nous utilisons pour chacune des parties de ce projet.&lt;br /&gt;
&lt;br /&gt;
    1) Serveur de collecte des données:&lt;br /&gt;
       Scanne et parse les données récupérées pour fournir la matrice D des distances relatives du tag aux 4 balises&lt;br /&gt;
        - API&lt;br /&gt;
        - Python / Serveur Flask&lt;br /&gt;
&lt;br /&gt;
    2) Serveur de localisation (fourni):&lt;br /&gt;
       Calcule grâce à l'algorithme de localisation et la matrice D les positions spatiales des 4 noeuds et du tag&lt;br /&gt;
        - API&lt;br /&gt;
        - Bootstrap&lt;br /&gt;
        - Jquery&lt;br /&gt;
        - Python&lt;br /&gt;
&lt;br /&gt;
    3) Interface utilisateur:&lt;br /&gt;
       Affiche courbes, visualisation 3D, boutons ou données des fichiers envoyées par le serveur de localisation&lt;br /&gt;
        - HTML5 / Javascript&lt;br /&gt;
        - Fichiers JSON (serveurs de collecte et de localisation)&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Calendrier prévisionnel'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Liste des tâches à effectuer&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
# Se documenter sur le projet&lt;br /&gt;
##Langages et technologies utilisées&lt;br /&gt;
##Matériel utilisé&lt;br /&gt;
##Mettre en place du travail sur le Git&lt;br /&gt;
# Réaliser le serveur de collecte&lt;br /&gt;
##Récupérer les trames envoyées par bluetooth par le TAG via la Raspberry Pi&lt;br /&gt;
##Intégrer le serveur de localisation pour interpréter les trames&lt;br /&gt;
##Tester et optimiser&lt;br /&gt;
# Réaliser l'interface Web utilisateur&lt;br /&gt;
##Implémenter le serveur de collecte et de localisation&lt;br /&gt;
##Afficher et traiter les données stockées dans les fichiers JSON via le serveur (temps différé + temps réel)&lt;br /&gt;
##Tester et optimiser&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;Replanification du cahier des charges / calendrier&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Feuille d'heures'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Tâche !! Prélude !! Heures S1 !! Heures S2 !! Heures S3 !! Heures S4 !! Heures S5 !! Heures S6 !! Heures S7 !! Heures S8 !! Heures S9 !! Heures S10 !! Heures S11 !! Heures S12 !! Heures S13 !! Heures S14 !! Heures S15 !! Heures S16 !! Heures S17 !! Heures S18 !! Heures S19 !! Total&lt;br /&gt;
|-&lt;br /&gt;
| Cahier des charges / Wiki / Gitlab / Rapport&lt;br /&gt;
|  4h&lt;br /&gt;
|  3h&lt;br /&gt;
|  1h&lt;br /&gt;
|  x&lt;br /&gt;
|  1h30&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h30&lt;br /&gt;
|  1h&lt;br /&gt;
|  3h&lt;br /&gt;
|  3h30&lt;br /&gt;
|  2h&lt;br /&gt;
|  5h&lt;br /&gt;
|  x&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Documentation sur les technos utilisées&lt;br /&gt;
|  2h&lt;br /&gt;
|  4h&lt;br /&gt;
|  3h&lt;br /&gt;
|  2h&lt;br /&gt;
|  3h&lt;br /&gt;
|  4h&lt;br /&gt;
|  5h&lt;br /&gt;
|  5h30&lt;br /&gt;
|  4h30&lt;br /&gt;
|  3h30&lt;br /&gt;
|  2h&lt;br /&gt;
|  3h&lt;br /&gt;
|  1h&lt;br /&gt;
|  3h&lt;br /&gt;
|  4h&lt;br /&gt;
|  x&lt;br /&gt;
|  2h&lt;br /&gt;
|  &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Documentation sur le matériel&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  1h&lt;br /&gt;
|  1h&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Recherche et développement du serveur de collecte&lt;br /&gt;
|  x&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  3h&lt;br /&gt;
|  3h30&lt;br /&gt;
|  4h&lt;br /&gt;
|  5h&lt;br /&gt;
|  7h&lt;br /&gt;
|  4h30&lt;br /&gt;
|  0,5h&lt;br /&gt;
|  3h&lt;br /&gt;
|  4h&lt;br /&gt;
|  3h&lt;br /&gt;
|  x&lt;br /&gt;
|  4h&lt;br /&gt;
|  7h30&lt;br /&gt;
|  5h&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Recherche et développement de l'interface Web&lt;br /&gt;
|  x&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  3h&lt;br /&gt;
|  5h&lt;br /&gt;
|  6h&lt;br /&gt;
|  4h&lt;br /&gt;
|  7h&lt;br /&gt;
|  5h30&lt;br /&gt;
|  2h30&lt;br /&gt;
|  6h&lt;br /&gt;
|  8h&lt;br /&gt;
|  5h&lt;br /&gt;
|  1h&lt;br /&gt;
|  8h&lt;br /&gt;
|  4h&lt;br /&gt;
|  4h&lt;br /&gt;
|  &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Recherche et intégration du serveur de localisation&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x &lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  6h&lt;br /&gt;
|  5h&lt;br /&gt;
|  3h&lt;br /&gt;
|  &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Intégration des différentes parties&lt;br /&gt;
|  x&lt;br /&gt;
|  x  &lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  2h&lt;br /&gt;
|  2h&lt;br /&gt;
|  2h&lt;br /&gt;
|  3h&lt;br /&gt;
|  1h30&lt;br /&gt;
|  x&lt;br /&gt;
|  3h&lt;br /&gt;
|  6h&lt;br /&gt;
|  5h&lt;br /&gt;
|  x&lt;br /&gt;
|  3h30&lt;br /&gt;
|  2h&lt;br /&gt;
|  2h&lt;br /&gt;
|  &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Tests et débuggage&lt;br /&gt;
|  x&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  1h&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  3h&lt;br /&gt;
|  4h&lt;br /&gt;
|  0,5h&lt;br /&gt;
|  3h&lt;br /&gt;
|  1h&lt;br /&gt;
|  3h&lt;br /&gt;
|  3h&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  4h&lt;br /&gt;
|  &lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Optimisation/Correction des programmes&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Vidéo&lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Avancement du Projet'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Phase préparatoire'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Jeu 21/09/17 - Ven 22/09/17]]'' &lt;br /&gt;
*Rendez-vous de mise au point du cahier des charges avec les encadrants/intervenants (M. ZHENG Gang et M. DAGHER Roudy)&lt;br /&gt;
*Elaboration du cahier des charges&lt;br /&gt;
*Elaboration de la page Wiki (préparation de la mise en page et présentation du sujet)&lt;br /&gt;
*Préparation du travail sous forme de Mind Map&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous nous sommes tout d’abord rendus au laboratoire de l'INRIA afin de pouvoir définir le plus précisément possible le cahier des charges avec nos tuteurs.&lt;br /&gt;
Nous avons donc défini avec eux les technologies qu'il faudrait étudier. Vous retrouverez le choix des technologies dans la partie '''choix technologiques'''&lt;br /&gt;
&lt;br /&gt;
Nous avons en même temps créé notre page Wiki, et structurée celle-ci avec les parties qui nous seraient utiles pour développer nos explications par la suite.&lt;br /&gt;
&lt;br /&gt;
Nous avons de plus découpé le travail en sous-parties que nous avions mis dans une '''Mind map''' afin d'y voir plus clair sur la ligne à suivre.&lt;br /&gt;
&lt;br /&gt;
Vous trouverez cette Mind map juste ci-dessous. Nous ne mettrons pas à jour cette Mind map chaque semaine mais il est fort probable que nous en refaisions un en milieu de projet pour pouvoir cibler les objectifs réussis et ceux à atteindre. Nous pourrons de plus redéfinir certains objectifs qui nous auraient semblés trop vague au début du projet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Projet de fin d'étude.png|centre|600px]]&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 1'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Jeu 28/09/17 - Ven 29/09/17]]'' &lt;br /&gt;
*Revue du Cahier des Charges avec les encadrants&lt;br /&gt;
*Lecture et recherches sur les technologies adaptées&lt;br /&gt;
*Construction de la suite de la Mind Map&lt;br /&gt;
*Création du Gitlab&lt;br /&gt;
&lt;br /&gt;
Nous commençons les recherches sur le projet et sur les premières technologies engagées dans celui-ci. Nous en profitons pour formuler dès à présent des questions sur le bon choix de celles-ci. Nous commençons donc des tests ayant seulement pour but de nous familiariser avec l'environnement de travail et de réellement comprendre les fonctions déjà présentes qu'il faudra exploiter et implanter notre interface web.&lt;br /&gt;
Nous créons un dépôt Gitlab avec notre tuteur et commençons a définir les taches premières sur celui-ci.&lt;br /&gt;
Nous en profitons pour affiner le Mind Map.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 2'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Jeu 05/10/17 - Ven 06/10/17]]''  &lt;br /&gt;
*Précisions sur le cahier des charges&lt;br /&gt;
*Listage du matériel&lt;br /&gt;
*Recherche et détermination de solutions technologiques possibles pour les fonctions demandées&lt;br /&gt;
*Début du travail sur le serveur de collecte&lt;br /&gt;
*Apprentissage du langage Python et de l'utilisation du framework Flask&lt;br /&gt;
&lt;br /&gt;
Nous avons finalisé les précisions sur le cahier des charges. Nous avons donc pu cibler le matériel dont nous nous servirons pour ce Projet. Vous trouverez donc cette liste la section correspondante. Il est évident que le matériel utilisé est dans l'ensemble déjà fourni par le laboratoire et qu'il nous reste dans l'ensemble à créer l'interface web et les API qui nous permettrons de faire communiquer cette interface avec la Raspberry Pi et le serveur de position déjà créé.&lt;br /&gt;
Nous avons donc pu commencer à nous former sur les technologies qui nous serviraient par la suite. Nous avons donc utilisé le cours d'Openclassrooms sur les serveurs Flask pour en apprendre les bases. Ce serveur Flask est programmé en Python et nous permet donc une grande liberté au niveau de l’exécution de certains scripts. En effet, les scripts de connexion Bluetooth et de redirection de port qui nous permettent de récupérer les données de distance sont eux-mêmes codés en Python et sont directement appelés via le serveur.&lt;br /&gt;
Dans ce serveur, représentant notre interface web, vous retrouverez la page '''/collecte''' qui représentera notre partie collecte de données ainsi que l'affichage de ces distances. Nous appellerons cette partie le Serveur de Collecte.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 3'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 11/10/17 - Jeu 12/10/17]]''  &lt;br /&gt;
*Recherche et développement initial du serveur de collecte de données&lt;br /&gt;
*Complément du Git sur les tâches à effectuer&lt;br /&gt;
&lt;br /&gt;
Nous avons commencé à créer un serveur Flask renvoyant pour l'instant une matrice aléatoire. Lors de la requête URL &amp;quot;../matrice&amp;quot;, nous voyons bien une matrice aléatoire apparaître sur la page Web. Nous essayons de nous connecter à la Raspberry Pi en redirigeant son port série vers le Bluetooth de façon à récupérer de vraies matrices de distance entre le drone (ie commutateur central) et les balises. Nous pourrons afficher ensuite ces matrices, ou alors les stocker dans un fichier en attendant le traitement de celles-ci.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Requete s3.PNG|300px|serveur Flask]]&lt;br /&gt;
&lt;br /&gt;
Nous avons plusieurs problèmes avec le Bluetooth pour se connecter avec la Raspberry Pi. Quand nous aurons réussi à nous connecter au port série de la Raspberry Pi alors nous pourrons gérer le traitement des données récupérées.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 4'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 18/10/17 - Jeu 19/10/17]]''  &lt;br /&gt;
*Configuration de la Raspberry Pi car problèmes de connectivité Bluetooth rencontrés&lt;br /&gt;
**Nous arrivons à connecter la Raspberry Pi sous Windows mais la connexion sous Linux pose problème (travail en suspens en attendant la disponibilité de l'encadrant)&lt;br /&gt;
*Début du développement de l'interface Web&lt;br /&gt;
**Traitement d'une matrice dans un fichier JSON&lt;br /&gt;
**Affichage sous forme de tableau de la matrice&lt;br /&gt;
**Utilisation du serveur de requête en Python avec chargement de template HTML&lt;br /&gt;
**Mise en forme de la trame de la page en HTML/CSS avec le framework Bootstrap&lt;br /&gt;
**Ajout d'un set de distances (d1, d2, d3, d4) dans la matrice lors d'un appui sur un bouton Chargement en utilisant un fichier Javascript&lt;br /&gt;
&lt;br /&gt;
Nous avons reçu des fonctions Python de notre tuteur afin d'obtenir une connexion Bluetooth entre notre Raspberry Pi et notre ordinateur ainsi qu'une redirection de port de celle-ci vers la connexion. Nous n'arrivons pas à utiliser ces fonctions sous linux et nous nécessitons une explication de notre tuteur n'étant pas disponible à ce moment. Pour ne pas perdre de temps, nous attaquons la création de l'interface web à proprement parler, c'est à dire la création des pages HTML ainsi que le document Javascript qui nous servira de bibliothèque de fonctions. Chaque route de notre serveur est reliée à une série de fonctions Python s'exécutant à l'appel des url puis suivies d'un template de la page HTML en question. Nous en profitons de plus pour explorer le framework CSS bootstrap afin de mettre un premier design et une structure a notre page collecte qui sera la page principale de notre site pour ce début de projet.&lt;br /&gt;
&lt;br /&gt;
Nous nous essayons de plus à différents tests sur des fichiers de format '''JSON''' que nous devrons réussir à traiter correctement plus tard dans notre projet.&lt;br /&gt;
Nous récupérons une matrice que nous créons nous-mêmes en Python (simulation d'une série de distances récupérée) que nous transformons au format JSON pour ensuite l'afficher sur notre page web. Pour pouvoir proprement afficher ce fichier '''JSON''' renvoyé vers notre page, nous nous servons du fichier Javascript afin de créer du code HTML contenant la matrice.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 5'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 25/10/17 - Ven 27/10/17]]''  &lt;br /&gt;
*Résolution des problèmes de connectique Bluetooth sur la Raspberry Pi&lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Traitement d'une matrice dans un fichier JSON&lt;br /&gt;
**Début de l'ajout d'un set de distances depuis une matrice contenue dans un fichier JSON&lt;br /&gt;
&lt;br /&gt;
Nous avons pu nous entretenir avec notre tuteur et donc comprendre les fonctions de connexion et de redirection de port. Nous pouvons donc continuer le développement de notre interface web. Nous arrivons à traiter un set de données au format JSON et à l'afficher dans le code HTML. Toutefois nous créons nous-mêmes ce set, il est maintenant nécessaire que nous arrivions à récupérer les sets de distance réels reçus par la connexion Bluetooth. Nous commencerons par un traitement asynchrone. L'idée est d’enregistrer les sets de distances dans un fichier '''JSON''' stocké dans un dossier. Nous appellerons ce dossier plus tard via une requête Ajax.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 6'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 08/11/17 - Ven 10/11/17]]''  &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
**Mise en place de la communication entre le port série de notre machine et le port série de la carte via Bluetooth de la RPi3&lt;br /&gt;
**Récupération et traitement (parse) manuels des données de distances dans un fichier .log via TCP/IP&amp;lt;-&amp;gt;Bluetooth&lt;br /&gt;
**Début de l'automatisation du procédé par script Python (requete.py) et mise en place de sockets de communication&lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Chargement sur commande d'un set de distances depuis une matrice contenue dans un fichier JSON&lt;br /&gt;
*Travail sur le layout du site&lt;br /&gt;
&lt;br /&gt;
Après avoir regardé le code de ces différentes fonctions nous avons pu faire des tests manuels via le Shell pour récupérer des données de distances et les stocker dans un fichier '''JSON''' sur notre ordinateur.&lt;br /&gt;
&lt;br /&gt;
Nous utilisons les commandes suivantes pour se connecter via Bluetooth:&lt;br /&gt;
&lt;br /&gt;
 rfcomm connect /dev/rfcomm0 B8:27:EB:80:DC:89 1&lt;br /&gt;
&lt;br /&gt;
Rediriger le port de la Raspberrypi3 vers la connexion:&lt;br /&gt;
&lt;br /&gt;
 Python lps-collector/tcp_serial_redirect.py /dev/rfcomm0 9600&lt;br /&gt;
&lt;br /&gt;
Collecter les données dans un fichier dont nous définissons le nom:&lt;br /&gt;
&lt;br /&gt;
 echo &amp;quot;cu -s9600 -lttyACM0&amp;quot;| nc localhost 7777&lt;br /&gt;
 nc localhost 7777 | grep distance &amp;gt; static/log/dist-capture'+date+'.log&lt;br /&gt;
&lt;br /&gt;
Nous pouvons '''parser''' le flux de données avant de le stocker dans le fichier via cette commande:&lt;br /&gt;
&lt;br /&gt;
 Python lps-collector/lps_parse.py static/log/dist-capture&amp;quot;+date+&amp;quot;.log&lt;br /&gt;
&lt;br /&gt;
Il est donc nécessaire d'inclure via des '''thread''' ces différentes fonctions dans notre serveur Python (Flask) afin d'automatiser le processus. Le but est de pouvoir choisir sur l'interface web quels fonctions il faut exécuter et les déclencher via l'appui sur des boutons.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 7'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 15/11/17 - Ven 17/11/17]]''  &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
**Récupération et traitement (parse) manuels des données de distances dans un fichier .log via TCP/IP&amp;lt;-&amp;gt;Bluetooth&lt;br /&gt;
**Automatisation du procédé par script Python (requete.py)&lt;br /&gt;
***Mise en place de sockets de communication pour le contrôle de la collecte -&amp;gt; abandonné (servait à commander la collecte manuellement)&lt;br /&gt;
***Développement d'un script engine.py regroupant les commandes exécutables par l'utilisateur via la page Web&lt;br /&gt;
***Début du travail sur la fonction &amp;quot;STOP&amp;quot; manuel d'une action de collecte de données (liaison entre script HTML, Javascript, et script Python)&lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Chargement sur commande d'un set de distances depuis une matrice contenue dans un fichier JSON&lt;br /&gt;
**Travail sur le layout du site&lt;br /&gt;
***Ajout des différentes commandes (connexion Bluetooth, lancement commande cu, collecte des données, collecte durée donnée)&lt;br /&gt;
***Début de l'implémentation de la visualisation des fichiers .JSON obtenus après collecte et affichage dans un tableau matriciel du fichier sélectionné&lt;br /&gt;
&lt;br /&gt;
Nous avons continué à travailler sur le serveur de collecte: les données que nous avons récupérées via Bluetooth sont stockées dans un fichier .log. Apres avoir bien compris comment marchait la fonction '''parse''' manuellement (lors de son utilisation dans le Shell), nous l'avons implémentée dans notre serveur de collecte qui lance cette commande lors de l’appui sur un bouton via notre interface virtuelle. Un problème rencontré était de savoir quand la récolte des données devait s’arrêter. Nous avons donc rajouté un temps à entrer nous-même sur l'interface. La fonction '''parse''' est effectuée et le sous-processus va attendre le temps donné avant de lancer une commande permettant de tuer le processus et mettant donc fin au remplissage du fichier '''.log'''. Nous voulons de plus réussir à lancer une fonction de collecte sans temps. C'est à dire que nous coupons la collecte via un bouton par nous-mêmes. Nous voulions utiliser des Sockets pour pouvoir définir nous-mêmes la gestion de la communication mais l'idée a été abandonné car nous avons réussi à sauvegarder le PID du processus lancé. Il nous suffit donc de l’arrêter grâce à un autre bouton qui récupère cette variable et l’arrête ensuite. &lt;br /&gt;
&lt;br /&gt;
Toutes nos fonctions Pythons étant regroupées dans notre serveur '''requete.py''', nous avons décidé de créer un module qui regroupera toutes ces fonctions que nous pourrons utiliser dans '''requete.py'''. ceci nous permet de voir plus clair dans notre code et de faciliter le travail lorsque nous modifions le code tous les deux.&lt;br /&gt;
&lt;br /&gt;
Nous essayons en continu d'adapter le layout du site pour le rendre le plus attractif et simple possible, de façon à ce que chaque bouton et tableau soient clairs et compréhensibles.&lt;br /&gt;
&lt;br /&gt;
Nous avons commencé à récupérer les fichiers '''JSON''' créés à partir des fichier '''log''', c'est-à-dire que ces fichiers sont automatiquement stockés coté serveur dans un dossier nommé '''static/log'''. Notre but est de récupérer le nom des fichiers JSON et de les afficher dans un composant sur notre interface web. Il nous sera donc possible ensuite de sélectionner le nom d'un fichier. Lors de la sélection de ce nom de fichier, un tableau apparaît avec les valeurs de distances à l’intérieur.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 8'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 22/11/17 - Ven 24/11/17]]''  &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
**Automatisation du procédé de collecte par script Python (requete.py qui fait appel à engine.py)&lt;br /&gt;
***Développement d'un script engine.py regroupant les commandes exécutables par l'utilisateur via la page Web&lt;br /&gt;
***Travail sur la fonction &amp;quot;STOP&amp;quot; manuel d'une action de collecte de données (liaison entre script HTML, Javascript, et script Python)&lt;br /&gt;
***Mise en place d'un serveur HTTP Simple sous Python pour accéder aux fichiers de données à partir de la page Web&lt;br /&gt;
***Mise à jour de fonctions de connexion &lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Travail sur le layout du site (ajout de pages, navigation entre les pages, apparence, nettoyage des codes)&lt;br /&gt;
**Bon fonctionnement de l'ensemble serveur collecte + serveur HTTP + client Web&lt;br /&gt;
**Affichage de la liste des fichiers de données de distance (log, csv, JSON) via serveur HTTP en Python sur port 9999&lt;br /&gt;
*Corrections et nettoyage du dépôt GIT&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous continuons à développer les points énoncés la semaine dernière. Nous avons décidé de nous diriger vers un serveur HTTP Simple pour accéder à nos fichiers. Il s’avère que nous finirons par ne pas utiliser ce serveur. Nous irons récupérer les fichiers en question via des requêtes '''Ajax''' faites à la sélection du nom du fichier.&lt;br /&gt;
&lt;br /&gt;
Nous rencontrons depuis le début des problèmes avec les fonctions de connexion qui peuvent ne pas marcher à un moment donné. Nous essayons de trouver pourquoi ce bug est un bug qui ne se produit pas à chaque fois. Nous avons déterminé qu'il ne se produisait seulement lorsque les fonctions de connexions étaient lancée dans des threads. Nous ne savons toujours pas pourquoi ces thread bugguent seulement parfois et non à chaque essai de connexion.&lt;br /&gt;
&lt;br /&gt;
Nous avons nettoyé notre dépot '''Git''' car il s’avère que nous utilisions une mauvaise méthode de fusion et de stockage des documents.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 9'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 29/11/17 - Jeudi 30/11/17]]''  &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
**Automatisation du procédé de collecte par script Python (requete.py qui fait appel à engine.py)&lt;br /&gt;
***Travail sur la fonction &amp;quot;STOP&amp;quot; manuel d'une action de collecte de données (liaison entre script HTML, Javascript, et script Python)&lt;br /&gt;
***Recherches sur l'utilisation de fichiers JSON accessibles via le serveur HTTP&lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Travail sur le layout du site &lt;br /&gt;
**Travail sur la liaison entre fichiers JSON et affichage Web des données de distance&lt;br /&gt;
***Recherches et tests de solutions&lt;br /&gt;
****Affichage depuis un fichier&lt;br /&gt;
****Affichage à la volée lors d'une action de collecte&lt;br /&gt;
&lt;br /&gt;
*Revue de code avec Roudy DAGHER:&lt;br /&gt;
**Structure globale des codes ok&lt;br /&gt;
**Fonctionnement presque ok: fonctionnalités implémentées ok, mais parsage csv ne marche pas&lt;br /&gt;
**Refactoring nécessaire&lt;br /&gt;
**Correction de la fonction STOP et amélioration de la fonction de COLLECTE&lt;br /&gt;
**Faire plus de requêtes Javascript que de requêtes HTML&lt;br /&gt;
**Discussion pour l'implémentation du serveur de localisation (= algorithme de localisation) et des visualisations de données sur le site Web&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous avons d'abord revu l'ensemble de notre code et les méthodes utilisées avec notre tuteur '''Roudy Dagher'''. Nous nous approchons d'un serveur de collecte de données stable et fonctionnel. Nous avons refait les différentes connexions entre l'interface et le serveur afin de ne faire que des requêtes sur des '''WebServices'''. Il nous est possible de commencer la deuxième partie qui est l'envoi de ces tableaux de données afin de les envoyer vers le serveur de localisation via des API afin de recevoir des matrices de positions.&lt;br /&gt;
Nous pourrons grâce à ces matrices afficher une carte 3D des balises  et du TAG dans l'espace.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 10'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 06/12/17 - Jeudi 07/12/17]]'' &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
**Travail sur la fonction STOP&lt;br /&gt;
**Réalisation d'une expression régulière pour le parsage des fichiers log en fichier JSON&lt;br /&gt;
&lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Travail sur l'affichage des fichiers JSON&lt;br /&gt;
***Réalisation de toutes les requêtes Ajax&lt;br /&gt;
***Réalisation d'un menu déroulant dropdown pour charger le contenu des fichiers JSON dans le tableau de distances&lt;br /&gt;
&lt;br /&gt;
*Nettoyage du dépôt Git&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 11'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 13/12/17]]''  &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
&lt;br /&gt;
*Revue de code avec Roudy DAGHER:&lt;br /&gt;
**Discussion sur la partie système du projet et correction de certaines fonctions&lt;br /&gt;
&lt;br /&gt;
Nous nous sommes réunis avec l'un de nos tuteurs, qui a réalisé certains bouts de code de base, pour nous mettre au point sur les fonctions en question et leur utilisation.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 12'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 20/12/17 - Jeudi 21/12/17]]''&lt;br /&gt;
*Revue, correction et nettoyage des codes&lt;br /&gt;
*Finalisation du rapport&lt;br /&gt;
*Planification de semaines restantes&lt;br /&gt;
*Préparation de la soutenance&lt;br /&gt;
*Revue de mi-projet avec tous les tuteurs&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Cette dernière semaine a servi à finaliser le rapport et à discuter de l'avancée du projet, notamment avec nos tuteurs pour déterminer le travail restant, présenter le travail abouti et replanifier précisément les échéances pour le travail restant. Nous avons réalisé la soutenance de mi-projet le '''jeudi 21/12/17 à 8h'''.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 13'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 10/01/18 - Ven 12/01/18]]''  &lt;br /&gt;
*Travail sur la collecte des données (serveur de collecte et interface Web)&lt;br /&gt;
**Redéfinition du fichier de parsage car il crée des conflits et ne produit pas un fichier formaté de la façon attendue&lt;br /&gt;
***Nombre de balises réel n'est pas bien déterminé par le code&lt;br /&gt;
***ID de la première et de la dernière balise ne sont pas déterminés correctement&lt;br /&gt;
&lt;br /&gt;
**Automatisation de la collecte par un script Shell lançant toutes les commandes de CONNEXION, REDIRECTION, LANCEMENT CU, FERMETURE DU PROGRAMME (kill rfcomm / kill tcp_redirect)&lt;br /&gt;
***Dans le but d'automatiser la procédure&lt;br /&gt;
***Dans le but de résoudre un problème de gestion de ressources (le bug '''thread''' apparu plus tôt dans le projet)&lt;br /&gt;
&lt;br /&gt;
**Travail sur la résolution du bug thread car l'automatisation n'a pas résolu le problème&lt;br /&gt;
***Identification du ou des causes potentielles: gestion des ressources (synchrone, asynchrone ?), connexion Bluetooth, lancement des commandes dans le même script, lancement en fg/bg, conflit dû au temps d'exécution de chaque processus ?&lt;br /&gt;
***Lancement des commandes manuellement dans des terminaux ne pose aucun problème: solution la plus simple&lt;br /&gt;
&lt;br /&gt;
**Redesign de la page Collecte&lt;br /&gt;
***Remplacement des boutons de commande par un bouton unique d'initialisation&lt;br /&gt;
***Travail sur une mise à jour du menu déroulant dropdown régulière sans avoir à recharger la page Web&lt;br /&gt;
***Implémentation de plotly.js, un module Javascript qui permet d'afficher des graphes en 3D&lt;br /&gt;
&lt;br /&gt;
*Mise au point post-soutenance avec Roudy DAGHER pour valider le travail restant, effectué et redéfinir certains objectifs atteignables ou pas selon les éléments réalisés dans le projet&lt;br /&gt;
*Recherches et début de l'implémentation du serveur de localisation fourni par les tuteurs&lt;br /&gt;
*Gestion du Git pour créer des branches additionnelles&lt;br /&gt;
*Recréation du rapport de projet suite à une perte du fichier éditable d'origine + Mise à jour avec les remarques suite à la soutenance ainsi que les nouveaux éléments&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 14'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mar 16/01/18 - Ven 19/01/18]]''  &lt;br /&gt;
*Travail sur la collecte des données (serveur de collecte et interface Web)&lt;br /&gt;
**Redéfinition du fichier de parsage car il crée des conflits et ne produit pas un fichier formaté de la façon attendue&lt;br /&gt;
***Corrigé: Nombre de balises réel n'est pas bien déterminé par le code&lt;br /&gt;
***Corrigé: ID de la première et de la dernière balise ne sont pas déterminés correctement&lt;br /&gt;
***Reste à faire: Traiter le cas où il y a un ajout ou suppression d'une balise pendant la collecte (pour le moment, lorsque c'est le cas, toutes les données se décalent au lieu de laisser des trous)&lt;br /&gt;
&lt;br /&gt;
**Automatisation de la collecte par un script Shell lançant toutes les commandes de CONNEXION, REDIRECTION, LANCEMENT CU, FERMETURE DU PROGRAMME (kill rfcomm / kill tcp_redirect)&lt;br /&gt;
***Mis en suspens: pour le moment, on lance les commandes manuellement dans le terminal&lt;br /&gt;
&lt;br /&gt;
**Interface Web&lt;br /&gt;
***Implémentation de plotly.js, un module Javascript qui permet d'afficher des graphes en 3D&lt;br /&gt;
&lt;br /&gt;
*Implémentation du serveur de localisation fourni par les tuteurs (mais algorithme de localisation pas fonctionnel pour le moment)&lt;br /&gt;
**Mise à jour de l'affichage des positions des éléments: précédemment seule la matrice X de position du Tag s'affichait, et pas la matrice A des balises&lt;br /&gt;
**Requêtes manuelles à l'API avec la fonction curl OK: on arrive à récupérer les matrices X et A (aléatoires pour le moment) par une requête GET à l'API du serveur de localisation&lt;br /&gt;
**Implémentation des requêtes Ajax pour automatiser les requêtes au serveur de localisation&lt;br /&gt;
&lt;br /&gt;
*Mise à jour du rapport les nouveaux éléments du travail réalisé&lt;br /&gt;
*Réflexion sur la possibilité ou non de réaliser la partie temps réel du projet au vu des moyens à disposition&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 15'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mar 23/01/18 - Ven 26/01/18]]'' &lt;br /&gt;
*Travail sur la collecte des données (serveur de collecte et interface Web)&lt;br /&gt;
**Redéfinition du fichier de parsage car il crée des conflits et ne produit pas un fichier formaté de la façon attendue&lt;br /&gt;
***Fait: Si distance négative car Tag trop près, la valeur négative générée par une balise est remplacée par un &amp;quot;0&amp;quot; (cela modifie la position réelle modélisée dans plotly, mais évite une impossibilité de générer la position à partir de la distance -&amp;gt; par des tests, il faudra déterminer la valeur limite à partir de laquelle les cartes donnent des valeurs de distance négatives&lt;br /&gt;
***Reste à faire: Traiter le cas où il y a un ajout ou suppression d'une balise pendant la collecte (pour le moment, lorsque c'est le cas, toutes les données se décalent au lieu de laisser des trous); Ainsi que le cas où il y un saut/bug inattendu et donc une disparition d'une ou plusieurs valeurs de distance&lt;br /&gt;
***Début de résolution du cas où une distance n'est pas prise en compte, c'est à dire où il y a une valeur qui disparaît et désaligne les valeurs lors de la création du JSON&lt;br /&gt;
&lt;br /&gt;
**Automatisation de la collecte par un script Shell lançant toutes les commandes de CONNEXION, REDIRECTION, LANCEMENT CU, FERMETURE DU PROGRAMME (kill rfcomm / kill tcp_redirect)&lt;br /&gt;
***Mis en suspens: pour le moment, on lance les commandes manuellement dans le terminal&lt;br /&gt;
***Création d'un script bash /etc/init.d/autoconnect.sh pour connecter automatiquement la RPi au lancement du système (si la RPi est déjà allumée au démarrage)&lt;br /&gt;
&lt;br /&gt;
**Interface Web&lt;br /&gt;
***Perfectionnement de l'utilisation de Plotly pour les visualisations&lt;br /&gt;
&lt;br /&gt;
*Implémentation du serveur de localisation fourni par les tuteurs (algorithme de localisation pas fonctionnel pour le moment)&lt;br /&gt;
**Requêtes manuelles à l'API avec la fonction curl OK&lt;br /&gt;
**Fait: Implémentation des requêtes Ajax pour automatiser les requêtes au serveur de localisation&lt;br /&gt;
***Liaison entre les différentes requêtes ajax grâce à des variables: permet de stocker l'adresse du job récupérée par la méthode GET&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 16'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Lun 29/01/18 - Ven 02/02/18]]'' &lt;br /&gt;
*Travail sur la collecte des données (serveur de collecte et interface Web)&lt;br /&gt;
**Redéfinition du fichier de parsage car il crée des conflits et ne produit pas un fichier formaté de la façon attendue&lt;br /&gt;
***déterminer la valeur limite à partir de laquelle les cartes donnent des valeurs de distance négatives&lt;br /&gt;
***Reste à faire: Traiter le cas où il y a un ajout ou suppression d'une balise pendant la collecte (pour le moment, lorsque c'est le cas, toutes les données se décalent au lieu de laisser des trous); Ainsi que le cas où il y un saut/bug inattendu et donc une disparition d'une ou plusieurs valeurs de distance&lt;br /&gt;
***Fait: gestion des bugs/sauts de valeurs de balises - remplacement par une valeur nulle sur balise existe, par rien sinon (implémentation d'un tableau caractérisant l'existence ou pas de chaque balise 1 à 6), optimisation des temps de calculs/exécution dans le script&lt;br /&gt;
**Interface Web&lt;br /&gt;
***Ajout d'une barre de progression de la collecte remplaçant le bouton de Lancement de collecte lors de l'appui&lt;br /&gt;
***Ajout d'un bouton dropdown pour afficher les fichiers de position qu'on reçoit du serveur de localisation&lt;br /&gt;
***Ajout d'une scrollbar dans les deux dropdown&lt;br /&gt;
&lt;br /&gt;
*Implémentation du serveur de localisation fourni par les tuteurs (algorithme de localisation pas fonctionnel pour le moment)&lt;br /&gt;
**Fait: Implémentation des requêtes Ajax pour automatiser les requêtes au serveur de localisation&lt;br /&gt;
***Création d'une requête Ajax GET qui demande le fichier JSON de position au serveur de localisation jusqu'à ce qu'il soit retourné&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 17'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Lun 05/02/18 - Ven 09/02/18]]''&lt;br /&gt;
&lt;br /&gt;
*Rapport partie Front-end&lt;br /&gt;
*Rapport partie Back-end&lt;br /&gt;
*Nettoyage du code requete.py&lt;br /&gt;
*Mise à jour final des de certes pages du site&lt;br /&gt;
** matrice.html à jour&lt;br /&gt;
**3D.html à jour&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 18'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Lun 12/02/18 - Ven 16/02/18]]''&lt;br /&gt;
&lt;br /&gt;
*réalisation de la video de présentation&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 19'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Lun 19/02/18 - Ven 23/02/18]]''&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Observations'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Problèmes rencontrés'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Solutions apportées'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Délivrables'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
Rapport de mi-PFE&lt;br /&gt;
[[Fichier:RapportMi-PFE-UNG DELATTE.pdf]]&lt;br /&gt;
&lt;br /&gt;
Rapport de PFE&lt;br /&gt;
&lt;br /&gt;
Vidéo&lt;/div&gt;</summary>
		<author><name>Hdelatte</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=P18_Localisation_of_quadrotors&amp;diff=51095</id>
		<title>P18 Localisation of quadrotors</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=P18_Localisation_of_quadrotors&amp;diff=51095"/>
				<updated>2018-02-16T15:19:04Z</updated>
		
		<summary type="html">&lt;p&gt;Hdelatte : /* Semaine 18 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Cahier des charges'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;Présentation générale du projet&amp;lt;/span&amp;gt;=== &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Contexte&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
Dans un monde de plus en plus connecté, de nombreux drones sont déployés pour diverses applications comme l'espionnage, la surveillance, la cartographie de lieux et la livraison de colis. Les technologies nécessaires pour contrôler ces drones sont des sujets de recherche actuels. &lt;br /&gt;
&lt;br /&gt;
Le contrôle de ceux-ci passe tout d'abord par la maîtrise de leur position dans l'espace. Le développement des applications liées à l'utilisation de drones nécessite un travail important sur la localisation spatiale d'objets connectés. &lt;br /&gt;
&lt;br /&gt;
De plus, dans un souci d'utilisation, il est essentiel de développer des interfaces logicielles permettant d'exploiter ces données.&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Objectif du projet&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
L'objectif de ce projet est de développer une interface logicielle permettant de traiter en temps réel les informations de localisation d'un drone et de balises, dans le but de définir leur localisation dans l'espace, en intérieur.&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Description du projet&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
Pour réaliser le contrôle de drones, la première étape importante est de donner ses informations de position. Le but du projet est de développer une interface logicielle permettant de localiser le drone en temps réel en intérieur. Le drone se déplace dans un environnement dans lequel ont été installées de multiples balises. Il est équipé d'une carte, lui permettant de recevoir les distances relatives entre lui-même et les balises, sur laquelle différents algorithmes vont être implémentés pour effectuer la localisation en temps réel. Le projet requiert des compétences en développement hardware (Crazyflie 2.0, voir https://wiki.bitcraze.io/) et software (langage C/C++/Python/Javascript/HTML...).&lt;br /&gt;
&lt;br /&gt;
Il se divise en 4 étapes principales, qui sont:&lt;br /&gt;
*1) Choisir les technologies utilisées&lt;br /&gt;
*2) Choisir l'architecture (OS / APIs)&lt;br /&gt;
*3) Développer les différentes parties du projet&lt;br /&gt;
*4) Intégrer et connecter les différentes parties du projet&lt;br /&gt;
&lt;br /&gt;
La localisation étant en intérieur, le protocole GPS n'est donc pas assez précis pour les applications ciblées. La mise en place d'un tel dispositif permettrait grâce à l'utilisation d'un algorithme d'estimer avec une bonne précision les positions en intérieur d'une balise centrale (appelée Tag) et de balises (appelées Anchor). Le Tag scanne en temps réel la distance relative aux différentes balises, et il nous est retourné la position des balises et du Tag grâce à l'algorithme de localisation.&lt;br /&gt;
&lt;br /&gt;
Le projet se compose de 3 parties:&lt;br /&gt;
* Collect &amp;amp; parse: collecter les données envoyées par les balises en communiquant avec un serveur et récupérer les données adéquates par un tri&lt;br /&gt;
* Localise: déterminer la matrice de position des balises et du Tag en traitant les données récupérées&lt;br /&gt;
* Display: développer l'interface homme machine pour afficher, étudier et utiliser les données traitées&lt;br /&gt;
&lt;br /&gt;
Nous travaillerons dans un premier temps dans une optique temps différé avant de travailler en temps réel. Cela nous permettra d'acquérir des données utiles et réutilisables en aval. &lt;br /&gt;
&lt;br /&gt;
A l'aboutissement du projet, nous devrions être capable via l'interface homme machine développée d'afficher précisément la position spatiale des balises ainsi que du Tag, grâce àl'utilisation d'un algorithme de localisation et des données récupérées, et d'afficher d'autres données relatives au déplacement du Tag ou des balises dans l'espace. &lt;br /&gt;
&lt;br /&gt;
Si le temps le permet, nous pourrons aussi être amenés à adapter et utiliser l'interface développée pour l'utilisation d'un drone.&lt;br /&gt;
&lt;br /&gt;
''Sujet originel''&lt;br /&gt;
&lt;br /&gt;
To achieve the control of quadrotors, the first important task to give its position information. This project is to develop a software(GUI) to localize the quadrotors in real-time. The quadrotor is flying in an environment where several transmitters have been installed. The quadrotor is equipped with a deck to receive the relative distances between the deck and all transmitters, based on which different algorithms will be implemented to realize the real-time localization. The candidates need to have both experiences on hardware (Crazyflie 2.0, see https://wiki.bitcraze.io/) and software development (C/C , Python…). &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Calendrier prévisionnel&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
''[[Avant le 29/09/17]]'' - Élaboration du Cahier des charges, de la liste des tâches et du calendrier prévisionnel&lt;br /&gt;
&lt;br /&gt;
''[[Avant fin Octobre]]'' - Serveur de collecte et début du développement de l'interface logicielle&lt;br /&gt;
&lt;br /&gt;
''[[Avant fin Décembre]]'' - Interface logicielle&lt;br /&gt;
&lt;br /&gt;
''[[A la fin du PFE]]'' - Intégration finale des différentes parties (Serveur de collecte des données &amp;amp; Serveur de localisation &amp;amp; Interface logicielle)&lt;br /&gt;
&lt;br /&gt;
Répartition du volume de travail (***h):&lt;br /&gt;
&lt;br /&gt;
* Recherche sur les technologies à utiliser&lt;br /&gt;
* Développement du serveur de collecte de données&lt;br /&gt;
* Réalisation de l'interface logicielle (Web//Logiciel/Application)&lt;br /&gt;
* Intégration des différentes parties&lt;br /&gt;
* Test et débuggage&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Choix techniques : matériel et logiciel&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
Afin de développer ce dispositif, nous allons utiliser une Raspberry Pi 3 associée à une carte réceptrice, qui communique avec 4 balises composées chacune d'un microcontrôleur et d'une carte émettrice radio (UWB5C) et alimentées par batteries. La carte réceptrice joue le rôle du drone à localiser et communiquera les données émises par les balises vers l'ordinateur via Bluetooth.&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Choix technologiques&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
Voici les technologies que nous utilisons pour chacune des parties de ce projet.&lt;br /&gt;
&lt;br /&gt;
    1) Serveur de collecte des données:&lt;br /&gt;
       Scanne et parse les données récupérées pour fournir la matrice D des distances relatives du tag aux 4 balises&lt;br /&gt;
        - API&lt;br /&gt;
        - Python / Serveur Flask&lt;br /&gt;
&lt;br /&gt;
    2) Serveur de localisation (fourni):&lt;br /&gt;
       Calcule grâce à l'algorithme de localisation et la matrice D les positions spatiales des 4 noeuds et du tag&lt;br /&gt;
        - API&lt;br /&gt;
        - Bootstrap&lt;br /&gt;
        - Jquery&lt;br /&gt;
        - Python&lt;br /&gt;
&lt;br /&gt;
    3) Interface utilisateur:&lt;br /&gt;
       Affiche courbes, visualisation 3D, boutons ou données des fichiers envoyées par le serveur de localisation&lt;br /&gt;
        - HTML5 / Javascript&lt;br /&gt;
        - Fichiers JSON (serveurs de collecte et de localisation)&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Calendrier prévisionnel'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Liste des tâches à effectuer&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
# Se documenter sur le projet&lt;br /&gt;
##Langages et technologies utilisées&lt;br /&gt;
##Matériel utilisé&lt;br /&gt;
##Mettre en place du travail sur le Git&lt;br /&gt;
# Réaliser le serveur de collecte&lt;br /&gt;
##Récupérer les trames envoyées par bluetooth par le TAG via la Raspberry Pi&lt;br /&gt;
##Intégrer le serveur de localisation pour interpréter les trames&lt;br /&gt;
##Tester et optimiser&lt;br /&gt;
# Réaliser l'interface Web utilisateur&lt;br /&gt;
##Implémenter le serveur de collecte et de localisation&lt;br /&gt;
##Afficher et traiter les données stockées dans les fichiers JSON via le serveur (temps différé + temps réel)&lt;br /&gt;
##Tester et optimiser&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;Replanification du cahier des charges / calendrier&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Feuille d'heures'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Tâche !! Prélude !! Heures S1 !! Heures S2 !! Heures S3 !! Heures S4 !! Heures S5 !! Heures S6 !! Heures S7 !! Heures S8 !! Heures S9 !! Heures S10 !! Heures S11 !! Heures S12 !! Heures S13 !! Heures S14 !! Heures S15 !! Heures S16 !! Heures S17 !! Heures S18 !! Heures S19 !! Total&lt;br /&gt;
|-&lt;br /&gt;
| Cahier des charges / Wiki / Gitlab / Rapport&lt;br /&gt;
|  4h&lt;br /&gt;
|  3h&lt;br /&gt;
|  1h&lt;br /&gt;
|  x&lt;br /&gt;
|  1h30&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h30&lt;br /&gt;
|  1h&lt;br /&gt;
|  3h&lt;br /&gt;
|  3h30&lt;br /&gt;
|  2h&lt;br /&gt;
|  5h&lt;br /&gt;
|  x&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Documentation sur les technos utilisées&lt;br /&gt;
|  2h&lt;br /&gt;
|  4h&lt;br /&gt;
|  3h&lt;br /&gt;
|  2h&lt;br /&gt;
|  3h&lt;br /&gt;
|  4h&lt;br /&gt;
|  5h&lt;br /&gt;
|  5h30&lt;br /&gt;
|  4h30&lt;br /&gt;
|  3h30&lt;br /&gt;
|  2h&lt;br /&gt;
|  3h&lt;br /&gt;
|  1h&lt;br /&gt;
|  3h&lt;br /&gt;
|  4h&lt;br /&gt;
|  x&lt;br /&gt;
|  2h&lt;br /&gt;
|  &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Documentation sur le matériel&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  1h&lt;br /&gt;
|  1h&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Recherche et développement du serveur de collecte&lt;br /&gt;
|  x&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  3h&lt;br /&gt;
|  3h30&lt;br /&gt;
|  4h&lt;br /&gt;
|  5h&lt;br /&gt;
|  7h&lt;br /&gt;
|  4h30&lt;br /&gt;
|  0,5h&lt;br /&gt;
|  3h&lt;br /&gt;
|  4h&lt;br /&gt;
|  3h&lt;br /&gt;
|  x&lt;br /&gt;
|  4h&lt;br /&gt;
|  7h30&lt;br /&gt;
|  5h&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Recherche et développement de l'interface Web&lt;br /&gt;
|  x&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  3h&lt;br /&gt;
|  5h&lt;br /&gt;
|  6h&lt;br /&gt;
|  4h&lt;br /&gt;
|  7h&lt;br /&gt;
|  5h30&lt;br /&gt;
|  2h30&lt;br /&gt;
|  6h&lt;br /&gt;
|  8h&lt;br /&gt;
|  5h&lt;br /&gt;
|  1h&lt;br /&gt;
|  8h&lt;br /&gt;
|  4h&lt;br /&gt;
|  4h&lt;br /&gt;
|  &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Recherche et intégration du serveur de localisation&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x &lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  6h&lt;br /&gt;
|  5h&lt;br /&gt;
|  3h&lt;br /&gt;
|  &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Intégration des différentes parties&lt;br /&gt;
|  x&lt;br /&gt;
|  x  &lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  2h&lt;br /&gt;
|  2h&lt;br /&gt;
|  2h&lt;br /&gt;
|  3h&lt;br /&gt;
|  1h30&lt;br /&gt;
|  x&lt;br /&gt;
|  3h&lt;br /&gt;
|  6h&lt;br /&gt;
|  5h&lt;br /&gt;
|  x&lt;br /&gt;
|  3h30&lt;br /&gt;
|  2h&lt;br /&gt;
|  2h&lt;br /&gt;
|  &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Tests et débuggage&lt;br /&gt;
|  x&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  1h&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  3h&lt;br /&gt;
|  4h&lt;br /&gt;
|  0,5h&lt;br /&gt;
|  3h&lt;br /&gt;
|  1h&lt;br /&gt;
|  3h&lt;br /&gt;
|  3h&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  4h&lt;br /&gt;
|  &lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Optimisation/Correction des programmes&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Vidéo&lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Avancement du Projet'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Phase préparatoire'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Jeu 21/09/17 - Ven 22/09/17]]'' &lt;br /&gt;
*Rendez-vous de mise au point du cahier des charges avec les encadrants/intervenants (M. ZHENG Gang et M. DAGHER Roudy)&lt;br /&gt;
*Elaboration du cahier des charges&lt;br /&gt;
*Elaboration de la page Wiki (préparation de la mise en page et présentation du sujet)&lt;br /&gt;
*Préparation du travail sous forme de Mind Map&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous nous sommes tout d’abord rendus au laboratoire de l'INRIA afin de pouvoir définir le plus précisément possible le cahier des charges avec nos tuteurs.&lt;br /&gt;
Nous avons donc défini avec eux les technologies qu'il faudrait étudier. Vous retrouverez le choix des technologies dans la partie '''choix technologiques'''&lt;br /&gt;
&lt;br /&gt;
Nous avons en même temps créé notre page Wiki, et structurée celle-ci avec les parties qui nous seraient utiles pour développer nos explications par la suite.&lt;br /&gt;
&lt;br /&gt;
Nous avons de plus découpé le travail en sous-parties que nous avions mis dans une '''Mind map''' afin d'y voir plus clair sur la ligne à suivre.&lt;br /&gt;
&lt;br /&gt;
Vous trouverez cette Mind map juste ci-dessous. Nous ne mettrons pas à jour cette Mind map chaque semaine mais il est fort probable que nous en refaisions un en milieu de projet pour pouvoir cibler les objectifs réussis et ceux à atteindre. Nous pourrons de plus redéfinir certains objectifs qui nous auraient semblés trop vague au début du projet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Projet de fin d'étude.png|centre|600px]]&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 1'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Jeu 28/09/17 - Ven 29/09/17]]'' &lt;br /&gt;
*Revue du Cahier des Charges avec les encadrants&lt;br /&gt;
*Lecture et recherches sur les technologies adaptées&lt;br /&gt;
*Construction de la suite de la Mind Map&lt;br /&gt;
*Création du Gitlab&lt;br /&gt;
&lt;br /&gt;
Nous commençons les recherches sur le projet et sur les premières technologies engagées dans celui-ci. Nous en profitons pour formuler dès à présent des questions sur le bon choix de celles-ci. Nous commençons donc des tests ayant seulement pour but de nous familiariser avec l'environnement de travail et de réellement comprendre les fonctions déjà présentes qu'il faudra exploiter et implanter notre interface web.&lt;br /&gt;
Nous créons un dépôt Gitlab avec notre tuteur et commençons a définir les taches premières sur celui-ci.&lt;br /&gt;
Nous en profitons pour affiner le Mind Map.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 2'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Jeu 05/10/17 - Ven 06/10/17]]''  &lt;br /&gt;
*Précisions sur le cahier des charges&lt;br /&gt;
*Listage du matériel&lt;br /&gt;
*Recherche et détermination de solutions technologiques possibles pour les fonctions demandées&lt;br /&gt;
*Début du travail sur le serveur de collecte&lt;br /&gt;
*Apprentissage du langage Python et de l'utilisation du framework Flask&lt;br /&gt;
&lt;br /&gt;
Nous avons finalisé les précisions sur le cahier des charges. Nous avons donc pu cibler le matériel dont nous nous servirons pour ce Projet. Vous trouverez donc cette liste la section correspondante. Il est évident que le matériel utilisé est dans l'ensemble déjà fourni par le laboratoire et qu'il nous reste dans l'ensemble à créer l'interface web et les API qui nous permettrons de faire communiquer cette interface avec la Raspberry Pi et le serveur de position déjà créé.&lt;br /&gt;
Nous avons donc pu commencer à nous former sur les technologies qui nous serviraient par la suite. Nous avons donc utilisé le cours d'Openclassrooms sur les serveurs Flask pour en apprendre les bases. Ce serveur Flask est programmé en Python et nous permet donc une grande liberté au niveau de l’exécution de certains scripts. En effet, les scripts de connexion Bluetooth et de redirection de port qui nous permettent de récupérer les données de distance sont eux-mêmes codés en Python et sont directement appelés via le serveur.&lt;br /&gt;
Dans ce serveur, représentant notre interface web, vous retrouverez la page '''/collecte''' qui représentera notre partie collecte de données ainsi que l'affichage de ces distances. Nous appellerons cette partie le Serveur de Collecte.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 3'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 11/10/17 - Jeu 12/10/17]]''  &lt;br /&gt;
*Recherche et développement initial du serveur de collecte de données&lt;br /&gt;
*Complément du Git sur les tâches à effectuer&lt;br /&gt;
&lt;br /&gt;
Nous avons commencé à créer un serveur Flask renvoyant pour l'instant une matrice aléatoire. Lors de la requête URL &amp;quot;../matrice&amp;quot;, nous voyons bien une matrice aléatoire apparaître sur la page Web. Nous essayons de nous connecter à la Raspberry Pi en redirigeant son port série vers le Bluetooth de façon à récupérer de vraies matrices de distance entre le drone (ie commutateur central) et les balises. Nous pourrons afficher ensuite ces matrices, ou alors les stocker dans un fichier en attendant le traitement de celles-ci.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Requete s3.PNG|300px|serveur Flask]]&lt;br /&gt;
&lt;br /&gt;
Nous avons plusieurs problèmes avec le Bluetooth pour se connecter avec la Raspberry Pi. Quand nous aurons réussi à nous connecter au port série de la Raspberry Pi alors nous pourrons gérer le traitement des données récupérées.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 4'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 18/10/17 - Jeu 19/10/17]]''  &lt;br /&gt;
*Configuration de la Raspberry Pi car problèmes de connectivité Bluetooth rencontrés&lt;br /&gt;
**Nous arrivons à connecter la Raspberry Pi sous Windows mais la connexion sous Linux pose problème (travail en suspens en attendant la disponibilité de l'encadrant)&lt;br /&gt;
*Début du développement de l'interface Web&lt;br /&gt;
**Traitement d'une matrice dans un fichier JSON&lt;br /&gt;
**Affichage sous forme de tableau de la matrice&lt;br /&gt;
**Utilisation du serveur de requête en Python avec chargement de template HTML&lt;br /&gt;
**Mise en forme de la trame de la page en HTML/CSS avec le framework Bootstrap&lt;br /&gt;
**Ajout d'un set de distances (d1, d2, d3, d4) dans la matrice lors d'un appui sur un bouton Chargement en utilisant un fichier Javascript&lt;br /&gt;
&lt;br /&gt;
Nous avons reçu des fonctions Python de notre tuteur afin d'obtenir une connexion Bluetooth entre notre Raspberry Pi et notre ordinateur ainsi qu'une redirection de port de celle-ci vers la connexion. Nous n'arrivons pas à utiliser ces fonctions sous linux et nous nécessitons une explication de notre tuteur n'étant pas disponible à ce moment. Pour ne pas perdre de temps, nous attaquons la création de l'interface web à proprement parler, c'est à dire la création des pages HTML ainsi que le document Javascript qui nous servira de bibliothèque de fonctions. Chaque route de notre serveur est reliée à une série de fonctions Python s'exécutant à l'appel des url puis suivies d'un template de la page HTML en question. Nous en profitons de plus pour explorer le framework CSS bootstrap afin de mettre un premier design et une structure a notre page collecte qui sera la page principale de notre site pour ce début de projet.&lt;br /&gt;
&lt;br /&gt;
Nous nous essayons de plus à différents tests sur des fichiers de format '''JSON''' que nous devrons réussir à traiter correctement plus tard dans notre projet.&lt;br /&gt;
Nous récupérons une matrice que nous créons nous-mêmes en Python (simulation d'une série de distances récupérée) que nous transformons au format JSON pour ensuite l'afficher sur notre page web. Pour pouvoir proprement afficher ce fichier '''JSON''' renvoyé vers notre page, nous nous servons du fichier Javascript afin de créer du code HTML contenant la matrice.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 5'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 25/10/17 - Ven 27/10/17]]''  &lt;br /&gt;
*Résolution des problèmes de connectique Bluetooth sur la Raspberry Pi&lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Traitement d'une matrice dans un fichier JSON&lt;br /&gt;
**Début de l'ajout d'un set de distances depuis une matrice contenue dans un fichier JSON&lt;br /&gt;
&lt;br /&gt;
Nous avons pu nous entretenir avec notre tuteur et donc comprendre les fonctions de connexion et de redirection de port. Nous pouvons donc continuer le développement de notre interface web. Nous arrivons à traiter un set de données au format JSON et à l'afficher dans le code HTML. Toutefois nous créons nous-mêmes ce set, il est maintenant nécessaire que nous arrivions à récupérer les sets de distance réels reçus par la connexion Bluetooth. Nous commencerons par un traitement asynchrone. L'idée est d’enregistrer les sets de distances dans un fichier '''JSON''' stocké dans un dossier. Nous appellerons ce dossier plus tard via une requête Ajax.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 6'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 08/11/17 - Ven 10/11/17]]''  &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
**Mise en place de la communication entre le port série de notre machine et le port série de la carte via Bluetooth de la RPi3&lt;br /&gt;
**Récupération et traitement (parse) manuels des données de distances dans un fichier .log via TCP/IP&amp;lt;-&amp;gt;Bluetooth&lt;br /&gt;
**Début de l'automatisation du procédé par script Python (requete.py) et mise en place de sockets de communication&lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Chargement sur commande d'un set de distances depuis une matrice contenue dans un fichier JSON&lt;br /&gt;
*Travail sur le layout du site&lt;br /&gt;
&lt;br /&gt;
Après avoir regardé le code de ces différentes fonctions nous avons pu faire des tests manuels via le Shell pour récupérer des données de distances et les stocker dans un fichier '''JSON''' sur notre ordinateur.&lt;br /&gt;
&lt;br /&gt;
Nous utilisons les commandes suivantes pour se connecter via Bluetooth:&lt;br /&gt;
&lt;br /&gt;
 rfcomm connect /dev/rfcomm0 B8:27:EB:80:DC:89 1&lt;br /&gt;
&lt;br /&gt;
Rediriger le port de la Raspberrypi3 vers la connexion:&lt;br /&gt;
&lt;br /&gt;
 Python lps-collector/tcp_serial_redirect.py /dev/rfcomm0 9600&lt;br /&gt;
&lt;br /&gt;
Collecter les données dans un fichier dont nous définissons le nom:&lt;br /&gt;
&lt;br /&gt;
 echo &amp;quot;cu -s9600 -lttyACM0&amp;quot;| nc localhost 7777&lt;br /&gt;
 nc localhost 7777 | grep distance &amp;gt; static/log/dist-capture'+date+'.log&lt;br /&gt;
&lt;br /&gt;
Nous pouvons '''parser''' le flux de données avant de le stocker dans le fichier via cette commande:&lt;br /&gt;
&lt;br /&gt;
 Python lps-collector/lps_parse.py static/log/dist-capture&amp;quot;+date+&amp;quot;.log&lt;br /&gt;
&lt;br /&gt;
Il est donc nécessaire d'inclure via des '''thread''' ces différentes fonctions dans notre serveur Python (Flask) afin d'automatiser le processus. Le but est de pouvoir choisir sur l'interface web quels fonctions il faut exécuter et les déclencher via l'appui sur des boutons.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 7'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 15/11/17 - Ven 17/11/17]]''  &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
**Récupération et traitement (parse) manuels des données de distances dans un fichier .log via TCP/IP&amp;lt;-&amp;gt;Bluetooth&lt;br /&gt;
**Automatisation du procédé par script Python (requete.py)&lt;br /&gt;
***Mise en place de sockets de communication pour le contrôle de la collecte -&amp;gt; abandonné (servait à commander la collecte manuellement)&lt;br /&gt;
***Développement d'un script engine.py regroupant les commandes exécutables par l'utilisateur via la page Web&lt;br /&gt;
***Début du travail sur la fonction &amp;quot;STOP&amp;quot; manuel d'une action de collecte de données (liaison entre script HTML, Javascript, et script Python)&lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Chargement sur commande d'un set de distances depuis une matrice contenue dans un fichier JSON&lt;br /&gt;
**Travail sur le layout du site&lt;br /&gt;
***Ajout des différentes commandes (connexion Bluetooth, lancement commande cu, collecte des données, collecte durée donnée)&lt;br /&gt;
***Début de l'implémentation de la visualisation des fichiers .JSON obtenus après collecte et affichage dans un tableau matriciel du fichier sélectionné&lt;br /&gt;
&lt;br /&gt;
Nous avons continué à travailler sur le serveur de collecte: les données que nous avons récupérées via Bluetooth sont stockées dans un fichier .log. Apres avoir bien compris comment marchait la fonction '''parse''' manuellement (lors de son utilisation dans le Shell), nous l'avons implémentée dans notre serveur de collecte qui lance cette commande lors de l’appui sur un bouton via notre interface virtuelle. Un problème rencontré était de savoir quand la récolte des données devait s’arrêter. Nous avons donc rajouté un temps à entrer nous-même sur l'interface. La fonction '''parse''' est effectuée et le sous-processus va attendre le temps donné avant de lancer une commande permettant de tuer le processus et mettant donc fin au remplissage du fichier '''.log'''. Nous voulons de plus réussir à lancer une fonction de collecte sans temps. C'est à dire que nous coupons la collecte via un bouton par nous-mêmes. Nous voulions utiliser des Sockets pour pouvoir définir nous-mêmes la gestion de la communication mais l'idée a été abandonné car nous avons réussi à sauvegarder le PID du processus lancé. Il nous suffit donc de l’arrêter grâce à un autre bouton qui récupère cette variable et l’arrête ensuite. &lt;br /&gt;
&lt;br /&gt;
Toutes nos fonctions Pythons étant regroupées dans notre serveur '''requete.py''', nous avons décidé de créer un module qui regroupera toutes ces fonctions que nous pourrons utiliser dans '''requete.py'''. ceci nous permet de voir plus clair dans notre code et de faciliter le travail lorsque nous modifions le code tous les deux.&lt;br /&gt;
&lt;br /&gt;
Nous essayons en continu d'adapter le layout du site pour le rendre le plus attractif et simple possible, de façon à ce que chaque bouton et tableau soient clairs et compréhensibles.&lt;br /&gt;
&lt;br /&gt;
Nous avons commencé à récupérer les fichiers '''JSON''' créés à partir des fichier '''log''', c'est-à-dire que ces fichiers sont automatiquement stockés coté serveur dans un dossier nommé '''static/log'''. Notre but est de récupérer le nom des fichiers JSON et de les afficher dans un composant sur notre interface web. Il nous sera donc possible ensuite de sélectionner le nom d'un fichier. Lors de la sélection de ce nom de fichier, un tableau apparaît avec les valeurs de distances à l’intérieur.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 8'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 22/11/17 - Ven 24/11/17]]''  &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
**Automatisation du procédé de collecte par script Python (requete.py qui fait appel à engine.py)&lt;br /&gt;
***Développement d'un script engine.py regroupant les commandes exécutables par l'utilisateur via la page Web&lt;br /&gt;
***Travail sur la fonction &amp;quot;STOP&amp;quot; manuel d'une action de collecte de données (liaison entre script HTML, Javascript, et script Python)&lt;br /&gt;
***Mise en place d'un serveur HTTP Simple sous Python pour accéder aux fichiers de données à partir de la page Web&lt;br /&gt;
***Mise à jour de fonctions de connexion &lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Travail sur le layout du site (ajout de pages, navigation entre les pages, apparence, nettoyage des codes)&lt;br /&gt;
**Bon fonctionnement de l'ensemble serveur collecte + serveur HTTP + client Web&lt;br /&gt;
**Affichage de la liste des fichiers de données de distance (log, csv, JSON) via serveur HTTP en Python sur port 9999&lt;br /&gt;
*Corrections et nettoyage du dépôt GIT&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous continuons à développer les points énoncés la semaine dernière. Nous avons décidé de nous diriger vers un serveur HTTP Simple pour accéder à nos fichiers. Il s’avère que nous finirons par ne pas utiliser ce serveur. Nous irons récupérer les fichiers en question via des requêtes '''Ajax''' faites à la sélection du nom du fichier.&lt;br /&gt;
&lt;br /&gt;
Nous rencontrons depuis le début des problèmes avec les fonctions de connexion qui peuvent ne pas marcher à un moment donné. Nous essayons de trouver pourquoi ce bug est un bug qui ne se produit pas à chaque fois. Nous avons déterminé qu'il ne se produisait seulement lorsque les fonctions de connexions étaient lancée dans des threads. Nous ne savons toujours pas pourquoi ces thread bugguent seulement parfois et non à chaque essai de connexion.&lt;br /&gt;
&lt;br /&gt;
Nous avons nettoyé notre dépot '''Git''' car il s’avère que nous utilisions une mauvaise méthode de fusion et de stockage des documents.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 9'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 29/11/17 - Jeudi 30/11/17]]''  &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
**Automatisation du procédé de collecte par script Python (requete.py qui fait appel à engine.py)&lt;br /&gt;
***Travail sur la fonction &amp;quot;STOP&amp;quot; manuel d'une action de collecte de données (liaison entre script HTML, Javascript, et script Python)&lt;br /&gt;
***Recherches sur l'utilisation de fichiers JSON accessibles via le serveur HTTP&lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Travail sur le layout du site &lt;br /&gt;
**Travail sur la liaison entre fichiers JSON et affichage Web des données de distance&lt;br /&gt;
***Recherches et tests de solutions&lt;br /&gt;
****Affichage depuis un fichier&lt;br /&gt;
****Affichage à la volée lors d'une action de collecte&lt;br /&gt;
&lt;br /&gt;
*Revue de code avec Roudy DAGHER:&lt;br /&gt;
**Structure globale des codes ok&lt;br /&gt;
**Fonctionnement presque ok: fonctionnalités implémentées ok, mais parsage csv ne marche pas&lt;br /&gt;
**Refactoring nécessaire&lt;br /&gt;
**Correction de la fonction STOP et amélioration de la fonction de COLLECTE&lt;br /&gt;
**Faire plus de requêtes Javascript que de requêtes HTML&lt;br /&gt;
**Discussion pour l'implémentation du serveur de localisation (= algorithme de localisation) et des visualisations de données sur le site Web&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous avons d'abord revu l'ensemble de notre code et les méthodes utilisées avec notre tuteur '''Roudy Dagher'''. Nous nous approchons d'un serveur de collecte de données stable et fonctionnel. Nous avons refait les différentes connexions entre l'interface et le serveur afin de ne faire que des requêtes sur des '''WebServices'''. Il nous est possible de commencer la deuxième partie qui est l'envoi de ces tableaux de données afin de les envoyer vers le serveur de localisation via des API afin de recevoir des matrices de positions.&lt;br /&gt;
Nous pourrons grâce à ces matrices afficher une carte 3D des balises  et du TAG dans l'espace.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 10'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 06/12/17 - Jeudi 07/12/17]]'' &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
**Travail sur la fonction STOP&lt;br /&gt;
**Réalisation d'une expression régulière pour le parsage des fichiers log en fichier JSON&lt;br /&gt;
&lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Travail sur l'affichage des fichiers JSON&lt;br /&gt;
***Réalisation de toutes les requêtes Ajax&lt;br /&gt;
***Réalisation d'un menu déroulant dropdown pour charger le contenu des fichiers JSON dans le tableau de distances&lt;br /&gt;
&lt;br /&gt;
*Nettoyage du dépôt Git&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 11'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 13/12/17]]''  &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
&lt;br /&gt;
*Revue de code avec Roudy DAGHER:&lt;br /&gt;
**Discussion sur la partie système du projet et correction de certaines fonctions&lt;br /&gt;
&lt;br /&gt;
Nous nous sommes réunis avec l'un de nos tuteurs, qui a réalisé certains bouts de code de base, pour nous mettre au point sur les fonctions en question et leur utilisation.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 12'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 20/12/17 - Jeudi 21/12/17]]''&lt;br /&gt;
*Revue, correction et nettoyage des codes&lt;br /&gt;
*Finalisation du rapport&lt;br /&gt;
*Planification de semaines restantes&lt;br /&gt;
*Préparation de la soutenance&lt;br /&gt;
*Revue de mi-projet avec tous les tuteurs&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Cette dernière semaine a servi à finaliser le rapport et à discuter de l'avancée du projet, notamment avec nos tuteurs pour déterminer le travail restant, présenter le travail abouti et replanifier précisément les échéances pour le travail restant. Nous avons réalisé la soutenance de mi-projet le '''jeudi 21/12/17 à 8h'''.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 13'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 10/01/18 - Ven 12/01/18]]''  &lt;br /&gt;
*Travail sur la collecte des données (serveur de collecte et interface Web)&lt;br /&gt;
**Redéfinition du fichier de parsage car il crée des conflits et ne produit pas un fichier formaté de la façon attendue&lt;br /&gt;
***Nombre de balises réel n'est pas bien déterminé par le code&lt;br /&gt;
***ID de la première et de la dernière balise ne sont pas déterminés correctement&lt;br /&gt;
&lt;br /&gt;
**Automatisation de la collecte par un script Shell lançant toutes les commandes de CONNEXION, REDIRECTION, LANCEMENT CU, FERMETURE DU PROGRAMME (kill rfcomm / kill tcp_redirect)&lt;br /&gt;
***Dans le but d'automatiser la procédure&lt;br /&gt;
***Dans le but de résoudre un problème de gestion de ressources (le bug '''thread''' apparu plus tôt dans le projet)&lt;br /&gt;
&lt;br /&gt;
**Travail sur la résolution du bug thread car l'automatisation n'a pas résolu le problème&lt;br /&gt;
***Identification du ou des causes potentielles: gestion des ressources (synchrone, asynchrone ?), connexion Bluetooth, lancement des commandes dans le même script, lancement en fg/bg, conflit dû au temps d'exécution de chaque processus ?&lt;br /&gt;
***Lancement des commandes manuellement dans des terminaux ne pose aucun problème: solution la plus simple&lt;br /&gt;
&lt;br /&gt;
**Redesign de la page Collecte&lt;br /&gt;
***Remplacement des boutons de commande par un bouton unique d'initialisation&lt;br /&gt;
***Travail sur une mise à jour du menu déroulant dropdown régulière sans avoir à recharger la page Web&lt;br /&gt;
***Implémentation de plotly.js, un module Javascript qui permet d'afficher des graphes en 3D&lt;br /&gt;
&lt;br /&gt;
*Mise au point post-soutenance avec Roudy DAGHER pour valider le travail restant, effectué et redéfinir certains objectifs atteignables ou pas selon les éléments réalisés dans le projet&lt;br /&gt;
*Recherches et début de l'implémentation du serveur de localisation fourni par les tuteurs&lt;br /&gt;
*Gestion du Git pour créer des branches additionnelles&lt;br /&gt;
*Recréation du rapport de projet suite à une perte du fichier éditable d'origine + Mise à jour avec les remarques suite à la soutenance ainsi que les nouveaux éléments&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 14'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mar 16/01/18 - Ven 19/01/18]]''  &lt;br /&gt;
*Travail sur la collecte des données (serveur de collecte et interface Web)&lt;br /&gt;
**Redéfinition du fichier de parsage car il crée des conflits et ne produit pas un fichier formaté de la façon attendue&lt;br /&gt;
***Corrigé: Nombre de balises réel n'est pas bien déterminé par le code&lt;br /&gt;
***Corrigé: ID de la première et de la dernière balise ne sont pas déterminés correctement&lt;br /&gt;
***Reste à faire: Traiter le cas où il y a un ajout ou suppression d'une balise pendant la collecte (pour le moment, lorsque c'est le cas, toutes les données se décalent au lieu de laisser des trous)&lt;br /&gt;
&lt;br /&gt;
**Automatisation de la collecte par un script Shell lançant toutes les commandes de CONNEXION, REDIRECTION, LANCEMENT CU, FERMETURE DU PROGRAMME (kill rfcomm / kill tcp_redirect)&lt;br /&gt;
***Mis en suspens: pour le moment, on lance les commandes manuellement dans le terminal&lt;br /&gt;
&lt;br /&gt;
**Interface Web&lt;br /&gt;
***Implémentation de plotly.js, un module Javascript qui permet d'afficher des graphes en 3D&lt;br /&gt;
&lt;br /&gt;
*Implémentation du serveur de localisation fourni par les tuteurs (mais algorithme de localisation pas fonctionnel pour le moment)&lt;br /&gt;
**Mise à jour de l'affichage des positions des éléments: précédemment seule la matrice X de position du Tag s'affichait, et pas la matrice A des balises&lt;br /&gt;
**Requêtes manuelles à l'API avec la fonction curl OK: on arrive à récupérer les matrices X et A (aléatoires pour le moment) par une requête GET à l'API du serveur de localisation&lt;br /&gt;
**Implémentation des requêtes Ajax pour automatiser les requêtes au serveur de localisation&lt;br /&gt;
&lt;br /&gt;
*Mise à jour du rapport les nouveaux éléments du travail réalisé&lt;br /&gt;
*Réflexion sur la possibilité ou non de réaliser la partie temps réel du projet au vu des moyens à disposition&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 15'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mar 23/01/18 - Ven 26/01/18]]'' &lt;br /&gt;
*Travail sur la collecte des données (serveur de collecte et interface Web)&lt;br /&gt;
**Redéfinition du fichier de parsage car il crée des conflits et ne produit pas un fichier formaté de la façon attendue&lt;br /&gt;
***Fait: Si distance négative car Tag trop près, la valeur négative générée par une balise est remplacée par un &amp;quot;0&amp;quot; (cela modifie la position réelle modélisée dans plotly, mais évite une impossibilité de générer la position à partir de la distance -&amp;gt; par des tests, il faudra déterminer la valeur limite à partir de laquelle les cartes donnent des valeurs de distance négatives&lt;br /&gt;
***Reste à faire: Traiter le cas où il y a un ajout ou suppression d'une balise pendant la collecte (pour le moment, lorsque c'est le cas, toutes les données se décalent au lieu de laisser des trous); Ainsi que le cas où il y un saut/bug inattendu et donc une disparition d'une ou plusieurs valeurs de distance&lt;br /&gt;
***Début de résolution du cas où une distance n'est pas prise en compte, c'est à dire où il y a une valeur qui disparaît et désaligne les valeurs lors de la création du JSON&lt;br /&gt;
&lt;br /&gt;
**Automatisation de la collecte par un script Shell lançant toutes les commandes de CONNEXION, REDIRECTION, LANCEMENT CU, FERMETURE DU PROGRAMME (kill rfcomm / kill tcp_redirect)&lt;br /&gt;
***Mis en suspens: pour le moment, on lance les commandes manuellement dans le terminal&lt;br /&gt;
***Création d'un script bash /etc/init.d/autoconnect.sh pour connecter automatiquement la RPi au lancement du système (si la RPi est déjà allumée au démarrage)&lt;br /&gt;
&lt;br /&gt;
**Interface Web&lt;br /&gt;
***Perfectionnement de l'utilisation de Plotly pour les visualisations&lt;br /&gt;
&lt;br /&gt;
*Implémentation du serveur de localisation fourni par les tuteurs (algorithme de localisation pas fonctionnel pour le moment)&lt;br /&gt;
**Requêtes manuelles à l'API avec la fonction curl OK&lt;br /&gt;
**Fait: Implémentation des requêtes Ajax pour automatiser les requêtes au serveur de localisation&lt;br /&gt;
***Liaison entre les différentes requêtes ajax grâce à des variables: permet de stocker l'adresse du job récupérée par la méthode GET&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 16'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Lun 29/01/18 - Ven 02/02/18]]'' &lt;br /&gt;
*Travail sur la collecte des données (serveur de collecte et interface Web)&lt;br /&gt;
**Redéfinition du fichier de parsage car il crée des conflits et ne produit pas un fichier formaté de la façon attendue&lt;br /&gt;
***déterminer la valeur limite à partir de laquelle les cartes donnent des valeurs de distance négatives&lt;br /&gt;
***Reste à faire: Traiter le cas où il y a un ajout ou suppression d'une balise pendant la collecte (pour le moment, lorsque c'est le cas, toutes les données se décalent au lieu de laisser des trous); Ainsi que le cas où il y un saut/bug inattendu et donc une disparition d'une ou plusieurs valeurs de distance&lt;br /&gt;
***Fait: gestion des bugs/sauts de valeurs de balises - remplacement par une valeur nulle sur balise existe, par rien sinon (implémentation d'un tableau caractérisant l'existence ou pas de chaque balise 1 à 6), optimisation des temps de calculs/exécution dans le script&lt;br /&gt;
**Interface Web&lt;br /&gt;
***Ajout d'une barre de progression de la collecte remplaçant le bouton de Lancement de collecte lors de l'appui&lt;br /&gt;
***Ajout d'un bouton dropdown pour afficher les fichiers de position qu'on reçoit du serveur de localisation&lt;br /&gt;
***Ajout d'une scrollbar dans les deux dropdown&lt;br /&gt;
&lt;br /&gt;
*Implémentation du serveur de localisation fourni par les tuteurs (algorithme de localisation pas fonctionnel pour le moment)&lt;br /&gt;
**Fait: Implémentation des requêtes Ajax pour automatiser les requêtes au serveur de localisation&lt;br /&gt;
***Création d'une requête Ajax GET qui demande le fichier JSON de position au serveur de localisation jusqu'à ce qu'il soit retourné&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 17'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Lun 05/02/18 - Ven 09/02/18]]''&lt;br /&gt;
&lt;br /&gt;
*Rapport partie front&lt;br /&gt;
*Nettoyage du code requete.py&lt;br /&gt;
*Mise à jour final des de certes pages du site&lt;br /&gt;
** matrice.html à jour&lt;br /&gt;
**3D.html à jour&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 18'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Lun 12/02/18 - Ven 16/02/18]]''&lt;br /&gt;
&lt;br /&gt;
*réalisation de la video de présentation&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 19'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Lun 19/02/18 - Ven 23/02/18]]''&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Observations'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Problèmes rencontrés'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Solutions apportées'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Délivrables'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
Rapport de mi-PFE&lt;br /&gt;
[[Fichier:RapportMi-PFE-UNG DELATTE.pdf]]&lt;br /&gt;
&lt;br /&gt;
Rapport de PFE&lt;br /&gt;
&lt;br /&gt;
Vidéo&lt;/div&gt;</summary>
		<author><name>Hdelatte</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=P18_Localisation_of_quadrotors&amp;diff=51094</id>
		<title>P18 Localisation of quadrotors</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=P18_Localisation_of_quadrotors&amp;diff=51094"/>
				<updated>2018-02-16T15:18:53Z</updated>
		
		<summary type="html">&lt;p&gt;Hdelatte : /* Semaine 17 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Cahier des charges'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;Présentation générale du projet&amp;lt;/span&amp;gt;=== &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Contexte&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
Dans un monde de plus en plus connecté, de nombreux drones sont déployés pour diverses applications comme l'espionnage, la surveillance, la cartographie de lieux et la livraison de colis. Les technologies nécessaires pour contrôler ces drones sont des sujets de recherche actuels. &lt;br /&gt;
&lt;br /&gt;
Le contrôle de ceux-ci passe tout d'abord par la maîtrise de leur position dans l'espace. Le développement des applications liées à l'utilisation de drones nécessite un travail important sur la localisation spatiale d'objets connectés. &lt;br /&gt;
&lt;br /&gt;
De plus, dans un souci d'utilisation, il est essentiel de développer des interfaces logicielles permettant d'exploiter ces données.&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Objectif du projet&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
L'objectif de ce projet est de développer une interface logicielle permettant de traiter en temps réel les informations de localisation d'un drone et de balises, dans le but de définir leur localisation dans l'espace, en intérieur.&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Description du projet&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
Pour réaliser le contrôle de drones, la première étape importante est de donner ses informations de position. Le but du projet est de développer une interface logicielle permettant de localiser le drone en temps réel en intérieur. Le drone se déplace dans un environnement dans lequel ont été installées de multiples balises. Il est équipé d'une carte, lui permettant de recevoir les distances relatives entre lui-même et les balises, sur laquelle différents algorithmes vont être implémentés pour effectuer la localisation en temps réel. Le projet requiert des compétences en développement hardware (Crazyflie 2.0, voir https://wiki.bitcraze.io/) et software (langage C/C++/Python/Javascript/HTML...).&lt;br /&gt;
&lt;br /&gt;
Il se divise en 4 étapes principales, qui sont:&lt;br /&gt;
*1) Choisir les technologies utilisées&lt;br /&gt;
*2) Choisir l'architecture (OS / APIs)&lt;br /&gt;
*3) Développer les différentes parties du projet&lt;br /&gt;
*4) Intégrer et connecter les différentes parties du projet&lt;br /&gt;
&lt;br /&gt;
La localisation étant en intérieur, le protocole GPS n'est donc pas assez précis pour les applications ciblées. La mise en place d'un tel dispositif permettrait grâce à l'utilisation d'un algorithme d'estimer avec une bonne précision les positions en intérieur d'une balise centrale (appelée Tag) et de balises (appelées Anchor). Le Tag scanne en temps réel la distance relative aux différentes balises, et il nous est retourné la position des balises et du Tag grâce à l'algorithme de localisation.&lt;br /&gt;
&lt;br /&gt;
Le projet se compose de 3 parties:&lt;br /&gt;
* Collect &amp;amp; parse: collecter les données envoyées par les balises en communiquant avec un serveur et récupérer les données adéquates par un tri&lt;br /&gt;
* Localise: déterminer la matrice de position des balises et du Tag en traitant les données récupérées&lt;br /&gt;
* Display: développer l'interface homme machine pour afficher, étudier et utiliser les données traitées&lt;br /&gt;
&lt;br /&gt;
Nous travaillerons dans un premier temps dans une optique temps différé avant de travailler en temps réel. Cela nous permettra d'acquérir des données utiles et réutilisables en aval. &lt;br /&gt;
&lt;br /&gt;
A l'aboutissement du projet, nous devrions être capable via l'interface homme machine développée d'afficher précisément la position spatiale des balises ainsi que du Tag, grâce àl'utilisation d'un algorithme de localisation et des données récupérées, et d'afficher d'autres données relatives au déplacement du Tag ou des balises dans l'espace. &lt;br /&gt;
&lt;br /&gt;
Si le temps le permet, nous pourrons aussi être amenés à adapter et utiliser l'interface développée pour l'utilisation d'un drone.&lt;br /&gt;
&lt;br /&gt;
''Sujet originel''&lt;br /&gt;
&lt;br /&gt;
To achieve the control of quadrotors, the first important task to give its position information. This project is to develop a software(GUI) to localize the quadrotors in real-time. The quadrotor is flying in an environment where several transmitters have been installed. The quadrotor is equipped with a deck to receive the relative distances between the deck and all transmitters, based on which different algorithms will be implemented to realize the real-time localization. The candidates need to have both experiences on hardware (Crazyflie 2.0, see https://wiki.bitcraze.io/) and software development (C/C , Python…). &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Calendrier prévisionnel&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
''[[Avant le 29/09/17]]'' - Élaboration du Cahier des charges, de la liste des tâches et du calendrier prévisionnel&lt;br /&gt;
&lt;br /&gt;
''[[Avant fin Octobre]]'' - Serveur de collecte et début du développement de l'interface logicielle&lt;br /&gt;
&lt;br /&gt;
''[[Avant fin Décembre]]'' - Interface logicielle&lt;br /&gt;
&lt;br /&gt;
''[[A la fin du PFE]]'' - Intégration finale des différentes parties (Serveur de collecte des données &amp;amp; Serveur de localisation &amp;amp; Interface logicielle)&lt;br /&gt;
&lt;br /&gt;
Répartition du volume de travail (***h):&lt;br /&gt;
&lt;br /&gt;
* Recherche sur les technologies à utiliser&lt;br /&gt;
* Développement du serveur de collecte de données&lt;br /&gt;
* Réalisation de l'interface logicielle (Web//Logiciel/Application)&lt;br /&gt;
* Intégration des différentes parties&lt;br /&gt;
* Test et débuggage&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Choix techniques : matériel et logiciel&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
Afin de développer ce dispositif, nous allons utiliser une Raspberry Pi 3 associée à une carte réceptrice, qui communique avec 4 balises composées chacune d'un microcontrôleur et d'une carte émettrice radio (UWB5C) et alimentées par batteries. La carte réceptrice joue le rôle du drone à localiser et communiquera les données émises par les balises vers l'ordinateur via Bluetooth.&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Choix technologiques&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
Voici les technologies que nous utilisons pour chacune des parties de ce projet.&lt;br /&gt;
&lt;br /&gt;
    1) Serveur de collecte des données:&lt;br /&gt;
       Scanne et parse les données récupérées pour fournir la matrice D des distances relatives du tag aux 4 balises&lt;br /&gt;
        - API&lt;br /&gt;
        - Python / Serveur Flask&lt;br /&gt;
&lt;br /&gt;
    2) Serveur de localisation (fourni):&lt;br /&gt;
       Calcule grâce à l'algorithme de localisation et la matrice D les positions spatiales des 4 noeuds et du tag&lt;br /&gt;
        - API&lt;br /&gt;
        - Bootstrap&lt;br /&gt;
        - Jquery&lt;br /&gt;
        - Python&lt;br /&gt;
&lt;br /&gt;
    3) Interface utilisateur:&lt;br /&gt;
       Affiche courbes, visualisation 3D, boutons ou données des fichiers envoyées par le serveur de localisation&lt;br /&gt;
        - HTML5 / Javascript&lt;br /&gt;
        - Fichiers JSON (serveurs de collecte et de localisation)&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Calendrier prévisionnel'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Liste des tâches à effectuer&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
# Se documenter sur le projet&lt;br /&gt;
##Langages et technologies utilisées&lt;br /&gt;
##Matériel utilisé&lt;br /&gt;
##Mettre en place du travail sur le Git&lt;br /&gt;
# Réaliser le serveur de collecte&lt;br /&gt;
##Récupérer les trames envoyées par bluetooth par le TAG via la Raspberry Pi&lt;br /&gt;
##Intégrer le serveur de localisation pour interpréter les trames&lt;br /&gt;
##Tester et optimiser&lt;br /&gt;
# Réaliser l'interface Web utilisateur&lt;br /&gt;
##Implémenter le serveur de collecte et de localisation&lt;br /&gt;
##Afficher et traiter les données stockées dans les fichiers JSON via le serveur (temps différé + temps réel)&lt;br /&gt;
##Tester et optimiser&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;Replanification du cahier des charges / calendrier&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Feuille d'heures'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Tâche !! Prélude !! Heures S1 !! Heures S2 !! Heures S3 !! Heures S4 !! Heures S5 !! Heures S6 !! Heures S7 !! Heures S8 !! Heures S9 !! Heures S10 !! Heures S11 !! Heures S12 !! Heures S13 !! Heures S14 !! Heures S15 !! Heures S16 !! Heures S17 !! Heures S18 !! Heures S19 !! Total&lt;br /&gt;
|-&lt;br /&gt;
| Cahier des charges / Wiki / Gitlab / Rapport&lt;br /&gt;
|  4h&lt;br /&gt;
|  3h&lt;br /&gt;
|  1h&lt;br /&gt;
|  x&lt;br /&gt;
|  1h30&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h30&lt;br /&gt;
|  1h&lt;br /&gt;
|  3h&lt;br /&gt;
|  3h30&lt;br /&gt;
|  2h&lt;br /&gt;
|  5h&lt;br /&gt;
|  x&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Documentation sur les technos utilisées&lt;br /&gt;
|  2h&lt;br /&gt;
|  4h&lt;br /&gt;
|  3h&lt;br /&gt;
|  2h&lt;br /&gt;
|  3h&lt;br /&gt;
|  4h&lt;br /&gt;
|  5h&lt;br /&gt;
|  5h30&lt;br /&gt;
|  4h30&lt;br /&gt;
|  3h30&lt;br /&gt;
|  2h&lt;br /&gt;
|  3h&lt;br /&gt;
|  1h&lt;br /&gt;
|  3h&lt;br /&gt;
|  4h&lt;br /&gt;
|  x&lt;br /&gt;
|  2h&lt;br /&gt;
|  &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Documentation sur le matériel&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  1h&lt;br /&gt;
|  1h&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Recherche et développement du serveur de collecte&lt;br /&gt;
|  x&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  3h&lt;br /&gt;
|  3h30&lt;br /&gt;
|  4h&lt;br /&gt;
|  5h&lt;br /&gt;
|  7h&lt;br /&gt;
|  4h30&lt;br /&gt;
|  0,5h&lt;br /&gt;
|  3h&lt;br /&gt;
|  4h&lt;br /&gt;
|  3h&lt;br /&gt;
|  x&lt;br /&gt;
|  4h&lt;br /&gt;
|  7h30&lt;br /&gt;
|  5h&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Recherche et développement de l'interface Web&lt;br /&gt;
|  x&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  3h&lt;br /&gt;
|  5h&lt;br /&gt;
|  6h&lt;br /&gt;
|  4h&lt;br /&gt;
|  7h&lt;br /&gt;
|  5h30&lt;br /&gt;
|  2h30&lt;br /&gt;
|  6h&lt;br /&gt;
|  8h&lt;br /&gt;
|  5h&lt;br /&gt;
|  1h&lt;br /&gt;
|  8h&lt;br /&gt;
|  4h&lt;br /&gt;
|  4h&lt;br /&gt;
|  &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Recherche et intégration du serveur de localisation&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x &lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  6h&lt;br /&gt;
|  5h&lt;br /&gt;
|  3h&lt;br /&gt;
|  &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Intégration des différentes parties&lt;br /&gt;
|  x&lt;br /&gt;
|  x  &lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  2h&lt;br /&gt;
|  2h&lt;br /&gt;
|  2h&lt;br /&gt;
|  3h&lt;br /&gt;
|  1h30&lt;br /&gt;
|  x&lt;br /&gt;
|  3h&lt;br /&gt;
|  6h&lt;br /&gt;
|  5h&lt;br /&gt;
|  x&lt;br /&gt;
|  3h30&lt;br /&gt;
|  2h&lt;br /&gt;
|  2h&lt;br /&gt;
|  &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Tests et débuggage&lt;br /&gt;
|  x&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  1h&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  3h&lt;br /&gt;
|  4h&lt;br /&gt;
|  0,5h&lt;br /&gt;
|  3h&lt;br /&gt;
|  1h&lt;br /&gt;
|  3h&lt;br /&gt;
|  3h&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  4h&lt;br /&gt;
|  &lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Optimisation/Correction des programmes&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Vidéo&lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Avancement du Projet'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Phase préparatoire'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Jeu 21/09/17 - Ven 22/09/17]]'' &lt;br /&gt;
*Rendez-vous de mise au point du cahier des charges avec les encadrants/intervenants (M. ZHENG Gang et M. DAGHER Roudy)&lt;br /&gt;
*Elaboration du cahier des charges&lt;br /&gt;
*Elaboration de la page Wiki (préparation de la mise en page et présentation du sujet)&lt;br /&gt;
*Préparation du travail sous forme de Mind Map&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous nous sommes tout d’abord rendus au laboratoire de l'INRIA afin de pouvoir définir le plus précisément possible le cahier des charges avec nos tuteurs.&lt;br /&gt;
Nous avons donc défini avec eux les technologies qu'il faudrait étudier. Vous retrouverez le choix des technologies dans la partie '''choix technologiques'''&lt;br /&gt;
&lt;br /&gt;
Nous avons en même temps créé notre page Wiki, et structurée celle-ci avec les parties qui nous seraient utiles pour développer nos explications par la suite.&lt;br /&gt;
&lt;br /&gt;
Nous avons de plus découpé le travail en sous-parties que nous avions mis dans une '''Mind map''' afin d'y voir plus clair sur la ligne à suivre.&lt;br /&gt;
&lt;br /&gt;
Vous trouverez cette Mind map juste ci-dessous. Nous ne mettrons pas à jour cette Mind map chaque semaine mais il est fort probable que nous en refaisions un en milieu de projet pour pouvoir cibler les objectifs réussis et ceux à atteindre. Nous pourrons de plus redéfinir certains objectifs qui nous auraient semblés trop vague au début du projet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Projet de fin d'étude.png|centre|600px]]&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 1'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Jeu 28/09/17 - Ven 29/09/17]]'' &lt;br /&gt;
*Revue du Cahier des Charges avec les encadrants&lt;br /&gt;
*Lecture et recherches sur les technologies adaptées&lt;br /&gt;
*Construction de la suite de la Mind Map&lt;br /&gt;
*Création du Gitlab&lt;br /&gt;
&lt;br /&gt;
Nous commençons les recherches sur le projet et sur les premières technologies engagées dans celui-ci. Nous en profitons pour formuler dès à présent des questions sur le bon choix de celles-ci. Nous commençons donc des tests ayant seulement pour but de nous familiariser avec l'environnement de travail et de réellement comprendre les fonctions déjà présentes qu'il faudra exploiter et implanter notre interface web.&lt;br /&gt;
Nous créons un dépôt Gitlab avec notre tuteur et commençons a définir les taches premières sur celui-ci.&lt;br /&gt;
Nous en profitons pour affiner le Mind Map.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 2'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Jeu 05/10/17 - Ven 06/10/17]]''  &lt;br /&gt;
*Précisions sur le cahier des charges&lt;br /&gt;
*Listage du matériel&lt;br /&gt;
*Recherche et détermination de solutions technologiques possibles pour les fonctions demandées&lt;br /&gt;
*Début du travail sur le serveur de collecte&lt;br /&gt;
*Apprentissage du langage Python et de l'utilisation du framework Flask&lt;br /&gt;
&lt;br /&gt;
Nous avons finalisé les précisions sur le cahier des charges. Nous avons donc pu cibler le matériel dont nous nous servirons pour ce Projet. Vous trouverez donc cette liste la section correspondante. Il est évident que le matériel utilisé est dans l'ensemble déjà fourni par le laboratoire et qu'il nous reste dans l'ensemble à créer l'interface web et les API qui nous permettrons de faire communiquer cette interface avec la Raspberry Pi et le serveur de position déjà créé.&lt;br /&gt;
Nous avons donc pu commencer à nous former sur les technologies qui nous serviraient par la suite. Nous avons donc utilisé le cours d'Openclassrooms sur les serveurs Flask pour en apprendre les bases. Ce serveur Flask est programmé en Python et nous permet donc une grande liberté au niveau de l’exécution de certains scripts. En effet, les scripts de connexion Bluetooth et de redirection de port qui nous permettent de récupérer les données de distance sont eux-mêmes codés en Python et sont directement appelés via le serveur.&lt;br /&gt;
Dans ce serveur, représentant notre interface web, vous retrouverez la page '''/collecte''' qui représentera notre partie collecte de données ainsi que l'affichage de ces distances. Nous appellerons cette partie le Serveur de Collecte.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 3'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 11/10/17 - Jeu 12/10/17]]''  &lt;br /&gt;
*Recherche et développement initial du serveur de collecte de données&lt;br /&gt;
*Complément du Git sur les tâches à effectuer&lt;br /&gt;
&lt;br /&gt;
Nous avons commencé à créer un serveur Flask renvoyant pour l'instant une matrice aléatoire. Lors de la requête URL &amp;quot;../matrice&amp;quot;, nous voyons bien une matrice aléatoire apparaître sur la page Web. Nous essayons de nous connecter à la Raspberry Pi en redirigeant son port série vers le Bluetooth de façon à récupérer de vraies matrices de distance entre le drone (ie commutateur central) et les balises. Nous pourrons afficher ensuite ces matrices, ou alors les stocker dans un fichier en attendant le traitement de celles-ci.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Requete s3.PNG|300px|serveur Flask]]&lt;br /&gt;
&lt;br /&gt;
Nous avons plusieurs problèmes avec le Bluetooth pour se connecter avec la Raspberry Pi. Quand nous aurons réussi à nous connecter au port série de la Raspberry Pi alors nous pourrons gérer le traitement des données récupérées.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 4'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 18/10/17 - Jeu 19/10/17]]''  &lt;br /&gt;
*Configuration de la Raspberry Pi car problèmes de connectivité Bluetooth rencontrés&lt;br /&gt;
**Nous arrivons à connecter la Raspberry Pi sous Windows mais la connexion sous Linux pose problème (travail en suspens en attendant la disponibilité de l'encadrant)&lt;br /&gt;
*Début du développement de l'interface Web&lt;br /&gt;
**Traitement d'une matrice dans un fichier JSON&lt;br /&gt;
**Affichage sous forme de tableau de la matrice&lt;br /&gt;
**Utilisation du serveur de requête en Python avec chargement de template HTML&lt;br /&gt;
**Mise en forme de la trame de la page en HTML/CSS avec le framework Bootstrap&lt;br /&gt;
**Ajout d'un set de distances (d1, d2, d3, d4) dans la matrice lors d'un appui sur un bouton Chargement en utilisant un fichier Javascript&lt;br /&gt;
&lt;br /&gt;
Nous avons reçu des fonctions Python de notre tuteur afin d'obtenir une connexion Bluetooth entre notre Raspberry Pi et notre ordinateur ainsi qu'une redirection de port de celle-ci vers la connexion. Nous n'arrivons pas à utiliser ces fonctions sous linux et nous nécessitons une explication de notre tuteur n'étant pas disponible à ce moment. Pour ne pas perdre de temps, nous attaquons la création de l'interface web à proprement parler, c'est à dire la création des pages HTML ainsi que le document Javascript qui nous servira de bibliothèque de fonctions. Chaque route de notre serveur est reliée à une série de fonctions Python s'exécutant à l'appel des url puis suivies d'un template de la page HTML en question. Nous en profitons de plus pour explorer le framework CSS bootstrap afin de mettre un premier design et une structure a notre page collecte qui sera la page principale de notre site pour ce début de projet.&lt;br /&gt;
&lt;br /&gt;
Nous nous essayons de plus à différents tests sur des fichiers de format '''JSON''' que nous devrons réussir à traiter correctement plus tard dans notre projet.&lt;br /&gt;
Nous récupérons une matrice que nous créons nous-mêmes en Python (simulation d'une série de distances récupérée) que nous transformons au format JSON pour ensuite l'afficher sur notre page web. Pour pouvoir proprement afficher ce fichier '''JSON''' renvoyé vers notre page, nous nous servons du fichier Javascript afin de créer du code HTML contenant la matrice.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 5'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 25/10/17 - Ven 27/10/17]]''  &lt;br /&gt;
*Résolution des problèmes de connectique Bluetooth sur la Raspberry Pi&lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Traitement d'une matrice dans un fichier JSON&lt;br /&gt;
**Début de l'ajout d'un set de distances depuis une matrice contenue dans un fichier JSON&lt;br /&gt;
&lt;br /&gt;
Nous avons pu nous entretenir avec notre tuteur et donc comprendre les fonctions de connexion et de redirection de port. Nous pouvons donc continuer le développement de notre interface web. Nous arrivons à traiter un set de données au format JSON et à l'afficher dans le code HTML. Toutefois nous créons nous-mêmes ce set, il est maintenant nécessaire que nous arrivions à récupérer les sets de distance réels reçus par la connexion Bluetooth. Nous commencerons par un traitement asynchrone. L'idée est d’enregistrer les sets de distances dans un fichier '''JSON''' stocké dans un dossier. Nous appellerons ce dossier plus tard via une requête Ajax.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 6'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 08/11/17 - Ven 10/11/17]]''  &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
**Mise en place de la communication entre le port série de notre machine et le port série de la carte via Bluetooth de la RPi3&lt;br /&gt;
**Récupération et traitement (parse) manuels des données de distances dans un fichier .log via TCP/IP&amp;lt;-&amp;gt;Bluetooth&lt;br /&gt;
**Début de l'automatisation du procédé par script Python (requete.py) et mise en place de sockets de communication&lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Chargement sur commande d'un set de distances depuis une matrice contenue dans un fichier JSON&lt;br /&gt;
*Travail sur le layout du site&lt;br /&gt;
&lt;br /&gt;
Après avoir regardé le code de ces différentes fonctions nous avons pu faire des tests manuels via le Shell pour récupérer des données de distances et les stocker dans un fichier '''JSON''' sur notre ordinateur.&lt;br /&gt;
&lt;br /&gt;
Nous utilisons les commandes suivantes pour se connecter via Bluetooth:&lt;br /&gt;
&lt;br /&gt;
 rfcomm connect /dev/rfcomm0 B8:27:EB:80:DC:89 1&lt;br /&gt;
&lt;br /&gt;
Rediriger le port de la Raspberrypi3 vers la connexion:&lt;br /&gt;
&lt;br /&gt;
 Python lps-collector/tcp_serial_redirect.py /dev/rfcomm0 9600&lt;br /&gt;
&lt;br /&gt;
Collecter les données dans un fichier dont nous définissons le nom:&lt;br /&gt;
&lt;br /&gt;
 echo &amp;quot;cu -s9600 -lttyACM0&amp;quot;| nc localhost 7777&lt;br /&gt;
 nc localhost 7777 | grep distance &amp;gt; static/log/dist-capture'+date+'.log&lt;br /&gt;
&lt;br /&gt;
Nous pouvons '''parser''' le flux de données avant de le stocker dans le fichier via cette commande:&lt;br /&gt;
&lt;br /&gt;
 Python lps-collector/lps_parse.py static/log/dist-capture&amp;quot;+date+&amp;quot;.log&lt;br /&gt;
&lt;br /&gt;
Il est donc nécessaire d'inclure via des '''thread''' ces différentes fonctions dans notre serveur Python (Flask) afin d'automatiser le processus. Le but est de pouvoir choisir sur l'interface web quels fonctions il faut exécuter et les déclencher via l'appui sur des boutons.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 7'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 15/11/17 - Ven 17/11/17]]''  &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
**Récupération et traitement (parse) manuels des données de distances dans un fichier .log via TCP/IP&amp;lt;-&amp;gt;Bluetooth&lt;br /&gt;
**Automatisation du procédé par script Python (requete.py)&lt;br /&gt;
***Mise en place de sockets de communication pour le contrôle de la collecte -&amp;gt; abandonné (servait à commander la collecte manuellement)&lt;br /&gt;
***Développement d'un script engine.py regroupant les commandes exécutables par l'utilisateur via la page Web&lt;br /&gt;
***Début du travail sur la fonction &amp;quot;STOP&amp;quot; manuel d'une action de collecte de données (liaison entre script HTML, Javascript, et script Python)&lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Chargement sur commande d'un set de distances depuis une matrice contenue dans un fichier JSON&lt;br /&gt;
**Travail sur le layout du site&lt;br /&gt;
***Ajout des différentes commandes (connexion Bluetooth, lancement commande cu, collecte des données, collecte durée donnée)&lt;br /&gt;
***Début de l'implémentation de la visualisation des fichiers .JSON obtenus après collecte et affichage dans un tableau matriciel du fichier sélectionné&lt;br /&gt;
&lt;br /&gt;
Nous avons continué à travailler sur le serveur de collecte: les données que nous avons récupérées via Bluetooth sont stockées dans un fichier .log. Apres avoir bien compris comment marchait la fonction '''parse''' manuellement (lors de son utilisation dans le Shell), nous l'avons implémentée dans notre serveur de collecte qui lance cette commande lors de l’appui sur un bouton via notre interface virtuelle. Un problème rencontré était de savoir quand la récolte des données devait s’arrêter. Nous avons donc rajouté un temps à entrer nous-même sur l'interface. La fonction '''parse''' est effectuée et le sous-processus va attendre le temps donné avant de lancer une commande permettant de tuer le processus et mettant donc fin au remplissage du fichier '''.log'''. Nous voulons de plus réussir à lancer une fonction de collecte sans temps. C'est à dire que nous coupons la collecte via un bouton par nous-mêmes. Nous voulions utiliser des Sockets pour pouvoir définir nous-mêmes la gestion de la communication mais l'idée a été abandonné car nous avons réussi à sauvegarder le PID du processus lancé. Il nous suffit donc de l’arrêter grâce à un autre bouton qui récupère cette variable et l’arrête ensuite. &lt;br /&gt;
&lt;br /&gt;
Toutes nos fonctions Pythons étant regroupées dans notre serveur '''requete.py''', nous avons décidé de créer un module qui regroupera toutes ces fonctions que nous pourrons utiliser dans '''requete.py'''. ceci nous permet de voir plus clair dans notre code et de faciliter le travail lorsque nous modifions le code tous les deux.&lt;br /&gt;
&lt;br /&gt;
Nous essayons en continu d'adapter le layout du site pour le rendre le plus attractif et simple possible, de façon à ce que chaque bouton et tableau soient clairs et compréhensibles.&lt;br /&gt;
&lt;br /&gt;
Nous avons commencé à récupérer les fichiers '''JSON''' créés à partir des fichier '''log''', c'est-à-dire que ces fichiers sont automatiquement stockés coté serveur dans un dossier nommé '''static/log'''. Notre but est de récupérer le nom des fichiers JSON et de les afficher dans un composant sur notre interface web. Il nous sera donc possible ensuite de sélectionner le nom d'un fichier. Lors de la sélection de ce nom de fichier, un tableau apparaît avec les valeurs de distances à l’intérieur.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 8'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 22/11/17 - Ven 24/11/17]]''  &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
**Automatisation du procédé de collecte par script Python (requete.py qui fait appel à engine.py)&lt;br /&gt;
***Développement d'un script engine.py regroupant les commandes exécutables par l'utilisateur via la page Web&lt;br /&gt;
***Travail sur la fonction &amp;quot;STOP&amp;quot; manuel d'une action de collecte de données (liaison entre script HTML, Javascript, et script Python)&lt;br /&gt;
***Mise en place d'un serveur HTTP Simple sous Python pour accéder aux fichiers de données à partir de la page Web&lt;br /&gt;
***Mise à jour de fonctions de connexion &lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Travail sur le layout du site (ajout de pages, navigation entre les pages, apparence, nettoyage des codes)&lt;br /&gt;
**Bon fonctionnement de l'ensemble serveur collecte + serveur HTTP + client Web&lt;br /&gt;
**Affichage de la liste des fichiers de données de distance (log, csv, JSON) via serveur HTTP en Python sur port 9999&lt;br /&gt;
*Corrections et nettoyage du dépôt GIT&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous continuons à développer les points énoncés la semaine dernière. Nous avons décidé de nous diriger vers un serveur HTTP Simple pour accéder à nos fichiers. Il s’avère que nous finirons par ne pas utiliser ce serveur. Nous irons récupérer les fichiers en question via des requêtes '''Ajax''' faites à la sélection du nom du fichier.&lt;br /&gt;
&lt;br /&gt;
Nous rencontrons depuis le début des problèmes avec les fonctions de connexion qui peuvent ne pas marcher à un moment donné. Nous essayons de trouver pourquoi ce bug est un bug qui ne se produit pas à chaque fois. Nous avons déterminé qu'il ne se produisait seulement lorsque les fonctions de connexions étaient lancée dans des threads. Nous ne savons toujours pas pourquoi ces thread bugguent seulement parfois et non à chaque essai de connexion.&lt;br /&gt;
&lt;br /&gt;
Nous avons nettoyé notre dépot '''Git''' car il s’avère que nous utilisions une mauvaise méthode de fusion et de stockage des documents.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 9'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 29/11/17 - Jeudi 30/11/17]]''  &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
**Automatisation du procédé de collecte par script Python (requete.py qui fait appel à engine.py)&lt;br /&gt;
***Travail sur la fonction &amp;quot;STOP&amp;quot; manuel d'une action de collecte de données (liaison entre script HTML, Javascript, et script Python)&lt;br /&gt;
***Recherches sur l'utilisation de fichiers JSON accessibles via le serveur HTTP&lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Travail sur le layout du site &lt;br /&gt;
**Travail sur la liaison entre fichiers JSON et affichage Web des données de distance&lt;br /&gt;
***Recherches et tests de solutions&lt;br /&gt;
****Affichage depuis un fichier&lt;br /&gt;
****Affichage à la volée lors d'une action de collecte&lt;br /&gt;
&lt;br /&gt;
*Revue de code avec Roudy DAGHER:&lt;br /&gt;
**Structure globale des codes ok&lt;br /&gt;
**Fonctionnement presque ok: fonctionnalités implémentées ok, mais parsage csv ne marche pas&lt;br /&gt;
**Refactoring nécessaire&lt;br /&gt;
**Correction de la fonction STOP et amélioration de la fonction de COLLECTE&lt;br /&gt;
**Faire plus de requêtes Javascript que de requêtes HTML&lt;br /&gt;
**Discussion pour l'implémentation du serveur de localisation (= algorithme de localisation) et des visualisations de données sur le site Web&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous avons d'abord revu l'ensemble de notre code et les méthodes utilisées avec notre tuteur '''Roudy Dagher'''. Nous nous approchons d'un serveur de collecte de données stable et fonctionnel. Nous avons refait les différentes connexions entre l'interface et le serveur afin de ne faire que des requêtes sur des '''WebServices'''. Il nous est possible de commencer la deuxième partie qui est l'envoi de ces tableaux de données afin de les envoyer vers le serveur de localisation via des API afin de recevoir des matrices de positions.&lt;br /&gt;
Nous pourrons grâce à ces matrices afficher une carte 3D des balises  et du TAG dans l'espace.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 10'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 06/12/17 - Jeudi 07/12/17]]'' &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
**Travail sur la fonction STOP&lt;br /&gt;
**Réalisation d'une expression régulière pour le parsage des fichiers log en fichier JSON&lt;br /&gt;
&lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Travail sur l'affichage des fichiers JSON&lt;br /&gt;
***Réalisation de toutes les requêtes Ajax&lt;br /&gt;
***Réalisation d'un menu déroulant dropdown pour charger le contenu des fichiers JSON dans le tableau de distances&lt;br /&gt;
&lt;br /&gt;
*Nettoyage du dépôt Git&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 11'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 13/12/17]]''  &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
&lt;br /&gt;
*Revue de code avec Roudy DAGHER:&lt;br /&gt;
**Discussion sur la partie système du projet et correction de certaines fonctions&lt;br /&gt;
&lt;br /&gt;
Nous nous sommes réunis avec l'un de nos tuteurs, qui a réalisé certains bouts de code de base, pour nous mettre au point sur les fonctions en question et leur utilisation.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 12'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 20/12/17 - Jeudi 21/12/17]]''&lt;br /&gt;
*Revue, correction et nettoyage des codes&lt;br /&gt;
*Finalisation du rapport&lt;br /&gt;
*Planification de semaines restantes&lt;br /&gt;
*Préparation de la soutenance&lt;br /&gt;
*Revue de mi-projet avec tous les tuteurs&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Cette dernière semaine a servi à finaliser le rapport et à discuter de l'avancée du projet, notamment avec nos tuteurs pour déterminer le travail restant, présenter le travail abouti et replanifier précisément les échéances pour le travail restant. Nous avons réalisé la soutenance de mi-projet le '''jeudi 21/12/17 à 8h'''.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 13'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 10/01/18 - Ven 12/01/18]]''  &lt;br /&gt;
*Travail sur la collecte des données (serveur de collecte et interface Web)&lt;br /&gt;
**Redéfinition du fichier de parsage car il crée des conflits et ne produit pas un fichier formaté de la façon attendue&lt;br /&gt;
***Nombre de balises réel n'est pas bien déterminé par le code&lt;br /&gt;
***ID de la première et de la dernière balise ne sont pas déterminés correctement&lt;br /&gt;
&lt;br /&gt;
**Automatisation de la collecte par un script Shell lançant toutes les commandes de CONNEXION, REDIRECTION, LANCEMENT CU, FERMETURE DU PROGRAMME (kill rfcomm / kill tcp_redirect)&lt;br /&gt;
***Dans le but d'automatiser la procédure&lt;br /&gt;
***Dans le but de résoudre un problème de gestion de ressources (le bug '''thread''' apparu plus tôt dans le projet)&lt;br /&gt;
&lt;br /&gt;
**Travail sur la résolution du bug thread car l'automatisation n'a pas résolu le problème&lt;br /&gt;
***Identification du ou des causes potentielles: gestion des ressources (synchrone, asynchrone ?), connexion Bluetooth, lancement des commandes dans le même script, lancement en fg/bg, conflit dû au temps d'exécution de chaque processus ?&lt;br /&gt;
***Lancement des commandes manuellement dans des terminaux ne pose aucun problème: solution la plus simple&lt;br /&gt;
&lt;br /&gt;
**Redesign de la page Collecte&lt;br /&gt;
***Remplacement des boutons de commande par un bouton unique d'initialisation&lt;br /&gt;
***Travail sur une mise à jour du menu déroulant dropdown régulière sans avoir à recharger la page Web&lt;br /&gt;
***Implémentation de plotly.js, un module Javascript qui permet d'afficher des graphes en 3D&lt;br /&gt;
&lt;br /&gt;
*Mise au point post-soutenance avec Roudy DAGHER pour valider le travail restant, effectué et redéfinir certains objectifs atteignables ou pas selon les éléments réalisés dans le projet&lt;br /&gt;
*Recherches et début de l'implémentation du serveur de localisation fourni par les tuteurs&lt;br /&gt;
*Gestion du Git pour créer des branches additionnelles&lt;br /&gt;
*Recréation du rapport de projet suite à une perte du fichier éditable d'origine + Mise à jour avec les remarques suite à la soutenance ainsi que les nouveaux éléments&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 14'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mar 16/01/18 - Ven 19/01/18]]''  &lt;br /&gt;
*Travail sur la collecte des données (serveur de collecte et interface Web)&lt;br /&gt;
**Redéfinition du fichier de parsage car il crée des conflits et ne produit pas un fichier formaté de la façon attendue&lt;br /&gt;
***Corrigé: Nombre de balises réel n'est pas bien déterminé par le code&lt;br /&gt;
***Corrigé: ID de la première et de la dernière balise ne sont pas déterminés correctement&lt;br /&gt;
***Reste à faire: Traiter le cas où il y a un ajout ou suppression d'une balise pendant la collecte (pour le moment, lorsque c'est le cas, toutes les données se décalent au lieu de laisser des trous)&lt;br /&gt;
&lt;br /&gt;
**Automatisation de la collecte par un script Shell lançant toutes les commandes de CONNEXION, REDIRECTION, LANCEMENT CU, FERMETURE DU PROGRAMME (kill rfcomm / kill tcp_redirect)&lt;br /&gt;
***Mis en suspens: pour le moment, on lance les commandes manuellement dans le terminal&lt;br /&gt;
&lt;br /&gt;
**Interface Web&lt;br /&gt;
***Implémentation de plotly.js, un module Javascript qui permet d'afficher des graphes en 3D&lt;br /&gt;
&lt;br /&gt;
*Implémentation du serveur de localisation fourni par les tuteurs (mais algorithme de localisation pas fonctionnel pour le moment)&lt;br /&gt;
**Mise à jour de l'affichage des positions des éléments: précédemment seule la matrice X de position du Tag s'affichait, et pas la matrice A des balises&lt;br /&gt;
**Requêtes manuelles à l'API avec la fonction curl OK: on arrive à récupérer les matrices X et A (aléatoires pour le moment) par une requête GET à l'API du serveur de localisation&lt;br /&gt;
**Implémentation des requêtes Ajax pour automatiser les requêtes au serveur de localisation&lt;br /&gt;
&lt;br /&gt;
*Mise à jour du rapport les nouveaux éléments du travail réalisé&lt;br /&gt;
*Réflexion sur la possibilité ou non de réaliser la partie temps réel du projet au vu des moyens à disposition&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 15'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mar 23/01/18 - Ven 26/01/18]]'' &lt;br /&gt;
*Travail sur la collecte des données (serveur de collecte et interface Web)&lt;br /&gt;
**Redéfinition du fichier de parsage car il crée des conflits et ne produit pas un fichier formaté de la façon attendue&lt;br /&gt;
***Fait: Si distance négative car Tag trop près, la valeur négative générée par une balise est remplacée par un &amp;quot;0&amp;quot; (cela modifie la position réelle modélisée dans plotly, mais évite une impossibilité de générer la position à partir de la distance -&amp;gt; par des tests, il faudra déterminer la valeur limite à partir de laquelle les cartes donnent des valeurs de distance négatives&lt;br /&gt;
***Reste à faire: Traiter le cas où il y a un ajout ou suppression d'une balise pendant la collecte (pour le moment, lorsque c'est le cas, toutes les données se décalent au lieu de laisser des trous); Ainsi que le cas où il y un saut/bug inattendu et donc une disparition d'une ou plusieurs valeurs de distance&lt;br /&gt;
***Début de résolution du cas où une distance n'est pas prise en compte, c'est à dire où il y a une valeur qui disparaît et désaligne les valeurs lors de la création du JSON&lt;br /&gt;
&lt;br /&gt;
**Automatisation de la collecte par un script Shell lançant toutes les commandes de CONNEXION, REDIRECTION, LANCEMENT CU, FERMETURE DU PROGRAMME (kill rfcomm / kill tcp_redirect)&lt;br /&gt;
***Mis en suspens: pour le moment, on lance les commandes manuellement dans le terminal&lt;br /&gt;
***Création d'un script bash /etc/init.d/autoconnect.sh pour connecter automatiquement la RPi au lancement du système (si la RPi est déjà allumée au démarrage)&lt;br /&gt;
&lt;br /&gt;
**Interface Web&lt;br /&gt;
***Perfectionnement de l'utilisation de Plotly pour les visualisations&lt;br /&gt;
&lt;br /&gt;
*Implémentation du serveur de localisation fourni par les tuteurs (algorithme de localisation pas fonctionnel pour le moment)&lt;br /&gt;
**Requêtes manuelles à l'API avec la fonction curl OK&lt;br /&gt;
**Fait: Implémentation des requêtes Ajax pour automatiser les requêtes au serveur de localisation&lt;br /&gt;
***Liaison entre les différentes requêtes ajax grâce à des variables: permet de stocker l'adresse du job récupérée par la méthode GET&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 16'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Lun 29/01/18 - Ven 02/02/18]]'' &lt;br /&gt;
*Travail sur la collecte des données (serveur de collecte et interface Web)&lt;br /&gt;
**Redéfinition du fichier de parsage car il crée des conflits et ne produit pas un fichier formaté de la façon attendue&lt;br /&gt;
***déterminer la valeur limite à partir de laquelle les cartes donnent des valeurs de distance négatives&lt;br /&gt;
***Reste à faire: Traiter le cas où il y a un ajout ou suppression d'une balise pendant la collecte (pour le moment, lorsque c'est le cas, toutes les données se décalent au lieu de laisser des trous); Ainsi que le cas où il y un saut/bug inattendu et donc une disparition d'une ou plusieurs valeurs de distance&lt;br /&gt;
***Fait: gestion des bugs/sauts de valeurs de balises - remplacement par une valeur nulle sur balise existe, par rien sinon (implémentation d'un tableau caractérisant l'existence ou pas de chaque balise 1 à 6), optimisation des temps de calculs/exécution dans le script&lt;br /&gt;
**Interface Web&lt;br /&gt;
***Ajout d'une barre de progression de la collecte remplaçant le bouton de Lancement de collecte lors de l'appui&lt;br /&gt;
***Ajout d'un bouton dropdown pour afficher les fichiers de position qu'on reçoit du serveur de localisation&lt;br /&gt;
***Ajout d'une scrollbar dans les deux dropdown&lt;br /&gt;
&lt;br /&gt;
*Implémentation du serveur de localisation fourni par les tuteurs (algorithme de localisation pas fonctionnel pour le moment)&lt;br /&gt;
**Fait: Implémentation des requêtes Ajax pour automatiser les requêtes au serveur de localisation&lt;br /&gt;
***Création d'une requête Ajax GET qui demande le fichier JSON de position au serveur de localisation jusqu'à ce qu'il soit retourné&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 17'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Lun 05/02/18 - Ven 09/02/18]]''&lt;br /&gt;
&lt;br /&gt;
*Rapport partie front&lt;br /&gt;
*Nettoyage du code requete.py&lt;br /&gt;
*Mise à jour final des de certes pages du site&lt;br /&gt;
** matrice.html à jour&lt;br /&gt;
**3D.html à jour&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 18'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Lun 12/02/18 - Ven 16/02/18]]'' &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 19'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Lun 19/02/18 - Ven 23/02/18]]''&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Observations'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Problèmes rencontrés'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Solutions apportées'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Délivrables'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
Rapport de mi-PFE&lt;br /&gt;
[[Fichier:RapportMi-PFE-UNG DELATTE.pdf]]&lt;br /&gt;
&lt;br /&gt;
Rapport de PFE&lt;br /&gt;
&lt;br /&gt;
Vidéo&lt;/div&gt;</summary>
		<author><name>Hdelatte</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=P18_Localisation_of_quadrotors&amp;diff=51093</id>
		<title>P18 Localisation of quadrotors</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=P18_Localisation_of_quadrotors&amp;diff=51093"/>
				<updated>2018-02-16T15:12:16Z</updated>
		
		<summary type="html">&lt;p&gt;Hdelatte : /* Semaine 16 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Cahier des charges'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;Présentation générale du projet&amp;lt;/span&amp;gt;=== &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Contexte&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
Dans un monde de plus en plus connecté, de nombreux drones sont déployés pour diverses applications comme l'espionnage, la surveillance, la cartographie de lieux et la livraison de colis. Les technologies nécessaires pour contrôler ces drones sont des sujets de recherche actuels. &lt;br /&gt;
&lt;br /&gt;
Le contrôle de ceux-ci passe tout d'abord par la maîtrise de leur position dans l'espace. Le développement des applications liées à l'utilisation de drones nécessite un travail important sur la localisation spatiale d'objets connectés. &lt;br /&gt;
&lt;br /&gt;
De plus, dans un souci d'utilisation, il est essentiel de développer des interfaces logicielles permettant d'exploiter ces données.&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Objectif du projet&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
L'objectif de ce projet est de développer une interface logicielle permettant de traiter en temps réel les informations de localisation d'un drone et de balises, dans le but de définir leur localisation dans l'espace, en intérieur.&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Description du projet&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
Pour réaliser le contrôle de drones, la première étape importante est de donner ses informations de position. Le but du projet est de développer une interface logicielle permettant de localiser le drone en temps réel en intérieur. Le drone se déplace dans un environnement dans lequel ont été installées de multiples balises. Il est équipé d'une carte, lui permettant de recevoir les distances relatives entre lui-même et les balises, sur laquelle différents algorithmes vont être implémentés pour effectuer la localisation en temps réel. Le projet requiert des compétences en développement hardware (Crazyflie 2.0, voir https://wiki.bitcraze.io/) et software (langage C/C++/Python/Javascript/HTML...).&lt;br /&gt;
&lt;br /&gt;
Il se divise en 4 étapes principales, qui sont:&lt;br /&gt;
*1) Choisir les technologies utilisées&lt;br /&gt;
*2) Choisir l'architecture (OS / APIs)&lt;br /&gt;
*3) Développer les différentes parties du projet&lt;br /&gt;
*4) Intégrer et connecter les différentes parties du projet&lt;br /&gt;
&lt;br /&gt;
La localisation étant en intérieur, le protocole GPS n'est donc pas assez précis pour les applications ciblées. La mise en place d'un tel dispositif permettrait grâce à l'utilisation d'un algorithme d'estimer avec une bonne précision les positions en intérieur d'une balise centrale (appelée Tag) et de balises (appelées Anchor). Le Tag scanne en temps réel la distance relative aux différentes balises, et il nous est retourné la position des balises et du Tag grâce à l'algorithme de localisation.&lt;br /&gt;
&lt;br /&gt;
Le projet se compose de 3 parties:&lt;br /&gt;
* Collect &amp;amp; parse: collecter les données envoyées par les balises en communiquant avec un serveur et récupérer les données adéquates par un tri&lt;br /&gt;
* Localise: déterminer la matrice de position des balises et du Tag en traitant les données récupérées&lt;br /&gt;
* Display: développer l'interface homme machine pour afficher, étudier et utiliser les données traitées&lt;br /&gt;
&lt;br /&gt;
Nous travaillerons dans un premier temps dans une optique temps différé avant de travailler en temps réel. Cela nous permettra d'acquérir des données utiles et réutilisables en aval. &lt;br /&gt;
&lt;br /&gt;
A l'aboutissement du projet, nous devrions être capable via l'interface homme machine développée d'afficher précisément la position spatiale des balises ainsi que du Tag, grâce àl'utilisation d'un algorithme de localisation et des données récupérées, et d'afficher d'autres données relatives au déplacement du Tag ou des balises dans l'espace. &lt;br /&gt;
&lt;br /&gt;
Si le temps le permet, nous pourrons aussi être amenés à adapter et utiliser l'interface développée pour l'utilisation d'un drone.&lt;br /&gt;
&lt;br /&gt;
''Sujet originel''&lt;br /&gt;
&lt;br /&gt;
To achieve the control of quadrotors, the first important task to give its position information. This project is to develop a software(GUI) to localize the quadrotors in real-time. The quadrotor is flying in an environment where several transmitters have been installed. The quadrotor is equipped with a deck to receive the relative distances between the deck and all transmitters, based on which different algorithms will be implemented to realize the real-time localization. The candidates need to have both experiences on hardware (Crazyflie 2.0, see https://wiki.bitcraze.io/) and software development (C/C , Python…). &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Calendrier prévisionnel&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
''[[Avant le 29/09/17]]'' - Élaboration du Cahier des charges, de la liste des tâches et du calendrier prévisionnel&lt;br /&gt;
&lt;br /&gt;
''[[Avant fin Octobre]]'' - Serveur de collecte et début du développement de l'interface logicielle&lt;br /&gt;
&lt;br /&gt;
''[[Avant fin Décembre]]'' - Interface logicielle&lt;br /&gt;
&lt;br /&gt;
''[[A la fin du PFE]]'' - Intégration finale des différentes parties (Serveur de collecte des données &amp;amp; Serveur de localisation &amp;amp; Interface logicielle)&lt;br /&gt;
&lt;br /&gt;
Répartition du volume de travail (***h):&lt;br /&gt;
&lt;br /&gt;
* Recherche sur les technologies à utiliser&lt;br /&gt;
* Développement du serveur de collecte de données&lt;br /&gt;
* Réalisation de l'interface logicielle (Web//Logiciel/Application)&lt;br /&gt;
* Intégration des différentes parties&lt;br /&gt;
* Test et débuggage&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Choix techniques : matériel et logiciel&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
Afin de développer ce dispositif, nous allons utiliser une Raspberry Pi 3 associée à une carte réceptrice, qui communique avec 4 balises composées chacune d'un microcontrôleur et d'une carte émettrice radio (UWB5C) et alimentées par batteries. La carte réceptrice joue le rôle du drone à localiser et communiquera les données émises par les balises vers l'ordinateur via Bluetooth.&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Choix technologiques&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
Voici les technologies que nous utilisons pour chacune des parties de ce projet.&lt;br /&gt;
&lt;br /&gt;
    1) Serveur de collecte des données:&lt;br /&gt;
       Scanne et parse les données récupérées pour fournir la matrice D des distances relatives du tag aux 4 balises&lt;br /&gt;
        - API&lt;br /&gt;
        - Python / Serveur Flask&lt;br /&gt;
&lt;br /&gt;
    2) Serveur de localisation (fourni):&lt;br /&gt;
       Calcule grâce à l'algorithme de localisation et la matrice D les positions spatiales des 4 noeuds et du tag&lt;br /&gt;
        - API&lt;br /&gt;
        - Bootstrap&lt;br /&gt;
        - Jquery&lt;br /&gt;
        - Python&lt;br /&gt;
&lt;br /&gt;
    3) Interface utilisateur:&lt;br /&gt;
       Affiche courbes, visualisation 3D, boutons ou données des fichiers envoyées par le serveur de localisation&lt;br /&gt;
        - HTML5 / Javascript&lt;br /&gt;
        - Fichiers JSON (serveurs de collecte et de localisation)&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Calendrier prévisionnel'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Liste des tâches à effectuer&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
# Se documenter sur le projet&lt;br /&gt;
##Langages et technologies utilisées&lt;br /&gt;
##Matériel utilisé&lt;br /&gt;
##Mettre en place du travail sur le Git&lt;br /&gt;
# Réaliser le serveur de collecte&lt;br /&gt;
##Récupérer les trames envoyées par bluetooth par le TAG via la Raspberry Pi&lt;br /&gt;
##Intégrer le serveur de localisation pour interpréter les trames&lt;br /&gt;
##Tester et optimiser&lt;br /&gt;
# Réaliser l'interface Web utilisateur&lt;br /&gt;
##Implémenter le serveur de collecte et de localisation&lt;br /&gt;
##Afficher et traiter les données stockées dans les fichiers JSON via le serveur (temps différé + temps réel)&lt;br /&gt;
##Tester et optimiser&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;Replanification du cahier des charges / calendrier&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Feuille d'heures'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Tâche !! Prélude !! Heures S1 !! Heures S2 !! Heures S3 !! Heures S4 !! Heures S5 !! Heures S6 !! Heures S7 !! Heures S8 !! Heures S9 !! Heures S10 !! Heures S11 !! Heures S12 !! Heures S13 !! Heures S14 !! Heures S15 !! Heures S16 !! Heures S17 !! Heures S18 !! Heures S19 !! Total&lt;br /&gt;
|-&lt;br /&gt;
| Cahier des charges / Wiki / Gitlab / Rapport&lt;br /&gt;
|  4h&lt;br /&gt;
|  3h&lt;br /&gt;
|  1h&lt;br /&gt;
|  x&lt;br /&gt;
|  1h30&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h30&lt;br /&gt;
|  1h&lt;br /&gt;
|  3h&lt;br /&gt;
|  3h30&lt;br /&gt;
|  2h&lt;br /&gt;
|  5h&lt;br /&gt;
|  x&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Documentation sur les technos utilisées&lt;br /&gt;
|  2h&lt;br /&gt;
|  4h&lt;br /&gt;
|  3h&lt;br /&gt;
|  2h&lt;br /&gt;
|  3h&lt;br /&gt;
|  4h&lt;br /&gt;
|  5h&lt;br /&gt;
|  5h30&lt;br /&gt;
|  4h30&lt;br /&gt;
|  3h30&lt;br /&gt;
|  2h&lt;br /&gt;
|  3h&lt;br /&gt;
|  1h&lt;br /&gt;
|  3h&lt;br /&gt;
|  4h&lt;br /&gt;
|  x&lt;br /&gt;
|  2h&lt;br /&gt;
|  &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Documentation sur le matériel&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  1h&lt;br /&gt;
|  1h&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Recherche et développement du serveur de collecte&lt;br /&gt;
|  x&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  3h&lt;br /&gt;
|  3h30&lt;br /&gt;
|  4h&lt;br /&gt;
|  5h&lt;br /&gt;
|  7h&lt;br /&gt;
|  4h30&lt;br /&gt;
|  0,5h&lt;br /&gt;
|  3h&lt;br /&gt;
|  4h&lt;br /&gt;
|  3h&lt;br /&gt;
|  x&lt;br /&gt;
|  4h&lt;br /&gt;
|  7h30&lt;br /&gt;
|  5h&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Recherche et développement de l'interface Web&lt;br /&gt;
|  x&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  3h&lt;br /&gt;
|  5h&lt;br /&gt;
|  6h&lt;br /&gt;
|  4h&lt;br /&gt;
|  7h&lt;br /&gt;
|  5h30&lt;br /&gt;
|  2h30&lt;br /&gt;
|  6h&lt;br /&gt;
|  8h&lt;br /&gt;
|  5h&lt;br /&gt;
|  1h&lt;br /&gt;
|  8h&lt;br /&gt;
|  4h&lt;br /&gt;
|  4h&lt;br /&gt;
|  &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Recherche et intégration du serveur de localisation&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x &lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  6h&lt;br /&gt;
|  5h&lt;br /&gt;
|  3h&lt;br /&gt;
|  &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Intégration des différentes parties&lt;br /&gt;
|  x&lt;br /&gt;
|  x  &lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  2h&lt;br /&gt;
|  2h&lt;br /&gt;
|  2h&lt;br /&gt;
|  3h&lt;br /&gt;
|  1h30&lt;br /&gt;
|  x&lt;br /&gt;
|  3h&lt;br /&gt;
|  6h&lt;br /&gt;
|  5h&lt;br /&gt;
|  x&lt;br /&gt;
|  3h30&lt;br /&gt;
|  2h&lt;br /&gt;
|  2h&lt;br /&gt;
|  &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Tests et débuggage&lt;br /&gt;
|  x&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  1h&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  3h&lt;br /&gt;
|  4h&lt;br /&gt;
|  0,5h&lt;br /&gt;
|  3h&lt;br /&gt;
|  1h&lt;br /&gt;
|  3h&lt;br /&gt;
|  3h&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  4h&lt;br /&gt;
|  &lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Optimisation/Correction des programmes&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Vidéo&lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Avancement du Projet'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Phase préparatoire'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Jeu 21/09/17 - Ven 22/09/17]]'' &lt;br /&gt;
*Rendez-vous de mise au point du cahier des charges avec les encadrants/intervenants (M. ZHENG Gang et M. DAGHER Roudy)&lt;br /&gt;
*Elaboration du cahier des charges&lt;br /&gt;
*Elaboration de la page Wiki (préparation de la mise en page et présentation du sujet)&lt;br /&gt;
*Préparation du travail sous forme de Mind Map&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous nous sommes tout d’abord rendus au laboratoire de l'INRIA afin de pouvoir définir le plus précisément possible le cahier des charges avec nos tuteurs.&lt;br /&gt;
Nous avons donc défini avec eux les technologies qu'il faudrait étudier. Vous retrouverez le choix des technologies dans la partie '''choix technologiques'''&lt;br /&gt;
&lt;br /&gt;
Nous avons en même temps créé notre page Wiki, et structurée celle-ci avec les parties qui nous seraient utiles pour développer nos explications par la suite.&lt;br /&gt;
&lt;br /&gt;
Nous avons de plus découpé le travail en sous-parties que nous avions mis dans une '''Mind map''' afin d'y voir plus clair sur la ligne à suivre.&lt;br /&gt;
&lt;br /&gt;
Vous trouverez cette Mind map juste ci-dessous. Nous ne mettrons pas à jour cette Mind map chaque semaine mais il est fort probable que nous en refaisions un en milieu de projet pour pouvoir cibler les objectifs réussis et ceux à atteindre. Nous pourrons de plus redéfinir certains objectifs qui nous auraient semblés trop vague au début du projet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Projet de fin d'étude.png|centre|600px]]&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 1'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Jeu 28/09/17 - Ven 29/09/17]]'' &lt;br /&gt;
*Revue du Cahier des Charges avec les encadrants&lt;br /&gt;
*Lecture et recherches sur les technologies adaptées&lt;br /&gt;
*Construction de la suite de la Mind Map&lt;br /&gt;
*Création du Gitlab&lt;br /&gt;
&lt;br /&gt;
Nous commençons les recherches sur le projet et sur les premières technologies engagées dans celui-ci. Nous en profitons pour formuler dès à présent des questions sur le bon choix de celles-ci. Nous commençons donc des tests ayant seulement pour but de nous familiariser avec l'environnement de travail et de réellement comprendre les fonctions déjà présentes qu'il faudra exploiter et implanter notre interface web.&lt;br /&gt;
Nous créons un dépôt Gitlab avec notre tuteur et commençons a définir les taches premières sur celui-ci.&lt;br /&gt;
Nous en profitons pour affiner le Mind Map.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 2'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Jeu 05/10/17 - Ven 06/10/17]]''  &lt;br /&gt;
*Précisions sur le cahier des charges&lt;br /&gt;
*Listage du matériel&lt;br /&gt;
*Recherche et détermination de solutions technologiques possibles pour les fonctions demandées&lt;br /&gt;
*Début du travail sur le serveur de collecte&lt;br /&gt;
*Apprentissage du langage Python et de l'utilisation du framework Flask&lt;br /&gt;
&lt;br /&gt;
Nous avons finalisé les précisions sur le cahier des charges. Nous avons donc pu cibler le matériel dont nous nous servirons pour ce Projet. Vous trouverez donc cette liste la section correspondante. Il est évident que le matériel utilisé est dans l'ensemble déjà fourni par le laboratoire et qu'il nous reste dans l'ensemble à créer l'interface web et les API qui nous permettrons de faire communiquer cette interface avec la Raspberry Pi et le serveur de position déjà créé.&lt;br /&gt;
Nous avons donc pu commencer à nous former sur les technologies qui nous serviraient par la suite. Nous avons donc utilisé le cours d'Openclassrooms sur les serveurs Flask pour en apprendre les bases. Ce serveur Flask est programmé en Python et nous permet donc une grande liberté au niveau de l’exécution de certains scripts. En effet, les scripts de connexion Bluetooth et de redirection de port qui nous permettent de récupérer les données de distance sont eux-mêmes codés en Python et sont directement appelés via le serveur.&lt;br /&gt;
Dans ce serveur, représentant notre interface web, vous retrouverez la page '''/collecte''' qui représentera notre partie collecte de données ainsi que l'affichage de ces distances. Nous appellerons cette partie le Serveur de Collecte.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 3'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 11/10/17 - Jeu 12/10/17]]''  &lt;br /&gt;
*Recherche et développement initial du serveur de collecte de données&lt;br /&gt;
*Complément du Git sur les tâches à effectuer&lt;br /&gt;
&lt;br /&gt;
Nous avons commencé à créer un serveur Flask renvoyant pour l'instant une matrice aléatoire. Lors de la requête URL &amp;quot;../matrice&amp;quot;, nous voyons bien une matrice aléatoire apparaître sur la page Web. Nous essayons de nous connecter à la Raspberry Pi en redirigeant son port série vers le Bluetooth de façon à récupérer de vraies matrices de distance entre le drone (ie commutateur central) et les balises. Nous pourrons afficher ensuite ces matrices, ou alors les stocker dans un fichier en attendant le traitement de celles-ci.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Requete s3.PNG|300px|serveur Flask]]&lt;br /&gt;
&lt;br /&gt;
Nous avons plusieurs problèmes avec le Bluetooth pour se connecter avec la Raspberry Pi. Quand nous aurons réussi à nous connecter au port série de la Raspberry Pi alors nous pourrons gérer le traitement des données récupérées.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 4'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 18/10/17 - Jeu 19/10/17]]''  &lt;br /&gt;
*Configuration de la Raspberry Pi car problèmes de connectivité Bluetooth rencontrés&lt;br /&gt;
**Nous arrivons à connecter la Raspberry Pi sous Windows mais la connexion sous Linux pose problème (travail en suspens en attendant la disponibilité de l'encadrant)&lt;br /&gt;
*Début du développement de l'interface Web&lt;br /&gt;
**Traitement d'une matrice dans un fichier JSON&lt;br /&gt;
**Affichage sous forme de tableau de la matrice&lt;br /&gt;
**Utilisation du serveur de requête en Python avec chargement de template HTML&lt;br /&gt;
**Mise en forme de la trame de la page en HTML/CSS avec le framework Bootstrap&lt;br /&gt;
**Ajout d'un set de distances (d1, d2, d3, d4) dans la matrice lors d'un appui sur un bouton Chargement en utilisant un fichier Javascript&lt;br /&gt;
&lt;br /&gt;
Nous avons reçu des fonctions Python de notre tuteur afin d'obtenir une connexion Bluetooth entre notre Raspberry Pi et notre ordinateur ainsi qu'une redirection de port de celle-ci vers la connexion. Nous n'arrivons pas à utiliser ces fonctions sous linux et nous nécessitons une explication de notre tuteur n'étant pas disponible à ce moment. Pour ne pas perdre de temps, nous attaquons la création de l'interface web à proprement parler, c'est à dire la création des pages HTML ainsi que le document Javascript qui nous servira de bibliothèque de fonctions. Chaque route de notre serveur est reliée à une série de fonctions Python s'exécutant à l'appel des url puis suivies d'un template de la page HTML en question. Nous en profitons de plus pour explorer le framework CSS bootstrap afin de mettre un premier design et une structure a notre page collecte qui sera la page principale de notre site pour ce début de projet.&lt;br /&gt;
&lt;br /&gt;
Nous nous essayons de plus à différents tests sur des fichiers de format '''JSON''' que nous devrons réussir à traiter correctement plus tard dans notre projet.&lt;br /&gt;
Nous récupérons une matrice que nous créons nous-mêmes en Python (simulation d'une série de distances récupérée) que nous transformons au format JSON pour ensuite l'afficher sur notre page web. Pour pouvoir proprement afficher ce fichier '''JSON''' renvoyé vers notre page, nous nous servons du fichier Javascript afin de créer du code HTML contenant la matrice.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 5'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 25/10/17 - Ven 27/10/17]]''  &lt;br /&gt;
*Résolution des problèmes de connectique Bluetooth sur la Raspberry Pi&lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Traitement d'une matrice dans un fichier JSON&lt;br /&gt;
**Début de l'ajout d'un set de distances depuis une matrice contenue dans un fichier JSON&lt;br /&gt;
&lt;br /&gt;
Nous avons pu nous entretenir avec notre tuteur et donc comprendre les fonctions de connexion et de redirection de port. Nous pouvons donc continuer le développement de notre interface web. Nous arrivons à traiter un set de données au format JSON et à l'afficher dans le code HTML. Toutefois nous créons nous-mêmes ce set, il est maintenant nécessaire que nous arrivions à récupérer les sets de distance réels reçus par la connexion Bluetooth. Nous commencerons par un traitement asynchrone. L'idée est d’enregistrer les sets de distances dans un fichier '''JSON''' stocké dans un dossier. Nous appellerons ce dossier plus tard via une requête Ajax.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 6'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 08/11/17 - Ven 10/11/17]]''  &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
**Mise en place de la communication entre le port série de notre machine et le port série de la carte via Bluetooth de la RPi3&lt;br /&gt;
**Récupération et traitement (parse) manuels des données de distances dans un fichier .log via TCP/IP&amp;lt;-&amp;gt;Bluetooth&lt;br /&gt;
**Début de l'automatisation du procédé par script Python (requete.py) et mise en place de sockets de communication&lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Chargement sur commande d'un set de distances depuis une matrice contenue dans un fichier JSON&lt;br /&gt;
*Travail sur le layout du site&lt;br /&gt;
&lt;br /&gt;
Après avoir regardé le code de ces différentes fonctions nous avons pu faire des tests manuels via le Shell pour récupérer des données de distances et les stocker dans un fichier '''JSON''' sur notre ordinateur.&lt;br /&gt;
&lt;br /&gt;
Nous utilisons les commandes suivantes pour se connecter via Bluetooth:&lt;br /&gt;
&lt;br /&gt;
 rfcomm connect /dev/rfcomm0 B8:27:EB:80:DC:89 1&lt;br /&gt;
&lt;br /&gt;
Rediriger le port de la Raspberrypi3 vers la connexion:&lt;br /&gt;
&lt;br /&gt;
 Python lps-collector/tcp_serial_redirect.py /dev/rfcomm0 9600&lt;br /&gt;
&lt;br /&gt;
Collecter les données dans un fichier dont nous définissons le nom:&lt;br /&gt;
&lt;br /&gt;
 echo &amp;quot;cu -s9600 -lttyACM0&amp;quot;| nc localhost 7777&lt;br /&gt;
 nc localhost 7777 | grep distance &amp;gt; static/log/dist-capture'+date+'.log&lt;br /&gt;
&lt;br /&gt;
Nous pouvons '''parser''' le flux de données avant de le stocker dans le fichier via cette commande:&lt;br /&gt;
&lt;br /&gt;
 Python lps-collector/lps_parse.py static/log/dist-capture&amp;quot;+date+&amp;quot;.log&lt;br /&gt;
&lt;br /&gt;
Il est donc nécessaire d'inclure via des '''thread''' ces différentes fonctions dans notre serveur Python (Flask) afin d'automatiser le processus. Le but est de pouvoir choisir sur l'interface web quels fonctions il faut exécuter et les déclencher via l'appui sur des boutons.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 7'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 15/11/17 - Ven 17/11/17]]''  &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
**Récupération et traitement (parse) manuels des données de distances dans un fichier .log via TCP/IP&amp;lt;-&amp;gt;Bluetooth&lt;br /&gt;
**Automatisation du procédé par script Python (requete.py)&lt;br /&gt;
***Mise en place de sockets de communication pour le contrôle de la collecte -&amp;gt; abandonné (servait à commander la collecte manuellement)&lt;br /&gt;
***Développement d'un script engine.py regroupant les commandes exécutables par l'utilisateur via la page Web&lt;br /&gt;
***Début du travail sur la fonction &amp;quot;STOP&amp;quot; manuel d'une action de collecte de données (liaison entre script HTML, Javascript, et script Python)&lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Chargement sur commande d'un set de distances depuis une matrice contenue dans un fichier JSON&lt;br /&gt;
**Travail sur le layout du site&lt;br /&gt;
***Ajout des différentes commandes (connexion Bluetooth, lancement commande cu, collecte des données, collecte durée donnée)&lt;br /&gt;
***Début de l'implémentation de la visualisation des fichiers .JSON obtenus après collecte et affichage dans un tableau matriciel du fichier sélectionné&lt;br /&gt;
&lt;br /&gt;
Nous avons continué à travailler sur le serveur de collecte: les données que nous avons récupérées via Bluetooth sont stockées dans un fichier .log. Apres avoir bien compris comment marchait la fonction '''parse''' manuellement (lors de son utilisation dans le Shell), nous l'avons implémentée dans notre serveur de collecte qui lance cette commande lors de l’appui sur un bouton via notre interface virtuelle. Un problème rencontré était de savoir quand la récolte des données devait s’arrêter. Nous avons donc rajouté un temps à entrer nous-même sur l'interface. La fonction '''parse''' est effectuée et le sous-processus va attendre le temps donné avant de lancer une commande permettant de tuer le processus et mettant donc fin au remplissage du fichier '''.log'''. Nous voulons de plus réussir à lancer une fonction de collecte sans temps. C'est à dire que nous coupons la collecte via un bouton par nous-mêmes. Nous voulions utiliser des Sockets pour pouvoir définir nous-mêmes la gestion de la communication mais l'idée a été abandonné car nous avons réussi à sauvegarder le PID du processus lancé. Il nous suffit donc de l’arrêter grâce à un autre bouton qui récupère cette variable et l’arrête ensuite. &lt;br /&gt;
&lt;br /&gt;
Toutes nos fonctions Pythons étant regroupées dans notre serveur '''requete.py''', nous avons décidé de créer un module qui regroupera toutes ces fonctions que nous pourrons utiliser dans '''requete.py'''. ceci nous permet de voir plus clair dans notre code et de faciliter le travail lorsque nous modifions le code tous les deux.&lt;br /&gt;
&lt;br /&gt;
Nous essayons en continu d'adapter le layout du site pour le rendre le plus attractif et simple possible, de façon à ce que chaque bouton et tableau soient clairs et compréhensibles.&lt;br /&gt;
&lt;br /&gt;
Nous avons commencé à récupérer les fichiers '''JSON''' créés à partir des fichier '''log''', c'est-à-dire que ces fichiers sont automatiquement stockés coté serveur dans un dossier nommé '''static/log'''. Notre but est de récupérer le nom des fichiers JSON et de les afficher dans un composant sur notre interface web. Il nous sera donc possible ensuite de sélectionner le nom d'un fichier. Lors de la sélection de ce nom de fichier, un tableau apparaît avec les valeurs de distances à l’intérieur.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 8'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 22/11/17 - Ven 24/11/17]]''  &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
**Automatisation du procédé de collecte par script Python (requete.py qui fait appel à engine.py)&lt;br /&gt;
***Développement d'un script engine.py regroupant les commandes exécutables par l'utilisateur via la page Web&lt;br /&gt;
***Travail sur la fonction &amp;quot;STOP&amp;quot; manuel d'une action de collecte de données (liaison entre script HTML, Javascript, et script Python)&lt;br /&gt;
***Mise en place d'un serveur HTTP Simple sous Python pour accéder aux fichiers de données à partir de la page Web&lt;br /&gt;
***Mise à jour de fonctions de connexion &lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Travail sur le layout du site (ajout de pages, navigation entre les pages, apparence, nettoyage des codes)&lt;br /&gt;
**Bon fonctionnement de l'ensemble serveur collecte + serveur HTTP + client Web&lt;br /&gt;
**Affichage de la liste des fichiers de données de distance (log, csv, JSON) via serveur HTTP en Python sur port 9999&lt;br /&gt;
*Corrections et nettoyage du dépôt GIT&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous continuons à développer les points énoncés la semaine dernière. Nous avons décidé de nous diriger vers un serveur HTTP Simple pour accéder à nos fichiers. Il s’avère que nous finirons par ne pas utiliser ce serveur. Nous irons récupérer les fichiers en question via des requêtes '''Ajax''' faites à la sélection du nom du fichier.&lt;br /&gt;
&lt;br /&gt;
Nous rencontrons depuis le début des problèmes avec les fonctions de connexion qui peuvent ne pas marcher à un moment donné. Nous essayons de trouver pourquoi ce bug est un bug qui ne se produit pas à chaque fois. Nous avons déterminé qu'il ne se produisait seulement lorsque les fonctions de connexions étaient lancée dans des threads. Nous ne savons toujours pas pourquoi ces thread bugguent seulement parfois et non à chaque essai de connexion.&lt;br /&gt;
&lt;br /&gt;
Nous avons nettoyé notre dépot '''Git''' car il s’avère que nous utilisions une mauvaise méthode de fusion et de stockage des documents.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 9'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 29/11/17 - Jeudi 30/11/17]]''  &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
**Automatisation du procédé de collecte par script Python (requete.py qui fait appel à engine.py)&lt;br /&gt;
***Travail sur la fonction &amp;quot;STOP&amp;quot; manuel d'une action de collecte de données (liaison entre script HTML, Javascript, et script Python)&lt;br /&gt;
***Recherches sur l'utilisation de fichiers JSON accessibles via le serveur HTTP&lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Travail sur le layout du site &lt;br /&gt;
**Travail sur la liaison entre fichiers JSON et affichage Web des données de distance&lt;br /&gt;
***Recherches et tests de solutions&lt;br /&gt;
****Affichage depuis un fichier&lt;br /&gt;
****Affichage à la volée lors d'une action de collecte&lt;br /&gt;
&lt;br /&gt;
*Revue de code avec Roudy DAGHER:&lt;br /&gt;
**Structure globale des codes ok&lt;br /&gt;
**Fonctionnement presque ok: fonctionnalités implémentées ok, mais parsage csv ne marche pas&lt;br /&gt;
**Refactoring nécessaire&lt;br /&gt;
**Correction de la fonction STOP et amélioration de la fonction de COLLECTE&lt;br /&gt;
**Faire plus de requêtes Javascript que de requêtes HTML&lt;br /&gt;
**Discussion pour l'implémentation du serveur de localisation (= algorithme de localisation) et des visualisations de données sur le site Web&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous avons d'abord revu l'ensemble de notre code et les méthodes utilisées avec notre tuteur '''Roudy Dagher'''. Nous nous approchons d'un serveur de collecte de données stable et fonctionnel. Nous avons refait les différentes connexions entre l'interface et le serveur afin de ne faire que des requêtes sur des '''WebServices'''. Il nous est possible de commencer la deuxième partie qui est l'envoi de ces tableaux de données afin de les envoyer vers le serveur de localisation via des API afin de recevoir des matrices de positions.&lt;br /&gt;
Nous pourrons grâce à ces matrices afficher une carte 3D des balises  et du TAG dans l'espace.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 10'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 06/12/17 - Jeudi 07/12/17]]'' &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
**Travail sur la fonction STOP&lt;br /&gt;
**Réalisation d'une expression régulière pour le parsage des fichiers log en fichier JSON&lt;br /&gt;
&lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Travail sur l'affichage des fichiers JSON&lt;br /&gt;
***Réalisation de toutes les requêtes Ajax&lt;br /&gt;
***Réalisation d'un menu déroulant dropdown pour charger le contenu des fichiers JSON dans le tableau de distances&lt;br /&gt;
&lt;br /&gt;
*Nettoyage du dépôt Git&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 11'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 13/12/17]]''  &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
&lt;br /&gt;
*Revue de code avec Roudy DAGHER:&lt;br /&gt;
**Discussion sur la partie système du projet et correction de certaines fonctions&lt;br /&gt;
&lt;br /&gt;
Nous nous sommes réunis avec l'un de nos tuteurs, qui a réalisé certains bouts de code de base, pour nous mettre au point sur les fonctions en question et leur utilisation.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 12'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 20/12/17 - Jeudi 21/12/17]]''&lt;br /&gt;
*Revue, correction et nettoyage des codes&lt;br /&gt;
*Finalisation du rapport&lt;br /&gt;
*Planification de semaines restantes&lt;br /&gt;
*Préparation de la soutenance&lt;br /&gt;
*Revue de mi-projet avec tous les tuteurs&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Cette dernière semaine a servi à finaliser le rapport et à discuter de l'avancée du projet, notamment avec nos tuteurs pour déterminer le travail restant, présenter le travail abouti et replanifier précisément les échéances pour le travail restant. Nous avons réalisé la soutenance de mi-projet le '''jeudi 21/12/17 à 8h'''.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 13'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 10/01/18 - Ven 12/01/18]]''  &lt;br /&gt;
*Travail sur la collecte des données (serveur de collecte et interface Web)&lt;br /&gt;
**Redéfinition du fichier de parsage car il crée des conflits et ne produit pas un fichier formaté de la façon attendue&lt;br /&gt;
***Nombre de balises réel n'est pas bien déterminé par le code&lt;br /&gt;
***ID de la première et de la dernière balise ne sont pas déterminés correctement&lt;br /&gt;
&lt;br /&gt;
**Automatisation de la collecte par un script Shell lançant toutes les commandes de CONNEXION, REDIRECTION, LANCEMENT CU, FERMETURE DU PROGRAMME (kill rfcomm / kill tcp_redirect)&lt;br /&gt;
***Dans le but d'automatiser la procédure&lt;br /&gt;
***Dans le but de résoudre un problème de gestion de ressources (le bug '''thread''' apparu plus tôt dans le projet)&lt;br /&gt;
&lt;br /&gt;
**Travail sur la résolution du bug thread car l'automatisation n'a pas résolu le problème&lt;br /&gt;
***Identification du ou des causes potentielles: gestion des ressources (synchrone, asynchrone ?), connexion Bluetooth, lancement des commandes dans le même script, lancement en fg/bg, conflit dû au temps d'exécution de chaque processus ?&lt;br /&gt;
***Lancement des commandes manuellement dans des terminaux ne pose aucun problème: solution la plus simple&lt;br /&gt;
&lt;br /&gt;
**Redesign de la page Collecte&lt;br /&gt;
***Remplacement des boutons de commande par un bouton unique d'initialisation&lt;br /&gt;
***Travail sur une mise à jour du menu déroulant dropdown régulière sans avoir à recharger la page Web&lt;br /&gt;
***Implémentation de plotly.js, un module Javascript qui permet d'afficher des graphes en 3D&lt;br /&gt;
&lt;br /&gt;
*Mise au point post-soutenance avec Roudy DAGHER pour valider le travail restant, effectué et redéfinir certains objectifs atteignables ou pas selon les éléments réalisés dans le projet&lt;br /&gt;
*Recherches et début de l'implémentation du serveur de localisation fourni par les tuteurs&lt;br /&gt;
*Gestion du Git pour créer des branches additionnelles&lt;br /&gt;
*Recréation du rapport de projet suite à une perte du fichier éditable d'origine + Mise à jour avec les remarques suite à la soutenance ainsi que les nouveaux éléments&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 14'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mar 16/01/18 - Ven 19/01/18]]''  &lt;br /&gt;
*Travail sur la collecte des données (serveur de collecte et interface Web)&lt;br /&gt;
**Redéfinition du fichier de parsage car il crée des conflits et ne produit pas un fichier formaté de la façon attendue&lt;br /&gt;
***Corrigé: Nombre de balises réel n'est pas bien déterminé par le code&lt;br /&gt;
***Corrigé: ID de la première et de la dernière balise ne sont pas déterminés correctement&lt;br /&gt;
***Reste à faire: Traiter le cas où il y a un ajout ou suppression d'une balise pendant la collecte (pour le moment, lorsque c'est le cas, toutes les données se décalent au lieu de laisser des trous)&lt;br /&gt;
&lt;br /&gt;
**Automatisation de la collecte par un script Shell lançant toutes les commandes de CONNEXION, REDIRECTION, LANCEMENT CU, FERMETURE DU PROGRAMME (kill rfcomm / kill tcp_redirect)&lt;br /&gt;
***Mis en suspens: pour le moment, on lance les commandes manuellement dans le terminal&lt;br /&gt;
&lt;br /&gt;
**Interface Web&lt;br /&gt;
***Implémentation de plotly.js, un module Javascript qui permet d'afficher des graphes en 3D&lt;br /&gt;
&lt;br /&gt;
*Implémentation du serveur de localisation fourni par les tuteurs (mais algorithme de localisation pas fonctionnel pour le moment)&lt;br /&gt;
**Mise à jour de l'affichage des positions des éléments: précédemment seule la matrice X de position du Tag s'affichait, et pas la matrice A des balises&lt;br /&gt;
**Requêtes manuelles à l'API avec la fonction curl OK: on arrive à récupérer les matrices X et A (aléatoires pour le moment) par une requête GET à l'API du serveur de localisation&lt;br /&gt;
**Implémentation des requêtes Ajax pour automatiser les requêtes au serveur de localisation&lt;br /&gt;
&lt;br /&gt;
*Mise à jour du rapport les nouveaux éléments du travail réalisé&lt;br /&gt;
*Réflexion sur la possibilité ou non de réaliser la partie temps réel du projet au vu des moyens à disposition&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 15'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mar 23/01/18 - Ven 26/01/18]]'' &lt;br /&gt;
*Travail sur la collecte des données (serveur de collecte et interface Web)&lt;br /&gt;
**Redéfinition du fichier de parsage car il crée des conflits et ne produit pas un fichier formaté de la façon attendue&lt;br /&gt;
***Fait: Si distance négative car Tag trop près, la valeur négative générée par une balise est remplacée par un &amp;quot;0&amp;quot; (cela modifie la position réelle modélisée dans plotly, mais évite une impossibilité de générer la position à partir de la distance -&amp;gt; par des tests, il faudra déterminer la valeur limite à partir de laquelle les cartes donnent des valeurs de distance négatives&lt;br /&gt;
***Reste à faire: Traiter le cas où il y a un ajout ou suppression d'une balise pendant la collecte (pour le moment, lorsque c'est le cas, toutes les données se décalent au lieu de laisser des trous); Ainsi que le cas où il y un saut/bug inattendu et donc une disparition d'une ou plusieurs valeurs de distance&lt;br /&gt;
***Début de résolution du cas où une distance n'est pas prise en compte, c'est à dire où il y a une valeur qui disparaît et désaligne les valeurs lors de la création du JSON&lt;br /&gt;
&lt;br /&gt;
**Automatisation de la collecte par un script Shell lançant toutes les commandes de CONNEXION, REDIRECTION, LANCEMENT CU, FERMETURE DU PROGRAMME (kill rfcomm / kill tcp_redirect)&lt;br /&gt;
***Mis en suspens: pour le moment, on lance les commandes manuellement dans le terminal&lt;br /&gt;
***Création d'un script bash /etc/init.d/autoconnect.sh pour connecter automatiquement la RPi au lancement du système (si la RPi est déjà allumée au démarrage)&lt;br /&gt;
&lt;br /&gt;
**Interface Web&lt;br /&gt;
***Perfectionnement de l'utilisation de Plotly pour les visualisations&lt;br /&gt;
&lt;br /&gt;
*Implémentation du serveur de localisation fourni par les tuteurs (algorithme de localisation pas fonctionnel pour le moment)&lt;br /&gt;
**Requêtes manuelles à l'API avec la fonction curl OK&lt;br /&gt;
**Fait: Implémentation des requêtes Ajax pour automatiser les requêtes au serveur de localisation&lt;br /&gt;
***Liaison entre les différentes requêtes ajax grâce à des variables: permet de stocker l'adresse du job récupérée par la méthode GET&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 16'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Lun 29/01/18 - Ven 02/02/18]]'' &lt;br /&gt;
*Travail sur la collecte des données (serveur de collecte et interface Web)&lt;br /&gt;
**Redéfinition du fichier de parsage car il crée des conflits et ne produit pas un fichier formaté de la façon attendue&lt;br /&gt;
***déterminer la valeur limite à partir de laquelle les cartes donnent des valeurs de distance négatives&lt;br /&gt;
***Reste à faire: Traiter le cas où il y a un ajout ou suppression d'une balise pendant la collecte (pour le moment, lorsque c'est le cas, toutes les données se décalent au lieu de laisser des trous); Ainsi que le cas où il y un saut/bug inattendu et donc une disparition d'une ou plusieurs valeurs de distance&lt;br /&gt;
***Fait: gestion des bugs/sauts de valeurs de balises - remplacement par une valeur nulle sur balise existe, par rien sinon (implémentation d'un tableau caractérisant l'existence ou pas de chaque balise 1 à 6), optimisation des temps de calculs/exécution dans le script&lt;br /&gt;
**Interface Web&lt;br /&gt;
***Ajout d'une barre de progression de la collecte remplaçant le bouton de Lancement de collecte lors de l'appui&lt;br /&gt;
***Ajout d'un bouton dropdown pour afficher les fichiers de position qu'on reçoit du serveur de localisation&lt;br /&gt;
***Ajout d'une scrollbar dans les deux dropdown&lt;br /&gt;
&lt;br /&gt;
*Implémentation du serveur de localisation fourni par les tuteurs (algorithme de localisation pas fonctionnel pour le moment)&lt;br /&gt;
**Fait: Implémentation des requêtes Ajax pour automatiser les requêtes au serveur de localisation&lt;br /&gt;
***Création d'une requête Ajax GET qui demande le fichier JSON de position au serveur de localisation jusqu'à ce qu'il soit retourné&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 17'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Lun 05/02/18 - Ven 09/02/18]]'' &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 18'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Lun 12/02/18 - Ven 16/02/18]]'' &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 19'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Lun 19/02/18 - Ven 23/02/18]]''&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Observations'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Problèmes rencontrés'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Solutions apportées'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Délivrables'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
Rapport de mi-PFE&lt;br /&gt;
[[Fichier:RapportMi-PFE-UNG DELATTE.pdf]]&lt;br /&gt;
&lt;br /&gt;
Rapport de PFE&lt;br /&gt;
&lt;br /&gt;
Vidéo&lt;/div&gt;</summary>
		<author><name>Hdelatte</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=P18_Localisation_of_quadrotors&amp;diff=50219</id>
		<title>P18 Localisation of quadrotors</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=P18_Localisation_of_quadrotors&amp;diff=50219"/>
				<updated>2018-02-07T16:38:36Z</updated>
		
		<summary type="html">&lt;p&gt;Hdelatte : /* Semaine 16 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Cahier des charges'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;Présentation générale du projet&amp;lt;/span&amp;gt;=== &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Contexte&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
Dans un monde de plus en plus connecté, de nombreux drones sont déployés pour diverses applications comme l'espionnage, la surveillance, la cartographie de lieux et la livraison de colis. Les technologies nécessaires pour contrôler ces drones sont des sujets de recherche actuels. &lt;br /&gt;
&lt;br /&gt;
Le contrôle de ceux-ci passe tout d'abord par la maîtrise de leur position dans l'espace. Le développement des applications liées à l'utilisation de drones nécessite un travail important sur la localisation spatiale d'objets connectés. &lt;br /&gt;
&lt;br /&gt;
De plus, dans un souci d'utilisation, il est essentiel de développer des interfaces logicielles permettant d'exploiter ces données.&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Objectif du projet&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
L'objectif de ce projet est de développer une interface logicielle permettant de traiter en temps réel les informations de localisation d'un drone et de balises, dans le but de définir leur localisation dans l'espace, en intérieur.&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Description du projet&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
Pour réaliser le contrôle de drones, la première étape importante est de donner ses informations de position. Le but du projet est de développer une interface logicielle permettant de localiser le drone en temps réel en intérieur. Le drone se déplace dans un environnement dans lequel ont été installées de multiples balises. Il est équipé d'une carte, lui permettant de recevoir les distances relatives entre lui-même et les balises, sur laquelle différents algorithmes vont être implémentés pour effectuer la localisation en temps réel. Le projet requiert des compétences en développement hardware (Crazyflie 2.0, voir https://wiki.bitcraze.io/) et software (langage C/C++/Python/Javascript/HTML...).&lt;br /&gt;
&lt;br /&gt;
Il se divise en 4 étapes principales, qui sont:&lt;br /&gt;
*1) Choisir les technologies utilisées&lt;br /&gt;
*2) Choisir l'architecture (OS / APIs)&lt;br /&gt;
*3) Développer les différentes parties du projet&lt;br /&gt;
*4) Intégrer et connecter les différentes parties du projet&lt;br /&gt;
&lt;br /&gt;
La localisation étant en intérieur, le protocole GPS n'est donc pas assez précis pour les applications ciblées. La mise en place d'un tel dispositif permettrait grâce à l'utilisation d'un algorithme d'estimer avec une bonne précision les positions en intérieur d'une balise centrale (appelée Tag) et de balises (appelées Anchor). Le Tag scanne en temps réel la distance relative aux différentes balises, et il nous est retourné la position des balises et du Tag grâce à l'algorithme de localisation.&lt;br /&gt;
&lt;br /&gt;
Le projet se compose de 3 parties:&lt;br /&gt;
* Collect &amp;amp; parse: collecter les données envoyées par les balises en communiquant avec un serveur et récupérer les données adéquates par un tri&lt;br /&gt;
* Localise: déterminer la matrice de position des balises et du Tag en traitant les données récupérées&lt;br /&gt;
* Display: développer l'interface homme machine pour afficher, étudier et utiliser les données traitées&lt;br /&gt;
&lt;br /&gt;
Nous travaillerons dans un premier temps dans une optique temps différé avant de travailler en temps réel. Cela nous permettra d'acquérir des données utiles et réutilisables en aval. &lt;br /&gt;
&lt;br /&gt;
A l'aboutissement du projet, nous devrions être capable via l'interface homme machine développée d'afficher précisément la position spatiale des balises ainsi que du Tag, grâce àl'utilisation d'un algorithme de localisation et des données récupérées, et d'afficher d'autres données relatives au déplacement du Tag ou des balises dans l'espace. &lt;br /&gt;
&lt;br /&gt;
Si le temps le permet, nous pourrons aussi être amenés à adapter et utiliser l'interface développée pour l'utilisation d'un drone.&lt;br /&gt;
&lt;br /&gt;
''Sujet originel''&lt;br /&gt;
&lt;br /&gt;
To achieve the control of quadrotors, the first important task to give its position information. This project is to develop a software(GUI) to localize the quadrotors in real-time. The quadrotor is flying in an environment where several transmitters have been installed. The quadrotor is equipped with a deck to receive the relative distances between the deck and all transmitters, based on which different algorithms will be implemented to realize the real-time localization. The candidates need to have both experiences on hardware (Crazyflie 2.0, see https://wiki.bitcraze.io/) and software development (C/C , Python…). &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Calendrier prévisionnel&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
''[[Avant le 29/09/17]]'' - Élaboration du Cahier des charges, de la liste des tâches et du calendrier prévisionnel&lt;br /&gt;
&lt;br /&gt;
''[[Avant fin Octobre]]'' - Serveur de collecte et début du développement de l'interface logicielle&lt;br /&gt;
&lt;br /&gt;
''[[Avant fin Décembre]]'' - Interface logicielle&lt;br /&gt;
&lt;br /&gt;
''[[A la fin du PFE]]'' - Intégration finale des différentes parties (Serveur de collecte des données &amp;amp; Serveur de localisation &amp;amp; Interface logicielle)&lt;br /&gt;
&lt;br /&gt;
Répartition du volume de travail (***h):&lt;br /&gt;
&lt;br /&gt;
* Recherche sur les technologies à utiliser&lt;br /&gt;
* Développement du serveur de collecte de données&lt;br /&gt;
* Réalisation de l'interface logicielle (Web//Logiciel/Application)&lt;br /&gt;
* Intégration des différentes parties&lt;br /&gt;
* Test et débuggage&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Choix techniques : matériel et logiciel&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
Afin de développer ce dispositif, nous allons utiliser une Raspberry Pi 3 associée à une carte réceptrice, qui communique avec 4 balises composées chacune d'un microcontrôleur et d'une carte émettrice radio (UWB5C) et alimentées par batteries. La carte réceptrice joue le rôle du drone à localiser et communiquera les données émises par les balises vers l'ordinateur via Bluetooth.&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Choix technologiques&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
Voici les technologies que nous utilisons pour chacune des parties de ce projet.&lt;br /&gt;
&lt;br /&gt;
    1) Serveur de collecte des données:&lt;br /&gt;
       Scanne et parse les données récupérées pour fournir la matrice D des distances relatives du tag aux 4 balises&lt;br /&gt;
        - API&lt;br /&gt;
        - Python / Serveur Flask&lt;br /&gt;
&lt;br /&gt;
    2) Serveur de localisation (fourni):&lt;br /&gt;
       Calcule grâce à l'algorithme de localisation et la matrice D les positions spatiales des 4 noeuds et du tag&lt;br /&gt;
        - API&lt;br /&gt;
        - Bootstrap&lt;br /&gt;
        - Jquery&lt;br /&gt;
        - Python&lt;br /&gt;
&lt;br /&gt;
    3) Interface utilisateur:&lt;br /&gt;
       Affiche courbes, visualisation 3D, boutons ou données des fichiers envoyées par le serveur de localisation&lt;br /&gt;
        - HTML5 / Javascript&lt;br /&gt;
        - Fichiers JSON (serveurs de collecte et de localisation)&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Calendrier prévisionnel'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Liste des tâches à effectuer&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
# Se documenter sur le projet&lt;br /&gt;
##Langages et technologies utilisées&lt;br /&gt;
##Matériel utilisé&lt;br /&gt;
##Mettre en place du travail sur le Git&lt;br /&gt;
# Réaliser le serveur de collecte&lt;br /&gt;
##Récupérer les trames envoyées par bluetooth par le TAG via la Raspberry Pi&lt;br /&gt;
##Intégrer le serveur de localisation pour interpréter les trames&lt;br /&gt;
##Tester et optimiser&lt;br /&gt;
# Réaliser l'interface Web utilisateur&lt;br /&gt;
##Implémenter le serveur de collecte et de localisation&lt;br /&gt;
##Afficher et traiter les données stockées dans les fichiers JSON via le serveur (temps différé + temps réel)&lt;br /&gt;
##Tester et optimiser&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;Replanification du cahier des charges / calendrier&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Feuille d'heures'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Tâche !! Prélude !! Heures S1 !! Heures S2 !! Heures S3 !! Heures S4 !! Heures S5 !! Heures S6 !! Heures S7 !! Heures S8 !! Heures S9 !! Heures S10 !! Heures S11 !! Heures S12 !! Heures S13 !! Heures S14 !! Heures S15 !! Heures S16 !! Heures S17 !! Heures S18 !! Heures S19 !! Total&lt;br /&gt;
|-&lt;br /&gt;
| Cahier des charges / Wiki / Gitlab / Rapport&lt;br /&gt;
|  4h&lt;br /&gt;
|  3h&lt;br /&gt;
|  1h&lt;br /&gt;
|  x&lt;br /&gt;
|  1h30&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h30&lt;br /&gt;
|  1h&lt;br /&gt;
|  3h&lt;br /&gt;
|  3h30&lt;br /&gt;
|  2h&lt;br /&gt;
|  5h&lt;br /&gt;
|  x&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Documentation sur les technos utilisées&lt;br /&gt;
|  2h&lt;br /&gt;
|  4h&lt;br /&gt;
|  3h&lt;br /&gt;
|  2h&lt;br /&gt;
|  3h&lt;br /&gt;
|  4h&lt;br /&gt;
|  5h&lt;br /&gt;
|  5h30&lt;br /&gt;
|  4h30&lt;br /&gt;
|  3h30&lt;br /&gt;
|  2h&lt;br /&gt;
|  3h&lt;br /&gt;
|  1h&lt;br /&gt;
|  3h&lt;br /&gt;
|  4h&lt;br /&gt;
|  x&lt;br /&gt;
|  2h&lt;br /&gt;
|  &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Documentation sur le matériel&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  1h&lt;br /&gt;
|  1h&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Recherche et développement du serveur de collecte&lt;br /&gt;
|  x&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  3h&lt;br /&gt;
|  3h30&lt;br /&gt;
|  4h&lt;br /&gt;
|  5h&lt;br /&gt;
|  7h&lt;br /&gt;
|  4h30&lt;br /&gt;
|  0,5h&lt;br /&gt;
|  3h&lt;br /&gt;
|  4h&lt;br /&gt;
|  3h&lt;br /&gt;
|  x&lt;br /&gt;
|  4h&lt;br /&gt;
|  7h30&lt;br /&gt;
|  5h&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Recherche et développement de l'interface Web&lt;br /&gt;
|  x&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  3h&lt;br /&gt;
|  5h&lt;br /&gt;
|  6h&lt;br /&gt;
|  4h&lt;br /&gt;
|  7h&lt;br /&gt;
|  5h30&lt;br /&gt;
|  2h30&lt;br /&gt;
|  6h&lt;br /&gt;
|  8h&lt;br /&gt;
|  5h&lt;br /&gt;
|  1h&lt;br /&gt;
|  8h&lt;br /&gt;
|  4h&lt;br /&gt;
|  4h&lt;br /&gt;
|  &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Recherche et intégration du serveur de localisation&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x &lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  6h&lt;br /&gt;
|  5h&lt;br /&gt;
|  3h&lt;br /&gt;
|  &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Intégration des différentes parties&lt;br /&gt;
|  x&lt;br /&gt;
|  x  &lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  2h&lt;br /&gt;
|  2h&lt;br /&gt;
|  2h&lt;br /&gt;
|  3h&lt;br /&gt;
|  1h30&lt;br /&gt;
|  x&lt;br /&gt;
|  3h&lt;br /&gt;
|  6h&lt;br /&gt;
|  5h&lt;br /&gt;
|  x&lt;br /&gt;
|  3h30&lt;br /&gt;
|  2h&lt;br /&gt;
|  2h&lt;br /&gt;
|  &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Tests et débuggage&lt;br /&gt;
|  x&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  1h&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  3h&lt;br /&gt;
|  4h&lt;br /&gt;
|  0,5h&lt;br /&gt;
|  3h&lt;br /&gt;
|  1h&lt;br /&gt;
|  3h&lt;br /&gt;
|  3h&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  4h&lt;br /&gt;
|  &lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Optimisation/Correction des programmes&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Vidéo&lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Avancement du Projet'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Phase préparatoire'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Jeu 21/09/17 - Ven 22/09/17]]'' &lt;br /&gt;
*Rendez-vous de mise au point du cahier des charges avec les encadrants/intervenants (M. ZHENG Gang et M. DAGHER Roudy)&lt;br /&gt;
*Elaboration du cahier des charges&lt;br /&gt;
*Elaboration de la page Wiki (préparation de la mise en page et présentation du sujet)&lt;br /&gt;
*Préparation du travail sous forme de Mind Map&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous nous sommes tout d’abord rendus au laboratoire de l'INRIA afin de pouvoir définir le plus précisément possible le cahier des charges avec nos tuteurs.&lt;br /&gt;
Nous avons donc défini avec eux les technologies qu'il faudrait étudier. Vous retrouverez le choix des technologies dans la partie '''choix technologiques'''&lt;br /&gt;
&lt;br /&gt;
Nous avons en même temps créé notre page Wiki, et structurée celle-ci avec les parties qui nous seraient utiles pour développer nos explications par la suite.&lt;br /&gt;
&lt;br /&gt;
Nous avons de plus découpé le travail en sous-parties que nous avions mis dans une '''Mind map''' afin d'y voir plus clair sur la ligne à suivre.&lt;br /&gt;
&lt;br /&gt;
Vous trouverez cette Mind map juste ci-dessous. Nous ne mettrons pas à jour cette Mind map chaque semaine mais il est fort probable que nous en refaisions un en milieu de projet pour pouvoir cibler les objectifs réussis et ceux à atteindre. Nous pourrons de plus redéfinir certains objectifs qui nous auraient semblés trop vague au début du projet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Projet de fin d'étude.png|centre|600px]]&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 1'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Jeu 28/09/17 - Ven 29/09/17]]'' &lt;br /&gt;
*Revue du Cahier des Charges avec les encadrants&lt;br /&gt;
*Lecture et recherches sur les technologies adaptées&lt;br /&gt;
*Construction de la suite de la Mind Map&lt;br /&gt;
*Création du Gitlab&lt;br /&gt;
&lt;br /&gt;
Nous commençons les recherches sur le projet et sur les premières technologies engagées dans celui-ci. Nous en profitons pour formuler dès à présent des questions sur le bon choix de celles-ci. Nous commençons donc des tests ayant seulement pour but de nous familiariser avec l'environnement de travail et de réellement comprendre les fonctions déjà présentes qu'il faudra exploiter et implanter notre interface web.&lt;br /&gt;
Nous créons un dépôt Gitlab avec notre tuteur et commençons a définir les taches premières sur celui-ci.&lt;br /&gt;
Nous en profitons pour affiner le Mind Map.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 2'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Jeu 05/10/17 - Ven 06/10/17]]''  &lt;br /&gt;
*Précisions sur le cahier des charges&lt;br /&gt;
*Listage du matériel&lt;br /&gt;
*Recherche et détermination de solutions technologiques possibles pour les fonctions demandées&lt;br /&gt;
*Début du travail sur le serveur de collecte&lt;br /&gt;
*Apprentissage du langage Python et de l'utilisation du framework Flask&lt;br /&gt;
&lt;br /&gt;
Nous avons finalisé les précisions sur le cahier des charges. Nous avons donc pu cibler le matériel dont nous nous servirons pour ce Projet. Vous trouverez donc cette liste la section correspondante. Il est évident que le matériel utilisé est dans l'ensemble déjà fourni par le laboratoire et qu'il nous reste dans l'ensemble à créer l'interface web et les API qui nous permettrons de faire communiquer cette interface avec la Raspberry Pi et le serveur de position déjà créé.&lt;br /&gt;
Nous avons donc pu commencer à nous former sur les technologies qui nous serviraient par la suite. Nous avons donc utilisé le cours d'Openclassrooms sur les serveurs Flask pour en apprendre les bases. Ce serveur Flask est programmé en Python et nous permet donc une grande liberté au niveau de l’exécution de certains scripts. En effet, les scripts de connexion Bluetooth et de redirection de port qui nous permettent de récupérer les données de distance sont eux-mêmes codés en Python et sont directement appelés via le serveur.&lt;br /&gt;
Dans ce serveur, représentant notre interface web, vous retrouverez la page '''/collecte''' qui représentera notre partie collecte de données ainsi que l'affichage de ces distances. Nous appellerons cette partie le Serveur de Collecte.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 3'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 11/10/17 - Jeu 12/10/17]]''  &lt;br /&gt;
*Recherche et développement initial du serveur de collecte de données&lt;br /&gt;
*Complément du Git sur les tâches à effectuer&lt;br /&gt;
&lt;br /&gt;
Nous avons commencé à créer un serveur Flask renvoyant pour l'instant une matrice aléatoire. Lors de la requête URL &amp;quot;../matrice&amp;quot;, nous voyons bien une matrice aléatoire apparaître sur la page Web. Nous essayons de nous connecter à la Raspberry Pi en redirigeant son port série vers le Bluetooth de façon à récupérer de vraies matrices de distance entre le drone (ie commutateur central) et les balises. Nous pourrons afficher ensuite ces matrices, ou alors les stocker dans un fichier en attendant le traitement de celles-ci.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Requete s3.PNG|300px|serveur Flask]]&lt;br /&gt;
&lt;br /&gt;
Nous avons plusieurs problèmes avec le Bluetooth pour se connecter avec la Raspberry Pi. Quand nous aurons réussi à nous connecter au port série de la Raspberry Pi alors nous pourrons gérer le traitement des données récupérées.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 4'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 18/10/17 - Jeu 19/10/17]]''  &lt;br /&gt;
*Configuration de la Raspberry Pi car problèmes de connectivité Bluetooth rencontrés&lt;br /&gt;
**Nous arrivons à connecter la Raspberry Pi sous Windows mais la connexion sous Linux pose problème (travail en suspens en attendant la disponibilité de l'encadrant)&lt;br /&gt;
*Début du développement de l'interface Web&lt;br /&gt;
**Traitement d'une matrice dans un fichier JSON&lt;br /&gt;
**Affichage sous forme de tableau de la matrice&lt;br /&gt;
**Utilisation du serveur de requête en Python avec chargement de template HTML&lt;br /&gt;
**Mise en forme de la trame de la page en HTML/CSS avec le framework Bootstrap&lt;br /&gt;
**Ajout d'un set de distances (d1, d2, d3, d4) dans la matrice lors d'un appui sur un bouton Chargement en utilisant un fichier Javascript&lt;br /&gt;
&lt;br /&gt;
Nous avons reçu des fonctions Python de notre tuteur afin d'obtenir une connexion Bluetooth entre notre Raspberry Pi et notre ordinateur ainsi qu'une redirection de port de celle-ci vers la connexion. Nous n'arrivons pas à utiliser ces fonctions sous linux et nous nécessitons une explication de notre tuteur n'étant pas disponible à ce moment. Pour ne pas perdre de temps, nous attaquons la création de l'interface web à proprement parler, c'est à dire la création des pages HTML ainsi que le document Javascript qui nous servira de bibliothèque de fonctions. Chaque route de notre serveur est reliée à une série de fonctions Python s'exécutant à l'appel des url puis suivies d'un template de la page HTML en question. Nous en profitons de plus pour explorer le framework CSS bootstrap afin de mettre un premier design et une structure a notre page collecte qui sera la page principale de notre site pour ce début de projet.&lt;br /&gt;
&lt;br /&gt;
Nous nous essayons de plus à différents tests sur des fichiers de format '''JSON''' que nous devrons réussir à traiter correctement plus tard dans notre projet.&lt;br /&gt;
Nous récupérons une matrice que nous créons nous-mêmes en Python (simulation d'une série de distances récupérée) que nous transformons au format JSON pour ensuite l'afficher sur notre page web. Pour pouvoir proprement afficher ce fichier '''JSON''' renvoyé vers notre page, nous nous servons du fichier Javascript afin de créer du code HTML contenant la matrice.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 5'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 25/10/17 - Ven 27/10/17]]''  &lt;br /&gt;
*Résolution des problèmes de connectique Bluetooth sur la Raspberry Pi&lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Traitement d'une matrice dans un fichier JSON&lt;br /&gt;
**Début de l'ajout d'un set de distances depuis une matrice contenue dans un fichier JSON&lt;br /&gt;
&lt;br /&gt;
Nous avons pu nous entretenir avec notre tuteur et donc comprendre les fonctions de connexion et de redirection de port. Nous pouvons donc continuer le développement de notre interface web. Nous arrivons à traiter un set de données au format JSON et à l'afficher dans le code HTML. Toutefois nous créons nous-mêmes ce set, il est maintenant nécessaire que nous arrivions à récupérer les sets de distance réels reçus par la connexion Bluetooth. Nous commencerons par un traitement asynchrone. L'idée est d’enregistrer les sets de distances dans un fichier '''JSON''' stocké dans un dossier. Nous appellerons ce dossier plus tard via une requête Ajax.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 6'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 08/11/17 - Ven 10/11/17]]''  &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
**Mise en place de la communication entre le port série de notre machine et le port série de la carte via Bluetooth de la RPi3&lt;br /&gt;
**Récupération et traitement (parse) manuels des données de distances dans un fichier .log via TCP/IP&amp;lt;-&amp;gt;Bluetooth&lt;br /&gt;
**Début de l'automatisation du procédé par script Python (requete.py) et mise en place de sockets de communication&lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Chargement sur commande d'un set de distances depuis une matrice contenue dans un fichier JSON&lt;br /&gt;
*Travail sur le layout du site&lt;br /&gt;
&lt;br /&gt;
Après avoir regardé le code de ces différentes fonctions nous avons pu faire des tests manuels via le Shell pour récupérer des données de distances et les stocker dans un fichier '''JSON''' sur notre ordinateur.&lt;br /&gt;
&lt;br /&gt;
Nous utilisons les commandes suivantes pour se connecter via Bluetooth:&lt;br /&gt;
&lt;br /&gt;
 rfcomm connect /dev/rfcomm0 B8:27:EB:80:DC:89 1&lt;br /&gt;
&lt;br /&gt;
Rediriger le port de la Raspberrypi3 vers la connexion:&lt;br /&gt;
&lt;br /&gt;
 Python lps-collector/tcp_serial_redirect.py /dev/rfcomm0 9600&lt;br /&gt;
&lt;br /&gt;
Collecter les données dans un fichier dont nous définissons le nom:&lt;br /&gt;
&lt;br /&gt;
 echo &amp;quot;cu -s9600 -lttyACM0&amp;quot;| nc localhost 7777&lt;br /&gt;
 nc localhost 7777 | grep distance &amp;gt; static/log/dist-capture'+date+'.log&lt;br /&gt;
&lt;br /&gt;
Nous pouvons '''parser''' le flux de données avant de le stocker dans le fichier via cette commande:&lt;br /&gt;
&lt;br /&gt;
 Python lps-collector/lps_parse.py static/log/dist-capture&amp;quot;+date+&amp;quot;.log&lt;br /&gt;
&lt;br /&gt;
Il est donc nécessaire d'inclure via des '''thread''' ces différentes fonctions dans notre serveur Python (Flask) afin d'automatiser le processus. Le but est de pouvoir choisir sur l'interface web quels fonctions il faut exécuter et les déclencher via l'appui sur des boutons.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 7'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 15/11/17 - Ven 17/11/17]]''  &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
**Récupération et traitement (parse) manuels des données de distances dans un fichier .log via TCP/IP&amp;lt;-&amp;gt;Bluetooth&lt;br /&gt;
**Automatisation du procédé par script Python (requete.py)&lt;br /&gt;
***Mise en place de sockets de communication pour le contrôle de la collecte -&amp;gt; abandonné (servait à commander la collecte manuellement)&lt;br /&gt;
***Développement d'un script engine.py regroupant les commandes exécutables par l'utilisateur via la page Web&lt;br /&gt;
***Début du travail sur la fonction &amp;quot;STOP&amp;quot; manuel d'une action de collecte de données (liaison entre script HTML, Javascript, et script Python)&lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Chargement sur commande d'un set de distances depuis une matrice contenue dans un fichier JSON&lt;br /&gt;
**Travail sur le layout du site&lt;br /&gt;
***Ajout des différentes commandes (connexion Bluetooth, lancement commande cu, collecte des données, collecte durée donnée)&lt;br /&gt;
***Début de l'implémentation de la visualisation des fichiers .JSON obtenus après collecte et affichage dans un tableau matriciel du fichier sélectionné&lt;br /&gt;
&lt;br /&gt;
Nous avons continué à travailler sur le serveur de collecte: les données que nous avons récupérées via Bluetooth sont stockées dans un fichier .log. Apres avoir bien compris comment marchait la fonction '''parse''' manuellement (lors de son utilisation dans le Shell), nous l'avons implémentée dans notre serveur de collecte qui lance cette commande lors de l’appui sur un bouton via notre interface virtuelle. Un problème rencontré était de savoir quand la récolte des données devait s’arrêter. Nous avons donc rajouté un temps à entrer nous-même sur l'interface. La fonction '''parse''' est effectuée et le sous-processus va attendre le temps donné avant de lancer une commande permettant de tuer le processus et mettant donc fin au remplissage du fichier '''.log'''. Nous voulons de plus réussir à lancer une fonction de collecte sans temps. C'est à dire que nous coupons la collecte via un bouton par nous-mêmes. Nous voulions utiliser des Sockets pour pouvoir définir nous-mêmes la gestion de la communication mais l'idée a été abandonné car nous avons réussi à sauvegarder le PID du processus lancé. Il nous suffit donc de l’arrêter grâce à un autre bouton qui récupère cette variable et l’arrête ensuite. &lt;br /&gt;
&lt;br /&gt;
Toutes nos fonctions Pythons étant regroupées dans notre serveur '''requete.py''', nous avons décidé de créer un module qui regroupera toutes ces fonctions que nous pourrons utiliser dans '''requete.py'''. ceci nous permet de voir plus clair dans notre code et de faciliter le travail lorsque nous modifions le code tous les deux.&lt;br /&gt;
&lt;br /&gt;
Nous essayons en continu d'adapter le layout du site pour le rendre le plus attractif et simple possible, de façon à ce que chaque bouton et tableau soient clairs et compréhensibles.&lt;br /&gt;
&lt;br /&gt;
Nous avons commencé à récupérer les fichiers '''JSON''' créés à partir des fichier '''log''', c'est-à-dire que ces fichiers sont automatiquement stockés coté serveur dans un dossier nommé '''static/log'''. Notre but est de récupérer le nom des fichiers JSON et de les afficher dans un composant sur notre interface web. Il nous sera donc possible ensuite de sélectionner le nom d'un fichier. Lors de la sélection de ce nom de fichier, un tableau apparaît avec les valeurs de distances à l’intérieur.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 8'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 22/11/17 - Ven 24/11/17]]''  &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
**Automatisation du procédé de collecte par script Python (requete.py qui fait appel à engine.py)&lt;br /&gt;
***Développement d'un script engine.py regroupant les commandes exécutables par l'utilisateur via la page Web&lt;br /&gt;
***Travail sur la fonction &amp;quot;STOP&amp;quot; manuel d'une action de collecte de données (liaison entre script HTML, Javascript, et script Python)&lt;br /&gt;
***Mise en place d'un serveur HTTP Simple sous Python pour accéder aux fichiers de données à partir de la page Web&lt;br /&gt;
***Mise à jour de fonctions de connexion &lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Travail sur le layout du site (ajout de pages, navigation entre les pages, apparence, nettoyage des codes)&lt;br /&gt;
**Bon fonctionnement de l'ensemble serveur collecte + serveur HTTP + client Web&lt;br /&gt;
**Affichage de la liste des fichiers de données de distance (log, csv, JSON) via serveur HTTP en Python sur port 9999&lt;br /&gt;
*Corrections et nettoyage du dépôt GIT&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous continuons à développer les points énoncés la semaine dernière. Nous avons décidé de nous diriger vers un serveur HTTP Simple pour accéder à nos fichiers. Il s’avère que nous finirons par ne pas utiliser ce serveur. Nous irons récupérer les fichiers en question via des requêtes '''Ajax''' faites à la sélection du nom du fichier.&lt;br /&gt;
&lt;br /&gt;
Nous rencontrons depuis le début des problèmes avec les fonctions de connexion qui peuvent ne pas marcher à un moment donné. Nous essayons de trouver pourquoi ce bug est un bug qui ne se produit pas à chaque fois. Nous avons déterminé qu'il ne se produisait seulement lorsque les fonctions de connexions étaient lancée dans des threads. Nous ne savons toujours pas pourquoi ces thread bugguent seulement parfois et non à chaque essai de connexion.&lt;br /&gt;
&lt;br /&gt;
Nous avons nettoyé notre dépot '''Git''' car il s’avère que nous utilisions une mauvaise méthode de fusion et de stockage des documents.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 9'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 29/11/17 - Jeudi 30/11/17]]''  &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
**Automatisation du procédé de collecte par script Python (requete.py qui fait appel à engine.py)&lt;br /&gt;
***Travail sur la fonction &amp;quot;STOP&amp;quot; manuel d'une action de collecte de données (liaison entre script HTML, Javascript, et script Python)&lt;br /&gt;
***Recherches sur l'utilisation de fichiers JSON accessibles via le serveur HTTP&lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Travail sur le layout du site &lt;br /&gt;
**Travail sur la liaison entre fichiers JSON et affichage Web des données de distance&lt;br /&gt;
***Recherches et tests de solutions&lt;br /&gt;
****Affichage depuis un fichier&lt;br /&gt;
****Affichage à la volée lors d'une action de collecte&lt;br /&gt;
&lt;br /&gt;
*Revue de code avec Roudy DAGHER:&lt;br /&gt;
**Structure globale des codes ok&lt;br /&gt;
**Fonctionnement presque ok: fonctionnalités implémentées ok, mais parsage csv ne marche pas&lt;br /&gt;
**Refactoring nécessaire&lt;br /&gt;
**Correction de la fonction STOP et amélioration de la fonction de COLLECTE&lt;br /&gt;
**Faire plus de requêtes Javascript que de requêtes HTML&lt;br /&gt;
**Discussion pour l'implémentation du serveur de localisation (= algorithme de localisation) et des visualisations de données sur le site Web&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous avons d'abord revu l'ensemble de notre code et les méthodes utilisées avec notre tuteur '''Roudy Dagher'''. Nous nous approchons d'un serveur de collecte de données stable et fonctionnel. Nous avons refait les différentes connexions entre l'interface et le serveur afin de ne faire que des requêtes sur des '''WebServices'''. Il nous est possible de commencer la deuxième partie qui est l'envoi de ces tableaux de données afin de les envoyer vers le serveur de localisation via des API afin de recevoir des matrices de positions.&lt;br /&gt;
Nous pourrons grâce à ces matrices afficher une carte 3D des balises  et du TAG dans l'espace.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 10'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 06/12/17 - Jeudi 07/12/17]]'' &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
**Travail sur la fonction STOP&lt;br /&gt;
**Réalisation d'une expression régulière pour le parsage des fichiers log en fichier JSON&lt;br /&gt;
&lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Travail sur l'affichage des fichiers JSON&lt;br /&gt;
***Réalisation de toutes les requêtes Ajax&lt;br /&gt;
***Réalisation d'un menu déroulant dropdown pour charger le contenu des fichiers JSON dans le tableau de distances&lt;br /&gt;
&lt;br /&gt;
*Nettoyage du dépôt Git&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 11'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 13/12/17]]''  &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
&lt;br /&gt;
*Revue de code avec Roudy DAGHER:&lt;br /&gt;
**Discussion sur la partie système du projet et correction de certaines fonctions&lt;br /&gt;
&lt;br /&gt;
Nous nous sommes réunis avec l'un de nos tuteurs, qui a réalisé certains bouts de code de base, pour nous mettre au point sur les fonctions en question et leur utilisation.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 12'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 20/12/17 - Jeudi 21/12/17]]''&lt;br /&gt;
*Revue, correction et nettoyage des codes&lt;br /&gt;
*Finalisation du rapport&lt;br /&gt;
*Planification de semaines restantes&lt;br /&gt;
*Préparation de la soutenance&lt;br /&gt;
*Revue de mi-projet avec tous les tuteurs&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Cette dernière semaine a servi à finaliser le rapport et à discuter de l'avancée du projet, notamment avec nos tuteurs pour déterminer le travail restant, présenter le travail abouti et replanifier précisément les échéances pour le travail restant. Nous avons réalisé la soutenance de mi-projet le '''jeudi 21/12/17 à 8h'''.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 13'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 10/01/18 - Ven 12/01/18]]''  &lt;br /&gt;
*Travail sur la collecte des données (serveur de collecte et interface Web)&lt;br /&gt;
**Redéfinition du fichier de parsage car il crée des conflits et ne produit pas un fichier formaté de la façon attendue&lt;br /&gt;
***Nombre de balises réel n'est pas bien déterminé par le code&lt;br /&gt;
***ID de la première et de la dernière balise ne sont pas déterminés correctement&lt;br /&gt;
&lt;br /&gt;
**Automatisation de la collecte par un script Shell lançant toutes les commandes de CONNEXION, REDIRECTION, LANCEMENT CU, FERMETURE DU PROGRAMME (kill rfcomm / kill tcp_redirect)&lt;br /&gt;
***Dans le but d'automatiser la procédure&lt;br /&gt;
***Dans le but de résoudre un problème de gestion de ressources (le bug '''thread''' apparu plus tôt dans le projet)&lt;br /&gt;
&lt;br /&gt;
**Travail sur la résolution du bug thread car l'automatisation n'a pas résolu le problème&lt;br /&gt;
***Identification du ou des causes potentielles: gestion des ressources (synchrone, asynchrone ?), connexion Bluetooth, lancement des commandes dans le même script, lancement en fg/bg, conflit dû au temps d'exécution de chaque processus ?&lt;br /&gt;
***Lancement des commandes manuellement dans des terminaux ne pose aucun problème: solution la plus simple&lt;br /&gt;
&lt;br /&gt;
**Redesign de la page Collecte&lt;br /&gt;
***Remplacement des boutons de commande par un bouton unique d'initialisation&lt;br /&gt;
***Travail sur une mise à jour du menu déroulant dropdown régulière sans avoir à recharger la page Web&lt;br /&gt;
***Implémentation de plotly.js, un module Javascript qui permet d'afficher des graphes en 3D&lt;br /&gt;
&lt;br /&gt;
*Mise au point post-soutenance avec Roudy DAGHER pour valider le travail restant, effectué et redéfinir certains objectifs atteignables ou pas selon les éléments réalisés dans le projet&lt;br /&gt;
*Recherches et début de l'implémentation du serveur de localisation fourni par les tuteurs&lt;br /&gt;
*Gestion du Git pour créer des branches additionnelles&lt;br /&gt;
*Recréation du rapport de projet suite à une perte du fichier éditable d'origine + Mise à jour avec les remarques suite à la soutenance ainsi que les nouveaux éléments&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 14'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mar 16/01/18 - Ven 19/01/18]]''  &lt;br /&gt;
*Travail sur la collecte des données (serveur de collecte et interface Web)&lt;br /&gt;
**Redéfinition du fichier de parsage car il crée des conflits et ne produit pas un fichier formaté de la façon attendue&lt;br /&gt;
***Corrigé: Nombre de balises réel n'est pas bien déterminé par le code&lt;br /&gt;
***Corrigé: ID de la première et de la dernière balise ne sont pas déterminés correctement&lt;br /&gt;
***Reste à faire: Traiter le cas où il y a un ajout ou suppression d'une balise pendant la collecte (pour le moment, lorsque c'est le cas, toutes les données se décalent au lieu de laisser des trous)&lt;br /&gt;
&lt;br /&gt;
**Automatisation de la collecte par un script Shell lançant toutes les commandes de CONNEXION, REDIRECTION, LANCEMENT CU, FERMETURE DU PROGRAMME (kill rfcomm / kill tcp_redirect)&lt;br /&gt;
***Mis en suspens: pour le moment, on lance les commandes manuellement dans le terminal&lt;br /&gt;
&lt;br /&gt;
**Interface Web&lt;br /&gt;
***Implémentation de plotly.js, un module Javascript qui permet d'afficher des graphes en 3D&lt;br /&gt;
&lt;br /&gt;
*Implémentation du serveur de localisation fourni par les tuteurs (mais algorithme de localisation pas fonctionnel pour le moment)&lt;br /&gt;
**Mise à jour de l'affichage des positions des éléments: précédemment seule la matrice X de position du Tag s'affichait, et pas la matrice A des balises&lt;br /&gt;
**Requêtes manuelles à l'API avec la fonction curl OK: on arrive à récupérer les matrices X et A (aléatoires pour le moment) par une requête GET à l'API du serveur de localisation&lt;br /&gt;
**Implémentation des requêtes Ajax pour automatiser les requêtes au serveur de localisation&lt;br /&gt;
&lt;br /&gt;
*Mise à jour du rapport les nouveaux éléments du travail réalisé&lt;br /&gt;
*Réflexion sur la possibilité ou non de réaliser la partie temps réel du projet au vu des moyens à disposition&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 15'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mar 23/01/18 - Ven 26/01/18]]'' &lt;br /&gt;
*Travail sur la collecte des données (serveur de collecte et interface Web)&lt;br /&gt;
**Redéfinition du fichier de parsage car il crée des conflits et ne produit pas un fichier formaté de la façon attendue&lt;br /&gt;
***Fait: Si distance négative car Tag trop près, la valeur négative générée par une balise est remplacée par un &amp;quot;0&amp;quot; (cela modifie la position réelle modélisée dans plotly, mais évite une impossibilité de générer la position à partir de la distance -&amp;gt; par des tests, il faudra déterminer la valeur limite à partir de laquelle les cartes donnent des valeurs de distance négatives&lt;br /&gt;
***Reste à faire: Traiter le cas où il y a un ajout ou suppression d'une balise pendant la collecte (pour le moment, lorsque c'est le cas, toutes les données se décalent au lieu de laisser des trous); Ainsi que le cas où il y un saut/bug inattendu et donc une disparition d'une ou plusieurs valeurs de distance&lt;br /&gt;
***Début de résolution du cas où une distance n'est pas prise en compte, c'est à dire où il y a une valeur qui disparaît et désaligne les valeurs lors de la création du JSON&lt;br /&gt;
&lt;br /&gt;
**Automatisation de la collecte par un script Shell lançant toutes les commandes de CONNEXION, REDIRECTION, LANCEMENT CU, FERMETURE DU PROGRAMME (kill rfcomm / kill tcp_redirect)&lt;br /&gt;
***Mis en suspens: pour le moment, on lance les commandes manuellement dans le terminal&lt;br /&gt;
***Création d'un script bash /etc/init.d/autoconnect.sh pour connecter automatiquement la RPi au lancement du système (si la RPi est déjà allumée au démarrage)&lt;br /&gt;
&lt;br /&gt;
**Interface Web&lt;br /&gt;
***Perfectionnement de l'utilisation de Plotly pour les visualisations&lt;br /&gt;
&lt;br /&gt;
*Implémentation du serveur de localisation fourni par les tuteurs (algorithme de localisation pas fonctionnel pour le moment)&lt;br /&gt;
**Requêtes manuelles à l'API avec la fonction curl OK&lt;br /&gt;
**Fait: Implémentation des requêtes Ajax pour automatiser les requêtes au serveur de localisation&lt;br /&gt;
***Liaison entre les différentes requêtes ajax grâce à des variables: permet de stocker l'adresse du job récupérée par la méthode GET&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 16'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Lun 29/01/18 - Ven 02/02/18]]'' &lt;br /&gt;
*Travail sur la collecte des données (serveur de collecte et interface Web)&lt;br /&gt;
**Redéfinition du fichier de parsage car il crée des conflits et ne produit pas un fichier formaté de la façon attendue&lt;br /&gt;
***déterminer la valeur limite à partir de laquelle les cartes donnent des valeurs de distance négatives&lt;br /&gt;
***Reste à faire: Traiter le cas où il y a un ajout ou suppression d'une balise pendant la collecte (pour le moment, lorsque c'est le cas, toutes les données se décalent au lieu de laisser des trous); Ainsi que le cas où il y un saut/bug inattendu et donc une disparition d'une ou plusieurs valeurs de distance&lt;br /&gt;
***Fait: gestion des bugs/sauts de valeurs de balises - remplacement par une valeur nulle sur balise existe, par rien sinon (implémentation d'un tableau caractérisant l'existence ou pas de chaque balise 1 à 6), optimisation des temps de calculs/exécution dans le script&lt;br /&gt;
**Interface Web&lt;br /&gt;
***Ajout d'une barre de progression de la collecte remplaçant le bouton de Lancement de collecte lors de l'appui&lt;br /&gt;
***Ajout d'un bouton dropdown pour afficher les fichiers de position qu'on reçoit du serveur de localisation&lt;br /&gt;
***Ajout d'une scrollbar dans les deux dropdown&lt;br /&gt;
&lt;br /&gt;
*Implémentation du serveur de localisation fourni par les tuteurs (algorithme de localisation pas fonctionnel pour le moment)&lt;br /&gt;
**Fait: Implémentation des requêtes Ajax pour automatiser les requêtes au serveur de localisation&lt;br /&gt;
***Création d'une requête Ajax GET qui demande le fichier JSON de position au serveur de localisation jusqu'à ce qu'il soit retourné&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Observations'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Problèmes rencontrés'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Solutions apportées'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Délivrables'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
Rapport de mi-PFE&lt;br /&gt;
[[Fichier:RapportMi-PFE-UNG DELATTE.pdf]]&lt;br /&gt;
&lt;br /&gt;
Rapport de PFE&lt;br /&gt;
&lt;br /&gt;
Vidéo&lt;/div&gt;</summary>
		<author><name>Hdelatte</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=P18_Localisation_of_quadrotors&amp;diff=50218</id>
		<title>P18 Localisation of quadrotors</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=P18_Localisation_of_quadrotors&amp;diff=50218"/>
				<updated>2018-02-07T16:38:22Z</updated>
		
		<summary type="html">&lt;p&gt;Hdelatte : /* Semaine 15 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Cahier des charges'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;Présentation générale du projet&amp;lt;/span&amp;gt;=== &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Contexte&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
Dans un monde de plus en plus connecté, de nombreux drones sont déployés pour diverses applications comme l'espionnage, la surveillance, la cartographie de lieux et la livraison de colis. Les technologies nécessaires pour contrôler ces drones sont des sujets de recherche actuels. &lt;br /&gt;
&lt;br /&gt;
Le contrôle de ceux-ci passe tout d'abord par la maîtrise de leur position dans l'espace. Le développement des applications liées à l'utilisation de drones nécessite un travail important sur la localisation spatiale d'objets connectés. &lt;br /&gt;
&lt;br /&gt;
De plus, dans un souci d'utilisation, il est essentiel de développer des interfaces logicielles permettant d'exploiter ces données.&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Objectif du projet&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
L'objectif de ce projet est de développer une interface logicielle permettant de traiter en temps réel les informations de localisation d'un drone et de balises, dans le but de définir leur localisation dans l'espace, en intérieur.&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Description du projet&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
Pour réaliser le contrôle de drones, la première étape importante est de donner ses informations de position. Le but du projet est de développer une interface logicielle permettant de localiser le drone en temps réel en intérieur. Le drone se déplace dans un environnement dans lequel ont été installées de multiples balises. Il est équipé d'une carte, lui permettant de recevoir les distances relatives entre lui-même et les balises, sur laquelle différents algorithmes vont être implémentés pour effectuer la localisation en temps réel. Le projet requiert des compétences en développement hardware (Crazyflie 2.0, voir https://wiki.bitcraze.io/) et software (langage C/C++/Python/Javascript/HTML...).&lt;br /&gt;
&lt;br /&gt;
Il se divise en 4 étapes principales, qui sont:&lt;br /&gt;
*1) Choisir les technologies utilisées&lt;br /&gt;
*2) Choisir l'architecture (OS / APIs)&lt;br /&gt;
*3) Développer les différentes parties du projet&lt;br /&gt;
*4) Intégrer et connecter les différentes parties du projet&lt;br /&gt;
&lt;br /&gt;
La localisation étant en intérieur, le protocole GPS n'est donc pas assez précis pour les applications ciblées. La mise en place d'un tel dispositif permettrait grâce à l'utilisation d'un algorithme d'estimer avec une bonne précision les positions en intérieur d'une balise centrale (appelée Tag) et de balises (appelées Anchor). Le Tag scanne en temps réel la distance relative aux différentes balises, et il nous est retourné la position des balises et du Tag grâce à l'algorithme de localisation.&lt;br /&gt;
&lt;br /&gt;
Le projet se compose de 3 parties:&lt;br /&gt;
* Collect &amp;amp; parse: collecter les données envoyées par les balises en communiquant avec un serveur et récupérer les données adéquates par un tri&lt;br /&gt;
* Localise: déterminer la matrice de position des balises et du Tag en traitant les données récupérées&lt;br /&gt;
* Display: développer l'interface homme machine pour afficher, étudier et utiliser les données traitées&lt;br /&gt;
&lt;br /&gt;
Nous travaillerons dans un premier temps dans une optique temps différé avant de travailler en temps réel. Cela nous permettra d'acquérir des données utiles et réutilisables en aval. &lt;br /&gt;
&lt;br /&gt;
A l'aboutissement du projet, nous devrions être capable via l'interface homme machine développée d'afficher précisément la position spatiale des balises ainsi que du Tag, grâce àl'utilisation d'un algorithme de localisation et des données récupérées, et d'afficher d'autres données relatives au déplacement du Tag ou des balises dans l'espace. &lt;br /&gt;
&lt;br /&gt;
Si le temps le permet, nous pourrons aussi être amenés à adapter et utiliser l'interface développée pour l'utilisation d'un drone.&lt;br /&gt;
&lt;br /&gt;
''Sujet originel''&lt;br /&gt;
&lt;br /&gt;
To achieve the control of quadrotors, the first important task to give its position information. This project is to develop a software(GUI) to localize the quadrotors in real-time. The quadrotor is flying in an environment where several transmitters have been installed. The quadrotor is equipped with a deck to receive the relative distances between the deck and all transmitters, based on which different algorithms will be implemented to realize the real-time localization. The candidates need to have both experiences on hardware (Crazyflie 2.0, see https://wiki.bitcraze.io/) and software development (C/C , Python…). &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Calendrier prévisionnel&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
''[[Avant le 29/09/17]]'' - Élaboration du Cahier des charges, de la liste des tâches et du calendrier prévisionnel&lt;br /&gt;
&lt;br /&gt;
''[[Avant fin Octobre]]'' - Serveur de collecte et début du développement de l'interface logicielle&lt;br /&gt;
&lt;br /&gt;
''[[Avant fin Décembre]]'' - Interface logicielle&lt;br /&gt;
&lt;br /&gt;
''[[A la fin du PFE]]'' - Intégration finale des différentes parties (Serveur de collecte des données &amp;amp; Serveur de localisation &amp;amp; Interface logicielle)&lt;br /&gt;
&lt;br /&gt;
Répartition du volume de travail (***h):&lt;br /&gt;
&lt;br /&gt;
* Recherche sur les technologies à utiliser&lt;br /&gt;
* Développement du serveur de collecte de données&lt;br /&gt;
* Réalisation de l'interface logicielle (Web//Logiciel/Application)&lt;br /&gt;
* Intégration des différentes parties&lt;br /&gt;
* Test et débuggage&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Choix techniques : matériel et logiciel&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
Afin de développer ce dispositif, nous allons utiliser une Raspberry Pi 3 associée à une carte réceptrice, qui communique avec 4 balises composées chacune d'un microcontrôleur et d'une carte émettrice radio (UWB5C) et alimentées par batteries. La carte réceptrice joue le rôle du drone à localiser et communiquera les données émises par les balises vers l'ordinateur via Bluetooth.&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Choix technologiques&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
Voici les technologies que nous utilisons pour chacune des parties de ce projet.&lt;br /&gt;
&lt;br /&gt;
    1) Serveur de collecte des données:&lt;br /&gt;
       Scanne et parse les données récupérées pour fournir la matrice D des distances relatives du tag aux 4 balises&lt;br /&gt;
        - API&lt;br /&gt;
        - Python / Serveur Flask&lt;br /&gt;
&lt;br /&gt;
    2) Serveur de localisation (fourni):&lt;br /&gt;
       Calcule grâce à l'algorithme de localisation et la matrice D les positions spatiales des 4 noeuds et du tag&lt;br /&gt;
        - API&lt;br /&gt;
        - Bootstrap&lt;br /&gt;
        - Jquery&lt;br /&gt;
        - Python&lt;br /&gt;
&lt;br /&gt;
    3) Interface utilisateur:&lt;br /&gt;
       Affiche courbes, visualisation 3D, boutons ou données des fichiers envoyées par le serveur de localisation&lt;br /&gt;
        - HTML5 / Javascript&lt;br /&gt;
        - Fichiers JSON (serveurs de collecte et de localisation)&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Calendrier prévisionnel'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Liste des tâches à effectuer&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
# Se documenter sur le projet&lt;br /&gt;
##Langages et technologies utilisées&lt;br /&gt;
##Matériel utilisé&lt;br /&gt;
##Mettre en place du travail sur le Git&lt;br /&gt;
# Réaliser le serveur de collecte&lt;br /&gt;
##Récupérer les trames envoyées par bluetooth par le TAG via la Raspberry Pi&lt;br /&gt;
##Intégrer le serveur de localisation pour interpréter les trames&lt;br /&gt;
##Tester et optimiser&lt;br /&gt;
# Réaliser l'interface Web utilisateur&lt;br /&gt;
##Implémenter le serveur de collecte et de localisation&lt;br /&gt;
##Afficher et traiter les données stockées dans les fichiers JSON via le serveur (temps différé + temps réel)&lt;br /&gt;
##Tester et optimiser&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;Replanification du cahier des charges / calendrier&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Feuille d'heures'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Tâche !! Prélude !! Heures S1 !! Heures S2 !! Heures S3 !! Heures S4 !! Heures S5 !! Heures S6 !! Heures S7 !! Heures S8 !! Heures S9 !! Heures S10 !! Heures S11 !! Heures S12 !! Heures S13 !! Heures S14 !! Heures S15 !! Heures S16 !! Heures S17 !! Heures S18 !! Heures S19 !! Total&lt;br /&gt;
|-&lt;br /&gt;
| Cahier des charges / Wiki / Gitlab / Rapport&lt;br /&gt;
|  4h&lt;br /&gt;
|  3h&lt;br /&gt;
|  1h&lt;br /&gt;
|  x&lt;br /&gt;
|  1h30&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h30&lt;br /&gt;
|  1h&lt;br /&gt;
|  3h&lt;br /&gt;
|  3h30&lt;br /&gt;
|  2h&lt;br /&gt;
|  5h&lt;br /&gt;
|  x&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Documentation sur les technos utilisées&lt;br /&gt;
|  2h&lt;br /&gt;
|  4h&lt;br /&gt;
|  3h&lt;br /&gt;
|  2h&lt;br /&gt;
|  3h&lt;br /&gt;
|  4h&lt;br /&gt;
|  5h&lt;br /&gt;
|  5h30&lt;br /&gt;
|  4h30&lt;br /&gt;
|  3h30&lt;br /&gt;
|  2h&lt;br /&gt;
|  3h&lt;br /&gt;
|  1h&lt;br /&gt;
|  3h&lt;br /&gt;
|  4h&lt;br /&gt;
|  x&lt;br /&gt;
|  2h&lt;br /&gt;
|  &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Documentation sur le matériel&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  1h&lt;br /&gt;
|  1h&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Recherche et développement du serveur de collecte&lt;br /&gt;
|  x&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  3h&lt;br /&gt;
|  3h30&lt;br /&gt;
|  4h&lt;br /&gt;
|  5h&lt;br /&gt;
|  7h&lt;br /&gt;
|  4h30&lt;br /&gt;
|  0,5h&lt;br /&gt;
|  3h&lt;br /&gt;
|  4h&lt;br /&gt;
|  3h&lt;br /&gt;
|  x&lt;br /&gt;
|  4h&lt;br /&gt;
|  7h30&lt;br /&gt;
|  5h&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Recherche et développement de l'interface Web&lt;br /&gt;
|  x&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  3h&lt;br /&gt;
|  5h&lt;br /&gt;
|  6h&lt;br /&gt;
|  4h&lt;br /&gt;
|  7h&lt;br /&gt;
|  5h30&lt;br /&gt;
|  2h30&lt;br /&gt;
|  6h&lt;br /&gt;
|  8h&lt;br /&gt;
|  5h&lt;br /&gt;
|  1h&lt;br /&gt;
|  8h&lt;br /&gt;
|  4h&lt;br /&gt;
|  4h&lt;br /&gt;
|  &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Recherche et intégration du serveur de localisation&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x &lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  6h&lt;br /&gt;
|  5h&lt;br /&gt;
|  3h&lt;br /&gt;
|  &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Intégration des différentes parties&lt;br /&gt;
|  x&lt;br /&gt;
|  x  &lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  2h&lt;br /&gt;
|  2h&lt;br /&gt;
|  2h&lt;br /&gt;
|  3h&lt;br /&gt;
|  1h30&lt;br /&gt;
|  x&lt;br /&gt;
|  3h&lt;br /&gt;
|  6h&lt;br /&gt;
|  5h&lt;br /&gt;
|  x&lt;br /&gt;
|  3h30&lt;br /&gt;
|  2h&lt;br /&gt;
|  2h&lt;br /&gt;
|  &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Tests et débuggage&lt;br /&gt;
|  x&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  1h&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  3h&lt;br /&gt;
|  4h&lt;br /&gt;
|  0,5h&lt;br /&gt;
|  3h&lt;br /&gt;
|  1h&lt;br /&gt;
|  3h&lt;br /&gt;
|  3h&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  4h&lt;br /&gt;
|  &lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Optimisation/Correction des programmes&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Vidéo&lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Avancement du Projet'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Phase préparatoire'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Jeu 21/09/17 - Ven 22/09/17]]'' &lt;br /&gt;
*Rendez-vous de mise au point du cahier des charges avec les encadrants/intervenants (M. ZHENG Gang et M. DAGHER Roudy)&lt;br /&gt;
*Elaboration du cahier des charges&lt;br /&gt;
*Elaboration de la page Wiki (préparation de la mise en page et présentation du sujet)&lt;br /&gt;
*Préparation du travail sous forme de Mind Map&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous nous sommes tout d’abord rendus au laboratoire de l'INRIA afin de pouvoir définir le plus précisément possible le cahier des charges avec nos tuteurs.&lt;br /&gt;
Nous avons donc défini avec eux les technologies qu'il faudrait étudier. Vous retrouverez le choix des technologies dans la partie '''choix technologiques'''&lt;br /&gt;
&lt;br /&gt;
Nous avons en même temps créé notre page Wiki, et structurée celle-ci avec les parties qui nous seraient utiles pour développer nos explications par la suite.&lt;br /&gt;
&lt;br /&gt;
Nous avons de plus découpé le travail en sous-parties que nous avions mis dans une '''Mind map''' afin d'y voir plus clair sur la ligne à suivre.&lt;br /&gt;
&lt;br /&gt;
Vous trouverez cette Mind map juste ci-dessous. Nous ne mettrons pas à jour cette Mind map chaque semaine mais il est fort probable que nous en refaisions un en milieu de projet pour pouvoir cibler les objectifs réussis et ceux à atteindre. Nous pourrons de plus redéfinir certains objectifs qui nous auraient semblés trop vague au début du projet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Projet de fin d'étude.png|centre|600px]]&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 1'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Jeu 28/09/17 - Ven 29/09/17]]'' &lt;br /&gt;
*Revue du Cahier des Charges avec les encadrants&lt;br /&gt;
*Lecture et recherches sur les technologies adaptées&lt;br /&gt;
*Construction de la suite de la Mind Map&lt;br /&gt;
*Création du Gitlab&lt;br /&gt;
&lt;br /&gt;
Nous commençons les recherches sur le projet et sur les premières technologies engagées dans celui-ci. Nous en profitons pour formuler dès à présent des questions sur le bon choix de celles-ci. Nous commençons donc des tests ayant seulement pour but de nous familiariser avec l'environnement de travail et de réellement comprendre les fonctions déjà présentes qu'il faudra exploiter et implanter notre interface web.&lt;br /&gt;
Nous créons un dépôt Gitlab avec notre tuteur et commençons a définir les taches premières sur celui-ci.&lt;br /&gt;
Nous en profitons pour affiner le Mind Map.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 2'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Jeu 05/10/17 - Ven 06/10/17]]''  &lt;br /&gt;
*Précisions sur le cahier des charges&lt;br /&gt;
*Listage du matériel&lt;br /&gt;
*Recherche et détermination de solutions technologiques possibles pour les fonctions demandées&lt;br /&gt;
*Début du travail sur le serveur de collecte&lt;br /&gt;
*Apprentissage du langage Python et de l'utilisation du framework Flask&lt;br /&gt;
&lt;br /&gt;
Nous avons finalisé les précisions sur le cahier des charges. Nous avons donc pu cibler le matériel dont nous nous servirons pour ce Projet. Vous trouverez donc cette liste la section correspondante. Il est évident que le matériel utilisé est dans l'ensemble déjà fourni par le laboratoire et qu'il nous reste dans l'ensemble à créer l'interface web et les API qui nous permettrons de faire communiquer cette interface avec la Raspberry Pi et le serveur de position déjà créé.&lt;br /&gt;
Nous avons donc pu commencer à nous former sur les technologies qui nous serviraient par la suite. Nous avons donc utilisé le cours d'Openclassrooms sur les serveurs Flask pour en apprendre les bases. Ce serveur Flask est programmé en Python et nous permet donc une grande liberté au niveau de l’exécution de certains scripts. En effet, les scripts de connexion Bluetooth et de redirection de port qui nous permettent de récupérer les données de distance sont eux-mêmes codés en Python et sont directement appelés via le serveur.&lt;br /&gt;
Dans ce serveur, représentant notre interface web, vous retrouverez la page '''/collecte''' qui représentera notre partie collecte de données ainsi que l'affichage de ces distances. Nous appellerons cette partie le Serveur de Collecte.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 3'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 11/10/17 - Jeu 12/10/17]]''  &lt;br /&gt;
*Recherche et développement initial du serveur de collecte de données&lt;br /&gt;
*Complément du Git sur les tâches à effectuer&lt;br /&gt;
&lt;br /&gt;
Nous avons commencé à créer un serveur Flask renvoyant pour l'instant une matrice aléatoire. Lors de la requête URL &amp;quot;../matrice&amp;quot;, nous voyons bien une matrice aléatoire apparaître sur la page Web. Nous essayons de nous connecter à la Raspberry Pi en redirigeant son port série vers le Bluetooth de façon à récupérer de vraies matrices de distance entre le drone (ie commutateur central) et les balises. Nous pourrons afficher ensuite ces matrices, ou alors les stocker dans un fichier en attendant le traitement de celles-ci.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Requete s3.PNG|300px|serveur Flask]]&lt;br /&gt;
&lt;br /&gt;
Nous avons plusieurs problèmes avec le Bluetooth pour se connecter avec la Raspberry Pi. Quand nous aurons réussi à nous connecter au port série de la Raspberry Pi alors nous pourrons gérer le traitement des données récupérées.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 4'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 18/10/17 - Jeu 19/10/17]]''  &lt;br /&gt;
*Configuration de la Raspberry Pi car problèmes de connectivité Bluetooth rencontrés&lt;br /&gt;
**Nous arrivons à connecter la Raspberry Pi sous Windows mais la connexion sous Linux pose problème (travail en suspens en attendant la disponibilité de l'encadrant)&lt;br /&gt;
*Début du développement de l'interface Web&lt;br /&gt;
**Traitement d'une matrice dans un fichier JSON&lt;br /&gt;
**Affichage sous forme de tableau de la matrice&lt;br /&gt;
**Utilisation du serveur de requête en Python avec chargement de template HTML&lt;br /&gt;
**Mise en forme de la trame de la page en HTML/CSS avec le framework Bootstrap&lt;br /&gt;
**Ajout d'un set de distances (d1, d2, d3, d4) dans la matrice lors d'un appui sur un bouton Chargement en utilisant un fichier Javascript&lt;br /&gt;
&lt;br /&gt;
Nous avons reçu des fonctions Python de notre tuteur afin d'obtenir une connexion Bluetooth entre notre Raspberry Pi et notre ordinateur ainsi qu'une redirection de port de celle-ci vers la connexion. Nous n'arrivons pas à utiliser ces fonctions sous linux et nous nécessitons une explication de notre tuteur n'étant pas disponible à ce moment. Pour ne pas perdre de temps, nous attaquons la création de l'interface web à proprement parler, c'est à dire la création des pages HTML ainsi que le document Javascript qui nous servira de bibliothèque de fonctions. Chaque route de notre serveur est reliée à une série de fonctions Python s'exécutant à l'appel des url puis suivies d'un template de la page HTML en question. Nous en profitons de plus pour explorer le framework CSS bootstrap afin de mettre un premier design et une structure a notre page collecte qui sera la page principale de notre site pour ce début de projet.&lt;br /&gt;
&lt;br /&gt;
Nous nous essayons de plus à différents tests sur des fichiers de format '''JSON''' que nous devrons réussir à traiter correctement plus tard dans notre projet.&lt;br /&gt;
Nous récupérons une matrice que nous créons nous-mêmes en Python (simulation d'une série de distances récupérée) que nous transformons au format JSON pour ensuite l'afficher sur notre page web. Pour pouvoir proprement afficher ce fichier '''JSON''' renvoyé vers notre page, nous nous servons du fichier Javascript afin de créer du code HTML contenant la matrice.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 5'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 25/10/17 - Ven 27/10/17]]''  &lt;br /&gt;
*Résolution des problèmes de connectique Bluetooth sur la Raspberry Pi&lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Traitement d'une matrice dans un fichier JSON&lt;br /&gt;
**Début de l'ajout d'un set de distances depuis une matrice contenue dans un fichier JSON&lt;br /&gt;
&lt;br /&gt;
Nous avons pu nous entretenir avec notre tuteur et donc comprendre les fonctions de connexion et de redirection de port. Nous pouvons donc continuer le développement de notre interface web. Nous arrivons à traiter un set de données au format JSON et à l'afficher dans le code HTML. Toutefois nous créons nous-mêmes ce set, il est maintenant nécessaire que nous arrivions à récupérer les sets de distance réels reçus par la connexion Bluetooth. Nous commencerons par un traitement asynchrone. L'idée est d’enregistrer les sets de distances dans un fichier '''JSON''' stocké dans un dossier. Nous appellerons ce dossier plus tard via une requête Ajax.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 6'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 08/11/17 - Ven 10/11/17]]''  &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
**Mise en place de la communication entre le port série de notre machine et le port série de la carte via Bluetooth de la RPi3&lt;br /&gt;
**Récupération et traitement (parse) manuels des données de distances dans un fichier .log via TCP/IP&amp;lt;-&amp;gt;Bluetooth&lt;br /&gt;
**Début de l'automatisation du procédé par script Python (requete.py) et mise en place de sockets de communication&lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Chargement sur commande d'un set de distances depuis une matrice contenue dans un fichier JSON&lt;br /&gt;
*Travail sur le layout du site&lt;br /&gt;
&lt;br /&gt;
Après avoir regardé le code de ces différentes fonctions nous avons pu faire des tests manuels via le Shell pour récupérer des données de distances et les stocker dans un fichier '''JSON''' sur notre ordinateur.&lt;br /&gt;
&lt;br /&gt;
Nous utilisons les commandes suivantes pour se connecter via Bluetooth:&lt;br /&gt;
&lt;br /&gt;
 rfcomm connect /dev/rfcomm0 B8:27:EB:80:DC:89 1&lt;br /&gt;
&lt;br /&gt;
Rediriger le port de la Raspberrypi3 vers la connexion:&lt;br /&gt;
&lt;br /&gt;
 Python lps-collector/tcp_serial_redirect.py /dev/rfcomm0 9600&lt;br /&gt;
&lt;br /&gt;
Collecter les données dans un fichier dont nous définissons le nom:&lt;br /&gt;
&lt;br /&gt;
 echo &amp;quot;cu -s9600 -lttyACM0&amp;quot;| nc localhost 7777&lt;br /&gt;
 nc localhost 7777 | grep distance &amp;gt; static/log/dist-capture'+date+'.log&lt;br /&gt;
&lt;br /&gt;
Nous pouvons '''parser''' le flux de données avant de le stocker dans le fichier via cette commande:&lt;br /&gt;
&lt;br /&gt;
 Python lps-collector/lps_parse.py static/log/dist-capture&amp;quot;+date+&amp;quot;.log&lt;br /&gt;
&lt;br /&gt;
Il est donc nécessaire d'inclure via des '''thread''' ces différentes fonctions dans notre serveur Python (Flask) afin d'automatiser le processus. Le but est de pouvoir choisir sur l'interface web quels fonctions il faut exécuter et les déclencher via l'appui sur des boutons.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 7'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 15/11/17 - Ven 17/11/17]]''  &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
**Récupération et traitement (parse) manuels des données de distances dans un fichier .log via TCP/IP&amp;lt;-&amp;gt;Bluetooth&lt;br /&gt;
**Automatisation du procédé par script Python (requete.py)&lt;br /&gt;
***Mise en place de sockets de communication pour le contrôle de la collecte -&amp;gt; abandonné (servait à commander la collecte manuellement)&lt;br /&gt;
***Développement d'un script engine.py regroupant les commandes exécutables par l'utilisateur via la page Web&lt;br /&gt;
***Début du travail sur la fonction &amp;quot;STOP&amp;quot; manuel d'une action de collecte de données (liaison entre script HTML, Javascript, et script Python)&lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Chargement sur commande d'un set de distances depuis une matrice contenue dans un fichier JSON&lt;br /&gt;
**Travail sur le layout du site&lt;br /&gt;
***Ajout des différentes commandes (connexion Bluetooth, lancement commande cu, collecte des données, collecte durée donnée)&lt;br /&gt;
***Début de l'implémentation de la visualisation des fichiers .JSON obtenus après collecte et affichage dans un tableau matriciel du fichier sélectionné&lt;br /&gt;
&lt;br /&gt;
Nous avons continué à travailler sur le serveur de collecte: les données que nous avons récupérées via Bluetooth sont stockées dans un fichier .log. Apres avoir bien compris comment marchait la fonction '''parse''' manuellement (lors de son utilisation dans le Shell), nous l'avons implémentée dans notre serveur de collecte qui lance cette commande lors de l’appui sur un bouton via notre interface virtuelle. Un problème rencontré était de savoir quand la récolte des données devait s’arrêter. Nous avons donc rajouté un temps à entrer nous-même sur l'interface. La fonction '''parse''' est effectuée et le sous-processus va attendre le temps donné avant de lancer une commande permettant de tuer le processus et mettant donc fin au remplissage du fichier '''.log'''. Nous voulons de plus réussir à lancer une fonction de collecte sans temps. C'est à dire que nous coupons la collecte via un bouton par nous-mêmes. Nous voulions utiliser des Sockets pour pouvoir définir nous-mêmes la gestion de la communication mais l'idée a été abandonné car nous avons réussi à sauvegarder le PID du processus lancé. Il nous suffit donc de l’arrêter grâce à un autre bouton qui récupère cette variable et l’arrête ensuite. &lt;br /&gt;
&lt;br /&gt;
Toutes nos fonctions Pythons étant regroupées dans notre serveur '''requete.py''', nous avons décidé de créer un module qui regroupera toutes ces fonctions que nous pourrons utiliser dans '''requete.py'''. ceci nous permet de voir plus clair dans notre code et de faciliter le travail lorsque nous modifions le code tous les deux.&lt;br /&gt;
&lt;br /&gt;
Nous essayons en continu d'adapter le layout du site pour le rendre le plus attractif et simple possible, de façon à ce que chaque bouton et tableau soient clairs et compréhensibles.&lt;br /&gt;
&lt;br /&gt;
Nous avons commencé à récupérer les fichiers '''JSON''' créés à partir des fichier '''log''', c'est-à-dire que ces fichiers sont automatiquement stockés coté serveur dans un dossier nommé '''static/log'''. Notre but est de récupérer le nom des fichiers JSON et de les afficher dans un composant sur notre interface web. Il nous sera donc possible ensuite de sélectionner le nom d'un fichier. Lors de la sélection de ce nom de fichier, un tableau apparaît avec les valeurs de distances à l’intérieur.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 8'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 22/11/17 - Ven 24/11/17]]''  &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
**Automatisation du procédé de collecte par script Python (requete.py qui fait appel à engine.py)&lt;br /&gt;
***Développement d'un script engine.py regroupant les commandes exécutables par l'utilisateur via la page Web&lt;br /&gt;
***Travail sur la fonction &amp;quot;STOP&amp;quot; manuel d'une action de collecte de données (liaison entre script HTML, Javascript, et script Python)&lt;br /&gt;
***Mise en place d'un serveur HTTP Simple sous Python pour accéder aux fichiers de données à partir de la page Web&lt;br /&gt;
***Mise à jour de fonctions de connexion &lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Travail sur le layout du site (ajout de pages, navigation entre les pages, apparence, nettoyage des codes)&lt;br /&gt;
**Bon fonctionnement de l'ensemble serveur collecte + serveur HTTP + client Web&lt;br /&gt;
**Affichage de la liste des fichiers de données de distance (log, csv, JSON) via serveur HTTP en Python sur port 9999&lt;br /&gt;
*Corrections et nettoyage du dépôt GIT&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous continuons à développer les points énoncés la semaine dernière. Nous avons décidé de nous diriger vers un serveur HTTP Simple pour accéder à nos fichiers. Il s’avère que nous finirons par ne pas utiliser ce serveur. Nous irons récupérer les fichiers en question via des requêtes '''Ajax''' faites à la sélection du nom du fichier.&lt;br /&gt;
&lt;br /&gt;
Nous rencontrons depuis le début des problèmes avec les fonctions de connexion qui peuvent ne pas marcher à un moment donné. Nous essayons de trouver pourquoi ce bug est un bug qui ne se produit pas à chaque fois. Nous avons déterminé qu'il ne se produisait seulement lorsque les fonctions de connexions étaient lancée dans des threads. Nous ne savons toujours pas pourquoi ces thread bugguent seulement parfois et non à chaque essai de connexion.&lt;br /&gt;
&lt;br /&gt;
Nous avons nettoyé notre dépot '''Git''' car il s’avère que nous utilisions une mauvaise méthode de fusion et de stockage des documents.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 9'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 29/11/17 - Jeudi 30/11/17]]''  &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
**Automatisation du procédé de collecte par script Python (requete.py qui fait appel à engine.py)&lt;br /&gt;
***Travail sur la fonction &amp;quot;STOP&amp;quot; manuel d'une action de collecte de données (liaison entre script HTML, Javascript, et script Python)&lt;br /&gt;
***Recherches sur l'utilisation de fichiers JSON accessibles via le serveur HTTP&lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Travail sur le layout du site &lt;br /&gt;
**Travail sur la liaison entre fichiers JSON et affichage Web des données de distance&lt;br /&gt;
***Recherches et tests de solutions&lt;br /&gt;
****Affichage depuis un fichier&lt;br /&gt;
****Affichage à la volée lors d'une action de collecte&lt;br /&gt;
&lt;br /&gt;
*Revue de code avec Roudy DAGHER:&lt;br /&gt;
**Structure globale des codes ok&lt;br /&gt;
**Fonctionnement presque ok: fonctionnalités implémentées ok, mais parsage csv ne marche pas&lt;br /&gt;
**Refactoring nécessaire&lt;br /&gt;
**Correction de la fonction STOP et amélioration de la fonction de COLLECTE&lt;br /&gt;
**Faire plus de requêtes Javascript que de requêtes HTML&lt;br /&gt;
**Discussion pour l'implémentation du serveur de localisation (= algorithme de localisation) et des visualisations de données sur le site Web&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous avons d'abord revu l'ensemble de notre code et les méthodes utilisées avec notre tuteur '''Roudy Dagher'''. Nous nous approchons d'un serveur de collecte de données stable et fonctionnel. Nous avons refait les différentes connexions entre l'interface et le serveur afin de ne faire que des requêtes sur des '''WebServices'''. Il nous est possible de commencer la deuxième partie qui est l'envoi de ces tableaux de données afin de les envoyer vers le serveur de localisation via des API afin de recevoir des matrices de positions.&lt;br /&gt;
Nous pourrons grâce à ces matrices afficher une carte 3D des balises  et du TAG dans l'espace.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 10'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 06/12/17 - Jeudi 07/12/17]]'' &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
**Travail sur la fonction STOP&lt;br /&gt;
**Réalisation d'une expression régulière pour le parsage des fichiers log en fichier JSON&lt;br /&gt;
&lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Travail sur l'affichage des fichiers JSON&lt;br /&gt;
***Réalisation de toutes les requêtes Ajax&lt;br /&gt;
***Réalisation d'un menu déroulant dropdown pour charger le contenu des fichiers JSON dans le tableau de distances&lt;br /&gt;
&lt;br /&gt;
*Nettoyage du dépôt Git&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 11'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 13/12/17]]''  &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
&lt;br /&gt;
*Revue de code avec Roudy DAGHER:&lt;br /&gt;
**Discussion sur la partie système du projet et correction de certaines fonctions&lt;br /&gt;
&lt;br /&gt;
Nous nous sommes réunis avec l'un de nos tuteurs, qui a réalisé certains bouts de code de base, pour nous mettre au point sur les fonctions en question et leur utilisation.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 12'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 20/12/17 - Jeudi 21/12/17]]''&lt;br /&gt;
*Revue, correction et nettoyage des codes&lt;br /&gt;
*Finalisation du rapport&lt;br /&gt;
*Planification de semaines restantes&lt;br /&gt;
*Préparation de la soutenance&lt;br /&gt;
*Revue de mi-projet avec tous les tuteurs&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Cette dernière semaine a servi à finaliser le rapport et à discuter de l'avancée du projet, notamment avec nos tuteurs pour déterminer le travail restant, présenter le travail abouti et replanifier précisément les échéances pour le travail restant. Nous avons réalisé la soutenance de mi-projet le '''jeudi 21/12/17 à 8h'''.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 13'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 10/01/18 - Ven 12/01/18]]''  &lt;br /&gt;
*Travail sur la collecte des données (serveur de collecte et interface Web)&lt;br /&gt;
**Redéfinition du fichier de parsage car il crée des conflits et ne produit pas un fichier formaté de la façon attendue&lt;br /&gt;
***Nombre de balises réel n'est pas bien déterminé par le code&lt;br /&gt;
***ID de la première et de la dernière balise ne sont pas déterminés correctement&lt;br /&gt;
&lt;br /&gt;
**Automatisation de la collecte par un script Shell lançant toutes les commandes de CONNEXION, REDIRECTION, LANCEMENT CU, FERMETURE DU PROGRAMME (kill rfcomm / kill tcp_redirect)&lt;br /&gt;
***Dans le but d'automatiser la procédure&lt;br /&gt;
***Dans le but de résoudre un problème de gestion de ressources (le bug '''thread''' apparu plus tôt dans le projet)&lt;br /&gt;
&lt;br /&gt;
**Travail sur la résolution du bug thread car l'automatisation n'a pas résolu le problème&lt;br /&gt;
***Identification du ou des causes potentielles: gestion des ressources (synchrone, asynchrone ?), connexion Bluetooth, lancement des commandes dans le même script, lancement en fg/bg, conflit dû au temps d'exécution de chaque processus ?&lt;br /&gt;
***Lancement des commandes manuellement dans des terminaux ne pose aucun problème: solution la plus simple&lt;br /&gt;
&lt;br /&gt;
**Redesign de la page Collecte&lt;br /&gt;
***Remplacement des boutons de commande par un bouton unique d'initialisation&lt;br /&gt;
***Travail sur une mise à jour du menu déroulant dropdown régulière sans avoir à recharger la page Web&lt;br /&gt;
***Implémentation de plotly.js, un module Javascript qui permet d'afficher des graphes en 3D&lt;br /&gt;
&lt;br /&gt;
*Mise au point post-soutenance avec Roudy DAGHER pour valider le travail restant, effectué et redéfinir certains objectifs atteignables ou pas selon les éléments réalisés dans le projet&lt;br /&gt;
*Recherches et début de l'implémentation du serveur de localisation fourni par les tuteurs&lt;br /&gt;
*Gestion du Git pour créer des branches additionnelles&lt;br /&gt;
*Recréation du rapport de projet suite à une perte du fichier éditable d'origine + Mise à jour avec les remarques suite à la soutenance ainsi que les nouveaux éléments&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 14'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mar 16/01/18 - Ven 19/01/18]]''  &lt;br /&gt;
*Travail sur la collecte des données (serveur de collecte et interface Web)&lt;br /&gt;
**Redéfinition du fichier de parsage car il crée des conflits et ne produit pas un fichier formaté de la façon attendue&lt;br /&gt;
***Corrigé: Nombre de balises réel n'est pas bien déterminé par le code&lt;br /&gt;
***Corrigé: ID de la première et de la dernière balise ne sont pas déterminés correctement&lt;br /&gt;
***Reste à faire: Traiter le cas où il y a un ajout ou suppression d'une balise pendant la collecte (pour le moment, lorsque c'est le cas, toutes les données se décalent au lieu de laisser des trous)&lt;br /&gt;
&lt;br /&gt;
**Automatisation de la collecte par un script Shell lançant toutes les commandes de CONNEXION, REDIRECTION, LANCEMENT CU, FERMETURE DU PROGRAMME (kill rfcomm / kill tcp_redirect)&lt;br /&gt;
***Mis en suspens: pour le moment, on lance les commandes manuellement dans le terminal&lt;br /&gt;
&lt;br /&gt;
**Interface Web&lt;br /&gt;
***Implémentation de plotly.js, un module Javascript qui permet d'afficher des graphes en 3D&lt;br /&gt;
&lt;br /&gt;
*Implémentation du serveur de localisation fourni par les tuteurs (mais algorithme de localisation pas fonctionnel pour le moment)&lt;br /&gt;
**Mise à jour de l'affichage des positions des éléments: précédemment seule la matrice X de position du Tag s'affichait, et pas la matrice A des balises&lt;br /&gt;
**Requêtes manuelles à l'API avec la fonction curl OK: on arrive à récupérer les matrices X et A (aléatoires pour le moment) par une requête GET à l'API du serveur de localisation&lt;br /&gt;
**Implémentation des requêtes Ajax pour automatiser les requêtes au serveur de localisation&lt;br /&gt;
&lt;br /&gt;
*Mise à jour du rapport les nouveaux éléments du travail réalisé&lt;br /&gt;
*Réflexion sur la possibilité ou non de réaliser la partie temps réel du projet au vu des moyens à disposition&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 15'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mar 23/01/18 - Ven 26/01/18]]'' &lt;br /&gt;
*Travail sur la collecte des données (serveur de collecte et interface Web)&lt;br /&gt;
**Redéfinition du fichier de parsage car il crée des conflits et ne produit pas un fichier formaté de la façon attendue&lt;br /&gt;
***Fait: Si distance négative car Tag trop près, la valeur négative générée par une balise est remplacée par un &amp;quot;0&amp;quot; (cela modifie la position réelle modélisée dans plotly, mais évite une impossibilité de générer la position à partir de la distance -&amp;gt; par des tests, il faudra déterminer la valeur limite à partir de laquelle les cartes donnent des valeurs de distance négatives&lt;br /&gt;
***Reste à faire: Traiter le cas où il y a un ajout ou suppression d'une balise pendant la collecte (pour le moment, lorsque c'est le cas, toutes les données se décalent au lieu de laisser des trous); Ainsi que le cas où il y un saut/bug inattendu et donc une disparition d'une ou plusieurs valeurs de distance&lt;br /&gt;
***Début de résolution du cas où une distance n'est pas prise en compte, c'est à dire où il y a une valeur qui disparaît et désaligne les valeurs lors de la création du JSON&lt;br /&gt;
&lt;br /&gt;
**Automatisation de la collecte par un script Shell lançant toutes les commandes de CONNEXION, REDIRECTION, LANCEMENT CU, FERMETURE DU PROGRAMME (kill rfcomm / kill tcp_redirect)&lt;br /&gt;
***Mis en suspens: pour le moment, on lance les commandes manuellement dans le terminal&lt;br /&gt;
***Création d'un script bash /etc/init.d/autoconnect.sh pour connecter automatiquement la RPi au lancement du système (si la RPi est déjà allumée au démarrage)&lt;br /&gt;
&lt;br /&gt;
**Interface Web&lt;br /&gt;
***Perfectionnement de l'utilisation de Plotly pour les visualisations&lt;br /&gt;
&lt;br /&gt;
*Implémentation du serveur de localisation fourni par les tuteurs (algorithme de localisation pas fonctionnel pour le moment)&lt;br /&gt;
**Requêtes manuelles à l'API avec la fonction curl OK&lt;br /&gt;
**Fait: Implémentation des requêtes Ajax pour automatiser les requêtes au serveur de localisation&lt;br /&gt;
***Liaison entre les différentes requêtes ajax grâce à des variables: permet de stocker l'adresse du job récupérée par la méthode GET&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 16'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Lun 29/01/18 - Ven 02/02/18]]'' &lt;br /&gt;
*Travail sur la collecte des données (serveur de collecte et interface Web)&lt;br /&gt;
**Redéfinition du fichier de parsage car il crée des conflits et ne produit pas un fichier formaté de la façon attendue&lt;br /&gt;
***déterminer la valeur limite à partir de laquelle les cartes donnent des valeurs de distance négatives&lt;br /&gt;
***Reste à faire: Traiter le cas où il y a un ajout ou suppression d'une balise pendant la collecte (pour le moment, lorsque c'est le cas, toutes les données se décalent au lieu de laisser des trous); Ainsi que le cas où il y un saut/bug inattendu et donc une disparition d'une ou plusieurs valeurs de distance&lt;br /&gt;
***Fait: gestion des bugs/sauts de valeurs de balises - remplacement par une valeur nulle sur balise existe, par rien sinon (implémentation d'un tableau caractérisant l'existence ou pas de chaque balise 1 à 6), optimisation des temps de calculs/exécution dans le script&lt;br /&gt;
**Interface Web&lt;br /&gt;
***Ajout d'une barre de progression de la collecte remplaçant le bouton de Lancement de collecte lors de l'appui&lt;br /&gt;
***Ajout d'un bouton dropdown pour afficher les fichiers de position qu'on reçoit du serveur de localisation&lt;br /&gt;
***Ajout d'une scrollbar dans les deux dropdown&lt;br /&gt;
&lt;br /&gt;
*Implémentation du serveur de localisation fourni par les tuteurs (algorithme de localisation pas fonctionnel pour le moment)&lt;br /&gt;
**Fait: Implémentation des requêtes Ajax pour automatiser les requêtes au serveur de localisation&lt;br /&gt;
***Liaison entre les différentes requêtes Ajax grâce à des variables: permet de stocker l'adresse du job récupérée par la méthode GET&lt;br /&gt;
***Création d'une requête Ajax GET qui demande le fichier JSON de position au serveur de localisation jusqu'à ce qu'il soit retourné&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Observations'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Problèmes rencontrés'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Solutions apportées'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Délivrables'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
Rapport de mi-PFE&lt;br /&gt;
[[Fichier:RapportMi-PFE-UNG DELATTE.pdf]]&lt;br /&gt;
&lt;br /&gt;
Rapport de PFE&lt;br /&gt;
&lt;br /&gt;
Vidéo&lt;/div&gt;</summary>
		<author><name>Hdelatte</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=P18_Localisation_of_quadrotors&amp;diff=50216</id>
		<title>P18 Localisation of quadrotors</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=P18_Localisation_of_quadrotors&amp;diff=50216"/>
				<updated>2018-02-07T16:36:37Z</updated>
		
		<summary type="html">&lt;p&gt;Hdelatte : /* Semaine 16 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Cahier des charges'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;Présentation générale du projet&amp;lt;/span&amp;gt;=== &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Contexte&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
Dans un monde de plus en plus connecté, de nombreux drones sont déployés pour diverses applications comme l'espionnage, la surveillance, la cartographie de lieux et la livraison de colis. Les technologies nécessaires pour contrôler ces drones sont des sujets de recherche actuels. &lt;br /&gt;
&lt;br /&gt;
Le contrôle de ceux-ci passe tout d'abord par la maîtrise de leur position dans l'espace. Le développement des applications liées à l'utilisation de drones nécessite un travail important sur la localisation spatiale d'objets connectés. &lt;br /&gt;
&lt;br /&gt;
De plus, dans un souci d'utilisation, il est essentiel de développer des interfaces logicielles permettant d'exploiter ces données.&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Objectif du projet&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
L'objectif de ce projet est de développer une interface logicielle permettant de traiter en temps réel les informations de localisation d'un drone et de balises, dans le but de définir leur localisation dans l'espace, en intérieur.&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Description du projet&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
Pour réaliser le contrôle de drones, la première étape importante est de donner ses informations de position. Le but du projet est de développer une interface logicielle permettant de localiser le drone en temps réel en intérieur. Le drone se déplace dans un environnement dans lequel ont été installées de multiples balises. Il est équipé d'une carte, lui permettant de recevoir les distances relatives entre lui-même et les balises, sur laquelle différents algorithmes vont être implémentés pour effectuer la localisation en temps réel. Le projet requiert des compétences en développement hardware (Crazyflie 2.0, voir https://wiki.bitcraze.io/) et software (langage C/C++/Python/Javascript/HTML...).&lt;br /&gt;
&lt;br /&gt;
Il se divise en 4 étapes principales, qui sont:&lt;br /&gt;
*1) Choisir les technologies utilisées&lt;br /&gt;
*2) Choisir l'architecture (OS / APIs)&lt;br /&gt;
*3) Développer les différentes parties du projet&lt;br /&gt;
*4) Intégrer et connecter les différentes parties du projet&lt;br /&gt;
&lt;br /&gt;
La localisation étant en intérieur, le protocole GPS n'est donc pas assez précis pour les applications ciblées. La mise en place d'un tel dispositif permettrait grâce à l'utilisation d'un algorithme d'estimer avec une bonne précision les positions en intérieur d'une balise centrale (appelée Tag) et de balises (appelées Anchor). Le Tag scanne en temps réel la distance relative aux différentes balises, et il nous est retourné la position des balises et du Tag grâce à l'algorithme de localisation.&lt;br /&gt;
&lt;br /&gt;
Le projet se compose de 3 parties:&lt;br /&gt;
* Collect &amp;amp; parse: collecter les données envoyées par les balises en communiquant avec un serveur et récupérer les données adéquates par un tri&lt;br /&gt;
* Localise: déterminer la matrice de position des balises et du Tag en traitant les données récupérées&lt;br /&gt;
* Display: développer l'interface homme machine pour afficher, étudier et utiliser les données traitées&lt;br /&gt;
&lt;br /&gt;
Nous travaillerons dans un premier temps dans une optique temps différé avant de travailler en temps réel. Cela nous permettra d'acquérir des données utiles et réutilisables en aval. &lt;br /&gt;
&lt;br /&gt;
A l'aboutissement du projet, nous devrions être capable via l'interface homme machine développée d'afficher précisément la position spatiale des balises ainsi que du Tag, grâce àl'utilisation d'un algorithme de localisation et des données récupérées, et d'afficher d'autres données relatives au déplacement du Tag ou des balises dans l'espace. &lt;br /&gt;
&lt;br /&gt;
Si le temps le permet, nous pourrons aussi être amenés à adapter et utiliser l'interface développée pour l'utilisation d'un drone.&lt;br /&gt;
&lt;br /&gt;
''Sujet originel''&lt;br /&gt;
&lt;br /&gt;
To achieve the control of quadrotors, the first important task to give its position information. This project is to develop a software(GUI) to localize the quadrotors in real-time. The quadrotor is flying in an environment where several transmitters have been installed. The quadrotor is equipped with a deck to receive the relative distances between the deck and all transmitters, based on which different algorithms will be implemented to realize the real-time localization. The candidates need to have both experiences on hardware (Crazyflie 2.0, see https://wiki.bitcraze.io/) and software development (C/C , Python…). &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Calendrier prévisionnel&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
''[[Avant le 29/09/17]]'' - Élaboration du Cahier des charges, de la liste des tâches et du calendrier prévisionnel&lt;br /&gt;
&lt;br /&gt;
''[[Avant fin Octobre]]'' - Serveur de collecte et début du développement de l'interface logicielle&lt;br /&gt;
&lt;br /&gt;
''[[Avant fin Décembre]]'' - Interface logicielle&lt;br /&gt;
&lt;br /&gt;
''[[A la fin du PFE]]'' - Intégration finale des différentes parties (Serveur de collecte des données &amp;amp; Serveur de localisation &amp;amp; Interface logicielle)&lt;br /&gt;
&lt;br /&gt;
Répartition du volume de travail (***h):&lt;br /&gt;
&lt;br /&gt;
* Recherche sur les technologies à utiliser&lt;br /&gt;
* Développement du serveur de collecte de données&lt;br /&gt;
* Réalisation de l'interface logicielle (Web//Logiciel/Application)&lt;br /&gt;
* Intégration des différentes parties&lt;br /&gt;
* Test et débuggage&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Choix techniques : matériel et logiciel&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
Afin de développer ce dispositif, nous allons utiliser une Raspberry Pi 3 associée à une carte réceptrice, qui communique avec 4 balises composées chacune d'un microcontrôleur et d'une carte émettrice radio (UWB5C) et alimentées par batteries. La carte réceptrice joue le rôle du drone à localiser et communiquera les données émises par les balises vers l'ordinateur via Bluetooth.&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Choix technologiques&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
Voici les technologies que nous utilisons pour chacune des parties de ce projet.&lt;br /&gt;
&lt;br /&gt;
    1) Serveur de collecte des données:&lt;br /&gt;
       Scanne et parse les données récupérées pour fournir la matrice D des distances relatives du tag aux 4 balises&lt;br /&gt;
        - API&lt;br /&gt;
        - Python / Serveur Flask&lt;br /&gt;
&lt;br /&gt;
    2) Serveur de localisation (fourni):&lt;br /&gt;
       Calcule grâce à l'algorithme de localisation et la matrice D les positions spatiales des 4 noeuds et du tag&lt;br /&gt;
        - API&lt;br /&gt;
        - Bootstrap&lt;br /&gt;
        - Jquery&lt;br /&gt;
        - Python&lt;br /&gt;
&lt;br /&gt;
    3) Interface utilisateur:&lt;br /&gt;
       Affiche courbes, visualisation 3D, boutons ou données des fichiers envoyées par le serveur de localisation&lt;br /&gt;
        - HTML5 / Javascript&lt;br /&gt;
        - Fichiers JSON (serveurs de collecte et de localisation)&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Calendrier prévisionnel'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Liste des tâches à effectuer&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
# Se documenter sur le projet&lt;br /&gt;
##Langages et technologies utilisées&lt;br /&gt;
##Matériel utilisé&lt;br /&gt;
##Mettre en place du travail sur le Git&lt;br /&gt;
# Réaliser le serveur de collecte&lt;br /&gt;
##Récupérer les trames envoyées par bluetooth par le TAG via la Raspberry Pi&lt;br /&gt;
##Intégrer le serveur de localisation pour interpréter les trames&lt;br /&gt;
##Tester et optimiser&lt;br /&gt;
# Réaliser l'interface Web utilisateur&lt;br /&gt;
##Implémenter le serveur de collecte et de localisation&lt;br /&gt;
##Afficher et traiter les données stockées dans les fichiers JSON via le serveur (temps différé + temps réel)&lt;br /&gt;
##Tester et optimiser&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;Replanification du cahier des charges / calendrier&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Feuille d'heures'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Tâche !! Prélude !! Heures S1 !! Heures S2 !! Heures S3 !! Heures S4 !! Heures S5 !! Heures S6 !! Heures S7 !! Heures S8 !! Heures S9 !! Heures S10 !! Heures S11 !! Heures S12 !! Heures S13 !! Heures S14 !! Heures S15 !! Heures S16 !! Heures S17 !! Heures S18 !! Heures S19 !! Total&lt;br /&gt;
|-&lt;br /&gt;
| Cahier des charges / Wiki / Gitlab / Rapport&lt;br /&gt;
|  4h&lt;br /&gt;
|  3h&lt;br /&gt;
|  1h&lt;br /&gt;
|  x&lt;br /&gt;
|  1h30&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h30&lt;br /&gt;
|  1h&lt;br /&gt;
|  3h&lt;br /&gt;
|  3h30&lt;br /&gt;
|  2h&lt;br /&gt;
|  5h&lt;br /&gt;
|  x&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Documentation sur les technos utilisées&lt;br /&gt;
|  2h&lt;br /&gt;
|  4h&lt;br /&gt;
|  3h&lt;br /&gt;
|  2h&lt;br /&gt;
|  3h&lt;br /&gt;
|  4h&lt;br /&gt;
|  5h&lt;br /&gt;
|  5h30&lt;br /&gt;
|  4h30&lt;br /&gt;
|  3h30&lt;br /&gt;
|  2h&lt;br /&gt;
|  3h&lt;br /&gt;
|  1h&lt;br /&gt;
|  3h&lt;br /&gt;
|  4h&lt;br /&gt;
|  x&lt;br /&gt;
|  2h&lt;br /&gt;
|  &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Documentation sur le matériel&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  1h&lt;br /&gt;
|  1h&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Recherche et développement du serveur de collecte&lt;br /&gt;
|  x&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  3h&lt;br /&gt;
|  3h30&lt;br /&gt;
|  4h&lt;br /&gt;
|  5h&lt;br /&gt;
|  7h&lt;br /&gt;
|  4h30&lt;br /&gt;
|  0,5h&lt;br /&gt;
|  3h&lt;br /&gt;
|  4h&lt;br /&gt;
|  3h&lt;br /&gt;
|  x&lt;br /&gt;
|  4h&lt;br /&gt;
|  7h30&lt;br /&gt;
|  5h&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Recherche et développement de l'interface Web&lt;br /&gt;
|  x&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  3h&lt;br /&gt;
|  5h&lt;br /&gt;
|  6h&lt;br /&gt;
|  4h&lt;br /&gt;
|  7h&lt;br /&gt;
|  5h30&lt;br /&gt;
|  2h30&lt;br /&gt;
|  6h&lt;br /&gt;
|  8h&lt;br /&gt;
|  5h&lt;br /&gt;
|  1h&lt;br /&gt;
|  8h&lt;br /&gt;
|  4h&lt;br /&gt;
|  4h&lt;br /&gt;
|  &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Recherche et intégration du serveur de localisation&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x &lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  6h&lt;br /&gt;
|  5h&lt;br /&gt;
|  3h&lt;br /&gt;
|  &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Intégration des différentes parties&lt;br /&gt;
|  x&lt;br /&gt;
|  x  &lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  2h&lt;br /&gt;
|  2h&lt;br /&gt;
|  2h&lt;br /&gt;
|  3h&lt;br /&gt;
|  1h30&lt;br /&gt;
|  x&lt;br /&gt;
|  3h&lt;br /&gt;
|  6h&lt;br /&gt;
|  5h&lt;br /&gt;
|  x&lt;br /&gt;
|  3h30&lt;br /&gt;
|  2h&lt;br /&gt;
|  2h&lt;br /&gt;
|  &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Tests et débuggage&lt;br /&gt;
|  x&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  1h&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  3h&lt;br /&gt;
|  4h&lt;br /&gt;
|  0,5h&lt;br /&gt;
|  3h&lt;br /&gt;
|  1h&lt;br /&gt;
|  3h&lt;br /&gt;
|  3h&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  4h&lt;br /&gt;
|  &lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Optimisation/Correction des programmes&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Vidéo&lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Avancement du Projet'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Phase préparatoire'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Jeu 21/09/17 - Ven 22/09/17]]'' &lt;br /&gt;
*Rendez-vous de mise au point du cahier des charges avec les encadrants/intervenants (M. ZHENG Gang et M. DAGHER Roudy)&lt;br /&gt;
*Elaboration du cahier des charges&lt;br /&gt;
*Elaboration de la page Wiki (préparation de la mise en page et présentation du sujet)&lt;br /&gt;
*Préparation du travail sous forme de Mind Map&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous nous sommes tout d’abord rendus au laboratoire de l'INRIA afin de pouvoir définir le plus précisément possible le cahier des charges avec nos tuteurs.&lt;br /&gt;
Nous avons donc défini avec eux les technologies qu'il faudrait étudier. Vous retrouverez le choix des technologies dans la partie '''choix technologiques'''&lt;br /&gt;
&lt;br /&gt;
Nous avons en même temps créé notre page Wiki, et structurée celle-ci avec les parties qui nous seraient utiles pour développer nos explications par la suite.&lt;br /&gt;
&lt;br /&gt;
Nous avons de plus découpé le travail en sous-parties que nous avions mis dans une '''Mind map''' afin d'y voir plus clair sur la ligne à suivre.&lt;br /&gt;
&lt;br /&gt;
Vous trouverez cette Mind map juste ci-dessous. Nous ne mettrons pas à jour cette Mind map chaque semaine mais il est fort probable que nous en refaisions un en milieu de projet pour pouvoir cibler les objectifs réussis et ceux à atteindre. Nous pourrons de plus redéfinir certains objectifs qui nous auraient semblés trop vague au début du projet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Projet de fin d'étude.png|centre|600px]]&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 1'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Jeu 28/09/17 - Ven 29/09/17]]'' &lt;br /&gt;
*Revue du Cahier des Charges avec les encadrants&lt;br /&gt;
*Lecture et recherches sur les technologies adaptées&lt;br /&gt;
*Construction de la suite de la Mind Map&lt;br /&gt;
*Création du Gitlab&lt;br /&gt;
&lt;br /&gt;
Nous commençons les recherches sur le projet et sur les premières technologies engagées dans celui-ci. Nous en profitons pour formuler dès à présent des questions sur le bon choix de celles-ci. Nous commençons donc des tests ayant seulement pour but de nous familiariser avec l'environnement de travail et de réellement comprendre les fonctions déjà présentes qu'il faudra exploiter et implanter notre interface web.&lt;br /&gt;
Nous créons un dépôt Gitlab avec notre tuteur et commençons a définir les taches premières sur celui-ci.&lt;br /&gt;
Nous en profitons pour affiner le Mind Map.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 2'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Jeu 05/10/17 - Ven 06/10/17]]''  &lt;br /&gt;
*Précisions sur le cahier des charges&lt;br /&gt;
*Listage du matériel&lt;br /&gt;
*Recherche et détermination de solutions technologiques possibles pour les fonctions demandées&lt;br /&gt;
*Début du travail sur le serveur de collecte&lt;br /&gt;
*Apprentissage du langage Python et de l'utilisation du framework Flask&lt;br /&gt;
&lt;br /&gt;
Nous avons finalisé les précisions sur le cahier des charges. Nous avons donc pu cibler le matériel dont nous nous servirons pour ce Projet. Vous trouverez donc cette liste la section correspondante. Il est évident que le matériel utilisé est dans l'ensemble déjà fourni par le laboratoire et qu'il nous reste dans l'ensemble à créer l'interface web et les API qui nous permettrons de faire communiquer cette interface avec la Raspberry Pi et le serveur de position déjà créé.&lt;br /&gt;
Nous avons donc pu commencer à nous former sur les technologies qui nous serviraient par la suite. Nous avons donc utilisé le cours d'Openclassrooms sur les serveurs Flask pour en apprendre les bases. Ce serveur Flask est programmé en Python et nous permet donc une grande liberté au niveau de l’exécution de certains scripts. En effet, les scripts de connexion Bluetooth et de redirection de port qui nous permettent de récupérer les données de distance sont eux-mêmes codés en Python et sont directement appelés via le serveur.&lt;br /&gt;
Dans ce serveur, représentant notre interface web, vous retrouverez la page '''/collecte''' qui représentera notre partie collecte de données ainsi que l'affichage de ces distances. Nous appellerons cette partie le Serveur de Collecte.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 3'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 11/10/17 - Jeu 12/10/17]]''  &lt;br /&gt;
*Recherche et développement initial du serveur de collecte de données&lt;br /&gt;
*Complément du Git sur les tâches à effectuer&lt;br /&gt;
&lt;br /&gt;
Nous avons commencé à créer un serveur Flask renvoyant pour l'instant une matrice aléatoire. Lors de la requête URL &amp;quot;../matrice&amp;quot;, nous voyons bien une matrice aléatoire apparaître sur la page Web. Nous essayons de nous connecter à la Raspberry Pi en redirigeant son port série vers le Bluetooth de façon à récupérer de vraies matrices de distance entre le drone (ie commutateur central) et les balises. Nous pourrons afficher ensuite ces matrices, ou alors les stocker dans un fichier en attendant le traitement de celles-ci.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Requete s3.PNG|300px|serveur Flask]]&lt;br /&gt;
&lt;br /&gt;
Nous avons plusieurs problèmes avec le Bluetooth pour se connecter avec la Raspberry Pi. Quand nous aurons réussi à nous connecter au port série de la Raspberry Pi alors nous pourrons gérer le traitement des données récupérées.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 4'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 18/10/17 - Jeu 19/10/17]]''  &lt;br /&gt;
*Configuration de la Raspberry Pi car problèmes de connectivité Bluetooth rencontrés&lt;br /&gt;
**Nous arrivons à connecter la Raspberry Pi sous Windows mais la connexion sous Linux pose problème (travail en suspens en attendant la disponibilité de l'encadrant)&lt;br /&gt;
*Début du développement de l'interface Web&lt;br /&gt;
**Traitement d'une matrice dans un fichier JSON&lt;br /&gt;
**Affichage sous forme de tableau de la matrice&lt;br /&gt;
**Utilisation du serveur de requête en Python avec chargement de template HTML&lt;br /&gt;
**Mise en forme de la trame de la page en HTML/CSS avec le framework Bootstrap&lt;br /&gt;
**Ajout d'un set de distances (d1, d2, d3, d4) dans la matrice lors d'un appui sur un bouton Chargement en utilisant un fichier Javascript&lt;br /&gt;
&lt;br /&gt;
Nous avons reçu des fonctions Python de notre tuteur afin d'obtenir une connexion Bluetooth entre notre Raspberry Pi et notre ordinateur ainsi qu'une redirection de port de celle-ci vers la connexion. Nous n'arrivons pas à utiliser ces fonctions sous linux et nous nécessitons une explication de notre tuteur n'étant pas disponible à ce moment. Pour ne pas perdre de temps, nous attaquons la création de l'interface web à proprement parler, c'est à dire la création des pages HTML ainsi que le document Javascript qui nous servira de bibliothèque de fonctions. Chaque route de notre serveur est reliée à une série de fonctions Python s'exécutant à l'appel des url puis suivies d'un template de la page HTML en question. Nous en profitons de plus pour explorer le framework CSS bootstrap afin de mettre un premier design et une structure a notre page collecte qui sera la page principale de notre site pour ce début de projet.&lt;br /&gt;
&lt;br /&gt;
Nous nous essayons de plus à différents tests sur des fichiers de format '''JSON''' que nous devrons réussir à traiter correctement plus tard dans notre projet.&lt;br /&gt;
Nous récupérons une matrice que nous créons nous-mêmes en Python (simulation d'une série de distances récupérée) que nous transformons au format JSON pour ensuite l'afficher sur notre page web. Pour pouvoir proprement afficher ce fichier '''JSON''' renvoyé vers notre page, nous nous servons du fichier Javascript afin de créer du code HTML contenant la matrice.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 5'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 25/10/17 - Ven 27/10/17]]''  &lt;br /&gt;
*Résolution des problèmes de connectique Bluetooth sur la Raspberry Pi&lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Traitement d'une matrice dans un fichier JSON&lt;br /&gt;
**Début de l'ajout d'un set de distances depuis une matrice contenue dans un fichier JSON&lt;br /&gt;
&lt;br /&gt;
Nous avons pu nous entretenir avec notre tuteur et donc comprendre les fonctions de connexion et de redirection de port. Nous pouvons donc continuer le développement de notre interface web. Nous arrivons à traiter un set de données au format JSON et à l'afficher dans le code HTML. Toutefois nous créons nous-mêmes ce set, il est maintenant nécessaire que nous arrivions à récupérer les sets de distance réels reçus par la connexion Bluetooth. Nous commencerons par un traitement asynchrone. L'idée est d’enregistrer les sets de distances dans un fichier '''JSON''' stocké dans un dossier. Nous appellerons ce dossier plus tard via une requête Ajax.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 6'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 08/11/17 - Ven 10/11/17]]''  &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
**Mise en place de la communication entre le port série de notre machine et le port série de la carte via Bluetooth de la RPi3&lt;br /&gt;
**Récupération et traitement (parse) manuels des données de distances dans un fichier .log via TCP/IP&amp;lt;-&amp;gt;Bluetooth&lt;br /&gt;
**Début de l'automatisation du procédé par script Python (requete.py) et mise en place de sockets de communication&lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Chargement sur commande d'un set de distances depuis une matrice contenue dans un fichier JSON&lt;br /&gt;
*Travail sur le layout du site&lt;br /&gt;
&lt;br /&gt;
Après avoir regardé le code de ces différentes fonctions nous avons pu faire des tests manuels via le Shell pour récupérer des données de distances et les stocker dans un fichier '''JSON''' sur notre ordinateur.&lt;br /&gt;
&lt;br /&gt;
Nous utilisons les commandes suivantes pour se connecter via Bluetooth:&lt;br /&gt;
&lt;br /&gt;
 rfcomm connect /dev/rfcomm0 B8:27:EB:80:DC:89 1&lt;br /&gt;
&lt;br /&gt;
Rediriger le port de la Raspberrypi3 vers la connexion:&lt;br /&gt;
&lt;br /&gt;
 Python lps-collector/tcp_serial_redirect.py /dev/rfcomm0 9600&lt;br /&gt;
&lt;br /&gt;
Collecter les données dans un fichier dont nous définissons le nom:&lt;br /&gt;
&lt;br /&gt;
 echo &amp;quot;cu -s9600 -lttyACM0&amp;quot;| nc localhost 7777&lt;br /&gt;
 nc localhost 7777 | grep distance &amp;gt; static/log/dist-capture'+date+'.log&lt;br /&gt;
&lt;br /&gt;
Nous pouvons '''parser''' le flux de données avant de le stocker dans le fichier via cette commande:&lt;br /&gt;
&lt;br /&gt;
 Python lps-collector/lps_parse.py static/log/dist-capture&amp;quot;+date+&amp;quot;.log&lt;br /&gt;
&lt;br /&gt;
Il est donc nécessaire d'inclure via des '''thread''' ces différentes fonctions dans notre serveur Python (Flask) afin d'automatiser le processus. Le but est de pouvoir choisir sur l'interface web quels fonctions il faut exécuter et les déclencher via l'appui sur des boutons.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 7'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 15/11/17 - Ven 17/11/17]]''  &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
**Récupération et traitement (parse) manuels des données de distances dans un fichier .log via TCP/IP&amp;lt;-&amp;gt;Bluetooth&lt;br /&gt;
**Automatisation du procédé par script Python (requete.py)&lt;br /&gt;
***Mise en place de sockets de communication pour le contrôle de la collecte -&amp;gt; abandonné (servait à commander la collecte manuellement)&lt;br /&gt;
***Développement d'un script engine.py regroupant les commandes exécutables par l'utilisateur via la page Web&lt;br /&gt;
***Début du travail sur la fonction &amp;quot;STOP&amp;quot; manuel d'une action de collecte de données (liaison entre script HTML, Javascript, et script Python)&lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Chargement sur commande d'un set de distances depuis une matrice contenue dans un fichier JSON&lt;br /&gt;
**Travail sur le layout du site&lt;br /&gt;
***Ajout des différentes commandes (connexion Bluetooth, lancement commande cu, collecte des données, collecte durée donnée)&lt;br /&gt;
***Début de l'implémentation de la visualisation des fichiers .JSON obtenus après collecte et affichage dans un tableau matriciel du fichier sélectionné&lt;br /&gt;
&lt;br /&gt;
Nous avons continué à travailler sur le serveur de collecte: les données que nous avons récupérées via Bluetooth sont stockées dans un fichier .log. Apres avoir bien compris comment marchait la fonction '''parse''' manuellement (lors de son utilisation dans le Shell), nous l'avons implémentée dans notre serveur de collecte qui lance cette commande lors de l’appui sur un bouton via notre interface virtuelle. Un problème rencontré était de savoir quand la récolte des données devait s’arrêter. Nous avons donc rajouté un temps à entrer nous-même sur l'interface. La fonction '''parse''' est effectuée et le sous-processus va attendre le temps donné avant de lancer une commande permettant de tuer le processus et mettant donc fin au remplissage du fichier '''.log'''. Nous voulons de plus réussir à lancer une fonction de collecte sans temps. C'est à dire que nous coupons la collecte via un bouton par nous-mêmes. Nous voulions utiliser des Sockets pour pouvoir définir nous-mêmes la gestion de la communication mais l'idée a été abandonné car nous avons réussi à sauvegarder le PID du processus lancé. Il nous suffit donc de l’arrêter grâce à un autre bouton qui récupère cette variable et l’arrête ensuite. &lt;br /&gt;
&lt;br /&gt;
Toutes nos fonctions Pythons étant regroupées dans notre serveur '''requete.py''', nous avons décidé de créer un module qui regroupera toutes ces fonctions que nous pourrons utiliser dans '''requete.py'''. ceci nous permet de voir plus clair dans notre code et de faciliter le travail lorsque nous modifions le code tous les deux.&lt;br /&gt;
&lt;br /&gt;
Nous essayons en continu d'adapter le layout du site pour le rendre le plus attractif et simple possible, de façon à ce que chaque bouton et tableau soient clairs et compréhensibles.&lt;br /&gt;
&lt;br /&gt;
Nous avons commencé à récupérer les fichiers '''JSON''' créés à partir des fichier '''log''', c'est-à-dire que ces fichiers sont automatiquement stockés coté serveur dans un dossier nommé '''static/log'''. Notre but est de récupérer le nom des fichiers JSON et de les afficher dans un composant sur notre interface web. Il nous sera donc possible ensuite de sélectionner le nom d'un fichier. Lors de la sélection de ce nom de fichier, un tableau apparaît avec les valeurs de distances à l’intérieur.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 8'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 22/11/17 - Ven 24/11/17]]''  &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
**Automatisation du procédé de collecte par script Python (requete.py qui fait appel à engine.py)&lt;br /&gt;
***Développement d'un script engine.py regroupant les commandes exécutables par l'utilisateur via la page Web&lt;br /&gt;
***Travail sur la fonction &amp;quot;STOP&amp;quot; manuel d'une action de collecte de données (liaison entre script HTML, Javascript, et script Python)&lt;br /&gt;
***Mise en place d'un serveur HTTP Simple sous Python pour accéder aux fichiers de données à partir de la page Web&lt;br /&gt;
***Mise à jour de fonctions de connexion &lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Travail sur le layout du site (ajout de pages, navigation entre les pages, apparence, nettoyage des codes)&lt;br /&gt;
**Bon fonctionnement de l'ensemble serveur collecte + serveur HTTP + client Web&lt;br /&gt;
**Affichage de la liste des fichiers de données de distance (log, csv, JSON) via serveur HTTP en Python sur port 9999&lt;br /&gt;
*Corrections et nettoyage du dépôt GIT&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous continuons à développer les points énoncés la semaine dernière. Nous avons décidé de nous diriger vers un serveur HTTP Simple pour accéder à nos fichiers. Il s’avère que nous finirons par ne pas utiliser ce serveur. Nous irons récupérer les fichiers en question via des requêtes '''Ajax''' faites à la sélection du nom du fichier.&lt;br /&gt;
&lt;br /&gt;
Nous rencontrons depuis le début des problèmes avec les fonctions de connexion qui peuvent ne pas marcher à un moment donné. Nous essayons de trouver pourquoi ce bug est un bug qui ne se produit pas à chaque fois. Nous avons déterminé qu'il ne se produisait seulement lorsque les fonctions de connexions étaient lancée dans des threads. Nous ne savons toujours pas pourquoi ces thread bugguent seulement parfois et non à chaque essai de connexion.&lt;br /&gt;
&lt;br /&gt;
Nous avons nettoyé notre dépot '''Git''' car il s’avère que nous utilisions une mauvaise méthode de fusion et de stockage des documents.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 9'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 29/11/17 - Jeudi 30/11/17]]''  &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
**Automatisation du procédé de collecte par script Python (requete.py qui fait appel à engine.py)&lt;br /&gt;
***Travail sur la fonction &amp;quot;STOP&amp;quot; manuel d'une action de collecte de données (liaison entre script HTML, Javascript, et script Python)&lt;br /&gt;
***Recherches sur l'utilisation de fichiers JSON accessibles via le serveur HTTP&lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Travail sur le layout du site &lt;br /&gt;
**Travail sur la liaison entre fichiers JSON et affichage Web des données de distance&lt;br /&gt;
***Recherches et tests de solutions&lt;br /&gt;
****Affichage depuis un fichier&lt;br /&gt;
****Affichage à la volée lors d'une action de collecte&lt;br /&gt;
&lt;br /&gt;
*Revue de code avec Roudy DAGHER:&lt;br /&gt;
**Structure globale des codes ok&lt;br /&gt;
**Fonctionnement presque ok: fonctionnalités implémentées ok, mais parsage csv ne marche pas&lt;br /&gt;
**Refactoring nécessaire&lt;br /&gt;
**Correction de la fonction STOP et amélioration de la fonction de COLLECTE&lt;br /&gt;
**Faire plus de requêtes Javascript que de requêtes HTML&lt;br /&gt;
**Discussion pour l'implémentation du serveur de localisation (= algorithme de localisation) et des visualisations de données sur le site Web&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous avons d'abord revu l'ensemble de notre code et les méthodes utilisées avec notre tuteur '''Roudy Dagher'''. Nous nous approchons d'un serveur de collecte de données stable et fonctionnel. Nous avons refait les différentes connexions entre l'interface et le serveur afin de ne faire que des requêtes sur des '''WebServices'''. Il nous est possible de commencer la deuxième partie qui est l'envoi de ces tableaux de données afin de les envoyer vers le serveur de localisation via des API afin de recevoir des matrices de positions.&lt;br /&gt;
Nous pourrons grâce à ces matrices afficher une carte 3D des balises  et du TAG dans l'espace.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 10'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 06/12/17 - Jeudi 07/12/17]]'' &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
**Travail sur la fonction STOP&lt;br /&gt;
**Réalisation d'une expression régulière pour le parsage des fichiers log en fichier JSON&lt;br /&gt;
&lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Travail sur l'affichage des fichiers JSON&lt;br /&gt;
***Réalisation de toutes les requêtes Ajax&lt;br /&gt;
***Réalisation d'un menu déroulant dropdown pour charger le contenu des fichiers JSON dans le tableau de distances&lt;br /&gt;
&lt;br /&gt;
*Nettoyage du dépôt Git&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 11'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 13/12/17]]''  &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
&lt;br /&gt;
*Revue de code avec Roudy DAGHER:&lt;br /&gt;
**Discussion sur la partie système du projet et correction de certaines fonctions&lt;br /&gt;
&lt;br /&gt;
Nous nous sommes réunis avec l'un de nos tuteurs, qui a réalisé certains bouts de code de base, pour nous mettre au point sur les fonctions en question et leur utilisation.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 12'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 20/12/17 - Jeudi 21/12/17]]''&lt;br /&gt;
*Revue, correction et nettoyage des codes&lt;br /&gt;
*Finalisation du rapport&lt;br /&gt;
*Planification de semaines restantes&lt;br /&gt;
*Préparation de la soutenance&lt;br /&gt;
*Revue de mi-projet avec tous les tuteurs&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Cette dernière semaine a servi à finaliser le rapport et à discuter de l'avancée du projet, notamment avec nos tuteurs pour déterminer le travail restant, présenter le travail abouti et replanifier précisément les échéances pour le travail restant. Nous avons réalisé la soutenance de mi-projet le '''jeudi 21/12/17 à 8h'''.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 13'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 10/01/18 - Ven 12/01/18]]''  &lt;br /&gt;
*Travail sur la collecte des données (serveur de collecte et interface Web)&lt;br /&gt;
**Redéfinition du fichier de parsage car il crée des conflits et ne produit pas un fichier formaté de la façon attendue&lt;br /&gt;
***Nombre de balises réel n'est pas bien déterminé par le code&lt;br /&gt;
***ID de la première et de la dernière balise ne sont pas déterminés correctement&lt;br /&gt;
&lt;br /&gt;
**Automatisation de la collecte par un script Shell lançant toutes les commandes de CONNEXION, REDIRECTION, LANCEMENT CU, FERMETURE DU PROGRAMME (kill rfcomm / kill tcp_redirect)&lt;br /&gt;
***Dans le but d'automatiser la procédure&lt;br /&gt;
***Dans le but de résoudre un problème de gestion de ressources (le bug '''thread''' apparu plus tôt dans le projet)&lt;br /&gt;
&lt;br /&gt;
**Travail sur la résolution du bug thread car l'automatisation n'a pas résolu le problème&lt;br /&gt;
***Identification du ou des causes potentielles: gestion des ressources (synchrone, asynchrone ?), connexion Bluetooth, lancement des commandes dans le même script, lancement en fg/bg, conflit dû au temps d'exécution de chaque processus ?&lt;br /&gt;
***Lancement des commandes manuellement dans des terminaux ne pose aucun problème: solution la plus simple&lt;br /&gt;
&lt;br /&gt;
**Redesign de la page Collecte&lt;br /&gt;
***Remplacement des boutons de commande par un bouton unique d'initialisation&lt;br /&gt;
***Travail sur une mise à jour du menu déroulant dropdown régulière sans avoir à recharger la page Web&lt;br /&gt;
***Implémentation de plotly.js, un module Javascript qui permet d'afficher des graphes en 3D&lt;br /&gt;
&lt;br /&gt;
*Mise au point post-soutenance avec Roudy DAGHER pour valider le travail restant, effectué et redéfinir certains objectifs atteignables ou pas selon les éléments réalisés dans le projet&lt;br /&gt;
*Recherches et début de l'implémentation du serveur de localisation fourni par les tuteurs&lt;br /&gt;
*Gestion du Git pour créer des branches additionnelles&lt;br /&gt;
*Recréation du rapport de projet suite à une perte du fichier éditable d'origine + Mise à jour avec les remarques suite à la soutenance ainsi que les nouveaux éléments&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 14'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mar 16/01/18 - Ven 19/01/18]]''  &lt;br /&gt;
*Travail sur la collecte des données (serveur de collecte et interface Web)&lt;br /&gt;
**Redéfinition du fichier de parsage car il crée des conflits et ne produit pas un fichier formaté de la façon attendue&lt;br /&gt;
***Corrigé: Nombre de balises réel n'est pas bien déterminé par le code&lt;br /&gt;
***Corrigé: ID de la première et de la dernière balise ne sont pas déterminés correctement&lt;br /&gt;
***Reste à faire: Traiter le cas où il y a un ajout ou suppression d'une balise pendant la collecte (pour le moment, lorsque c'est le cas, toutes les données se décalent au lieu de laisser des trous)&lt;br /&gt;
&lt;br /&gt;
**Automatisation de la collecte par un script Shell lançant toutes les commandes de CONNEXION, REDIRECTION, LANCEMENT CU, FERMETURE DU PROGRAMME (kill rfcomm / kill tcp_redirect)&lt;br /&gt;
***Mis en suspens: pour le moment, on lance les commandes manuellement dans le terminal&lt;br /&gt;
&lt;br /&gt;
**Interface Web&lt;br /&gt;
***Implémentation de plotly.js, un module Javascript qui permet d'afficher des graphes en 3D&lt;br /&gt;
&lt;br /&gt;
*Implémentation du serveur de localisation fourni par les tuteurs (mais algorithme de localisation pas fonctionnel pour le moment)&lt;br /&gt;
**Mise à jour de l'affichage des positions des éléments: précédemment seule la matrice X de position du Tag s'affichait, et pas la matrice A des balises&lt;br /&gt;
**Requêtes manuelles à l'API avec la fonction curl OK: on arrive à récupérer les matrices X et A (aléatoires pour le moment) par une requête GET à l'API du serveur de localisation&lt;br /&gt;
**Implémentation des requêtes Ajax pour automatiser les requêtes au serveur de localisation&lt;br /&gt;
&lt;br /&gt;
*Mise à jour du rapport les nouveaux éléments du travail réalisé&lt;br /&gt;
*Réflexion sur la possibilité ou non de réaliser la partie temps réel du projet au vu des moyens à disposition&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 15'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mar 23/01/18 - Ven 26/01/18]]'' &lt;br /&gt;
*Travail sur la collecte des données (serveur de collecte et interface Web)&lt;br /&gt;
**Redéfinition du fichier de parsage car il crée des conflits et ne produit pas un fichier formaté de la façon attendue&lt;br /&gt;
***Fait: Si distance négative car Tag trop près, la valeur négative générée par une balise est remplacée par un &amp;quot;0&amp;quot; (cela modifie la position réelle modélisée dans plotly, mais évite une impossibilité de générer la position à partir de la distance -&amp;gt; par des tests, il faudra déterminer la valeur limite à partir de laquelle les cartes donnent des valeurs de distance négatives&lt;br /&gt;
***Reste à faire: Traiter le cas où il y a un ajout ou suppression d'une balise pendant la collecte (pour le moment, lorsque c'est le cas, toutes les données se décalent au lieu de laisser des trous); Ainsi que le cas où il y un saut/bug inattendu et donc une disparition d'une ou plusieurs valeurs de distance&lt;br /&gt;
***Début de résolution du cas où une distance n'est pas prise en compte, c'est à dire où il y a une valeur qui disparaît et désaligne les valeurs lors de la création du JSON&lt;br /&gt;
&lt;br /&gt;
**Automatisation de la collecte par un script Shell lançant toutes les commandes de CONNEXION, REDIRECTION, LANCEMENT CU, FERMETURE DU PROGRAMME (kill rfcomm / kill tcp_redirect)&lt;br /&gt;
***Mis en suspens: pour le moment, on lance les commandes manuellement dans le terminal&lt;br /&gt;
***Création d'un script bash /etc/init.d/autoconnect.sh pour connecter automatiquement la RPi au lancement du système (si la RPi est déjà allumée au démarrage)&lt;br /&gt;
&lt;br /&gt;
**Interface Web&lt;br /&gt;
***Perfectionnement de l'utilisation de Plotly pour les visualisations&lt;br /&gt;
&lt;br /&gt;
*Implémentation du serveur de localisation fourni par les tuteurs (algorithme de localisation pas fonctionnel pour le moment)&lt;br /&gt;
**Requêtes manuelles à l'API avec la fonction curl OK&lt;br /&gt;
**Fait: Implémentation des requêtes Ajax pour automatiser les requêtes au serveur de localisation&lt;br /&gt;
***Liaison entre les différentes commandes curl grace à des variables: permet de stocker l'adresse du job récupérée par la méthode GET&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 16'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Lun 29/01/18 - Ven 02/02/18]]'' &lt;br /&gt;
*Travail sur la collecte des données (serveur de collecte et interface Web)&lt;br /&gt;
**Redéfinition du fichier de parsage car il crée des conflits et ne produit pas un fichier formaté de la façon attendue&lt;br /&gt;
***déterminer la valeur limite à partir de laquelle les cartes donnent des valeurs de distance négatives&lt;br /&gt;
***Reste à faire: Traiter le cas où il y a un ajout ou suppression d'une balise pendant la collecte (pour le moment, lorsque c'est le cas, toutes les données se décalent au lieu de laisser des trous); Ainsi que le cas où il y un saut/bug inattendu et donc une disparition d'une ou plusieurs valeurs de distance&lt;br /&gt;
***Fait: gestion des bugs/sauts de valeurs de balises - remplacement par une valeur nulle sur balise existe, par rien sinon (implémentation d'un tableau caractérisant l'existence ou pas de chaque balise 1 à 6), optimisation des temps de calculs/exécution dans le script&lt;br /&gt;
**Interface Web&lt;br /&gt;
***Ajout d'une barre de progression de la collecte remplaçant le bouton de Lancement de collecte lors de l'appui&lt;br /&gt;
***Ajout d'un bouton dropdown pour afficher les fichiers de position qu'on reçoit du serveur de localisation&lt;br /&gt;
***Ajout d'une scrollbar dans les deux dropdown&lt;br /&gt;
&lt;br /&gt;
*Implémentation du serveur de localisation fourni par les tuteurs (algorithme de localisation pas fonctionnel pour le moment)&lt;br /&gt;
**Fait: Implémentation des requêtes Ajax pour automatiser les requêtes au serveur de localisation&lt;br /&gt;
***Liaison entre les différentes requêtes Ajax grâce à des variables: permet de stocker l'adresse du job récupérée par la méthode GET&lt;br /&gt;
***Création d'une requête Ajax GET qui demande le fichier JSON de position au serveur de localisation jusqu'à ce qu'il soit retourné&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Observations'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Problèmes rencontrés'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Solutions apportées'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Délivrables'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
Rapport de mi-PFE&lt;br /&gt;
[[Fichier:RapportMi-PFE-UNG DELATTE.pdf]]&lt;br /&gt;
&lt;br /&gt;
Rapport de PFE&lt;br /&gt;
&lt;br /&gt;
Vidéo&lt;/div&gt;</summary>
		<author><name>Hdelatte</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=P18_Localisation_of_quadrotors&amp;diff=50215</id>
		<title>P18 Localisation of quadrotors</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=P18_Localisation_of_quadrotors&amp;diff=50215"/>
				<updated>2018-02-07T16:36:12Z</updated>
		
		<summary type="html">&lt;p&gt;Hdelatte : /* Semaine 15 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Cahier des charges'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;Présentation générale du projet&amp;lt;/span&amp;gt;=== &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Contexte&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
Dans un monde de plus en plus connecté, de nombreux drones sont déployés pour diverses applications comme l'espionnage, la surveillance, la cartographie de lieux et la livraison de colis. Les technologies nécessaires pour contrôler ces drones sont des sujets de recherche actuels. &lt;br /&gt;
&lt;br /&gt;
Le contrôle de ceux-ci passe tout d'abord par la maîtrise de leur position dans l'espace. Le développement des applications liées à l'utilisation de drones nécessite un travail important sur la localisation spatiale d'objets connectés. &lt;br /&gt;
&lt;br /&gt;
De plus, dans un souci d'utilisation, il est essentiel de développer des interfaces logicielles permettant d'exploiter ces données.&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Objectif du projet&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
L'objectif de ce projet est de développer une interface logicielle permettant de traiter en temps réel les informations de localisation d'un drone et de balises, dans le but de définir leur localisation dans l'espace, en intérieur.&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Description du projet&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
Pour réaliser le contrôle de drones, la première étape importante est de donner ses informations de position. Le but du projet est de développer une interface logicielle permettant de localiser le drone en temps réel en intérieur. Le drone se déplace dans un environnement dans lequel ont été installées de multiples balises. Il est équipé d'une carte, lui permettant de recevoir les distances relatives entre lui-même et les balises, sur laquelle différents algorithmes vont être implémentés pour effectuer la localisation en temps réel. Le projet requiert des compétences en développement hardware (Crazyflie 2.0, voir https://wiki.bitcraze.io/) et software (langage C/C++/Python/Javascript/HTML...).&lt;br /&gt;
&lt;br /&gt;
Il se divise en 4 étapes principales, qui sont:&lt;br /&gt;
*1) Choisir les technologies utilisées&lt;br /&gt;
*2) Choisir l'architecture (OS / APIs)&lt;br /&gt;
*3) Développer les différentes parties du projet&lt;br /&gt;
*4) Intégrer et connecter les différentes parties du projet&lt;br /&gt;
&lt;br /&gt;
La localisation étant en intérieur, le protocole GPS n'est donc pas assez précis pour les applications ciblées. La mise en place d'un tel dispositif permettrait grâce à l'utilisation d'un algorithme d'estimer avec une bonne précision les positions en intérieur d'une balise centrale (appelée Tag) et de balises (appelées Anchor). Le Tag scanne en temps réel la distance relative aux différentes balises, et il nous est retourné la position des balises et du Tag grâce à l'algorithme de localisation.&lt;br /&gt;
&lt;br /&gt;
Le projet se compose de 3 parties:&lt;br /&gt;
* Collect &amp;amp; parse: collecter les données envoyées par les balises en communiquant avec un serveur et récupérer les données adéquates par un tri&lt;br /&gt;
* Localise: déterminer la matrice de position des balises et du Tag en traitant les données récupérées&lt;br /&gt;
* Display: développer l'interface homme machine pour afficher, étudier et utiliser les données traitées&lt;br /&gt;
&lt;br /&gt;
Nous travaillerons dans un premier temps dans une optique temps différé avant de travailler en temps réel. Cela nous permettra d'acquérir des données utiles et réutilisables en aval. &lt;br /&gt;
&lt;br /&gt;
A l'aboutissement du projet, nous devrions être capable via l'interface homme machine développée d'afficher précisément la position spatiale des balises ainsi que du Tag, grâce àl'utilisation d'un algorithme de localisation et des données récupérées, et d'afficher d'autres données relatives au déplacement du Tag ou des balises dans l'espace. &lt;br /&gt;
&lt;br /&gt;
Si le temps le permet, nous pourrons aussi être amenés à adapter et utiliser l'interface développée pour l'utilisation d'un drone.&lt;br /&gt;
&lt;br /&gt;
''Sujet originel''&lt;br /&gt;
&lt;br /&gt;
To achieve the control of quadrotors, the first important task to give its position information. This project is to develop a software(GUI) to localize the quadrotors in real-time. The quadrotor is flying in an environment where several transmitters have been installed. The quadrotor is equipped with a deck to receive the relative distances between the deck and all transmitters, based on which different algorithms will be implemented to realize the real-time localization. The candidates need to have both experiences on hardware (Crazyflie 2.0, see https://wiki.bitcraze.io/) and software development (C/C , Python…). &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Calendrier prévisionnel&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
''[[Avant le 29/09/17]]'' - Élaboration du Cahier des charges, de la liste des tâches et du calendrier prévisionnel&lt;br /&gt;
&lt;br /&gt;
''[[Avant fin Octobre]]'' - Serveur de collecte et début du développement de l'interface logicielle&lt;br /&gt;
&lt;br /&gt;
''[[Avant fin Décembre]]'' - Interface logicielle&lt;br /&gt;
&lt;br /&gt;
''[[A la fin du PFE]]'' - Intégration finale des différentes parties (Serveur de collecte des données &amp;amp; Serveur de localisation &amp;amp; Interface logicielle)&lt;br /&gt;
&lt;br /&gt;
Répartition du volume de travail (***h):&lt;br /&gt;
&lt;br /&gt;
* Recherche sur les technologies à utiliser&lt;br /&gt;
* Développement du serveur de collecte de données&lt;br /&gt;
* Réalisation de l'interface logicielle (Web//Logiciel/Application)&lt;br /&gt;
* Intégration des différentes parties&lt;br /&gt;
* Test et débuggage&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Choix techniques : matériel et logiciel&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
Afin de développer ce dispositif, nous allons utiliser une Raspberry Pi 3 associée à une carte réceptrice, qui communique avec 4 balises composées chacune d'un microcontrôleur et d'une carte émettrice radio (UWB5C) et alimentées par batteries. La carte réceptrice joue le rôle du drone à localiser et communiquera les données émises par les balises vers l'ordinateur via Bluetooth.&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Choix technologiques&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
Voici les technologies que nous utilisons pour chacune des parties de ce projet.&lt;br /&gt;
&lt;br /&gt;
    1) Serveur de collecte des données:&lt;br /&gt;
       Scanne et parse les données récupérées pour fournir la matrice D des distances relatives du tag aux 4 balises&lt;br /&gt;
        - API&lt;br /&gt;
        - Python / Serveur Flask&lt;br /&gt;
&lt;br /&gt;
    2) Serveur de localisation (fourni):&lt;br /&gt;
       Calcule grâce à l'algorithme de localisation et la matrice D les positions spatiales des 4 noeuds et du tag&lt;br /&gt;
        - API&lt;br /&gt;
        - Bootstrap&lt;br /&gt;
        - Jquery&lt;br /&gt;
        - Python&lt;br /&gt;
&lt;br /&gt;
    3) Interface utilisateur:&lt;br /&gt;
       Affiche courbes, visualisation 3D, boutons ou données des fichiers envoyées par le serveur de localisation&lt;br /&gt;
        - HTML5 / Javascript&lt;br /&gt;
        - Fichiers JSON (serveurs de collecte et de localisation)&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Calendrier prévisionnel'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Liste des tâches à effectuer&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
# Se documenter sur le projet&lt;br /&gt;
##Langages et technologies utilisées&lt;br /&gt;
##Matériel utilisé&lt;br /&gt;
##Mettre en place du travail sur le Git&lt;br /&gt;
# Réaliser le serveur de collecte&lt;br /&gt;
##Récupérer les trames envoyées par bluetooth par le TAG via la Raspberry Pi&lt;br /&gt;
##Intégrer le serveur de localisation pour interpréter les trames&lt;br /&gt;
##Tester et optimiser&lt;br /&gt;
# Réaliser l'interface Web utilisateur&lt;br /&gt;
##Implémenter le serveur de collecte et de localisation&lt;br /&gt;
##Afficher et traiter les données stockées dans les fichiers JSON via le serveur (temps différé + temps réel)&lt;br /&gt;
##Tester et optimiser&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;Replanification du cahier des charges / calendrier&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Feuille d'heures'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Tâche !! Prélude !! Heures S1 !! Heures S2 !! Heures S3 !! Heures S4 !! Heures S5 !! Heures S6 !! Heures S7 !! Heures S8 !! Heures S9 !! Heures S10 !! Heures S11 !! Heures S12 !! Heures S13 !! Heures S14 !! Heures S15 !! Heures S16 !! Heures S17 !! Heures S18 !! Heures S19 !! Total&lt;br /&gt;
|-&lt;br /&gt;
| Cahier des charges / Wiki / Gitlab / Rapport&lt;br /&gt;
|  4h&lt;br /&gt;
|  3h&lt;br /&gt;
|  1h&lt;br /&gt;
|  x&lt;br /&gt;
|  1h30&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h30&lt;br /&gt;
|  1h&lt;br /&gt;
|  3h&lt;br /&gt;
|  3h30&lt;br /&gt;
|  2h&lt;br /&gt;
|  5h&lt;br /&gt;
|  x&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Documentation sur les technos utilisées&lt;br /&gt;
|  2h&lt;br /&gt;
|  4h&lt;br /&gt;
|  3h&lt;br /&gt;
|  2h&lt;br /&gt;
|  3h&lt;br /&gt;
|  4h&lt;br /&gt;
|  5h&lt;br /&gt;
|  5h30&lt;br /&gt;
|  4h30&lt;br /&gt;
|  3h30&lt;br /&gt;
|  2h&lt;br /&gt;
|  3h&lt;br /&gt;
|  1h&lt;br /&gt;
|  3h&lt;br /&gt;
|  4h&lt;br /&gt;
|  x&lt;br /&gt;
|  2h&lt;br /&gt;
|  &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Documentation sur le matériel&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  1h&lt;br /&gt;
|  1h&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Recherche et développement du serveur de collecte&lt;br /&gt;
|  x&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  3h&lt;br /&gt;
|  3h30&lt;br /&gt;
|  4h&lt;br /&gt;
|  5h&lt;br /&gt;
|  7h&lt;br /&gt;
|  4h30&lt;br /&gt;
|  0,5h&lt;br /&gt;
|  3h&lt;br /&gt;
|  4h&lt;br /&gt;
|  3h&lt;br /&gt;
|  x&lt;br /&gt;
|  4h&lt;br /&gt;
|  7h30&lt;br /&gt;
|  5h&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Recherche et développement de l'interface Web&lt;br /&gt;
|  x&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  3h&lt;br /&gt;
|  5h&lt;br /&gt;
|  6h&lt;br /&gt;
|  4h&lt;br /&gt;
|  7h&lt;br /&gt;
|  5h30&lt;br /&gt;
|  2h30&lt;br /&gt;
|  6h&lt;br /&gt;
|  8h&lt;br /&gt;
|  5h&lt;br /&gt;
|  1h&lt;br /&gt;
|  8h&lt;br /&gt;
|  4h&lt;br /&gt;
|  4h&lt;br /&gt;
|  &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Recherche et intégration du serveur de localisation&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x &lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  6h&lt;br /&gt;
|  5h&lt;br /&gt;
|  3h&lt;br /&gt;
|  &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Intégration des différentes parties&lt;br /&gt;
|  x&lt;br /&gt;
|  x  &lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  2h&lt;br /&gt;
|  2h&lt;br /&gt;
|  2h&lt;br /&gt;
|  3h&lt;br /&gt;
|  1h30&lt;br /&gt;
|  x&lt;br /&gt;
|  3h&lt;br /&gt;
|  6h&lt;br /&gt;
|  5h&lt;br /&gt;
|  x&lt;br /&gt;
|  3h30&lt;br /&gt;
|  2h&lt;br /&gt;
|  2h&lt;br /&gt;
|  &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Tests et débuggage&lt;br /&gt;
|  x&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  1h&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  3h&lt;br /&gt;
|  4h&lt;br /&gt;
|  0,5h&lt;br /&gt;
|  3h&lt;br /&gt;
|  1h&lt;br /&gt;
|  3h&lt;br /&gt;
|  3h&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  4h&lt;br /&gt;
|  &lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Optimisation/Correction des programmes&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Vidéo&lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Avancement du Projet'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Phase préparatoire'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Jeu 21/09/17 - Ven 22/09/17]]'' &lt;br /&gt;
*Rendez-vous de mise au point du cahier des charges avec les encadrants/intervenants (M. ZHENG Gang et M. DAGHER Roudy)&lt;br /&gt;
*Elaboration du cahier des charges&lt;br /&gt;
*Elaboration de la page Wiki (préparation de la mise en page et présentation du sujet)&lt;br /&gt;
*Préparation du travail sous forme de Mind Map&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous nous sommes tout d’abord rendus au laboratoire de l'INRIA afin de pouvoir définir le plus précisément possible le cahier des charges avec nos tuteurs.&lt;br /&gt;
Nous avons donc défini avec eux les technologies qu'il faudrait étudier. Vous retrouverez le choix des technologies dans la partie '''choix technologiques'''&lt;br /&gt;
&lt;br /&gt;
Nous avons en même temps créé notre page Wiki, et structurée celle-ci avec les parties qui nous seraient utiles pour développer nos explications par la suite.&lt;br /&gt;
&lt;br /&gt;
Nous avons de plus découpé le travail en sous-parties que nous avions mis dans une '''Mind map''' afin d'y voir plus clair sur la ligne à suivre.&lt;br /&gt;
&lt;br /&gt;
Vous trouverez cette Mind map juste ci-dessous. Nous ne mettrons pas à jour cette Mind map chaque semaine mais il est fort probable que nous en refaisions un en milieu de projet pour pouvoir cibler les objectifs réussis et ceux à atteindre. Nous pourrons de plus redéfinir certains objectifs qui nous auraient semblés trop vague au début du projet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Projet de fin d'étude.png|centre|600px]]&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 1'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Jeu 28/09/17 - Ven 29/09/17]]'' &lt;br /&gt;
*Revue du Cahier des Charges avec les encadrants&lt;br /&gt;
*Lecture et recherches sur les technologies adaptées&lt;br /&gt;
*Construction de la suite de la Mind Map&lt;br /&gt;
*Création du Gitlab&lt;br /&gt;
&lt;br /&gt;
Nous commençons les recherches sur le projet et sur les premières technologies engagées dans celui-ci. Nous en profitons pour formuler dès à présent des questions sur le bon choix de celles-ci. Nous commençons donc des tests ayant seulement pour but de nous familiariser avec l'environnement de travail et de réellement comprendre les fonctions déjà présentes qu'il faudra exploiter et implanter notre interface web.&lt;br /&gt;
Nous créons un dépôt Gitlab avec notre tuteur et commençons a définir les taches premières sur celui-ci.&lt;br /&gt;
Nous en profitons pour affiner le Mind Map.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 2'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Jeu 05/10/17 - Ven 06/10/17]]''  &lt;br /&gt;
*Précisions sur le cahier des charges&lt;br /&gt;
*Listage du matériel&lt;br /&gt;
*Recherche et détermination de solutions technologiques possibles pour les fonctions demandées&lt;br /&gt;
*Début du travail sur le serveur de collecte&lt;br /&gt;
*Apprentissage du langage Python et de l'utilisation du framework Flask&lt;br /&gt;
&lt;br /&gt;
Nous avons finalisé les précisions sur le cahier des charges. Nous avons donc pu cibler le matériel dont nous nous servirons pour ce Projet. Vous trouverez donc cette liste la section correspondante. Il est évident que le matériel utilisé est dans l'ensemble déjà fourni par le laboratoire et qu'il nous reste dans l'ensemble à créer l'interface web et les API qui nous permettrons de faire communiquer cette interface avec la Raspberry Pi et le serveur de position déjà créé.&lt;br /&gt;
Nous avons donc pu commencer à nous former sur les technologies qui nous serviraient par la suite. Nous avons donc utilisé le cours d'Openclassrooms sur les serveurs Flask pour en apprendre les bases. Ce serveur Flask est programmé en Python et nous permet donc une grande liberté au niveau de l’exécution de certains scripts. En effet, les scripts de connexion Bluetooth et de redirection de port qui nous permettent de récupérer les données de distance sont eux-mêmes codés en Python et sont directement appelés via le serveur.&lt;br /&gt;
Dans ce serveur, représentant notre interface web, vous retrouverez la page '''/collecte''' qui représentera notre partie collecte de données ainsi que l'affichage de ces distances. Nous appellerons cette partie le Serveur de Collecte.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 3'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 11/10/17 - Jeu 12/10/17]]''  &lt;br /&gt;
*Recherche et développement initial du serveur de collecte de données&lt;br /&gt;
*Complément du Git sur les tâches à effectuer&lt;br /&gt;
&lt;br /&gt;
Nous avons commencé à créer un serveur Flask renvoyant pour l'instant une matrice aléatoire. Lors de la requête URL &amp;quot;../matrice&amp;quot;, nous voyons bien une matrice aléatoire apparaître sur la page Web. Nous essayons de nous connecter à la Raspberry Pi en redirigeant son port série vers le Bluetooth de façon à récupérer de vraies matrices de distance entre le drone (ie commutateur central) et les balises. Nous pourrons afficher ensuite ces matrices, ou alors les stocker dans un fichier en attendant le traitement de celles-ci.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Requete s3.PNG|300px|serveur Flask]]&lt;br /&gt;
&lt;br /&gt;
Nous avons plusieurs problèmes avec le Bluetooth pour se connecter avec la Raspberry Pi. Quand nous aurons réussi à nous connecter au port série de la Raspberry Pi alors nous pourrons gérer le traitement des données récupérées.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 4'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 18/10/17 - Jeu 19/10/17]]''  &lt;br /&gt;
*Configuration de la Raspberry Pi car problèmes de connectivité Bluetooth rencontrés&lt;br /&gt;
**Nous arrivons à connecter la Raspberry Pi sous Windows mais la connexion sous Linux pose problème (travail en suspens en attendant la disponibilité de l'encadrant)&lt;br /&gt;
*Début du développement de l'interface Web&lt;br /&gt;
**Traitement d'une matrice dans un fichier JSON&lt;br /&gt;
**Affichage sous forme de tableau de la matrice&lt;br /&gt;
**Utilisation du serveur de requête en Python avec chargement de template HTML&lt;br /&gt;
**Mise en forme de la trame de la page en HTML/CSS avec le framework Bootstrap&lt;br /&gt;
**Ajout d'un set de distances (d1, d2, d3, d4) dans la matrice lors d'un appui sur un bouton Chargement en utilisant un fichier Javascript&lt;br /&gt;
&lt;br /&gt;
Nous avons reçu des fonctions Python de notre tuteur afin d'obtenir une connexion Bluetooth entre notre Raspberry Pi et notre ordinateur ainsi qu'une redirection de port de celle-ci vers la connexion. Nous n'arrivons pas à utiliser ces fonctions sous linux et nous nécessitons une explication de notre tuteur n'étant pas disponible à ce moment. Pour ne pas perdre de temps, nous attaquons la création de l'interface web à proprement parler, c'est à dire la création des pages HTML ainsi que le document Javascript qui nous servira de bibliothèque de fonctions. Chaque route de notre serveur est reliée à une série de fonctions Python s'exécutant à l'appel des url puis suivies d'un template de la page HTML en question. Nous en profitons de plus pour explorer le framework CSS bootstrap afin de mettre un premier design et une structure a notre page collecte qui sera la page principale de notre site pour ce début de projet.&lt;br /&gt;
&lt;br /&gt;
Nous nous essayons de plus à différents tests sur des fichiers de format '''JSON''' que nous devrons réussir à traiter correctement plus tard dans notre projet.&lt;br /&gt;
Nous récupérons une matrice que nous créons nous-mêmes en Python (simulation d'une série de distances récupérée) que nous transformons au format JSON pour ensuite l'afficher sur notre page web. Pour pouvoir proprement afficher ce fichier '''JSON''' renvoyé vers notre page, nous nous servons du fichier Javascript afin de créer du code HTML contenant la matrice.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 5'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 25/10/17 - Ven 27/10/17]]''  &lt;br /&gt;
*Résolution des problèmes de connectique Bluetooth sur la Raspberry Pi&lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Traitement d'une matrice dans un fichier JSON&lt;br /&gt;
**Début de l'ajout d'un set de distances depuis une matrice contenue dans un fichier JSON&lt;br /&gt;
&lt;br /&gt;
Nous avons pu nous entretenir avec notre tuteur et donc comprendre les fonctions de connexion et de redirection de port. Nous pouvons donc continuer le développement de notre interface web. Nous arrivons à traiter un set de données au format JSON et à l'afficher dans le code HTML. Toutefois nous créons nous-mêmes ce set, il est maintenant nécessaire que nous arrivions à récupérer les sets de distance réels reçus par la connexion Bluetooth. Nous commencerons par un traitement asynchrone. L'idée est d’enregistrer les sets de distances dans un fichier '''JSON''' stocké dans un dossier. Nous appellerons ce dossier plus tard via une requête Ajax.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 6'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 08/11/17 - Ven 10/11/17]]''  &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
**Mise en place de la communication entre le port série de notre machine et le port série de la carte via Bluetooth de la RPi3&lt;br /&gt;
**Récupération et traitement (parse) manuels des données de distances dans un fichier .log via TCP/IP&amp;lt;-&amp;gt;Bluetooth&lt;br /&gt;
**Début de l'automatisation du procédé par script Python (requete.py) et mise en place de sockets de communication&lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Chargement sur commande d'un set de distances depuis une matrice contenue dans un fichier JSON&lt;br /&gt;
*Travail sur le layout du site&lt;br /&gt;
&lt;br /&gt;
Après avoir regardé le code de ces différentes fonctions nous avons pu faire des tests manuels via le Shell pour récupérer des données de distances et les stocker dans un fichier '''JSON''' sur notre ordinateur.&lt;br /&gt;
&lt;br /&gt;
Nous utilisons les commandes suivantes pour se connecter via Bluetooth:&lt;br /&gt;
&lt;br /&gt;
 rfcomm connect /dev/rfcomm0 B8:27:EB:80:DC:89 1&lt;br /&gt;
&lt;br /&gt;
Rediriger le port de la Raspberrypi3 vers la connexion:&lt;br /&gt;
&lt;br /&gt;
 Python lps-collector/tcp_serial_redirect.py /dev/rfcomm0 9600&lt;br /&gt;
&lt;br /&gt;
Collecter les données dans un fichier dont nous définissons le nom:&lt;br /&gt;
&lt;br /&gt;
 echo &amp;quot;cu -s9600 -lttyACM0&amp;quot;| nc localhost 7777&lt;br /&gt;
 nc localhost 7777 | grep distance &amp;gt; static/log/dist-capture'+date+'.log&lt;br /&gt;
&lt;br /&gt;
Nous pouvons '''parser''' le flux de données avant de le stocker dans le fichier via cette commande:&lt;br /&gt;
&lt;br /&gt;
 Python lps-collector/lps_parse.py static/log/dist-capture&amp;quot;+date+&amp;quot;.log&lt;br /&gt;
&lt;br /&gt;
Il est donc nécessaire d'inclure via des '''thread''' ces différentes fonctions dans notre serveur Python (Flask) afin d'automatiser le processus. Le but est de pouvoir choisir sur l'interface web quels fonctions il faut exécuter et les déclencher via l'appui sur des boutons.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 7'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 15/11/17 - Ven 17/11/17]]''  &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
**Récupération et traitement (parse) manuels des données de distances dans un fichier .log via TCP/IP&amp;lt;-&amp;gt;Bluetooth&lt;br /&gt;
**Automatisation du procédé par script Python (requete.py)&lt;br /&gt;
***Mise en place de sockets de communication pour le contrôle de la collecte -&amp;gt; abandonné (servait à commander la collecte manuellement)&lt;br /&gt;
***Développement d'un script engine.py regroupant les commandes exécutables par l'utilisateur via la page Web&lt;br /&gt;
***Début du travail sur la fonction &amp;quot;STOP&amp;quot; manuel d'une action de collecte de données (liaison entre script HTML, Javascript, et script Python)&lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Chargement sur commande d'un set de distances depuis une matrice contenue dans un fichier JSON&lt;br /&gt;
**Travail sur le layout du site&lt;br /&gt;
***Ajout des différentes commandes (connexion Bluetooth, lancement commande cu, collecte des données, collecte durée donnée)&lt;br /&gt;
***Début de l'implémentation de la visualisation des fichiers .JSON obtenus après collecte et affichage dans un tableau matriciel du fichier sélectionné&lt;br /&gt;
&lt;br /&gt;
Nous avons continué à travailler sur le serveur de collecte: les données que nous avons récupérées via Bluetooth sont stockées dans un fichier .log. Apres avoir bien compris comment marchait la fonction '''parse''' manuellement (lors de son utilisation dans le Shell), nous l'avons implémentée dans notre serveur de collecte qui lance cette commande lors de l’appui sur un bouton via notre interface virtuelle. Un problème rencontré était de savoir quand la récolte des données devait s’arrêter. Nous avons donc rajouté un temps à entrer nous-même sur l'interface. La fonction '''parse''' est effectuée et le sous-processus va attendre le temps donné avant de lancer une commande permettant de tuer le processus et mettant donc fin au remplissage du fichier '''.log'''. Nous voulons de plus réussir à lancer une fonction de collecte sans temps. C'est à dire que nous coupons la collecte via un bouton par nous-mêmes. Nous voulions utiliser des Sockets pour pouvoir définir nous-mêmes la gestion de la communication mais l'idée a été abandonné car nous avons réussi à sauvegarder le PID du processus lancé. Il nous suffit donc de l’arrêter grâce à un autre bouton qui récupère cette variable et l’arrête ensuite. &lt;br /&gt;
&lt;br /&gt;
Toutes nos fonctions Pythons étant regroupées dans notre serveur '''requete.py''', nous avons décidé de créer un module qui regroupera toutes ces fonctions que nous pourrons utiliser dans '''requete.py'''. ceci nous permet de voir plus clair dans notre code et de faciliter le travail lorsque nous modifions le code tous les deux.&lt;br /&gt;
&lt;br /&gt;
Nous essayons en continu d'adapter le layout du site pour le rendre le plus attractif et simple possible, de façon à ce que chaque bouton et tableau soient clairs et compréhensibles.&lt;br /&gt;
&lt;br /&gt;
Nous avons commencé à récupérer les fichiers '''JSON''' créés à partir des fichier '''log''', c'est-à-dire que ces fichiers sont automatiquement stockés coté serveur dans un dossier nommé '''static/log'''. Notre but est de récupérer le nom des fichiers JSON et de les afficher dans un composant sur notre interface web. Il nous sera donc possible ensuite de sélectionner le nom d'un fichier. Lors de la sélection de ce nom de fichier, un tableau apparaît avec les valeurs de distances à l’intérieur.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 8'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 22/11/17 - Ven 24/11/17]]''  &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
**Automatisation du procédé de collecte par script Python (requete.py qui fait appel à engine.py)&lt;br /&gt;
***Développement d'un script engine.py regroupant les commandes exécutables par l'utilisateur via la page Web&lt;br /&gt;
***Travail sur la fonction &amp;quot;STOP&amp;quot; manuel d'une action de collecte de données (liaison entre script HTML, Javascript, et script Python)&lt;br /&gt;
***Mise en place d'un serveur HTTP Simple sous Python pour accéder aux fichiers de données à partir de la page Web&lt;br /&gt;
***Mise à jour de fonctions de connexion &lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Travail sur le layout du site (ajout de pages, navigation entre les pages, apparence, nettoyage des codes)&lt;br /&gt;
**Bon fonctionnement de l'ensemble serveur collecte + serveur HTTP + client Web&lt;br /&gt;
**Affichage de la liste des fichiers de données de distance (log, csv, JSON) via serveur HTTP en Python sur port 9999&lt;br /&gt;
*Corrections et nettoyage du dépôt GIT&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous continuons à développer les points énoncés la semaine dernière. Nous avons décidé de nous diriger vers un serveur HTTP Simple pour accéder à nos fichiers. Il s’avère que nous finirons par ne pas utiliser ce serveur. Nous irons récupérer les fichiers en question via des requêtes '''Ajax''' faites à la sélection du nom du fichier.&lt;br /&gt;
&lt;br /&gt;
Nous rencontrons depuis le début des problèmes avec les fonctions de connexion qui peuvent ne pas marcher à un moment donné. Nous essayons de trouver pourquoi ce bug est un bug qui ne se produit pas à chaque fois. Nous avons déterminé qu'il ne se produisait seulement lorsque les fonctions de connexions étaient lancée dans des threads. Nous ne savons toujours pas pourquoi ces thread bugguent seulement parfois et non à chaque essai de connexion.&lt;br /&gt;
&lt;br /&gt;
Nous avons nettoyé notre dépot '''Git''' car il s’avère que nous utilisions une mauvaise méthode de fusion et de stockage des documents.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 9'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 29/11/17 - Jeudi 30/11/17]]''  &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
**Automatisation du procédé de collecte par script Python (requete.py qui fait appel à engine.py)&lt;br /&gt;
***Travail sur la fonction &amp;quot;STOP&amp;quot; manuel d'une action de collecte de données (liaison entre script HTML, Javascript, et script Python)&lt;br /&gt;
***Recherches sur l'utilisation de fichiers JSON accessibles via le serveur HTTP&lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Travail sur le layout du site &lt;br /&gt;
**Travail sur la liaison entre fichiers JSON et affichage Web des données de distance&lt;br /&gt;
***Recherches et tests de solutions&lt;br /&gt;
****Affichage depuis un fichier&lt;br /&gt;
****Affichage à la volée lors d'une action de collecte&lt;br /&gt;
&lt;br /&gt;
*Revue de code avec Roudy DAGHER:&lt;br /&gt;
**Structure globale des codes ok&lt;br /&gt;
**Fonctionnement presque ok: fonctionnalités implémentées ok, mais parsage csv ne marche pas&lt;br /&gt;
**Refactoring nécessaire&lt;br /&gt;
**Correction de la fonction STOP et amélioration de la fonction de COLLECTE&lt;br /&gt;
**Faire plus de requêtes Javascript que de requêtes HTML&lt;br /&gt;
**Discussion pour l'implémentation du serveur de localisation (= algorithme de localisation) et des visualisations de données sur le site Web&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous avons d'abord revu l'ensemble de notre code et les méthodes utilisées avec notre tuteur '''Roudy Dagher'''. Nous nous approchons d'un serveur de collecte de données stable et fonctionnel. Nous avons refait les différentes connexions entre l'interface et le serveur afin de ne faire que des requêtes sur des '''WebServices'''. Il nous est possible de commencer la deuxième partie qui est l'envoi de ces tableaux de données afin de les envoyer vers le serveur de localisation via des API afin de recevoir des matrices de positions.&lt;br /&gt;
Nous pourrons grâce à ces matrices afficher une carte 3D des balises  et du TAG dans l'espace.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 10'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 06/12/17 - Jeudi 07/12/17]]'' &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
**Travail sur la fonction STOP&lt;br /&gt;
**Réalisation d'une expression régulière pour le parsage des fichiers log en fichier JSON&lt;br /&gt;
&lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Travail sur l'affichage des fichiers JSON&lt;br /&gt;
***Réalisation de toutes les requêtes Ajax&lt;br /&gt;
***Réalisation d'un menu déroulant dropdown pour charger le contenu des fichiers JSON dans le tableau de distances&lt;br /&gt;
&lt;br /&gt;
*Nettoyage du dépôt Git&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 11'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 13/12/17]]''  &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
&lt;br /&gt;
*Revue de code avec Roudy DAGHER:&lt;br /&gt;
**Discussion sur la partie système du projet et correction de certaines fonctions&lt;br /&gt;
&lt;br /&gt;
Nous nous sommes réunis avec l'un de nos tuteurs, qui a réalisé certains bouts de code de base, pour nous mettre au point sur les fonctions en question et leur utilisation.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 12'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 20/12/17 - Jeudi 21/12/17]]''&lt;br /&gt;
*Revue, correction et nettoyage des codes&lt;br /&gt;
*Finalisation du rapport&lt;br /&gt;
*Planification de semaines restantes&lt;br /&gt;
*Préparation de la soutenance&lt;br /&gt;
*Revue de mi-projet avec tous les tuteurs&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Cette dernière semaine a servi à finaliser le rapport et à discuter de l'avancée du projet, notamment avec nos tuteurs pour déterminer le travail restant, présenter le travail abouti et replanifier précisément les échéances pour le travail restant. Nous avons réalisé la soutenance de mi-projet le '''jeudi 21/12/17 à 8h'''.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 13'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 10/01/18 - Ven 12/01/18]]''  &lt;br /&gt;
*Travail sur la collecte des données (serveur de collecte et interface Web)&lt;br /&gt;
**Redéfinition du fichier de parsage car il crée des conflits et ne produit pas un fichier formaté de la façon attendue&lt;br /&gt;
***Nombre de balises réel n'est pas bien déterminé par le code&lt;br /&gt;
***ID de la première et de la dernière balise ne sont pas déterminés correctement&lt;br /&gt;
&lt;br /&gt;
**Automatisation de la collecte par un script Shell lançant toutes les commandes de CONNEXION, REDIRECTION, LANCEMENT CU, FERMETURE DU PROGRAMME (kill rfcomm / kill tcp_redirect)&lt;br /&gt;
***Dans le but d'automatiser la procédure&lt;br /&gt;
***Dans le but de résoudre un problème de gestion de ressources (le bug '''thread''' apparu plus tôt dans le projet)&lt;br /&gt;
&lt;br /&gt;
**Travail sur la résolution du bug thread car l'automatisation n'a pas résolu le problème&lt;br /&gt;
***Identification du ou des causes potentielles: gestion des ressources (synchrone, asynchrone ?), connexion Bluetooth, lancement des commandes dans le même script, lancement en fg/bg, conflit dû au temps d'exécution de chaque processus ?&lt;br /&gt;
***Lancement des commandes manuellement dans des terminaux ne pose aucun problème: solution la plus simple&lt;br /&gt;
&lt;br /&gt;
**Redesign de la page Collecte&lt;br /&gt;
***Remplacement des boutons de commande par un bouton unique d'initialisation&lt;br /&gt;
***Travail sur une mise à jour du menu déroulant dropdown régulière sans avoir à recharger la page Web&lt;br /&gt;
***Implémentation de plotly.js, un module Javascript qui permet d'afficher des graphes en 3D&lt;br /&gt;
&lt;br /&gt;
*Mise au point post-soutenance avec Roudy DAGHER pour valider le travail restant, effectué et redéfinir certains objectifs atteignables ou pas selon les éléments réalisés dans le projet&lt;br /&gt;
*Recherches et début de l'implémentation du serveur de localisation fourni par les tuteurs&lt;br /&gt;
*Gestion du Git pour créer des branches additionnelles&lt;br /&gt;
*Recréation du rapport de projet suite à une perte du fichier éditable d'origine + Mise à jour avec les remarques suite à la soutenance ainsi que les nouveaux éléments&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 14'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mar 16/01/18 - Ven 19/01/18]]''  &lt;br /&gt;
*Travail sur la collecte des données (serveur de collecte et interface Web)&lt;br /&gt;
**Redéfinition du fichier de parsage car il crée des conflits et ne produit pas un fichier formaté de la façon attendue&lt;br /&gt;
***Corrigé: Nombre de balises réel n'est pas bien déterminé par le code&lt;br /&gt;
***Corrigé: ID de la première et de la dernière balise ne sont pas déterminés correctement&lt;br /&gt;
***Reste à faire: Traiter le cas où il y a un ajout ou suppression d'une balise pendant la collecte (pour le moment, lorsque c'est le cas, toutes les données se décalent au lieu de laisser des trous)&lt;br /&gt;
&lt;br /&gt;
**Automatisation de la collecte par un script Shell lançant toutes les commandes de CONNEXION, REDIRECTION, LANCEMENT CU, FERMETURE DU PROGRAMME (kill rfcomm / kill tcp_redirect)&lt;br /&gt;
***Mis en suspens: pour le moment, on lance les commandes manuellement dans le terminal&lt;br /&gt;
&lt;br /&gt;
**Interface Web&lt;br /&gt;
***Implémentation de plotly.js, un module Javascript qui permet d'afficher des graphes en 3D&lt;br /&gt;
&lt;br /&gt;
*Implémentation du serveur de localisation fourni par les tuteurs (mais algorithme de localisation pas fonctionnel pour le moment)&lt;br /&gt;
**Mise à jour de l'affichage des positions des éléments: précédemment seule la matrice X de position du Tag s'affichait, et pas la matrice A des balises&lt;br /&gt;
**Requêtes manuelles à l'API avec la fonction curl OK: on arrive à récupérer les matrices X et A (aléatoires pour le moment) par une requête GET à l'API du serveur de localisation&lt;br /&gt;
**Implémentation des requêtes Ajax pour automatiser les requêtes au serveur de localisation&lt;br /&gt;
&lt;br /&gt;
*Mise à jour du rapport les nouveaux éléments du travail réalisé&lt;br /&gt;
*Réflexion sur la possibilité ou non de réaliser la partie temps réel du projet au vu des moyens à disposition&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 15'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mar 23/01/18 - Ven 26/01/18]]'' &lt;br /&gt;
*Travail sur la collecte des données (serveur de collecte et interface Web)&lt;br /&gt;
**Redéfinition du fichier de parsage car il crée des conflits et ne produit pas un fichier formaté de la façon attendue&lt;br /&gt;
***Fait: Si distance négative car Tag trop près, la valeur négative générée par une balise est remplacée par un &amp;quot;0&amp;quot; (cela modifie la position réelle modélisée dans plotly, mais évite une impossibilité de générer la position à partir de la distance -&amp;gt; par des tests, il faudra déterminer la valeur limite à partir de laquelle les cartes donnent des valeurs de distance négatives&lt;br /&gt;
***Reste à faire: Traiter le cas où il y a un ajout ou suppression d'une balise pendant la collecte (pour le moment, lorsque c'est le cas, toutes les données se décalent au lieu de laisser des trous); Ainsi que le cas où il y un saut/bug inattendu et donc une disparition d'une ou plusieurs valeurs de distance&lt;br /&gt;
***Début de résolution du cas où une distance n'est pas prise en compte, c'est à dire où il y a une valeur qui disparaît et désaligne les valeurs lors de la création du JSON&lt;br /&gt;
&lt;br /&gt;
**Automatisation de la collecte par un script Shell lançant toutes les commandes de CONNEXION, REDIRECTION, LANCEMENT CU, FERMETURE DU PROGRAMME (kill rfcomm / kill tcp_redirect)&lt;br /&gt;
***Mis en suspens: pour le moment, on lance les commandes manuellement dans le terminal&lt;br /&gt;
***Création d'un script bash /etc/init.d/autoconnect.sh pour connecter automatiquement la RPi au lancement du système (si la RPi est déjà allumée au démarrage)&lt;br /&gt;
&lt;br /&gt;
**Interface Web&lt;br /&gt;
***Perfectionnement de l'utilisation de Plotly pour les visualisations&lt;br /&gt;
&lt;br /&gt;
*Implémentation du serveur de localisation fourni par les tuteurs (algorithme de localisation pas fonctionnel pour le moment)&lt;br /&gt;
**Requêtes manuelles à l'API avec la fonction curl OK&lt;br /&gt;
**Fait: Implémentation des requêtes Ajax pour automatiser les requêtes au serveur de localisation&lt;br /&gt;
***Liaison entre les différentes commandes curl grace à des variables: permet de stocker l'adresse du job récupérée par la méthode GET&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 16'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Lun 29/01/18 - Ven 02/02/18]]'' &lt;br /&gt;
*Travail sur la collecte des données (serveur de collecte et interface Web)&lt;br /&gt;
**Redéfinition du fichier de parsage car il crée des conflits et ne produit pas un fichier formaté de la façon attendue&lt;br /&gt;
***déterminer la valeur limite à partir de laquelle les cartes donnent des valeurs de distance négatives&lt;br /&gt;
***Reste à faire: Traiter le cas où il y a un ajout ou suppression d'une balise pendant la collecte (pour le moment, lorsque c'est le cas, toutes les données se décalent au lieu de laisser des trous); Ainsi que le cas où il y un saut/bug inattendu et donc une disparition d'une ou plusieurs valeurs de distance&lt;br /&gt;
***Fait: gestion des bugs/sauts de valeurs de balises - remplacement par une valeur nulle sur balise existe, par rien sinon (implémentation d'un tableau caractérisant l'existence ou pas de chaque balise 1 à 6), optimisation des temps de calculs/exécution dans le script&lt;br /&gt;
**Interface Web&lt;br /&gt;
***Ajout d'une barre de progression de la collecte remplaçant le bouton de Lancement de collecte lors de l'appui&lt;br /&gt;
***Ajout d'un bouton dropdown pour afficher les fichiers de position qu'on reçoit du serveur de localisation&lt;br /&gt;
***Ajout d'une scrollbar dans les deux dropdown&lt;br /&gt;
&lt;br /&gt;
*Implémentation du serveur de localisation fourni par les tuteurs (algorithme de localisation pas fonctionnel pour le moment)&lt;br /&gt;
**Requêtes manuelles à l'API avec la fonction curl OK&lt;br /&gt;
**Fait: Implémentation des requêtes Ajax pour automatiser les requêtes au serveur de localisation&lt;br /&gt;
***Liaison entre les différentes requêtes Ajax grâce à des variables: permet de stocker l'adresse du job récupérée par la méthode GET&lt;br /&gt;
***Création d'une requête Ajax GET qui demande le fichier JSON de position au serveur de localisation jusqu'à ce qu'il soit retourné&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Observations'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Problèmes rencontrés'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Solutions apportées'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Délivrables'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
Rapport de mi-PFE&lt;br /&gt;
[[Fichier:RapportMi-PFE-UNG DELATTE.pdf]]&lt;br /&gt;
&lt;br /&gt;
Rapport de PFE&lt;br /&gt;
&lt;br /&gt;
Vidéo&lt;/div&gt;</summary>
		<author><name>Hdelatte</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=P18_Localisation_of_quadrotors&amp;diff=50214</id>
		<title>P18 Localisation of quadrotors</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=P18_Localisation_of_quadrotors&amp;diff=50214"/>
				<updated>2018-02-07T16:35:44Z</updated>
		
		<summary type="html">&lt;p&gt;Hdelatte : /* Semaine 16 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Cahier des charges'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;Présentation générale du projet&amp;lt;/span&amp;gt;=== &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Contexte&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
Dans un monde de plus en plus connecté, de nombreux drones sont déployés pour diverses applications comme l'espionnage, la surveillance, la cartographie de lieux et la livraison de colis. Les technologies nécessaires pour contrôler ces drones sont des sujets de recherche actuels. &lt;br /&gt;
&lt;br /&gt;
Le contrôle de ceux-ci passe tout d'abord par la maîtrise de leur position dans l'espace. Le développement des applications liées à l'utilisation de drones nécessite un travail important sur la localisation spatiale d'objets connectés. &lt;br /&gt;
&lt;br /&gt;
De plus, dans un souci d'utilisation, il est essentiel de développer des interfaces logicielles permettant d'exploiter ces données.&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Objectif du projet&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
L'objectif de ce projet est de développer une interface logicielle permettant de traiter en temps réel les informations de localisation d'un drone et de balises, dans le but de définir leur localisation dans l'espace, en intérieur.&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Description du projet&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
Pour réaliser le contrôle de drones, la première étape importante est de donner ses informations de position. Le but du projet est de développer une interface logicielle permettant de localiser le drone en temps réel en intérieur. Le drone se déplace dans un environnement dans lequel ont été installées de multiples balises. Il est équipé d'une carte, lui permettant de recevoir les distances relatives entre lui-même et les balises, sur laquelle différents algorithmes vont être implémentés pour effectuer la localisation en temps réel. Le projet requiert des compétences en développement hardware (Crazyflie 2.0, voir https://wiki.bitcraze.io/) et software (langage C/C++/Python/Javascript/HTML...).&lt;br /&gt;
&lt;br /&gt;
Il se divise en 4 étapes principales, qui sont:&lt;br /&gt;
*1) Choisir les technologies utilisées&lt;br /&gt;
*2) Choisir l'architecture (OS / APIs)&lt;br /&gt;
*3) Développer les différentes parties du projet&lt;br /&gt;
*4) Intégrer et connecter les différentes parties du projet&lt;br /&gt;
&lt;br /&gt;
La localisation étant en intérieur, le protocole GPS n'est donc pas assez précis pour les applications ciblées. La mise en place d'un tel dispositif permettrait grâce à l'utilisation d'un algorithme d'estimer avec une bonne précision les positions en intérieur d'une balise centrale (appelée Tag) et de balises (appelées Anchor). Le Tag scanne en temps réel la distance relative aux différentes balises, et il nous est retourné la position des balises et du Tag grâce à l'algorithme de localisation.&lt;br /&gt;
&lt;br /&gt;
Le projet se compose de 3 parties:&lt;br /&gt;
* Collect &amp;amp; parse: collecter les données envoyées par les balises en communiquant avec un serveur et récupérer les données adéquates par un tri&lt;br /&gt;
* Localise: déterminer la matrice de position des balises et du Tag en traitant les données récupérées&lt;br /&gt;
* Display: développer l'interface homme machine pour afficher, étudier et utiliser les données traitées&lt;br /&gt;
&lt;br /&gt;
Nous travaillerons dans un premier temps dans une optique temps différé avant de travailler en temps réel. Cela nous permettra d'acquérir des données utiles et réutilisables en aval. &lt;br /&gt;
&lt;br /&gt;
A l'aboutissement du projet, nous devrions être capable via l'interface homme machine développée d'afficher précisément la position spatiale des balises ainsi que du Tag, grâce àl'utilisation d'un algorithme de localisation et des données récupérées, et d'afficher d'autres données relatives au déplacement du Tag ou des balises dans l'espace. &lt;br /&gt;
&lt;br /&gt;
Si le temps le permet, nous pourrons aussi être amenés à adapter et utiliser l'interface développée pour l'utilisation d'un drone.&lt;br /&gt;
&lt;br /&gt;
''Sujet originel''&lt;br /&gt;
&lt;br /&gt;
To achieve the control of quadrotors, the first important task to give its position information. This project is to develop a software(GUI) to localize the quadrotors in real-time. The quadrotor is flying in an environment where several transmitters have been installed. The quadrotor is equipped with a deck to receive the relative distances between the deck and all transmitters, based on which different algorithms will be implemented to realize the real-time localization. The candidates need to have both experiences on hardware (Crazyflie 2.0, see https://wiki.bitcraze.io/) and software development (C/C , Python…). &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Calendrier prévisionnel&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
''[[Avant le 29/09/17]]'' - Élaboration du Cahier des charges, de la liste des tâches et du calendrier prévisionnel&lt;br /&gt;
&lt;br /&gt;
''[[Avant fin Octobre]]'' - Serveur de collecte et début du développement de l'interface logicielle&lt;br /&gt;
&lt;br /&gt;
''[[Avant fin Décembre]]'' - Interface logicielle&lt;br /&gt;
&lt;br /&gt;
''[[A la fin du PFE]]'' - Intégration finale des différentes parties (Serveur de collecte des données &amp;amp; Serveur de localisation &amp;amp; Interface logicielle)&lt;br /&gt;
&lt;br /&gt;
Répartition du volume de travail (***h):&lt;br /&gt;
&lt;br /&gt;
* Recherche sur les technologies à utiliser&lt;br /&gt;
* Développement du serveur de collecte de données&lt;br /&gt;
* Réalisation de l'interface logicielle (Web//Logiciel/Application)&lt;br /&gt;
* Intégration des différentes parties&lt;br /&gt;
* Test et débuggage&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Choix techniques : matériel et logiciel&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
Afin de développer ce dispositif, nous allons utiliser une Raspberry Pi 3 associée à une carte réceptrice, qui communique avec 4 balises composées chacune d'un microcontrôleur et d'une carte émettrice radio (UWB5C) et alimentées par batteries. La carte réceptrice joue le rôle du drone à localiser et communiquera les données émises par les balises vers l'ordinateur via Bluetooth.&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Choix technologiques&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
Voici les technologies que nous utilisons pour chacune des parties de ce projet.&lt;br /&gt;
&lt;br /&gt;
    1) Serveur de collecte des données:&lt;br /&gt;
       Scanne et parse les données récupérées pour fournir la matrice D des distances relatives du tag aux 4 balises&lt;br /&gt;
        - API&lt;br /&gt;
        - Python / Serveur Flask&lt;br /&gt;
&lt;br /&gt;
    2) Serveur de localisation (fourni):&lt;br /&gt;
       Calcule grâce à l'algorithme de localisation et la matrice D les positions spatiales des 4 noeuds et du tag&lt;br /&gt;
        - API&lt;br /&gt;
        - Bootstrap&lt;br /&gt;
        - Jquery&lt;br /&gt;
        - Python&lt;br /&gt;
&lt;br /&gt;
    3) Interface utilisateur:&lt;br /&gt;
       Affiche courbes, visualisation 3D, boutons ou données des fichiers envoyées par le serveur de localisation&lt;br /&gt;
        - HTML5 / Javascript&lt;br /&gt;
        - Fichiers JSON (serveurs de collecte et de localisation)&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Calendrier prévisionnel'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Liste des tâches à effectuer&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
# Se documenter sur le projet&lt;br /&gt;
##Langages et technologies utilisées&lt;br /&gt;
##Matériel utilisé&lt;br /&gt;
##Mettre en place du travail sur le Git&lt;br /&gt;
# Réaliser le serveur de collecte&lt;br /&gt;
##Récupérer les trames envoyées par bluetooth par le TAG via la Raspberry Pi&lt;br /&gt;
##Intégrer le serveur de localisation pour interpréter les trames&lt;br /&gt;
##Tester et optimiser&lt;br /&gt;
# Réaliser l'interface Web utilisateur&lt;br /&gt;
##Implémenter le serveur de collecte et de localisation&lt;br /&gt;
##Afficher et traiter les données stockées dans les fichiers JSON via le serveur (temps différé + temps réel)&lt;br /&gt;
##Tester et optimiser&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;Replanification du cahier des charges / calendrier&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Feuille d'heures'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Tâche !! Prélude !! Heures S1 !! Heures S2 !! Heures S3 !! Heures S4 !! Heures S5 !! Heures S6 !! Heures S7 !! Heures S8 !! Heures S9 !! Heures S10 !! Heures S11 !! Heures S12 !! Heures S13 !! Heures S14 !! Heures S15 !! Heures S16 !! Heures S17 !! Heures S18 !! Heures S19 !! Total&lt;br /&gt;
|-&lt;br /&gt;
| Cahier des charges / Wiki / Gitlab / Rapport&lt;br /&gt;
|  4h&lt;br /&gt;
|  3h&lt;br /&gt;
|  1h&lt;br /&gt;
|  x&lt;br /&gt;
|  1h30&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h30&lt;br /&gt;
|  1h&lt;br /&gt;
|  3h&lt;br /&gt;
|  3h30&lt;br /&gt;
|  2h&lt;br /&gt;
|  5h&lt;br /&gt;
|  x&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Documentation sur les technos utilisées&lt;br /&gt;
|  2h&lt;br /&gt;
|  4h&lt;br /&gt;
|  3h&lt;br /&gt;
|  2h&lt;br /&gt;
|  3h&lt;br /&gt;
|  4h&lt;br /&gt;
|  5h&lt;br /&gt;
|  5h30&lt;br /&gt;
|  4h30&lt;br /&gt;
|  3h30&lt;br /&gt;
|  2h&lt;br /&gt;
|  3h&lt;br /&gt;
|  1h&lt;br /&gt;
|  3h&lt;br /&gt;
|  4h&lt;br /&gt;
|  x&lt;br /&gt;
|  2h&lt;br /&gt;
|  &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Documentation sur le matériel&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  1h&lt;br /&gt;
|  1h&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Recherche et développement du serveur de collecte&lt;br /&gt;
|  x&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  3h&lt;br /&gt;
|  3h30&lt;br /&gt;
|  4h&lt;br /&gt;
|  5h&lt;br /&gt;
|  7h&lt;br /&gt;
|  4h30&lt;br /&gt;
|  0,5h&lt;br /&gt;
|  3h&lt;br /&gt;
|  4h&lt;br /&gt;
|  3h&lt;br /&gt;
|  x&lt;br /&gt;
|  4h&lt;br /&gt;
|  7h30&lt;br /&gt;
|  5h&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Recherche et développement de l'interface Web&lt;br /&gt;
|  x&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  3h&lt;br /&gt;
|  5h&lt;br /&gt;
|  6h&lt;br /&gt;
|  4h&lt;br /&gt;
|  7h&lt;br /&gt;
|  5h30&lt;br /&gt;
|  2h30&lt;br /&gt;
|  6h&lt;br /&gt;
|  8h&lt;br /&gt;
|  5h&lt;br /&gt;
|  1h&lt;br /&gt;
|  8h&lt;br /&gt;
|  4h&lt;br /&gt;
|  4h&lt;br /&gt;
|  &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Recherche et intégration du serveur de localisation&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x &lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  6h&lt;br /&gt;
|  5h&lt;br /&gt;
|  3h&lt;br /&gt;
|  &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Intégration des différentes parties&lt;br /&gt;
|  x&lt;br /&gt;
|  x  &lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  2h&lt;br /&gt;
|  2h&lt;br /&gt;
|  2h&lt;br /&gt;
|  3h&lt;br /&gt;
|  1h30&lt;br /&gt;
|  x&lt;br /&gt;
|  3h&lt;br /&gt;
|  6h&lt;br /&gt;
|  5h&lt;br /&gt;
|  x&lt;br /&gt;
|  3h30&lt;br /&gt;
|  2h&lt;br /&gt;
|  2h&lt;br /&gt;
|  &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Tests et débuggage&lt;br /&gt;
|  x&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  1h&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  3h&lt;br /&gt;
|  4h&lt;br /&gt;
|  0,5h&lt;br /&gt;
|  3h&lt;br /&gt;
|  1h&lt;br /&gt;
|  3h&lt;br /&gt;
|  3h&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  4h&lt;br /&gt;
|  &lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Optimisation/Correction des programmes&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Vidéo&lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Avancement du Projet'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Phase préparatoire'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Jeu 21/09/17 - Ven 22/09/17]]'' &lt;br /&gt;
*Rendez-vous de mise au point du cahier des charges avec les encadrants/intervenants (M. ZHENG Gang et M. DAGHER Roudy)&lt;br /&gt;
*Elaboration du cahier des charges&lt;br /&gt;
*Elaboration de la page Wiki (préparation de la mise en page et présentation du sujet)&lt;br /&gt;
*Préparation du travail sous forme de Mind Map&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous nous sommes tout d’abord rendus au laboratoire de l'INRIA afin de pouvoir définir le plus précisément possible le cahier des charges avec nos tuteurs.&lt;br /&gt;
Nous avons donc défini avec eux les technologies qu'il faudrait étudier. Vous retrouverez le choix des technologies dans la partie '''choix technologiques'''&lt;br /&gt;
&lt;br /&gt;
Nous avons en même temps créé notre page Wiki, et structurée celle-ci avec les parties qui nous seraient utiles pour développer nos explications par la suite.&lt;br /&gt;
&lt;br /&gt;
Nous avons de plus découpé le travail en sous-parties que nous avions mis dans une '''Mind map''' afin d'y voir plus clair sur la ligne à suivre.&lt;br /&gt;
&lt;br /&gt;
Vous trouverez cette Mind map juste ci-dessous. Nous ne mettrons pas à jour cette Mind map chaque semaine mais il est fort probable que nous en refaisions un en milieu de projet pour pouvoir cibler les objectifs réussis et ceux à atteindre. Nous pourrons de plus redéfinir certains objectifs qui nous auraient semblés trop vague au début du projet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Projet de fin d'étude.png|centre|600px]]&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 1'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Jeu 28/09/17 - Ven 29/09/17]]'' &lt;br /&gt;
*Revue du Cahier des Charges avec les encadrants&lt;br /&gt;
*Lecture et recherches sur les technologies adaptées&lt;br /&gt;
*Construction de la suite de la Mind Map&lt;br /&gt;
*Création du Gitlab&lt;br /&gt;
&lt;br /&gt;
Nous commençons les recherches sur le projet et sur les premières technologies engagées dans celui-ci. Nous en profitons pour formuler dès à présent des questions sur le bon choix de celles-ci. Nous commençons donc des tests ayant seulement pour but de nous familiariser avec l'environnement de travail et de réellement comprendre les fonctions déjà présentes qu'il faudra exploiter et implanter notre interface web.&lt;br /&gt;
Nous créons un dépôt Gitlab avec notre tuteur et commençons a définir les taches premières sur celui-ci.&lt;br /&gt;
Nous en profitons pour affiner le Mind Map.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 2'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Jeu 05/10/17 - Ven 06/10/17]]''  &lt;br /&gt;
*Précisions sur le cahier des charges&lt;br /&gt;
*Listage du matériel&lt;br /&gt;
*Recherche et détermination de solutions technologiques possibles pour les fonctions demandées&lt;br /&gt;
*Début du travail sur le serveur de collecte&lt;br /&gt;
*Apprentissage du langage Python et de l'utilisation du framework Flask&lt;br /&gt;
&lt;br /&gt;
Nous avons finalisé les précisions sur le cahier des charges. Nous avons donc pu cibler le matériel dont nous nous servirons pour ce Projet. Vous trouverez donc cette liste la section correspondante. Il est évident que le matériel utilisé est dans l'ensemble déjà fourni par le laboratoire et qu'il nous reste dans l'ensemble à créer l'interface web et les API qui nous permettrons de faire communiquer cette interface avec la Raspberry Pi et le serveur de position déjà créé.&lt;br /&gt;
Nous avons donc pu commencer à nous former sur les technologies qui nous serviraient par la suite. Nous avons donc utilisé le cours d'Openclassrooms sur les serveurs Flask pour en apprendre les bases. Ce serveur Flask est programmé en Python et nous permet donc une grande liberté au niveau de l’exécution de certains scripts. En effet, les scripts de connexion Bluetooth et de redirection de port qui nous permettent de récupérer les données de distance sont eux-mêmes codés en Python et sont directement appelés via le serveur.&lt;br /&gt;
Dans ce serveur, représentant notre interface web, vous retrouverez la page '''/collecte''' qui représentera notre partie collecte de données ainsi que l'affichage de ces distances. Nous appellerons cette partie le Serveur de Collecte.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 3'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 11/10/17 - Jeu 12/10/17]]''  &lt;br /&gt;
*Recherche et développement initial du serveur de collecte de données&lt;br /&gt;
*Complément du Git sur les tâches à effectuer&lt;br /&gt;
&lt;br /&gt;
Nous avons commencé à créer un serveur Flask renvoyant pour l'instant une matrice aléatoire. Lors de la requête URL &amp;quot;../matrice&amp;quot;, nous voyons bien une matrice aléatoire apparaître sur la page Web. Nous essayons de nous connecter à la Raspberry Pi en redirigeant son port série vers le Bluetooth de façon à récupérer de vraies matrices de distance entre le drone (ie commutateur central) et les balises. Nous pourrons afficher ensuite ces matrices, ou alors les stocker dans un fichier en attendant le traitement de celles-ci.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Requete s3.PNG|300px|serveur Flask]]&lt;br /&gt;
&lt;br /&gt;
Nous avons plusieurs problèmes avec le Bluetooth pour se connecter avec la Raspberry Pi. Quand nous aurons réussi à nous connecter au port série de la Raspberry Pi alors nous pourrons gérer le traitement des données récupérées.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 4'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 18/10/17 - Jeu 19/10/17]]''  &lt;br /&gt;
*Configuration de la Raspberry Pi car problèmes de connectivité Bluetooth rencontrés&lt;br /&gt;
**Nous arrivons à connecter la Raspberry Pi sous Windows mais la connexion sous Linux pose problème (travail en suspens en attendant la disponibilité de l'encadrant)&lt;br /&gt;
*Début du développement de l'interface Web&lt;br /&gt;
**Traitement d'une matrice dans un fichier JSON&lt;br /&gt;
**Affichage sous forme de tableau de la matrice&lt;br /&gt;
**Utilisation du serveur de requête en Python avec chargement de template HTML&lt;br /&gt;
**Mise en forme de la trame de la page en HTML/CSS avec le framework Bootstrap&lt;br /&gt;
**Ajout d'un set de distances (d1, d2, d3, d4) dans la matrice lors d'un appui sur un bouton Chargement en utilisant un fichier Javascript&lt;br /&gt;
&lt;br /&gt;
Nous avons reçu des fonctions Python de notre tuteur afin d'obtenir une connexion Bluetooth entre notre Raspberry Pi et notre ordinateur ainsi qu'une redirection de port de celle-ci vers la connexion. Nous n'arrivons pas à utiliser ces fonctions sous linux et nous nécessitons une explication de notre tuteur n'étant pas disponible à ce moment. Pour ne pas perdre de temps, nous attaquons la création de l'interface web à proprement parler, c'est à dire la création des pages HTML ainsi que le document Javascript qui nous servira de bibliothèque de fonctions. Chaque route de notre serveur est reliée à une série de fonctions Python s'exécutant à l'appel des url puis suivies d'un template de la page HTML en question. Nous en profitons de plus pour explorer le framework CSS bootstrap afin de mettre un premier design et une structure a notre page collecte qui sera la page principale de notre site pour ce début de projet.&lt;br /&gt;
&lt;br /&gt;
Nous nous essayons de plus à différents tests sur des fichiers de format '''JSON''' que nous devrons réussir à traiter correctement plus tard dans notre projet.&lt;br /&gt;
Nous récupérons une matrice que nous créons nous-mêmes en Python (simulation d'une série de distances récupérée) que nous transformons au format JSON pour ensuite l'afficher sur notre page web. Pour pouvoir proprement afficher ce fichier '''JSON''' renvoyé vers notre page, nous nous servons du fichier Javascript afin de créer du code HTML contenant la matrice.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 5'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 25/10/17 - Ven 27/10/17]]''  &lt;br /&gt;
*Résolution des problèmes de connectique Bluetooth sur la Raspberry Pi&lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Traitement d'une matrice dans un fichier JSON&lt;br /&gt;
**Début de l'ajout d'un set de distances depuis une matrice contenue dans un fichier JSON&lt;br /&gt;
&lt;br /&gt;
Nous avons pu nous entretenir avec notre tuteur et donc comprendre les fonctions de connexion et de redirection de port. Nous pouvons donc continuer le développement de notre interface web. Nous arrivons à traiter un set de données au format JSON et à l'afficher dans le code HTML. Toutefois nous créons nous-mêmes ce set, il est maintenant nécessaire que nous arrivions à récupérer les sets de distance réels reçus par la connexion Bluetooth. Nous commencerons par un traitement asynchrone. L'idée est d’enregistrer les sets de distances dans un fichier '''JSON''' stocké dans un dossier. Nous appellerons ce dossier plus tard via une requête Ajax.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 6'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 08/11/17 - Ven 10/11/17]]''  &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
**Mise en place de la communication entre le port série de notre machine et le port série de la carte via Bluetooth de la RPi3&lt;br /&gt;
**Récupération et traitement (parse) manuels des données de distances dans un fichier .log via TCP/IP&amp;lt;-&amp;gt;Bluetooth&lt;br /&gt;
**Début de l'automatisation du procédé par script Python (requete.py) et mise en place de sockets de communication&lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Chargement sur commande d'un set de distances depuis une matrice contenue dans un fichier JSON&lt;br /&gt;
*Travail sur le layout du site&lt;br /&gt;
&lt;br /&gt;
Après avoir regardé le code de ces différentes fonctions nous avons pu faire des tests manuels via le Shell pour récupérer des données de distances et les stocker dans un fichier '''JSON''' sur notre ordinateur.&lt;br /&gt;
&lt;br /&gt;
Nous utilisons les commandes suivantes pour se connecter via Bluetooth:&lt;br /&gt;
&lt;br /&gt;
 rfcomm connect /dev/rfcomm0 B8:27:EB:80:DC:89 1&lt;br /&gt;
&lt;br /&gt;
Rediriger le port de la Raspberrypi3 vers la connexion:&lt;br /&gt;
&lt;br /&gt;
 Python lps-collector/tcp_serial_redirect.py /dev/rfcomm0 9600&lt;br /&gt;
&lt;br /&gt;
Collecter les données dans un fichier dont nous définissons le nom:&lt;br /&gt;
&lt;br /&gt;
 echo &amp;quot;cu -s9600 -lttyACM0&amp;quot;| nc localhost 7777&lt;br /&gt;
 nc localhost 7777 | grep distance &amp;gt; static/log/dist-capture'+date+'.log&lt;br /&gt;
&lt;br /&gt;
Nous pouvons '''parser''' le flux de données avant de le stocker dans le fichier via cette commande:&lt;br /&gt;
&lt;br /&gt;
 Python lps-collector/lps_parse.py static/log/dist-capture&amp;quot;+date+&amp;quot;.log&lt;br /&gt;
&lt;br /&gt;
Il est donc nécessaire d'inclure via des '''thread''' ces différentes fonctions dans notre serveur Python (Flask) afin d'automatiser le processus. Le but est de pouvoir choisir sur l'interface web quels fonctions il faut exécuter et les déclencher via l'appui sur des boutons.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 7'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 15/11/17 - Ven 17/11/17]]''  &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
**Récupération et traitement (parse) manuels des données de distances dans un fichier .log via TCP/IP&amp;lt;-&amp;gt;Bluetooth&lt;br /&gt;
**Automatisation du procédé par script Python (requete.py)&lt;br /&gt;
***Mise en place de sockets de communication pour le contrôle de la collecte -&amp;gt; abandonné (servait à commander la collecte manuellement)&lt;br /&gt;
***Développement d'un script engine.py regroupant les commandes exécutables par l'utilisateur via la page Web&lt;br /&gt;
***Début du travail sur la fonction &amp;quot;STOP&amp;quot; manuel d'une action de collecte de données (liaison entre script HTML, Javascript, et script Python)&lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Chargement sur commande d'un set de distances depuis une matrice contenue dans un fichier JSON&lt;br /&gt;
**Travail sur le layout du site&lt;br /&gt;
***Ajout des différentes commandes (connexion Bluetooth, lancement commande cu, collecte des données, collecte durée donnée)&lt;br /&gt;
***Début de l'implémentation de la visualisation des fichiers .JSON obtenus après collecte et affichage dans un tableau matriciel du fichier sélectionné&lt;br /&gt;
&lt;br /&gt;
Nous avons continué à travailler sur le serveur de collecte: les données que nous avons récupérées via Bluetooth sont stockées dans un fichier .log. Apres avoir bien compris comment marchait la fonction '''parse''' manuellement (lors de son utilisation dans le Shell), nous l'avons implémentée dans notre serveur de collecte qui lance cette commande lors de l’appui sur un bouton via notre interface virtuelle. Un problème rencontré était de savoir quand la récolte des données devait s’arrêter. Nous avons donc rajouté un temps à entrer nous-même sur l'interface. La fonction '''parse''' est effectuée et le sous-processus va attendre le temps donné avant de lancer une commande permettant de tuer le processus et mettant donc fin au remplissage du fichier '''.log'''. Nous voulons de plus réussir à lancer une fonction de collecte sans temps. C'est à dire que nous coupons la collecte via un bouton par nous-mêmes. Nous voulions utiliser des Sockets pour pouvoir définir nous-mêmes la gestion de la communication mais l'idée a été abandonné car nous avons réussi à sauvegarder le PID du processus lancé. Il nous suffit donc de l’arrêter grâce à un autre bouton qui récupère cette variable et l’arrête ensuite. &lt;br /&gt;
&lt;br /&gt;
Toutes nos fonctions Pythons étant regroupées dans notre serveur '''requete.py''', nous avons décidé de créer un module qui regroupera toutes ces fonctions que nous pourrons utiliser dans '''requete.py'''. ceci nous permet de voir plus clair dans notre code et de faciliter le travail lorsque nous modifions le code tous les deux.&lt;br /&gt;
&lt;br /&gt;
Nous essayons en continu d'adapter le layout du site pour le rendre le plus attractif et simple possible, de façon à ce que chaque bouton et tableau soient clairs et compréhensibles.&lt;br /&gt;
&lt;br /&gt;
Nous avons commencé à récupérer les fichiers '''JSON''' créés à partir des fichier '''log''', c'est-à-dire que ces fichiers sont automatiquement stockés coté serveur dans un dossier nommé '''static/log'''. Notre but est de récupérer le nom des fichiers JSON et de les afficher dans un composant sur notre interface web. Il nous sera donc possible ensuite de sélectionner le nom d'un fichier. Lors de la sélection de ce nom de fichier, un tableau apparaît avec les valeurs de distances à l’intérieur.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 8'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 22/11/17 - Ven 24/11/17]]''  &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
**Automatisation du procédé de collecte par script Python (requete.py qui fait appel à engine.py)&lt;br /&gt;
***Développement d'un script engine.py regroupant les commandes exécutables par l'utilisateur via la page Web&lt;br /&gt;
***Travail sur la fonction &amp;quot;STOP&amp;quot; manuel d'une action de collecte de données (liaison entre script HTML, Javascript, et script Python)&lt;br /&gt;
***Mise en place d'un serveur HTTP Simple sous Python pour accéder aux fichiers de données à partir de la page Web&lt;br /&gt;
***Mise à jour de fonctions de connexion &lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Travail sur le layout du site (ajout de pages, navigation entre les pages, apparence, nettoyage des codes)&lt;br /&gt;
**Bon fonctionnement de l'ensemble serveur collecte + serveur HTTP + client Web&lt;br /&gt;
**Affichage de la liste des fichiers de données de distance (log, csv, JSON) via serveur HTTP en Python sur port 9999&lt;br /&gt;
*Corrections et nettoyage du dépôt GIT&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous continuons à développer les points énoncés la semaine dernière. Nous avons décidé de nous diriger vers un serveur HTTP Simple pour accéder à nos fichiers. Il s’avère que nous finirons par ne pas utiliser ce serveur. Nous irons récupérer les fichiers en question via des requêtes '''Ajax''' faites à la sélection du nom du fichier.&lt;br /&gt;
&lt;br /&gt;
Nous rencontrons depuis le début des problèmes avec les fonctions de connexion qui peuvent ne pas marcher à un moment donné. Nous essayons de trouver pourquoi ce bug est un bug qui ne se produit pas à chaque fois. Nous avons déterminé qu'il ne se produisait seulement lorsque les fonctions de connexions étaient lancée dans des threads. Nous ne savons toujours pas pourquoi ces thread bugguent seulement parfois et non à chaque essai de connexion.&lt;br /&gt;
&lt;br /&gt;
Nous avons nettoyé notre dépot '''Git''' car il s’avère que nous utilisions une mauvaise méthode de fusion et de stockage des documents.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 9'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 29/11/17 - Jeudi 30/11/17]]''  &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
**Automatisation du procédé de collecte par script Python (requete.py qui fait appel à engine.py)&lt;br /&gt;
***Travail sur la fonction &amp;quot;STOP&amp;quot; manuel d'une action de collecte de données (liaison entre script HTML, Javascript, et script Python)&lt;br /&gt;
***Recherches sur l'utilisation de fichiers JSON accessibles via le serveur HTTP&lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Travail sur le layout du site &lt;br /&gt;
**Travail sur la liaison entre fichiers JSON et affichage Web des données de distance&lt;br /&gt;
***Recherches et tests de solutions&lt;br /&gt;
****Affichage depuis un fichier&lt;br /&gt;
****Affichage à la volée lors d'une action de collecte&lt;br /&gt;
&lt;br /&gt;
*Revue de code avec Roudy DAGHER:&lt;br /&gt;
**Structure globale des codes ok&lt;br /&gt;
**Fonctionnement presque ok: fonctionnalités implémentées ok, mais parsage csv ne marche pas&lt;br /&gt;
**Refactoring nécessaire&lt;br /&gt;
**Correction de la fonction STOP et amélioration de la fonction de COLLECTE&lt;br /&gt;
**Faire plus de requêtes Javascript que de requêtes HTML&lt;br /&gt;
**Discussion pour l'implémentation du serveur de localisation (= algorithme de localisation) et des visualisations de données sur le site Web&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous avons d'abord revu l'ensemble de notre code et les méthodes utilisées avec notre tuteur '''Roudy Dagher'''. Nous nous approchons d'un serveur de collecte de données stable et fonctionnel. Nous avons refait les différentes connexions entre l'interface et le serveur afin de ne faire que des requêtes sur des '''WebServices'''. Il nous est possible de commencer la deuxième partie qui est l'envoi de ces tableaux de données afin de les envoyer vers le serveur de localisation via des API afin de recevoir des matrices de positions.&lt;br /&gt;
Nous pourrons grâce à ces matrices afficher une carte 3D des balises  et du TAG dans l'espace.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 10'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 06/12/17 - Jeudi 07/12/17]]'' &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
**Travail sur la fonction STOP&lt;br /&gt;
**Réalisation d'une expression régulière pour le parsage des fichiers log en fichier JSON&lt;br /&gt;
&lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Travail sur l'affichage des fichiers JSON&lt;br /&gt;
***Réalisation de toutes les requêtes Ajax&lt;br /&gt;
***Réalisation d'un menu déroulant dropdown pour charger le contenu des fichiers JSON dans le tableau de distances&lt;br /&gt;
&lt;br /&gt;
*Nettoyage du dépôt Git&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 11'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 13/12/17]]''  &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
&lt;br /&gt;
*Revue de code avec Roudy DAGHER:&lt;br /&gt;
**Discussion sur la partie système du projet et correction de certaines fonctions&lt;br /&gt;
&lt;br /&gt;
Nous nous sommes réunis avec l'un de nos tuteurs, qui a réalisé certains bouts de code de base, pour nous mettre au point sur les fonctions en question et leur utilisation.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 12'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 20/12/17 - Jeudi 21/12/17]]''&lt;br /&gt;
*Revue, correction et nettoyage des codes&lt;br /&gt;
*Finalisation du rapport&lt;br /&gt;
*Planification de semaines restantes&lt;br /&gt;
*Préparation de la soutenance&lt;br /&gt;
*Revue de mi-projet avec tous les tuteurs&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Cette dernière semaine a servi à finaliser le rapport et à discuter de l'avancée du projet, notamment avec nos tuteurs pour déterminer le travail restant, présenter le travail abouti et replanifier précisément les échéances pour le travail restant. Nous avons réalisé la soutenance de mi-projet le '''jeudi 21/12/17 à 8h'''.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 13'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 10/01/18 - Ven 12/01/18]]''  &lt;br /&gt;
*Travail sur la collecte des données (serveur de collecte et interface Web)&lt;br /&gt;
**Redéfinition du fichier de parsage car il crée des conflits et ne produit pas un fichier formaté de la façon attendue&lt;br /&gt;
***Nombre de balises réel n'est pas bien déterminé par le code&lt;br /&gt;
***ID de la première et de la dernière balise ne sont pas déterminés correctement&lt;br /&gt;
&lt;br /&gt;
**Automatisation de la collecte par un script Shell lançant toutes les commandes de CONNEXION, REDIRECTION, LANCEMENT CU, FERMETURE DU PROGRAMME (kill rfcomm / kill tcp_redirect)&lt;br /&gt;
***Dans le but d'automatiser la procédure&lt;br /&gt;
***Dans le but de résoudre un problème de gestion de ressources (le bug '''thread''' apparu plus tôt dans le projet)&lt;br /&gt;
&lt;br /&gt;
**Travail sur la résolution du bug thread car l'automatisation n'a pas résolu le problème&lt;br /&gt;
***Identification du ou des causes potentielles: gestion des ressources (synchrone, asynchrone ?), connexion Bluetooth, lancement des commandes dans le même script, lancement en fg/bg, conflit dû au temps d'exécution de chaque processus ?&lt;br /&gt;
***Lancement des commandes manuellement dans des terminaux ne pose aucun problème: solution la plus simple&lt;br /&gt;
&lt;br /&gt;
**Redesign de la page Collecte&lt;br /&gt;
***Remplacement des boutons de commande par un bouton unique d'initialisation&lt;br /&gt;
***Travail sur une mise à jour du menu déroulant dropdown régulière sans avoir à recharger la page Web&lt;br /&gt;
***Implémentation de plotly.js, un module Javascript qui permet d'afficher des graphes en 3D&lt;br /&gt;
&lt;br /&gt;
*Mise au point post-soutenance avec Roudy DAGHER pour valider le travail restant, effectué et redéfinir certains objectifs atteignables ou pas selon les éléments réalisés dans le projet&lt;br /&gt;
*Recherches et début de l'implémentation du serveur de localisation fourni par les tuteurs&lt;br /&gt;
*Gestion du Git pour créer des branches additionnelles&lt;br /&gt;
*Recréation du rapport de projet suite à une perte du fichier éditable d'origine + Mise à jour avec les remarques suite à la soutenance ainsi que les nouveaux éléments&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 14'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mar 16/01/18 - Ven 19/01/18]]''  &lt;br /&gt;
*Travail sur la collecte des données (serveur de collecte et interface Web)&lt;br /&gt;
**Redéfinition du fichier de parsage car il crée des conflits et ne produit pas un fichier formaté de la façon attendue&lt;br /&gt;
***Corrigé: Nombre de balises réel n'est pas bien déterminé par le code&lt;br /&gt;
***Corrigé: ID de la première et de la dernière balise ne sont pas déterminés correctement&lt;br /&gt;
***Reste à faire: Traiter le cas où il y a un ajout ou suppression d'une balise pendant la collecte (pour le moment, lorsque c'est le cas, toutes les données se décalent au lieu de laisser des trous)&lt;br /&gt;
&lt;br /&gt;
**Automatisation de la collecte par un script Shell lançant toutes les commandes de CONNEXION, REDIRECTION, LANCEMENT CU, FERMETURE DU PROGRAMME (kill rfcomm / kill tcp_redirect)&lt;br /&gt;
***Mis en suspens: pour le moment, on lance les commandes manuellement dans le terminal&lt;br /&gt;
&lt;br /&gt;
**Interface Web&lt;br /&gt;
***Implémentation de plotly.js, un module Javascript qui permet d'afficher des graphes en 3D&lt;br /&gt;
&lt;br /&gt;
*Implémentation du serveur de localisation fourni par les tuteurs (mais algorithme de localisation pas fonctionnel pour le moment)&lt;br /&gt;
**Mise à jour de l'affichage des positions des éléments: précédemment seule la matrice X de position du Tag s'affichait, et pas la matrice A des balises&lt;br /&gt;
**Requêtes manuelles à l'API avec la fonction curl OK: on arrive à récupérer les matrices X et A (aléatoires pour le moment) par une requête GET à l'API du serveur de localisation&lt;br /&gt;
**Implémentation des requêtes Ajax pour automatiser les requêtes au serveur de localisation&lt;br /&gt;
&lt;br /&gt;
*Mise à jour du rapport les nouveaux éléments du travail réalisé&lt;br /&gt;
*Réflexion sur la possibilité ou non de réaliser la partie temps réel du projet au vu des moyens à disposition&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 15'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mar 23/01/18 - Ven 26/01/18]]'' &lt;br /&gt;
*Travail sur la collecte des données (serveur de collecte et interface Web)&lt;br /&gt;
**Redéfinition du fichier de parsage car il crée des conflits et ne produit pas un fichier formaté de la façon attendue&lt;br /&gt;
***Fait: Si distance négative car Tag trop près, la valeur négative générée par une balise est remplacée par un &amp;quot;0&amp;quot; (cela modifie la position réelle modélisée dans plotly, mais évite une impossibilité de générer la position à partir de la distance -&amp;gt; par des tests, il faudra déterminer la valeur limite à partir de laquelle les cartes donnent des valeurs de distance négatives&lt;br /&gt;
***Reste à faire: Traiter le cas où il y a un ajout ou suppression d'une balise pendant la collecte (pour le moment, lorsque c'est le cas, toutes les données se décalent au lieu de laisser des trous); Ainsi que le cas où il y un saut/bug inattendu et donc une disparition d'une ou plusieurs valeurs de distance&lt;br /&gt;
***Fait: Début de résolution du cas où une distance n'est pas prise en compte, c'est à dire où il y a une valeur qui disparaît et désaligne les valeurs lors de la création du JSON&lt;br /&gt;
&lt;br /&gt;
**Automatisation de la collecte par un script Shell lançant toutes les commandes de CONNEXION, REDIRECTION, LANCEMENT CU, FERMETURE DU PROGRAMME (kill rfcomm / kill tcp_redirect)&lt;br /&gt;
***Mis en suspens: pour le moment, on lance les commandes manuellement dans le terminal&lt;br /&gt;
***Création d'un script bash /etc/init.d/autoconnect.sh pour connecter automatiquement la RPi au lancement du système (si la RPi est déjà allumée au démarrage)&lt;br /&gt;
&lt;br /&gt;
**Interface Web&lt;br /&gt;
***Perfectionnement de l'utilisation de Plotly pour les visualisations&lt;br /&gt;
&lt;br /&gt;
*Implémentation du serveur de localisation fourni par les tuteurs (algorithme de localisation pas fonctionnel pour le moment)&lt;br /&gt;
**Requêtes manuelles à l'API avec la fonction curl OK&lt;br /&gt;
**Fait: Implémentation des requêtes Ajax pour automatiser les requêtes au serveur de localisation&lt;br /&gt;
***Liaison entre les différentes commandes curl grace à des variables: permet de stocker l'adresse du job récupérée par la méthode GET&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 16'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Lun 29/01/18 - Ven 02/02/18]]'' &lt;br /&gt;
*Travail sur la collecte des données (serveur de collecte et interface Web)&lt;br /&gt;
**Redéfinition du fichier de parsage car il crée des conflits et ne produit pas un fichier formaté de la façon attendue&lt;br /&gt;
***déterminer la valeur limite à partir de laquelle les cartes donnent des valeurs de distance négatives&lt;br /&gt;
***Reste à faire: Traiter le cas où il y a un ajout ou suppression d'une balise pendant la collecte (pour le moment, lorsque c'est le cas, toutes les données se décalent au lieu de laisser des trous); Ainsi que le cas où il y un saut/bug inattendu et donc une disparition d'une ou plusieurs valeurs de distance&lt;br /&gt;
***Fait: gestion des bugs/sauts de valeurs de balises - remplacement par une valeur nulle sur balise existe, par rien sinon (implémentation d'un tableau caractérisant l'existence ou pas de chaque balise 1 à 6), optimisation des temps de calculs/exécution dans le script&lt;br /&gt;
**Interface Web&lt;br /&gt;
***Ajout d'une barre de progression de la collecte remplaçant le bouton de Lancement de collecte lors de l'appui&lt;br /&gt;
***Ajout d'un bouton dropdown pour afficher les fichiers de position qu'on reçoit du serveur de localisation&lt;br /&gt;
***Ajout d'une scrollbar dans les deux dropdown&lt;br /&gt;
&lt;br /&gt;
*Implémentation du serveur de localisation fourni par les tuteurs (algorithme de localisation pas fonctionnel pour le moment)&lt;br /&gt;
**Requêtes manuelles à l'API avec la fonction curl OK&lt;br /&gt;
**Fait: Implémentation des requêtes Ajax pour automatiser les requêtes au serveur de localisation&lt;br /&gt;
***Liaison entre les différentes requêtes Ajax grâce à des variables: permet de stocker l'adresse du job récupérée par la méthode GET&lt;br /&gt;
***Création d'une requête Ajax GET qui demande le fichier JSON de position au serveur de localisation jusqu'à ce qu'il soit retourné&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Observations'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Problèmes rencontrés'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Solutions apportées'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Délivrables'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
Rapport de mi-PFE&lt;br /&gt;
[[Fichier:RapportMi-PFE-UNG DELATTE.pdf]]&lt;br /&gt;
&lt;br /&gt;
Rapport de PFE&lt;br /&gt;
&lt;br /&gt;
Vidéo&lt;/div&gt;</summary>
		<author><name>Hdelatte</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=P18_Localisation_of_quadrotors&amp;diff=47019</id>
		<title>P18 Localisation of quadrotors</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=P18_Localisation_of_quadrotors&amp;diff=47019"/>
				<updated>2017-12-19T14:19:15Z</updated>
		
		<summary type="html">&lt;p&gt;Hdelatte : /* Avancement du Projet */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Cahier des charges'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;Présentation générale du projet&amp;lt;/span&amp;gt;=== &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Contexte&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
Dans un monde de plus en plus connecté, de nombreux drones sont déployés pour diverses applications comme l'espionnage, la surveillance, la cartographie de lieux et la livraison de colis. Les technologies nécessaires pour contrôler ces drones sont des sujets de recherche actuels. &lt;br /&gt;
&lt;br /&gt;
Le contrôle de ceux-ci passe tout d'abord par la maîtrise de leur position dans l'espace. Le développement des applications liées à l'utilisation de drones nécessite un travail important sur la localisation spatiale d'objets connectés. &lt;br /&gt;
&lt;br /&gt;
De plus, dans un souci d'utilisation, il est essentiel de développer des interfaces logicielles permettant d'exploiter ces données.&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Objectif du projet&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
L'objectif de ce projet est de développer une interface logicielle permettant de traiter en temps réel les informations de localisation d'un drone et de balises, dans le but de définir leur localisation dans l'espace, en intérieur.&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Description du projet&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
Pour réaliser le contrôle de drones, la première étape importante est de donner ses informations de position. Le but du projet est de développer une interface logicielle permettant de localiser le drone en temps réel en intérieur. Le drone se déplace dans un environnement dans lequel ont été installées de multiples balises. Il est équipé d'une carte, lui permettant de recevoir les distances relatives entre lui-même et les balises, sur laquelle différents algorithmes vont être implémentés pour effectuer la localisation en temps réel. Le projet requiert des compétences en développement hardware (Crazyflie 2.0, voir https://wiki.bitcraze.io/) et software (langage C/C++/Python/Javascript/HTML...).&lt;br /&gt;
&lt;br /&gt;
Il se divise en 4 étapes principales, qui sont:&lt;br /&gt;
*1) Choisir les technologies utilisées&lt;br /&gt;
*2) Choisir l'architecture (OS / APIs)&lt;br /&gt;
*3) Développer les différentes parties du projet&lt;br /&gt;
*4) Intégrer et connecter les différentes parties du projet&lt;br /&gt;
&lt;br /&gt;
La localisation étant en intérieur, le protocole GPS n'est donc pas assez précis pour les applications ciblées. La mise en place d'un tel dispositif permettrait grâce à l'utilisation d'un algorithme d'estimer avec une bonne précision les positions en intérieur d'une balise centrale (appelée Tag) et de balises (appelées Anchor). Le Tag scanne en temps réel la distance relative aux différentes balises, et il nous est retourné la position des balises et du Tag grâce à l'algorithme de localisation.&lt;br /&gt;
&lt;br /&gt;
Le projet se compose de 3 parties:&lt;br /&gt;
* Collect &amp;amp; parse: collecter les données envoyées par les balises en communiquant avec un serveur et récupérer les données adéquates par un tri&lt;br /&gt;
* Localise: déterminer la matrice de position des balises et du Tag en traitant les données récupérées&lt;br /&gt;
* Display: développer l'interface homme machine pour afficher, étudier et utiliser les données traitées&lt;br /&gt;
&lt;br /&gt;
Nous travaillerons dans un premier temps dans une optique temps différé avant de travailler en temps réel. Cela nous permettra d'acquérir des données utiles et réutilisables en aval. &lt;br /&gt;
&lt;br /&gt;
A l'aboutissement du projet, nous devrions être capable via l'interface homme machine développée d'afficher précisément la position spatiale des balises ainsi que du Tag, grâce àl'utilisation d'un algorithme de localisation et des données récupérées, et d'afficher d'autres données relatives au déplacement du Tag ou des balises dans l'espace. &lt;br /&gt;
&lt;br /&gt;
Si le temps le permet, nous pourrons aussi être amenés à adapter et utiliser l'interface développée pour l'utilisation d'un drone.&lt;br /&gt;
&lt;br /&gt;
''Sujet originel''&lt;br /&gt;
&lt;br /&gt;
To achieve the control of quadrotors, the first important task to give its position information. This project is to develop a software(GUI) to localize the quadrotors in real-time. The quadrotor is flying in an environment where several transmitters have been installed. The quadrotor is equipped with a deck to receive the relative distances between the deck and all transmitters, based on which different algorithms will be implemented to realize the real-time localization. The candidates need to have both experiences on hardware (Crazyflie 2.0, see https://wiki.bitcraze.io/) and software development (C/C , Python…). &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Calendrier&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
''[[Avant le 29/09/17]]'' - Élaboration du Cahier des charges, de la liste des tâches et du calendrier prévisionnel&lt;br /&gt;
&lt;br /&gt;
''[[Avant fin Octobre]]'' - Serveur de collecte et début du développement de l'interface logicielle&lt;br /&gt;
&lt;br /&gt;
''[[Avant fin Décembre]]'' - Interface logicielle&lt;br /&gt;
&lt;br /&gt;
''[[A la fin du PFE]]'' - Intégration finale des différentes parties (Serveur de collecte des données &amp;amp; Serveur de localisation &amp;amp; Interface logicielle)&lt;br /&gt;
&lt;br /&gt;
Répartition du volume de travail (***h):&lt;br /&gt;
&lt;br /&gt;
* Recherche sur les technologies à utiliser (**h)&lt;br /&gt;
* Développement du serveur de collecte de données (**h)&lt;br /&gt;
* Réalisation de l'interface logicielle (Web//Logiciel/Application) (**h)&lt;br /&gt;
* Intégration des différentes parties (**h)&lt;br /&gt;
* Test et débuggage (**h)&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Choix techniques : matériel et logiciel&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
Afin de développer ce dispositif, nous allons utiliser une Raspberry Pi 3 associée à une carte réceptrice, qui communique avec 4 balises composées chacune d'un microcontrôleur et d'une carte émettrice radio (UWB5C) et alimentées par batteries. La carte réceptrice joue le rôle du drone à localiser et communiquera les données émises par les balises vers l'ordinateur via Bluetooth.&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Choix technologiques&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
Voici les technologies que nous utilisons pour chacune des parties de ce projet.&lt;br /&gt;
&lt;br /&gt;
    1) Serveur de collecte des données:&lt;br /&gt;
       Scanne et parse les données récupérées pour fournir la matrice D des distances relatives du tag aux 4 balises&lt;br /&gt;
        - API&lt;br /&gt;
        - Python / Serveur Flask&lt;br /&gt;
&lt;br /&gt;
    2) Serveur de localisation (fourni):&lt;br /&gt;
       Calcule grâce à l'algorithme de localisation et la matrice D les positions spatiales des 4 noeuds et du tag&lt;br /&gt;
        - API&lt;br /&gt;
        - Bootstrap&lt;br /&gt;
        - Jquery&lt;br /&gt;
        - Python&lt;br /&gt;
&lt;br /&gt;
    3) Interface utilisateur:&lt;br /&gt;
       Affiche courbes, visualisation 3D, boutons ou données des fichiers envoyées par le serveur de localisation&lt;br /&gt;
        - HTML5 / Javascript&lt;br /&gt;
        - Fichiers JSON (serveurs de collecte et de localisation)&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Calendrier prévisionnel'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Liste des tâches à effectuer&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
# Se documenter sur le projet&lt;br /&gt;
##Langages et technologies utilisées&lt;br /&gt;
##Matériel utilisé&lt;br /&gt;
##Mettre en place du travail sur le Git&lt;br /&gt;
# Réaliser le serveur de collecte&lt;br /&gt;
##Récupérer les trames envoyées par bluetooth par le TAG via la Raspberry Pi&lt;br /&gt;
##Intégrer le serveur de localisation pour interpréter les trames&lt;br /&gt;
##Tester et optimiser&lt;br /&gt;
# Réaliser l'interface Web utilisateur&lt;br /&gt;
##Implémenter le serveur de collecte et de localisation&lt;br /&gt;
##Afficher et traiter les données stockées dans les fichiers JSON via le serveur (temps différé + temps réel)&lt;br /&gt;
##Tester et optimiser&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;Replanification du cahier des charges / calendrier&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Feuille d'heures'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Tâche !! Prélude !! Heures S1 !! Heures S2 !! Heures S3 !! Heures S4 !! Heures S5 !! Heures S6 !! Heures S7 !! Heures S8 !! Heures S9 !! Heures S10 !! Heures S11 !! Heures S12 !! Après Noël !! Total&lt;br /&gt;
|-&lt;br /&gt;
| Cahier des charges / Wiki / Gitlab&lt;br /&gt;
|  4h&lt;br /&gt;
|  3h&lt;br /&gt;
|  1h&lt;br /&gt;
|  x&lt;br /&gt;
|  1h30&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h30&lt;br /&gt;
|  1h&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Documentation sur les technos utilisées&lt;br /&gt;
|  2h&lt;br /&gt;
|  4h&lt;br /&gt;
|  3h&lt;br /&gt;
|  2h&lt;br /&gt;
|  3h&lt;br /&gt;
|  4h&lt;br /&gt;
|  5h&lt;br /&gt;
|  5h30&lt;br /&gt;
|  4h30&lt;br /&gt;
|  3h30&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Documentation sur le matériel&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Recherche et développement du serveur de collecte&lt;br /&gt;
|  x&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  3h&lt;br /&gt;
|  3h30&lt;br /&gt;
|  4h&lt;br /&gt;
|  5h&lt;br /&gt;
|  7h&lt;br /&gt;
|  4h30&lt;br /&gt;
|  0,5h&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| Recherche et développement de l'interface Web&lt;br /&gt;
|  x&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  3h&lt;br /&gt;
|  5h&lt;br /&gt;
|  6h&lt;br /&gt;
|  4h&lt;br /&gt;
|  7h&lt;br /&gt;
|  5h30&lt;br /&gt;
|  2h30&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| Recherche et intégration du serveur de localisation&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x &lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| Intégration des différentes parties&lt;br /&gt;
|  x&lt;br /&gt;
|  x  &lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  2h&lt;br /&gt;
|  2h&lt;br /&gt;
|  2h&lt;br /&gt;
|  3h&lt;br /&gt;
|  1h30&lt;br /&gt;
|  x&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| Tests et débuggage&lt;br /&gt;
|  x&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  1h&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  3h&lt;br /&gt;
|  4h&lt;br /&gt;
|  0,5h&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Optimisation/Correction des programmes&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Avancement du Projet'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Phase préparatoire'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Jeu 21/09/17 - Ven 22/09/17]]'' &lt;br /&gt;
*Rendez-vous de mise au point du cahier des charges avec les encadrants/intervenants (M. ZHENG Gang et M. DAGHER Roudy)&lt;br /&gt;
*Elaboration du cahier des charges&lt;br /&gt;
*Elaboration de la page Wiki (préparation de la mise en page et présentation du sujet)&lt;br /&gt;
*Préparation du travail sous forme de Mind Map&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous nous sommes tout d’abord rendus au laboratoire de l'INRIA afin de pouvoir définir le plus précisément possible le cahier des charges avec nos tuteurs.&lt;br /&gt;
Nous avons donc défini avec eux les technologies qu'il faudrait étudier. Vous retrouverez le choix des technologies dans la partie '''choix technologiques'''&lt;br /&gt;
&lt;br /&gt;
Nous avons en même temps créé notre page Wiki, et structuré celui-ci avec les parties qui nous seraient utiles pour développer nos explications par la suite.&lt;br /&gt;
&lt;br /&gt;
Nous avons de plus découpé le travail en sous-parties que nous avions mis dans un '''Mind map''' afin d'y voir plus clair sur la ligne à suivre.&lt;br /&gt;
&lt;br /&gt;
Vous trouverez ce Mind map juste ci-dessous. Nous ne mettrons pas à jour ce Mind map chaque semaine mais il est fort probable que nous en referions un en milieu de projet pour pouvoir cibler les objectifs réussis et ceux à atteindre. Nous pourrons de plus redéfinir certains objectifs qui nous aurait semblé trop vague au début du projet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Projet de fin d'étude.png|centre|600px]]&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 1'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Jeu 28/09/17 - Ven 29/09/17]]'' &lt;br /&gt;
*Revue du Cahier des Charges avec les encadrants&lt;br /&gt;
*Lecture et recherches sur les technologies adaptées&lt;br /&gt;
*Construction de la suite de la Mind Map&lt;br /&gt;
*Création du Gitlab&lt;br /&gt;
&lt;br /&gt;
Nous commençons les recherches sur le projet et sur les premières technologies engagées dans celui-ci. Nous en profitons pour formuler des à présent des questions sur le bon choix de celles-ci. Nous commençons donc des tests ayant seulement pour but de nous familiariser avec l'environnement de travail et de réellement comprendre les fonctions déjà présentes qu'il faudra exploiter et implanter notre interface web.&lt;br /&gt;
Nous créons un gitlab avec notre tuteur et commençons a définir les taches premières sur celui-ci.&lt;br /&gt;
Nous en profitons pour affiner le Mind Map.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 2'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Jeu 05/10/17 - Ven 06/10/17]]''  &lt;br /&gt;
*Précisions sur le cahier des charges&lt;br /&gt;
*Listage du matériel&lt;br /&gt;
*Recherche et détermination de solutions technologiques possibles pour les fonctions demandées&lt;br /&gt;
*Début du travail sur le serveur de collecte&lt;br /&gt;
*Apprentissage du langage Python et de l'utilisation du framework Flask&lt;br /&gt;
&lt;br /&gt;
Nous avons finalisé les précisions sur le cahier des charges. Nous avons donc pu cibler le matériel dont nous nous servirons pour ce Projet. Vous trouverez donc cette liste la section correspondante. Il est évident que le matériel utilisé est dans l'ensemble déjà fourni par le laboratoire et qu'il nous reste dans l'ensemble à créer l'interface web et les API qui nous permettrons de faire communiquer cette interface avec la Raspberrypi et le serveur de position déjà créé.&lt;br /&gt;
Nous avons donc pu commencer a ce former sur les technologies qui nous serviraient par la suite. Nous avaons donc utilisé le cours d'openclassroom sur les serveur flask pour en apprendre les bases. Ce serveur flask est programmé en python et nous permets donc une grande liberté au niveau de l’exécutions de certains scripts. En effet les script de connexion bluetooth et de redirection de port qui nous permette de recuperer les données de distance sont eux meme codé en python et sont directement appelé via le serveur.&lt;br /&gt;
Dans ce serveur, représentant notre interface web, vous retrouverez la page '''/collecte''' qui représentera notre partie collecte de données ainsi que l'affichage de ces distances. Nous appellerons cette partie le serveur de collecte.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 3'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 11/10/17 - Jeu 12/10/17]]''  &lt;br /&gt;
*Recherche et développement initial du serveur de collecte de données&lt;br /&gt;
*Complément du Git sur les tâches à effectuer&lt;br /&gt;
&lt;br /&gt;
Nous avons commencé à créer un serveur flask renvoyant pour l'instant une matrice aléatoire. Lors de la requête URL &amp;quot;../matrice&amp;quot;, nous voyons bien une matrice aléatoire apparaître sur la page Web. Nous essayons de nous connecter à la Raspberry Pi en redirigeant son port série vers le Bluetooth de façon à récupérer de vraies matrices de distance entre le drone (ie commutateur central) et les balises. Nous pourrons afficher ensuite ces matrices, ou alors les stocker dans un fichier en attendant le traitement de celles-ci.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Requete s3.PNG|300px|serveur flask]]&lt;br /&gt;
&lt;br /&gt;
Nous avons plusieurs problèmes avec le Bluetooth pour se connecter avec la Raspberry Pi. Quand nous aurons réussi à nous connecter au port série de la Raspberry pi alors nous pour gérer le traitement des données récupérées.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 4'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 18/10/17 - Jeu 19/10/17]]''  &lt;br /&gt;
*Configuration de la Raspberry Pi car problèmes de connectivité Bluetooth rencontrés&lt;br /&gt;
**Nous arrivons à connecter la Raspberry Pi sous Windows mais la connexion sous Linux pose problème (travail en suspens en attendant la disponibilité de l'encadrant)&lt;br /&gt;
*Début du développement de l'interface Web&lt;br /&gt;
**Traitement d'une matrice dans un fichier JSON&lt;br /&gt;
**Affichage sous forme de tableau de la matrice&lt;br /&gt;
**Utilisation du serveur de requête en Python avec chargement de template HTML&lt;br /&gt;
**Mise en forme de la trame de la page en HTML/CSS avec le framework Bootstrap&lt;br /&gt;
**Ajout d'un set de distances (d1, d2, d3, d4) dans la matrice lors d'un appui sur un bouton Chargement en utilisant un fichier Javascript&lt;br /&gt;
&lt;br /&gt;
Nous Avons reçus des fonctions pythons de notre tuteurs afin d'obtenir une connexion bluetooth entre notre raspberrypi et notre ordinateur ainsi qu'une redirection de port de celle ci vers la connexion. Nous n'arrivons pas à utiliser ces fonctions sous linux et nous necessitons une explication de notre tuteur n'etant pas disponible a ce moment. Pour ne pas perdre de temps nous nous attaquons la creation de l'interface web a proprement parler. c'est a dire la création des pages html ainsi que le document javascript qui nous servira de bibliotheque de fonctions.chaque route de notre serveur sont relié a une series de fonctions python s'executant a l'apelle des url puis suivis d'un template de la page HTML en question. Nous en profitons de plus pour explorer le framework CSS bootstrap afin de mettre un premier design et une structure a notre page collecte qui sera la page principale de notre site pour ce début de projet.&lt;br /&gt;
&lt;br /&gt;
Nous nous essayons de plus à différents tests sur des fichiers de format '''Json''' que nous devrons réussir à traiter correctement plus tard dans notre projet.&lt;br /&gt;
Nous récupérons une matrice que nous créons nous même en python (simulation d'une série de distances récupérée) que nous transformons au format Json pour ensuite l'afficher sur notre page web. Pour pouvoir proprement afficher se fichier '''Json''' renvoyé vers notre page, nous nous servons du fichier javascript afin de créer du code html contenant la matrice.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 5'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 25/10/17 - Ven 27/10/17]]''  &lt;br /&gt;
*Résolution des problèmes de connectique Bluetooth sur la Raspberry Pi&lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Traitement d'une matrice dans un fichier JSON&lt;br /&gt;
**Début de l'ajout d'un set de distances depuis une matrice contenue dans un fichier JSON&lt;br /&gt;
&lt;br /&gt;
Nous avons pu nous entretenir avec notre tuteur et donc comprendre les fonctions de connexion et de redirection de port. Nous pouvons donc continuer le développement de notre interface web. Nous arrivons à traiter un set de donné au format json et à l'afficher dans le code html. Toutefois nous créons nous mème ce set, il est maintenant nécessaire que nous arrivions à récupérer les set de distance réels reçus par la connexions bluetooth. Nous commencerons par un traitement asynchrone. L'idée est d’enregistrer les sets de distances dans un fichier '''Json''' stocké dans un dossier. Nous appellerons ce dossier plus tard via une requête ajax.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 6'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 08/11/17 - Ven 10/11/17]]''  &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
**Mise en place de la communication entre le port série de notre machine et le port série de la carte via Bluetooth de la RPi3&lt;br /&gt;
**Récupération et traitement (parse) manuels des données de distances dans un fichier .log via TCP/IP&amp;lt;-&amp;gt;Bluetooth&lt;br /&gt;
**Début de l'automatisation du procédé par script Python (requete.py) et mise en place de sockets de communication&lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Chargement sur commande d'un set de distances depuis une matrice contenue dans un fichier JSON&lt;br /&gt;
*Travail sur le layout du site&lt;br /&gt;
&lt;br /&gt;
Après avoir regardé le code de ces différentes fonctions nous avons pu faire des test manuels via le shell pour récupérer des données de distances et les stocker dans un fichier '''Json''' sur notre ordinateur.&lt;br /&gt;
&lt;br /&gt;
Nous utilisons les commandes suivante pour se connecter via bluetooth:&lt;br /&gt;
&lt;br /&gt;
 rfcomm connect /dev/rfcomm0 B8:27:EB:80:DC:89 1&lt;br /&gt;
&lt;br /&gt;
Rediriger le port de la raspberrypi3 vers la connexion:&lt;br /&gt;
&lt;br /&gt;
 python lps-collector/tcp_serial_redirect.py /dev/rfcomm0 9600&lt;br /&gt;
&lt;br /&gt;
Collecter les données dans un fichier dont nous définissons le nom:&lt;br /&gt;
&lt;br /&gt;
 echo &amp;quot;cu -s9600 -lttyACM0&amp;quot;| nc localhost 7777&lt;br /&gt;
 nc localhost 7777 | grep distance &amp;gt; static/log/dist-capture'+date+'.log&lt;br /&gt;
&lt;br /&gt;
Nous pouvons '''parser''' le flux de donner avant de le stocker dans le fichier via cette commande:&lt;br /&gt;
&lt;br /&gt;
 python lps-collector/lps_parse.py static/log/dist-capture&amp;quot;+date+&amp;quot;.log&lt;br /&gt;
&lt;br /&gt;
Il est donc nécessaire d'inclure via des '''thread''' ces différente fonctions dans notre serveur python (Flask) afin d'automatiser le processus. Le but est de pouvoir choisir sur l'interface web quels fonctions il faut exécuter et les déclencher via l'appuie sur des boutons.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 7'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 15/11/17 - Ven 17/11/17]]''  &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
**Récupération et traitement (parse) manuels des données de distances dans un fichier .log via TCP/IP&amp;lt;-&amp;gt;Bluetooth&lt;br /&gt;
**Automatisation du procédé par script Python (requete.py)&lt;br /&gt;
***Mise en place de sockets de communication pour le contrôle de la collecte -&amp;gt; abandonné (servait à commander la collecte manuellement)&lt;br /&gt;
***Développement d'un script engine.py regroupant les commandes exécutables par l'utilisateur via la page Web&lt;br /&gt;
***Début du travail sur la fonction &amp;quot;STOP&amp;quot; manuel d'une action de collecte de données (liaison entre script html, javascript, et script python)&lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Chargement sur commande d'un set de distances depuis une matrice contenue dans un fichier JSON&lt;br /&gt;
**Travail sur le layout du site&lt;br /&gt;
***Ajout des différentes commandes (connexion bluetooth, lancement commande cu, collecte des données, collecte durée donnée)&lt;br /&gt;
***Début de l'implémentation de la visualisation des fichiers .json obtenus après collecte et affichage dans un tableau matriciel du fichier sélectionné&lt;br /&gt;
&lt;br /&gt;
Nous avons continuez a travaillez sur le serveur de collecte: Les données que nous savons récupérer via bluetooth sont stockée dans un fichier .log. Apres avoir bien compris comment marchait la fonction '''parse''' manuellement( lors de son utilisation dans le shell, nous l'avons implanter dans notre serveur de collecte qui lance cette commande lors de l’appuie sur un bouton via notre interface virtuelle. Un problème rencontré était de savoir quand la récolte des données devait s’arrêté. nous avons donc rajouté un temps à entré nous même sur l'interface. La fonction '''parse''' est effectué commence et le sous processus va attendre le temps donné avant de lancer une commande permettant de tuer le processus et mettant donc fin au remplissage du fichier '''.log'''. Nous voulons de plus réussir à lancer une fonction de collecte sans temps. c'est à dire que nous coupons la collecte via un bouton par nous même. nous voulions utiliser des Sockets pour pouvoir définir nous même la gestions de la communication mais l'idée a été abandonné car nous avons réussi a sauvegarder le PID du processus lancé. Il nous suffit donc de l’arrêter grâce à un autre bouton qui récupère cette variable et l’arrête ensuite. &lt;br /&gt;
&lt;br /&gt;
Toutes nos fonctions pythons étant regroupées dans notre serveur '''requete.py''' nous avons décidé de créé un module qui regroupera toutes ces fonction que nous pourrons utilisé dans '''requete.py'''. ceci nous permet de voir plus claire dans notre code et de faciliter le travail lorsque nous modifions le code tous les deux.&lt;br /&gt;
&lt;br /&gt;
Nous essayons en continues d'adapter le layout du site pour le rendre le plus attractif et simple possible. de facon a ce que chaque bouton et tableau soient claires et compréhensibles.&lt;br /&gt;
&lt;br /&gt;
Nous avons commencé à récupéré les fichier '''json''' créé à partir des fichier '''log'''. c'est a dire que ces fichiers sont automatiquement stockés coté serveur dans un dossier nommé '''static/log'''. Notre but est de récupérer le nom des fichier json et de les afficher dans un composant sur notre interface web. il nous sera donc possible ensuite de sélectionner le nom d'un fichier. lors de la sélection de ce nom de fichier, un tableau apparaît avec les valeurs de distances à l’intérieur.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 8'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 22/11/17 - Ven 24/11/17]]''  &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
**Automatisation du procédé de collecte par script Python (requete.py qui fait appel à engine.py)&lt;br /&gt;
***Développement d'un script engine.py regroupant les commandes exécutables par l'utilisateur via la page Web&lt;br /&gt;
***Travail sur la fonction &amp;quot;STOP&amp;quot; manuel d'une action de collecte de données (liaison entre script html, javascript, et script python)&lt;br /&gt;
***Mise en place d'un serveur HTTP Simple sous Python pour accéder aux fichiers de données à partir de la page Web&lt;br /&gt;
***Mise à jour de fonctions de connexion &lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Travail sur le layout du site (ajout de pages, navigation entre les pages, apparence, nettoyage des codes)&lt;br /&gt;
**Bon fonctionnement de l'ensemble serveur collecte + serveur HTTP + client Web&lt;br /&gt;
**Affichage de la liste des fichiers de données de distance (log, csv, json) via serveur HTTP en Python sur port 9999&lt;br /&gt;
*Corrections et nettoyage du dépôt GIT&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous continuons a développer les points énoncé la semaine dernière. Nous avons décidé de nous dirigé vers un serveur HTTP Simple pour accéder à nos fichiers. il s’avère que nous finirons par ne pas utiliser ce serveur. Nous irons récupérer les fichiers en question via des requêtes '''ajax''' faites à la sélection du nom du fichier.&lt;br /&gt;
&lt;br /&gt;
Nous rencontrons depuis le début des problèmes avec les fonctions de connexion qui peuvent ne pas marcher a un moment donner. Nous essayons de trouver pourquoi ce bug est un bug qui ne se produit pas à chaque fois. Nous avons déterminé qu'il ne se produisait seulement lorsque les fonctions de connexions étaient lancée dans des threads. Nous ne savons toujours pas pourquoi ces thread bug seulement parfois et non à chaque essaie de connexion.&lt;br /&gt;
&lt;br /&gt;
Nous avons nettoyé notre dépot '''Git''' car il s’avère que nous utilisions une mauvais méthode de fusion et de stockage des documents.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 9'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 29/11/17 - Jeudi 30/11/17]]''  &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
**Automatisation du procédé de collecte par script Python (requete.py qui fait appel à engine.py)&lt;br /&gt;
***Travail sur la fonction &amp;quot;STOP&amp;quot; manuel d'une action de collecte de données (liaison entre script html, javascript, et script python)&lt;br /&gt;
***Recherches sur l'utilisation de fichiers json accessibles via le serveur HTTP&lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Travail sur le layout du site &lt;br /&gt;
**Travail sur la liaison entre fichiers json et affichage Web des données de distance&lt;br /&gt;
***Recherches et tests de solutions&lt;br /&gt;
****Affichage depuis un fichier&lt;br /&gt;
****Affichage à la volée lors d'une action de collecte&lt;br /&gt;
&lt;br /&gt;
*Revue de code avec Roudy DAGHER:&lt;br /&gt;
**Structure globale des codes ok&lt;br /&gt;
**Fonctionnement presque ok: fonctionnalités implémentées ok, mais parsage csv ne marche pas&lt;br /&gt;
**Refactoring nécessaire&lt;br /&gt;
**Correction de la fonction STOP et amélioration de la fonction de COLLECTE&lt;br /&gt;
**Faire plus de requêtes Javascript que de requêtes HTML&lt;br /&gt;
**Discussion pour l'implémentation du serveur de localisation (= algorithme de localisation) et des visualisations de données sur le site Web&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous avons d'abord revue l'ensemble de notre code et les méthode utilisé avec notre tuteur '''Roudy Dagher'''. Nous nous approchons d'un serveur de collecte de donné stable et fonctionnel. Nous avons refait les différentes connexions entre l'interface et le serveur afin de ne faire que des requêtes sur des '''WebServices'''. Il nous ai possible de commencer la deuxième partie qui est l'envoie de ces tableaux de données afin de les envoyer vers le serveur de localisation via des API afin de recevoir des matrice de positions.&lt;br /&gt;
Nous pourrons grâce a ces matrices afficher une carte 3d des balises  et du TAG dans l'espace.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 10'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 11'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Observations'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Problèmes rencontrés'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Solutions apportées'''&amp;lt;/span&amp;gt;===&lt;/div&gt;</summary>
		<author><name>Hdelatte</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=P18_Localisation_of_quadrotors&amp;diff=47018</id>
		<title>P18 Localisation of quadrotors</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=P18_Localisation_of_quadrotors&amp;diff=47018"/>
				<updated>2017-12-19T14:17:16Z</updated>
		
		<summary type="html">&lt;p&gt;Hdelatte : /* Semaine 6 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Cahier des charges'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;Présentation générale du projet&amp;lt;/span&amp;gt;=== &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Contexte&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
Dans un monde de plus en plus connecté, de nombreux drones sont déployés pour diverses applications comme l'espionnage, la surveillance, la cartographie de lieux et la livraison de colis. Les technologies nécessaires pour contrôler ces drones sont des sujets de recherche actuels. &lt;br /&gt;
&lt;br /&gt;
Le contrôle de ceux-ci passe tout d'abord par la maîtrise de leur position dans l'espace. Le développement des applications liées à l'utilisation de drones nécessite un travail important sur la localisation spatiale d'objets connectés. &lt;br /&gt;
&lt;br /&gt;
De plus, dans un souci d'utilisation, il est essentiel de développer des interfaces logicielles permettant d'exploiter ces données.&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Objectif du projet&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
L'objectif de ce projet est de développer une interface logicielle permettant de traiter en temps réel les informations de localisation d'un drone et de balises, dans le but de définir leur localisation dans l'espace, en intérieur.&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Description du projet&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
Pour réaliser le contrôle de drones, la première étape importante est de donner ses informations de position. Le but du projet est de développer une interface logicielle permettant de localiser le drone en temps réel en intérieur. Le drone se déplace dans un environnement dans lequel ont été installées de multiples balises. Il est équipé d'une carte, lui permettant de recevoir les distances relatives entre lui-même et les balises, sur laquelle différents algorithmes vont être implémentés pour effectuer la localisation en temps réel. Le projet requiert des compétences en développement hardware (Crazyflie 2.0, voir https://wiki.bitcraze.io/) et software (langage C/C++/Python/Javascript/HTML...).&lt;br /&gt;
&lt;br /&gt;
Il se divise en 4 étapes principales, qui sont:&lt;br /&gt;
*1) Choisir les technologies utilisées&lt;br /&gt;
*2) Choisir l'architecture (OS / APIs)&lt;br /&gt;
*3) Développer les différentes parties du projet&lt;br /&gt;
*4) Intégrer et connecter les différentes parties du projet&lt;br /&gt;
&lt;br /&gt;
La localisation étant en intérieur, le protocole GPS n'est donc pas assez précis pour les applications ciblées. La mise en place d'un tel dispositif permettrait grâce à l'utilisation d'un algorithme d'estimer avec une bonne précision les positions en intérieur d'une balise centrale (appelée Tag) et de balises (appelées Anchor). Le Tag scanne en temps réel la distance relative aux différentes balises, et il nous est retourné la position des balises et du Tag grâce à l'algorithme de localisation.&lt;br /&gt;
&lt;br /&gt;
Le projet se compose de 3 parties:&lt;br /&gt;
* Collect &amp;amp; parse: collecter les données envoyées par les balises en communiquant avec un serveur et récupérer les données adéquates par un tri&lt;br /&gt;
* Localise: déterminer la matrice de position des balises et du Tag en traitant les données récupérées&lt;br /&gt;
* Display: développer l'interface homme machine pour afficher, étudier et utiliser les données traitées&lt;br /&gt;
&lt;br /&gt;
Nous travaillerons dans un premier temps dans une optique temps différé avant de travailler en temps réel. Cela nous permettra d'acquérir des données utiles et réutilisables en aval. &lt;br /&gt;
&lt;br /&gt;
A l'aboutissement du projet, nous devrions être capable via l'interface homme machine développée d'afficher précisément la position spatiale des balises ainsi que du Tag, grâce àl'utilisation d'un algorithme de localisation et des données récupérées, et d'afficher d'autres données relatives au déplacement du Tag ou des balises dans l'espace. &lt;br /&gt;
&lt;br /&gt;
Si le temps le permet, nous pourrons aussi être amenés à adapter et utiliser l'interface développée pour l'utilisation d'un drone.&lt;br /&gt;
&lt;br /&gt;
''Sujet originel''&lt;br /&gt;
&lt;br /&gt;
To achieve the control of quadrotors, the first important task to give its position information. This project is to develop a software(GUI) to localize the quadrotors in real-time. The quadrotor is flying in an environment where several transmitters have been installed. The quadrotor is equipped with a deck to receive the relative distances between the deck and all transmitters, based on which different algorithms will be implemented to realize the real-time localization. The candidates need to have both experiences on hardware (Crazyflie 2.0, see https://wiki.bitcraze.io/) and software development (C/C , Python…). &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Calendrier&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
''[[Avant le 29/09/17]]'' - Élaboration du Cahier des charges, de la liste des tâches et du calendrier prévisionnel&lt;br /&gt;
&lt;br /&gt;
''[[Avant fin Octobre]]'' - Serveur de collecte et début du développement de l'interface logicielle&lt;br /&gt;
&lt;br /&gt;
''[[Avant fin Décembre]]'' - Interface logicielle&lt;br /&gt;
&lt;br /&gt;
''[[A la fin du PFE]]'' - Intégration finale des différentes parties (Serveur de collecte des données &amp;amp; Serveur de localisation &amp;amp; Interface logicielle)&lt;br /&gt;
&lt;br /&gt;
Répartition du volume de travail (***h):&lt;br /&gt;
&lt;br /&gt;
* Recherche sur les technologies à utiliser (**h)&lt;br /&gt;
* Développement du serveur de collecte de données (**h)&lt;br /&gt;
* Réalisation de l'interface logicielle (Web//Logiciel/Application) (**h)&lt;br /&gt;
* Intégration des différentes parties (**h)&lt;br /&gt;
* Test et débuggage (**h)&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Choix techniques : matériel et logiciel&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
Afin de développer ce dispositif, nous allons utiliser une Raspberry Pi 3 associée à une carte réceptrice, qui communique avec 4 balises composées chacune d'un microcontrôleur et d'une carte émettrice radio (UWB5C) et alimentées par batteries. La carte réceptrice joue le rôle du drone à localiser et communiquera les données émises par les balises vers l'ordinateur via Bluetooth.&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Choix technologiques&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
Voici les technologies que nous utilisons pour chacune des parties de ce projet.&lt;br /&gt;
&lt;br /&gt;
    1) Serveur de collecte des données:&lt;br /&gt;
       Scanne et parse les données récupérées pour fournir la matrice D des distances relatives du tag aux 4 balises&lt;br /&gt;
        - API&lt;br /&gt;
        - Python / Serveur Flask&lt;br /&gt;
&lt;br /&gt;
    2) Serveur de localisation (fourni):&lt;br /&gt;
       Calcule grâce à l'algorithme de localisation et la matrice D les positions spatiales des 4 noeuds et du tag&lt;br /&gt;
        - API&lt;br /&gt;
        - Bootstrap&lt;br /&gt;
        - Jquery&lt;br /&gt;
        - Python&lt;br /&gt;
&lt;br /&gt;
    3) Interface utilisateur:&lt;br /&gt;
       Affiche courbes, visualisation 3D, boutons ou données des fichiers envoyées par le serveur de localisation&lt;br /&gt;
        - HTML5 / Javascript&lt;br /&gt;
        - Fichiers JSON (serveurs de collecte et de localisation)&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Calendrier prévisionnel'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Liste des tâches à effectuer&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
# Se documenter sur le projet&lt;br /&gt;
##Langages et technologies utilisées&lt;br /&gt;
##Matériel utilisé&lt;br /&gt;
##Mettre en place du travail sur le Git&lt;br /&gt;
# Réaliser le serveur de collecte&lt;br /&gt;
##Récupérer les trames envoyées par bluetooth par le TAG via la Raspberry Pi&lt;br /&gt;
##Intégrer le serveur de localisation pour interpréter les trames&lt;br /&gt;
##Tester et optimiser&lt;br /&gt;
# Réaliser l'interface Web utilisateur&lt;br /&gt;
##Implémenter le serveur de collecte et de localisation&lt;br /&gt;
##Afficher et traiter les données stockées dans les fichiers JSON via le serveur (temps différé + temps réel)&lt;br /&gt;
##Tester et optimiser&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;Replanification du cahier des charges / calendrier&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Feuille d'heures'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Tâche !! Prélude !! Heures S1 !! Heures S2 !! Heures S3 !! Heures S4 !! Heures S5 !! Heures S6 !! Heures S7 !! Heures S8 !! Heures S9 !! Heures S10 !! Heures S11 !! Heures S12 !! Après Noël !! Total&lt;br /&gt;
|-&lt;br /&gt;
| Cahier des charges / Wiki / Gitlab&lt;br /&gt;
|  4h&lt;br /&gt;
|  3h&lt;br /&gt;
|  1h&lt;br /&gt;
|  x&lt;br /&gt;
|  1h30&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h30&lt;br /&gt;
|  1h&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Documentation sur les technos utilisées&lt;br /&gt;
|  2h&lt;br /&gt;
|  4h&lt;br /&gt;
|  3h&lt;br /&gt;
|  2h&lt;br /&gt;
|  3h&lt;br /&gt;
|  4h&lt;br /&gt;
|  5h&lt;br /&gt;
|  5h30&lt;br /&gt;
|  4h30&lt;br /&gt;
|  3h30&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Documentation sur le matériel&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Recherche et développement du serveur de collecte&lt;br /&gt;
|  x&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  3h&lt;br /&gt;
|  3h30&lt;br /&gt;
|  4h&lt;br /&gt;
|  5h&lt;br /&gt;
|  7h&lt;br /&gt;
|  4h30&lt;br /&gt;
|  0,5h&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| Recherche et développement de l'interface Web&lt;br /&gt;
|  x&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  3h&lt;br /&gt;
|  5h&lt;br /&gt;
|  6h&lt;br /&gt;
|  4h&lt;br /&gt;
|  7h&lt;br /&gt;
|  5h30&lt;br /&gt;
|  2h30&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| Recherche et intégration du serveur de localisation&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x &lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| Intégration des différentes parties&lt;br /&gt;
|  x&lt;br /&gt;
|  x  &lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  2h&lt;br /&gt;
|  2h&lt;br /&gt;
|  2h&lt;br /&gt;
|  3h&lt;br /&gt;
|  1h30&lt;br /&gt;
|  x&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| Tests et débuggage&lt;br /&gt;
|  x&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  1h&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  3h&lt;br /&gt;
|  4h&lt;br /&gt;
|  0,5h&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Optimisation/Correction des programmes&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Avancement du Projet'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Phase préparatoire'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Jeu 21/09/17 - Ven 22/09/17]]'' &lt;br /&gt;
*Rendez-vous de mise au point du cahier des charges avec les encadrants/intervenants (M. ZHENG Gang et M. DAGHER Roudy)&lt;br /&gt;
*Elaboration du cahier des charges&lt;br /&gt;
*Elaboration de la page Wiki (préparation de la mise en page et présentation du sujet)&lt;br /&gt;
*Préparation du travail sous forme de Mind Map&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous nous sommes tout d’abord rendus au laboratoire de l'INRIA afin de pouvoir définir le plus précisément possible le cahier des charges avec nos tuteurs.&lt;br /&gt;
Nous avons donc défini avec eux les technologies qu'il faudrait étudier. Vous retrouverez le choix des technologies dans la partie '''choix technologiques'''&lt;br /&gt;
&lt;br /&gt;
Nous avons en même temps créé notre page Wiki, et structuré celui-ci avec les parties qui nous seraient utiles pour développer nos explications par la suite.&lt;br /&gt;
&lt;br /&gt;
Nous avons de plus découpé le travail en sous-parties que nous avions mis dans un '''Mind map''' afin d'y voir plus clair sur la ligne à suivre.&lt;br /&gt;
&lt;br /&gt;
Vous trouverez ce Mind map juste ci-dessous. Nous ne mettrons pas à jour ce Mind map chaque semaine mais il est fort probable que nous en referions un en milieu de projet pour pouvoir cibler les objectifs réussis et ceux à atteindre. Nous pourrons de plus redéfinir certains objectifs qui nous aurait semblé trop vague au début du projet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Projet de fin d'étude.png|centre|600px]]&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 1'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Jeu 28/09/17 - Ven 29/09/17]]'' &lt;br /&gt;
*Revue du Cahier des Charges avec les encadrants&lt;br /&gt;
*Lecture et recherches sur les technologies adaptées&lt;br /&gt;
*Construction de la suite de la Mind Map&lt;br /&gt;
*Création du Gitlab&lt;br /&gt;
&lt;br /&gt;
Nous commençons les recherches sur le projet et sur les premières technologies engagées dans celui-ci. Nous en profitons pour formuler des à présent des questions sur le bon choix de celles-ci. Nous commençons donc des tests ayant seulement pour but de nous familiariser avec l'environnement de travail et de réellement comprendre les fonctions déjà présentes qu'il faudra exploiter et implanter notre interface web.&lt;br /&gt;
Nous créons un gitlab avec notre tuteur et commençons a définir les taches premières sur celui-ci.&lt;br /&gt;
Nous en profitons pour affiner le Mind Map.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 2'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Jeu 05/10/17 - Ven 06/10/17]]''  &lt;br /&gt;
*Précisions sur le cahier des charges&lt;br /&gt;
*Listage du matériel&lt;br /&gt;
*Recherche et détermination de solutions technologiques possibles pour les fonctions demandées&lt;br /&gt;
*Début du travail sur le serveur de collecte&lt;br /&gt;
*Apprentissage du langage Python et de l'utilisation du framework Flask&lt;br /&gt;
&lt;br /&gt;
Nous avons finalisé les précisions sur le cahier des charges. Nous avons donc pu cibler le matériel dont nous nous servirons pour ce Projet. Vous trouverez donc cette liste la section correspondante. Il est évident que le matériel utilisé est dans l'ensemble déjà fourni par le laboratoire et qu'il nous reste dans l'ensemble à créer l'interface web et les API qui nous permettrons de faire communiquer cette interface avec la Raspberrypi et le serveur de position déjà créé.&lt;br /&gt;
Nous avons donc pu commencer a ce former sur les technologies qui nous serviraient par la suite. Nous avaons donc utilisé le cours d'openclassroom sur les serveur flask pour en apprendre les bases. Ce serveur flask est programmé en python et nous permets donc une grande liberté au niveau de l’exécutions de certains scripts. En effet les script de connexion bluetooth et de redirection de port qui nous permette de recuperer les données de distance sont eux meme codé en python et sont directement appelé via le serveur.&lt;br /&gt;
Dans ce serveur, représentant notre interface web, vous retrouverez la page '''/collecte''' qui représentera notre partie collecte de données ainsi que l'affichage de ces distances. Nous appellerons cette partie le serveur de collecte.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 3'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 11/10/17 - Jeu 12/10/17]]''  &lt;br /&gt;
*Recherche et développement initial du serveur de collecte de données&lt;br /&gt;
*Complément du Git sur les tâches à effectuer&lt;br /&gt;
&lt;br /&gt;
Nous avons commencé à créer un serveur flask renvoyant pour l'instant une matrice aléatoire. Lors de la requête URL &amp;quot;../matrice&amp;quot;, nous voyons bien une matrice aléatoire apparaître sur la page Web. Nous essayons de nous connecter à la Raspberry Pi en redirigeant son port série vers le Bluetooth de façon à récupérer de vraies matrices de distance entre le drone (ie commutateur central) et les balises. Nous pourrons afficher ensuite ces matrices, ou alors les stocker dans un fichier en attendant le traitement de celles-ci.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Requete s3.PNG|300px|serveur flask]]&lt;br /&gt;
&lt;br /&gt;
Nous avons plusieurs problèmes avec le Bluetooth pour se connecter avec la Raspberry Pi. Quand nous aurons réussi à nous connecter au port série de la Raspberry pi alors nous pour gérer le traitement des données récupérées.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 4'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 18/10/17 - Jeu 19/10/17]]''  &lt;br /&gt;
*Configuration de la Raspberry Pi car problèmes de connectivité Bluetooth rencontrés&lt;br /&gt;
**Nous arrivons à connecter la Raspberry Pi sous Windows mais la connexion sous Linux pose problème (travail en suspens en attendant la disponibilité de l'encadrant)&lt;br /&gt;
*Début du développement de l'interface Web&lt;br /&gt;
**Traitement d'une matrice dans un fichier JSON&lt;br /&gt;
**Affichage sous forme de tableau de la matrice&lt;br /&gt;
**Utilisation du serveur de requête en Python avec chargement de template HTML&lt;br /&gt;
**Mise en forme de la trame de la page en HTML/CSS avec le framework Bootstrap&lt;br /&gt;
**Ajout d'un set de distances (d1, d2, d3, d4) dans la matrice lors d'un appui sur un bouton Chargement en utilisant un fichier Javascript&lt;br /&gt;
&lt;br /&gt;
Nous Avons reçus des fonctions pythons de notre tuteurs afin d'obtenir une connexion bluetooth entre notre raspberrypi et notre ordinateur ainsi qu'une redirection de port de celle ci vers la connexion. Nous n'arrivons pas à utiliser ces fonctions sous linux et nous necessitons une explication de notre tuteur n'etant pas disponible a ce moment. Pour ne pas perdre de temps nous nous attaquons la creation de l'interface web a proprement parler. c'est a dire la création des pages html ainsi que le document javascript qui nous servira de bibliotheque de fonctions.chaque route de notre serveur sont relié a une series de fonctions python s'executant a l'apelle des url puis suivis d'un template de la page HTML en question. Nous en profitons de plus pour explorer le framework CSS bootstrap afin de mettre un premier design et une structure a notre page collecte qui sera la page principale de notre site pour ce début de projet.&lt;br /&gt;
&lt;br /&gt;
Nous nous essayons de plus à différents tests sur des fichiers de format '''Json''' que nous devrons réussir à traiter correctement plus tard dans notre projet.&lt;br /&gt;
Nous récupérons une matrice que nous créons nous même en python (simulation d'une série de distances récupérée) que nous transformons au format Json pour ensuite l'afficher sur notre page web. Pour pouvoir proprement afficher se fichier '''Json''' renvoyé vers notre page, nous nous servons du fichier javascript afin de créer du code html contenant la matrice.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 5'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 25/10/17 - Ven 27/10/17]]''  &lt;br /&gt;
*Résolution des problèmes de connectique Bluetooth sur la Raspberry Pi&lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Traitement d'une matrice dans un fichier JSON&lt;br /&gt;
**Début de l'ajout d'un set de distances depuis une matrice contenue dans un fichier JSON&lt;br /&gt;
&lt;br /&gt;
Nous avons pu nous entretenir avec notre tuteur et donc comprendre les fonctions de connexion et de redirection de port. Nous pouvons donc continuer le développement de notre interface web. Nous arrivons à traiter un set de donné au format json et à l'afficher dans le code html. Toutefois nous créons nous mème ce set, il est maintenant nécessaire que nous arrivions à récupérer les set de distance réels reçus par la connexions bluetooth. Nous commencerons par un traitement asynchrone. L'idée est d’enregistrer les sets de distances dans un fichier '''Json''' stocké dans un dossier. Nous appellerons ce dossier plus tard via une requête ajax.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 6'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 08/11/17 - Ven 10/11/17]]''  &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
**Mise en place de la communication entre le port série de notre machine et le port série de la carte via Bluetooth de la RPi3&lt;br /&gt;
**Récupération et traitement (parse) manuels des données de distances dans un fichier .log via TCP/IP&amp;lt;-&amp;gt;Bluetooth&lt;br /&gt;
**Début de l'automatisation du procédé par script Python (requete.py) et mise en place de sockets de communication&lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Chargement sur commande d'un set de distances depuis une matrice contenue dans un fichier JSON&lt;br /&gt;
*Travail sur le layout du site&lt;br /&gt;
&lt;br /&gt;
Après avoir regardé le code de ces différentes fonctions nous avons pu faire des test manuels via le shell pour récupérer des données de distances et les stocker dans un fichier '''Json''' sur notre ordinateur.&lt;br /&gt;
&lt;br /&gt;
Nous utilisons les commandes suivante pour se connecter via bluetooth:&lt;br /&gt;
&lt;br /&gt;
 rfcomm connect /dev/rfcomm0 B8:27:EB:80:DC:89 1&lt;br /&gt;
&lt;br /&gt;
Rediriger le port de la raspberrypi3 vers la connexion:&lt;br /&gt;
&lt;br /&gt;
 python lps-collector/tcp_serial_redirect.py /dev/rfcomm0 9600&lt;br /&gt;
&lt;br /&gt;
Collecter les données dans un fichier dont nous définissons le nom:&lt;br /&gt;
&lt;br /&gt;
 echo &amp;quot;cu -s9600 -lttyACM0&amp;quot;| nc localhost 7777&lt;br /&gt;
 nc localhost 7777 | grep distance &amp;gt; static/log/dist-capture'+date+'.log&lt;br /&gt;
&lt;br /&gt;
Nous pouvons '''parser''' le flux de donner avant de le stocker dans le fichier via cette commande:&lt;br /&gt;
&lt;br /&gt;
 python lps-collector/lps_parse.py static/log/dist-capture&amp;quot;+date+&amp;quot;.log&lt;br /&gt;
&lt;br /&gt;
Il est donc nécessaire d'inclure via des '''thread''' ces différente fonctions dans notre serveur python (Flask) afin d'automatiser le processus. Le but est de pouvoir choisir sur l'interface web quels fonctions il faut exécuter et les déclencher via l'appuie sur des boutons.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 7'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 15/11/17 - Ven 17/11/17]]''  &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
**Récupération et traitement (parse) manuels des données de distances dans un fichier .log via TCP/IP&amp;lt;-&amp;gt;Bluetooth&lt;br /&gt;
**Automatisation du procédé par script Python (requete.py)&lt;br /&gt;
***Mise en place de sockets de communication pour le contrôle de la collecte -&amp;gt; abandonné (servait à commander la collecte manuellement)&lt;br /&gt;
***Développement d'un script engine.py regroupant les commandes exécutables par l'utilisateur via la page Web&lt;br /&gt;
***Début du travail sur la fonction &amp;quot;STOP&amp;quot; manuel d'une action de collecte de données (liaison entre script html, javascript, et script python)&lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Chargement sur commande d'un set de distances depuis une matrice contenue dans un fichier JSON&lt;br /&gt;
**Travail sur le layout du site&lt;br /&gt;
***Ajout des différentes commandes (connexion bluetooth, lancement commande cu, collecte des données, collecte durée donnée)&lt;br /&gt;
***Début de l'implémentation de la visualisation des fichiers .json obtenus après collecte et affichage dans un tableau matriciel du fichier sélectionné&lt;br /&gt;
&lt;br /&gt;
Nous avons continuez a travaillez sur le serveur de collecte: Les données que nous savons récupérer via bluetooth sont stockée dans un fichier .log. Apres avoir bien compris comment marchait la fonction '''parse''' manuellement( lors de son utilisation dans le shell, nous l'avons implanter dans notre serveur de collecte qui lance cette commande lors de l’appuie sur un bouton via notre interface virtuelle. Un problème rencontré était de savoir quand la récolte des données devait s’arrêté. nous avons donc rajouté un temps à entré nous même sur l'interface. La fonction '''parse''' est effectué commence et le sous processus va attendre le temps donné avant de lancer une commande permettant de tuer le processus et mettant donc fin au remplissage du fichier '''.log'''. Nous voulons de plus réussir à lancer une fonction de collecte sans temps. c'est à dire que nous coupons la collecte via un bouton par nous même. nous voulions utiliser des Sockets pour pouvoir définir nous même la gestions de la communication mais l'idée a été abandonné car nous avons réussi a sauvegarder le PID du processus lancé. Il nous suffit donc de l’arrêter grâce à un autre bouton qui récupère cette variable et l’arrête ensuite. &lt;br /&gt;
&lt;br /&gt;
Toutes nos fonctions pythons étant regroupées dans notre serveur '''requete.py''' nous avons décidé de créé un module qui regroupera toutes ces fonction que nous pourrons utilisé dans '''requete.py'''. ceci nous permet de voir plus claire dans notre code et de faciliter le travail lorsque nous modifions le code tous les deux.&lt;br /&gt;
&lt;br /&gt;
Nous essayons en continues d'adapter le layout du site pour le rendre le plus attractif et simple possible. de facon a ce que chaque bouton et tableau soient claires et compréhensibles.&lt;br /&gt;
&lt;br /&gt;
Nous avons commencé à récupéré les fichier '''json''' créé à partir des fichier '''log'''. c'est a dire que ces fichiers sont automatiquement stockés coté serveur dans un dossier nommé '''static/log'''. Notre but est de récupérer le nom des fichier json et de les afficher dans un composant sur notre interface web. il nous sera donc possible ensuite de sélectionner le nom d'un fichier. lors de la sélection de ce nom de fichier, un tableau apparaît avec les valeurs de distances à l’intérieur.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 8'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 22/11/17 - Ven 24/11/17]]''  &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
**Automatisation du procédé de collecte par script Python (requete.py qui fait appel à engine.py)&lt;br /&gt;
***Développement d'un script engine.py regroupant les commandes exécutables par l'utilisateur via la page Web&lt;br /&gt;
***Travail sur la fonction &amp;quot;STOP&amp;quot; manuel d'une action de collecte de données (liaison entre script html, javascript, et script python)&lt;br /&gt;
***Mise en place d'un serveur HTTP Simple sous Python pour accéder aux fichiers de données à partir de la page Web&lt;br /&gt;
***Mise à jour de fonctions de connexion &lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Travail sur le layout du site (ajout de pages, navigation entre les pages, apparence, nettoyage des codes)&lt;br /&gt;
**Bon fonctionnement de l'ensemble serveur collecte + serveur HTTP + client Web&lt;br /&gt;
**Affichage de la liste des fichiers de données de distance (log, csv, json) via serveur HTTP en Python sur port 9999&lt;br /&gt;
*Corrections et nettoyage du dépôt GIT&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous continuons a développer les points énoncé la semaine dernière. Nous avons décidé de nous dirigé vers un serveur HTTP Simple pour accéder à nos fichiers. il s’avère que nous finirons par ne pas utiliser ce serveur. Nous irons récupérer les fichiers en question via des requêtes '''ajax''' faites à la sélection du nom du fichier.&lt;br /&gt;
&lt;br /&gt;
Nous rencontrons depuis le début des problèmes avec les fonctions de connexion qui peuvent ne pas marcher a un moment donner. Nous essayons de trouver pourquoi ce bug est un bug qui ne se produit pas à chaque fois. Nous avons déterminé qu'il ne se produisait seulement lorsque les fonctions de connexions étaient lancée dans des threads. Nous ne savons toujours pas pourquoi ces thread bug seulement parfois et non à chaque essaie de connexion.&lt;br /&gt;
&lt;br /&gt;
Nous avons nettoyé notre dépot '''Git''' car il s’avère que nous utilisions une mauvais méthode de fusion et de stockage des documents.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 9'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 29/11/17 - Jeudi 30/11/17]]''  &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
**Automatisation du procédé de collecte par script Python (requete.py qui fait appel à engine.py)&lt;br /&gt;
***Travail sur la fonction &amp;quot;STOP&amp;quot; manuel d'une action de collecte de données (liaison entre script html, javascript, et script python)&lt;br /&gt;
***Recherches sur l'utilisation de fichiers json accessibles via le serveur HTTP&lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Travail sur le layout du site &lt;br /&gt;
**Travail sur la liaison entre fichiers json et affichage Web des données de distance&lt;br /&gt;
***Recherches et tests de solutions&lt;br /&gt;
****Affichage depuis un fichier&lt;br /&gt;
****Affichage à la volée lors d'une action de collecte&lt;br /&gt;
&lt;br /&gt;
*Revue de code avec Roudy DAGHER:&lt;br /&gt;
**Structure globale des codes ok&lt;br /&gt;
**Fonctionnement presque ok: fonctionnalités implémentées ok, mais parsage csv ne marche pas&lt;br /&gt;
**Refactoring nécessaire&lt;br /&gt;
**Correction de la fonction STOP et amélioration de la fonction de COLLECTE&lt;br /&gt;
**Faire plus de requêtes Javascript que de requêtes HTML&lt;br /&gt;
**Discussion pour l'implémentation du serveur de localisation (= algorithme de localisation) et des visualisations de données sur le site Web&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous avons d'abord revue l'ensemble de notre code et les méthode utilisé avec notre tuteur '''Roudy Dagher'''. Nous nous approchons d'un serveur de collecte de donné stable et fonctionnel. Nous avons refait les différentes connexions entre l'interface et le serveur afin de ne faire que des requêtes sur des '''WebServices'''. Il nous ai possible de commencer la deuxième partie qui est l'envoie de ces tableaux de données afin de les envoyer vers le serveur de localisation via des API afin de recevoir des matrice de positions.&lt;br /&gt;
Nous pourrons grâce a ces matrices afficher une carte 3d des balises  et du TAG dans l'espace.&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Observations'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Problèmes rencontrés'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Solutions apportées'''&amp;lt;/span&amp;gt;===&lt;/div&gt;</summary>
		<author><name>Hdelatte</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=P18_Localisation_of_quadrotors&amp;diff=47016</id>
		<title>P18 Localisation of quadrotors</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=P18_Localisation_of_quadrotors&amp;diff=47016"/>
				<updated>2017-12-19T14:16:38Z</updated>
		
		<summary type="html">&lt;p&gt;Hdelatte : /* Semaine 6 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Cahier des charges'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;Présentation générale du projet&amp;lt;/span&amp;gt;=== &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Contexte&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
Dans un monde de plus en plus connecté, de nombreux drones sont déployés pour diverses applications comme l'espionnage, la surveillance, la cartographie de lieux et la livraison de colis. Les technologies nécessaires pour contrôler ces drones sont des sujets de recherche actuels. &lt;br /&gt;
&lt;br /&gt;
Le contrôle de ceux-ci passe tout d'abord par la maîtrise de leur position dans l'espace. Le développement des applications liées à l'utilisation de drones nécessite un travail important sur la localisation spatiale d'objets connectés. &lt;br /&gt;
&lt;br /&gt;
De plus, dans un souci d'utilisation, il est essentiel de développer des interfaces logicielles permettant d'exploiter ces données.&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Objectif du projet&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
L'objectif de ce projet est de développer une interface logicielle permettant de traiter en temps réel les informations de localisation d'un drone et de balises, dans le but de définir leur localisation dans l'espace, en intérieur.&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Description du projet&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
Pour réaliser le contrôle de drones, la première étape importante est de donner ses informations de position. Le but du projet est de développer une interface logicielle permettant de localiser le drone en temps réel en intérieur. Le drone se déplace dans un environnement dans lequel ont été installées de multiples balises. Il est équipé d'une carte, lui permettant de recevoir les distances relatives entre lui-même et les balises, sur laquelle différents algorithmes vont être implémentés pour effectuer la localisation en temps réel. Le projet requiert des compétences en développement hardware (Crazyflie 2.0, voir https://wiki.bitcraze.io/) et software (langage C/C++/Python/Javascript/HTML...).&lt;br /&gt;
&lt;br /&gt;
Il se divise en 4 étapes principales, qui sont:&lt;br /&gt;
*1) Choisir les technologies utilisées&lt;br /&gt;
*2) Choisir l'architecture (OS / APIs)&lt;br /&gt;
*3) Développer les différentes parties du projet&lt;br /&gt;
*4) Intégrer et connecter les différentes parties du projet&lt;br /&gt;
&lt;br /&gt;
La localisation étant en intérieur, le protocole GPS n'est donc pas assez précis pour les applications ciblées. La mise en place d'un tel dispositif permettrait grâce à l'utilisation d'un algorithme d'estimer avec une bonne précision les positions en intérieur d'une balise centrale (appelée Tag) et de balises (appelées Anchor). Le Tag scanne en temps réel la distance relative aux différentes balises, et il nous est retourné la position des balises et du Tag grâce à l'algorithme de localisation.&lt;br /&gt;
&lt;br /&gt;
Le projet se compose de 3 parties:&lt;br /&gt;
* Collect &amp;amp; parse: collecter les données envoyées par les balises en communiquant avec un serveur et récupérer les données adéquates par un tri&lt;br /&gt;
* Localise: déterminer la matrice de position des balises et du Tag en traitant les données récupérées&lt;br /&gt;
* Display: développer l'interface homme machine pour afficher, étudier et utiliser les données traitées&lt;br /&gt;
&lt;br /&gt;
Nous travaillerons dans un premier temps dans une optique temps différé avant de travailler en temps réel. Cela nous permettra d'acquérir des données utiles et réutilisables en aval. &lt;br /&gt;
&lt;br /&gt;
A l'aboutissement du projet, nous devrions être capable via l'interface homme machine développée d'afficher précisément la position spatiale des balises ainsi que du Tag, grâce àl'utilisation d'un algorithme de localisation et des données récupérées, et d'afficher d'autres données relatives au déplacement du Tag ou des balises dans l'espace. &lt;br /&gt;
&lt;br /&gt;
Si le temps le permet, nous pourrons aussi être amenés à adapter et utiliser l'interface développée pour l'utilisation d'un drone.&lt;br /&gt;
&lt;br /&gt;
''Sujet originel''&lt;br /&gt;
&lt;br /&gt;
To achieve the control of quadrotors, the first important task to give its position information. This project is to develop a software(GUI) to localize the quadrotors in real-time. The quadrotor is flying in an environment where several transmitters have been installed. The quadrotor is equipped with a deck to receive the relative distances between the deck and all transmitters, based on which different algorithms will be implemented to realize the real-time localization. The candidates need to have both experiences on hardware (Crazyflie 2.0, see https://wiki.bitcraze.io/) and software development (C/C , Python…). &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Calendrier&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
''[[Avant le 29/09/17]]'' - Élaboration du Cahier des charges, de la liste des tâches et du calendrier prévisionnel&lt;br /&gt;
&lt;br /&gt;
''[[Avant fin Octobre]]'' - Serveur de collecte et début du développement de l'interface logicielle&lt;br /&gt;
&lt;br /&gt;
''[[Avant fin Décembre]]'' - Interface logicielle&lt;br /&gt;
&lt;br /&gt;
''[[A la fin du PFE]]'' - Intégration finale des différentes parties (Serveur de collecte des données &amp;amp; Serveur de localisation &amp;amp; Interface logicielle)&lt;br /&gt;
&lt;br /&gt;
Répartition du volume de travail (***h):&lt;br /&gt;
&lt;br /&gt;
* Recherche sur les technologies à utiliser (**h)&lt;br /&gt;
* Développement du serveur de collecte de données (**h)&lt;br /&gt;
* Réalisation de l'interface logicielle (Web//Logiciel/Application) (**h)&lt;br /&gt;
* Intégration des différentes parties (**h)&lt;br /&gt;
* Test et débuggage (**h)&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Choix techniques : matériel et logiciel&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
Afin de développer ce dispositif, nous allons utiliser une Raspberry Pi 3 associée à une carte réceptrice, qui communique avec 4 balises composées chacune d'un microcontrôleur et d'une carte émettrice radio (UWB5C) et alimentées par batteries. La carte réceptrice joue le rôle du drone à localiser et communiquera les données émises par les balises vers l'ordinateur via Bluetooth.&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Choix technologiques&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
Voici les technologies que nous utilisons pour chacune des parties de ce projet.&lt;br /&gt;
&lt;br /&gt;
    1) Serveur de collecte des données:&lt;br /&gt;
       Scanne et parse les données récupérées pour fournir la matrice D des distances relatives du tag aux 4 balises&lt;br /&gt;
        - API&lt;br /&gt;
        - Python / Serveur Flask&lt;br /&gt;
&lt;br /&gt;
    2) Serveur de localisation (fourni):&lt;br /&gt;
       Calcule grâce à l'algorithme de localisation et la matrice D les positions spatiales des 4 noeuds et du tag&lt;br /&gt;
        - API&lt;br /&gt;
        - Bootstrap&lt;br /&gt;
        - Jquery&lt;br /&gt;
        - Python&lt;br /&gt;
&lt;br /&gt;
    3) Interface utilisateur:&lt;br /&gt;
       Affiche courbes, visualisation 3D, boutons ou données des fichiers envoyées par le serveur de localisation&lt;br /&gt;
        - HTML5 / Javascript&lt;br /&gt;
        - Fichiers JSON (serveurs de collecte et de localisation)&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Calendrier prévisionnel'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Liste des tâches à effectuer&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
# Se documenter sur le projet&lt;br /&gt;
##Langages et technologies utilisées&lt;br /&gt;
##Matériel utilisé&lt;br /&gt;
##Mettre en place du travail sur le Git&lt;br /&gt;
# Réaliser le serveur de collecte&lt;br /&gt;
##Récupérer les trames envoyées par bluetooth par le TAG via la Raspberry Pi&lt;br /&gt;
##Intégrer le serveur de localisation pour interpréter les trames&lt;br /&gt;
##Tester et optimiser&lt;br /&gt;
# Réaliser l'interface Web utilisateur&lt;br /&gt;
##Implémenter le serveur de collecte et de localisation&lt;br /&gt;
##Afficher et traiter les données stockées dans les fichiers JSON via le serveur (temps différé + temps réel)&lt;br /&gt;
##Tester et optimiser&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;Replanification du cahier des charges / calendrier&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Feuille d'heures'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Tâche !! Prélude !! Heures S1 !! Heures S2 !! Heures S3 !! Heures S4 !! Heures S5 !! Heures S6 !! Heures S7 !! Heures S8 !! Heures S9 !! Heures S10 !! Heures S11 !! Heures S12 !! Après Noël !! Total&lt;br /&gt;
|-&lt;br /&gt;
| Cahier des charges / Wiki / Gitlab&lt;br /&gt;
|  4h&lt;br /&gt;
|  3h&lt;br /&gt;
|  1h&lt;br /&gt;
|  x&lt;br /&gt;
|  1h30&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h30&lt;br /&gt;
|  1h&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Documentation sur les technos utilisées&lt;br /&gt;
|  2h&lt;br /&gt;
|  4h&lt;br /&gt;
|  3h&lt;br /&gt;
|  2h&lt;br /&gt;
|  3h&lt;br /&gt;
|  4h&lt;br /&gt;
|  5h&lt;br /&gt;
|  5h30&lt;br /&gt;
|  4h30&lt;br /&gt;
|  3h30&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Documentation sur le matériel&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Recherche et développement du serveur de collecte&lt;br /&gt;
|  x&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  3h&lt;br /&gt;
|  3h30&lt;br /&gt;
|  4h&lt;br /&gt;
|  5h&lt;br /&gt;
|  7h&lt;br /&gt;
|  4h30&lt;br /&gt;
|  0,5h&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| Recherche et développement de l'interface Web&lt;br /&gt;
|  x&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  3h&lt;br /&gt;
|  5h&lt;br /&gt;
|  6h&lt;br /&gt;
|  4h&lt;br /&gt;
|  7h&lt;br /&gt;
|  5h30&lt;br /&gt;
|  2h30&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| Recherche et intégration du serveur de localisation&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x &lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| Intégration des différentes parties&lt;br /&gt;
|  x&lt;br /&gt;
|  x  &lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  2h&lt;br /&gt;
|  2h&lt;br /&gt;
|  2h&lt;br /&gt;
|  3h&lt;br /&gt;
|  1h30&lt;br /&gt;
|  x&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| Tests et débuggage&lt;br /&gt;
|  x&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  1h&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  3h&lt;br /&gt;
|  4h&lt;br /&gt;
|  0,5h&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Optimisation/Correction des programmes&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Avancement du Projet'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Phase préparatoire'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Jeu 21/09/17 - Ven 22/09/17]]'' &lt;br /&gt;
*Rendez-vous de mise au point du cahier des charges avec les encadrants/intervenants (M. ZHENG Gang et M. DAGHER Roudy)&lt;br /&gt;
*Elaboration du cahier des charges&lt;br /&gt;
*Elaboration de la page Wiki (préparation de la mise en page et présentation du sujet)&lt;br /&gt;
*Préparation du travail sous forme de Mind Map&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous nous sommes tout d’abord rendus au laboratoire de l'INRIA afin de pouvoir définir le plus précisément possible le cahier des charges avec nos tuteurs.&lt;br /&gt;
Nous avons donc défini avec eux les technologies qu'il faudrait étudier. Vous retrouverez le choix des technologies dans la partie '''choix technologiques'''&lt;br /&gt;
&lt;br /&gt;
Nous avons en même temps créé notre page Wiki, et structuré celui-ci avec les parties qui nous seraient utiles pour développer nos explications par la suite.&lt;br /&gt;
&lt;br /&gt;
Nous avons de plus découpé le travail en sous-parties que nous avions mis dans un '''Mind map''' afin d'y voir plus clair sur la ligne à suivre.&lt;br /&gt;
&lt;br /&gt;
Vous trouverez ce Mind map juste ci-dessous. Nous ne mettrons pas à jour ce Mind map chaque semaine mais il est fort probable que nous en referions un en milieu de projet pour pouvoir cibler les objectifs réussis et ceux à atteindre. Nous pourrons de plus redéfinir certains objectifs qui nous aurait semblé trop vague au début du projet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Projet de fin d'étude.png|centre|600px]]&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 1'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Jeu 28/09/17 - Ven 29/09/17]]'' &lt;br /&gt;
*Revue du Cahier des Charges avec les encadrants&lt;br /&gt;
*Lecture et recherches sur les technologies adaptées&lt;br /&gt;
*Construction de la suite de la Mind Map&lt;br /&gt;
*Création du Gitlab&lt;br /&gt;
&lt;br /&gt;
Nous commençons les recherches sur le projet et sur les premières technologies engagées dans celui-ci. Nous en profitons pour formuler des à présent des questions sur le bon choix de celles-ci. Nous commençons donc des tests ayant seulement pour but de nous familiariser avec l'environnement de travail et de réellement comprendre les fonctions déjà présentes qu'il faudra exploiter et implanter notre interface web.&lt;br /&gt;
Nous créons un gitlab avec notre tuteur et commençons a définir les taches premières sur celui-ci.&lt;br /&gt;
Nous en profitons pour affiner le Mind Map.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 2'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Jeu 05/10/17 - Ven 06/10/17]]''  &lt;br /&gt;
*Précisions sur le cahier des charges&lt;br /&gt;
*Listage du matériel&lt;br /&gt;
*Recherche et détermination de solutions technologiques possibles pour les fonctions demandées&lt;br /&gt;
*Début du travail sur le serveur de collecte&lt;br /&gt;
*Apprentissage du langage Python et de l'utilisation du framework Flask&lt;br /&gt;
&lt;br /&gt;
Nous avons finalisé les précisions sur le cahier des charges. Nous avons donc pu cibler le matériel dont nous nous servirons pour ce Projet. Vous trouverez donc cette liste la section correspondante. Il est évident que le matériel utilisé est dans l'ensemble déjà fourni par le laboratoire et qu'il nous reste dans l'ensemble à créer l'interface web et les API qui nous permettrons de faire communiquer cette interface avec la Raspberrypi et le serveur de position déjà créé.&lt;br /&gt;
Nous avons donc pu commencer a ce former sur les technologies qui nous serviraient par la suite. Nous avaons donc utilisé le cours d'openclassroom sur les serveur flask pour en apprendre les bases. Ce serveur flask est programmé en python et nous permets donc une grande liberté au niveau de l’exécutions de certains scripts. En effet les script de connexion bluetooth et de redirection de port qui nous permette de recuperer les données de distance sont eux meme codé en python et sont directement appelé via le serveur.&lt;br /&gt;
Dans ce serveur, représentant notre interface web, vous retrouverez la page '''/collecte''' qui représentera notre partie collecte de données ainsi que l'affichage de ces distances. Nous appellerons cette partie le serveur de collecte.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 3'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 11/10/17 - Jeu 12/10/17]]''  &lt;br /&gt;
*Recherche et développement initial du serveur de collecte de données&lt;br /&gt;
*Complément du Git sur les tâches à effectuer&lt;br /&gt;
&lt;br /&gt;
Nous avons commencé à créer un serveur flask renvoyant pour l'instant une matrice aléatoire. Lors de la requête URL &amp;quot;../matrice&amp;quot;, nous voyons bien une matrice aléatoire apparaître sur la page Web. Nous essayons de nous connecter à la Raspberry Pi en redirigeant son port série vers le Bluetooth de façon à récupérer de vraies matrices de distance entre le drone (ie commutateur central) et les balises. Nous pourrons afficher ensuite ces matrices, ou alors les stocker dans un fichier en attendant le traitement de celles-ci.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Requete s3.PNG|300px|serveur flask]]&lt;br /&gt;
&lt;br /&gt;
Nous avons plusieurs problèmes avec le Bluetooth pour se connecter avec la Raspberry Pi. Quand nous aurons réussi à nous connecter au port série de la Raspberry pi alors nous pour gérer le traitement des données récupérées.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 4'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 18/10/17 - Jeu 19/10/17]]''  &lt;br /&gt;
*Configuration de la Raspberry Pi car problèmes de connectivité Bluetooth rencontrés&lt;br /&gt;
**Nous arrivons à connecter la Raspberry Pi sous Windows mais la connexion sous Linux pose problème (travail en suspens en attendant la disponibilité de l'encadrant)&lt;br /&gt;
*Début du développement de l'interface Web&lt;br /&gt;
**Traitement d'une matrice dans un fichier JSON&lt;br /&gt;
**Affichage sous forme de tableau de la matrice&lt;br /&gt;
**Utilisation du serveur de requête en Python avec chargement de template HTML&lt;br /&gt;
**Mise en forme de la trame de la page en HTML/CSS avec le framework Bootstrap&lt;br /&gt;
**Ajout d'un set de distances (d1, d2, d3, d4) dans la matrice lors d'un appui sur un bouton Chargement en utilisant un fichier Javascript&lt;br /&gt;
&lt;br /&gt;
Nous Avons reçus des fonctions pythons de notre tuteurs afin d'obtenir une connexion bluetooth entre notre raspberrypi et notre ordinateur ainsi qu'une redirection de port de celle ci vers la connexion. Nous n'arrivons pas à utiliser ces fonctions sous linux et nous necessitons une explication de notre tuteur n'etant pas disponible a ce moment. Pour ne pas perdre de temps nous nous attaquons la creation de l'interface web a proprement parler. c'est a dire la création des pages html ainsi que le document javascript qui nous servira de bibliotheque de fonctions.chaque route de notre serveur sont relié a une series de fonctions python s'executant a l'apelle des url puis suivis d'un template de la page HTML en question. Nous en profitons de plus pour explorer le framework CSS bootstrap afin de mettre un premier design et une structure a notre page collecte qui sera la page principale de notre site pour ce début de projet.&lt;br /&gt;
&lt;br /&gt;
Nous nous essayons de plus à différents tests sur des fichiers de format '''Json''' que nous devrons réussir à traiter correctement plus tard dans notre projet.&lt;br /&gt;
Nous récupérons une matrice que nous créons nous même en python (simulation d'une série de distances récupérée) que nous transformons au format Json pour ensuite l'afficher sur notre page web. Pour pouvoir proprement afficher se fichier '''Json''' renvoyé vers notre page, nous nous servons du fichier javascript afin de créer du code html contenant la matrice.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 5'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 25/10/17 - Ven 27/10/17]]''  &lt;br /&gt;
*Résolution des problèmes de connectique Bluetooth sur la Raspberry Pi&lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Traitement d'une matrice dans un fichier JSON&lt;br /&gt;
**Début de l'ajout d'un set de distances depuis une matrice contenue dans un fichier JSON&lt;br /&gt;
&lt;br /&gt;
Nous avons pu nous entretenir avec notre tuteur et donc comprendre les fonctions de connexion et de redirection de port. Nous pouvons donc continuer le développement de notre interface web. Nous arrivons à traiter un set de donné au format json et à l'afficher dans le code html. Toutefois nous créons nous mème ce set, il est maintenant nécessaire que nous arrivions à récupérer les set de distance réels reçus par la connexions bluetooth. Nous commencerons par un traitement asynchrone. L'idée est d’enregistrer les sets de distances dans un fichier '''Json''' stocké dans un dossier. Nous appellerons ce dossier plus tard via une requête ajax.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 6'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 08/11/17 - Ven 10/11/17]]''  &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
**Mise en place de la communication entre le port série de notre machine et le port série de la carte via Bluetooth de la RPi3&lt;br /&gt;
**Récupération et traitement (parse) manuels des données de distances dans un fichier .log via TCP/IP&amp;lt;-&amp;gt;Bluetooth&lt;br /&gt;
**Début de l'automatisation du procédé par script Python (requete.py) et mise en place de sockets de communication&lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Chargement sur commande d'un set de distances depuis une matrice contenue dans un fichier JSON&lt;br /&gt;
*Travail sur le layout du site&lt;br /&gt;
&lt;br /&gt;
Après avoir regardé le code de ces différentes fonctions nous avons pu faire des test manuels via le shell pour récupérer des données de distances et les stocker dans un fichier '''Json''' sur notre ordinateur.&lt;br /&gt;
&lt;br /&gt;
Nous utilisons les commandes suivante pour se connecter via bluetooth:&lt;br /&gt;
&lt;br /&gt;
 rfcomm connect /dev/rfcomm0 B8:27:EB:80:DC:89 1&lt;br /&gt;
&lt;br /&gt;
Rediriger le port de la raspberrypi3 vers la connexion:&lt;br /&gt;
&lt;br /&gt;
 python lps-collector/tcp_serial_redirect.py /dev/rfcomm0 9600&lt;br /&gt;
&lt;br /&gt;
Collecter la données dans un fichier dont nous définissons le nom:&lt;br /&gt;
&lt;br /&gt;
 echo &amp;quot;cu -s9600 -lttyACM0&amp;quot;| nc localhost 7777&lt;br /&gt;
 nc localhost 7777 | grep distance &amp;gt; static/log/dist-capture'+date+'.log&lt;br /&gt;
&lt;br /&gt;
Nous pouvons '''parser''' le flux de donner avant de le stocker dans le fichier via cette commande:&lt;br /&gt;
&lt;br /&gt;
 python lps-collector/lps_parse.py static/log/dist-capture&amp;quot;+date+&amp;quot;.log&lt;br /&gt;
&lt;br /&gt;
Il est donc nécessaire d'inclure via des '''thread''' ces différente fonctions dans notre serveur python (Flask) afin d'automatiser le processus. Le but est de pouvoir choisir sur l'interface web quels fonctions il faut exécuter et les déclencher via l'appuie sur des boutons.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 7'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 15/11/17 - Ven 17/11/17]]''  &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
**Récupération et traitement (parse) manuels des données de distances dans un fichier .log via TCP/IP&amp;lt;-&amp;gt;Bluetooth&lt;br /&gt;
**Automatisation du procédé par script Python (requete.py)&lt;br /&gt;
***Mise en place de sockets de communication pour le contrôle de la collecte -&amp;gt; abandonné (servait à commander la collecte manuellement)&lt;br /&gt;
***Développement d'un script engine.py regroupant les commandes exécutables par l'utilisateur via la page Web&lt;br /&gt;
***Début du travail sur la fonction &amp;quot;STOP&amp;quot; manuel d'une action de collecte de données (liaison entre script html, javascript, et script python)&lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Chargement sur commande d'un set de distances depuis une matrice contenue dans un fichier JSON&lt;br /&gt;
**Travail sur le layout du site&lt;br /&gt;
***Ajout des différentes commandes (connexion bluetooth, lancement commande cu, collecte des données, collecte durée donnée)&lt;br /&gt;
***Début de l'implémentation de la visualisation des fichiers .json obtenus après collecte et affichage dans un tableau matriciel du fichier sélectionné&lt;br /&gt;
&lt;br /&gt;
Nous avons continuez a travaillez sur le serveur de collecte: Les données que nous savons récupérer via bluetooth sont stockée dans un fichier .log. Apres avoir bien compris comment marchait la fonction '''parse''' manuellement( lors de son utilisation dans le shell, nous l'avons implanter dans notre serveur de collecte qui lance cette commande lors de l’appuie sur un bouton via notre interface virtuelle. Un problème rencontré était de savoir quand la récolte des données devait s’arrêté. nous avons donc rajouté un temps à entré nous même sur l'interface. La fonction '''parse''' est effectué commence et le sous processus va attendre le temps donné avant de lancer une commande permettant de tuer le processus et mettant donc fin au remplissage du fichier '''.log'''. Nous voulons de plus réussir à lancer une fonction de collecte sans temps. c'est à dire que nous coupons la collecte via un bouton par nous même. nous voulions utiliser des Sockets pour pouvoir définir nous même la gestions de la communication mais l'idée a été abandonné car nous avons réussi a sauvegarder le PID du processus lancé. Il nous suffit donc de l’arrêter grâce à un autre bouton qui récupère cette variable et l’arrête ensuite. &lt;br /&gt;
&lt;br /&gt;
Toutes nos fonctions pythons étant regroupées dans notre serveur '''requete.py''' nous avons décidé de créé un module qui regroupera toutes ces fonction que nous pourrons utilisé dans '''requete.py'''. ceci nous permet de voir plus claire dans notre code et de faciliter le travail lorsque nous modifions le code tous les deux.&lt;br /&gt;
&lt;br /&gt;
Nous essayons en continues d'adapter le layout du site pour le rendre le plus attractif et simple possible. de facon a ce que chaque bouton et tableau soient claires et compréhensibles.&lt;br /&gt;
&lt;br /&gt;
Nous avons commencé à récupéré les fichier '''json''' créé à partir des fichier '''log'''. c'est a dire que ces fichiers sont automatiquement stockés coté serveur dans un dossier nommé '''static/log'''. Notre but est de récupérer le nom des fichier json et de les afficher dans un composant sur notre interface web. il nous sera donc possible ensuite de sélectionner le nom d'un fichier. lors de la sélection de ce nom de fichier, un tableau apparaît avec les valeurs de distances à l’intérieur.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 8'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 22/11/17 - Ven 24/11/17]]''  &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
**Automatisation du procédé de collecte par script Python (requete.py qui fait appel à engine.py)&lt;br /&gt;
***Développement d'un script engine.py regroupant les commandes exécutables par l'utilisateur via la page Web&lt;br /&gt;
***Travail sur la fonction &amp;quot;STOP&amp;quot; manuel d'une action de collecte de données (liaison entre script html, javascript, et script python)&lt;br /&gt;
***Mise en place d'un serveur HTTP Simple sous Python pour accéder aux fichiers de données à partir de la page Web&lt;br /&gt;
***Mise à jour de fonctions de connexion &lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Travail sur le layout du site (ajout de pages, navigation entre les pages, apparence, nettoyage des codes)&lt;br /&gt;
**Bon fonctionnement de l'ensemble serveur collecte + serveur HTTP + client Web&lt;br /&gt;
**Affichage de la liste des fichiers de données de distance (log, csv, json) via serveur HTTP en Python sur port 9999&lt;br /&gt;
*Corrections et nettoyage du dépôt GIT&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous continuons a développer les points énoncé la semaine dernière. Nous avons décidé de nous dirigé vers un serveur HTTP Simple pour accéder à nos fichiers. il s’avère que nous finirons par ne pas utiliser ce serveur. Nous irons récupérer les fichiers en question via des requêtes '''ajax''' faites à la sélection du nom du fichier.&lt;br /&gt;
&lt;br /&gt;
Nous rencontrons depuis le début des problèmes avec les fonctions de connexion qui peuvent ne pas marcher a un moment donner. Nous essayons de trouver pourquoi ce bug est un bug qui ne se produit pas à chaque fois. Nous avons déterminé qu'il ne se produisait seulement lorsque les fonctions de connexions étaient lancée dans des threads. Nous ne savons toujours pas pourquoi ces thread bug seulement parfois et non à chaque essaie de connexion.&lt;br /&gt;
&lt;br /&gt;
Nous avons nettoyé notre dépot '''Git''' car il s’avère que nous utilisions une mauvais méthode de fusion et de stockage des documents.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 9'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 29/11/17 - Jeudi 30/11/17]]''  &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
**Automatisation du procédé de collecte par script Python (requete.py qui fait appel à engine.py)&lt;br /&gt;
***Travail sur la fonction &amp;quot;STOP&amp;quot; manuel d'une action de collecte de données (liaison entre script html, javascript, et script python)&lt;br /&gt;
***Recherches sur l'utilisation de fichiers json accessibles via le serveur HTTP&lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Travail sur le layout du site &lt;br /&gt;
**Travail sur la liaison entre fichiers json et affichage Web des données de distance&lt;br /&gt;
***Recherches et tests de solutions&lt;br /&gt;
****Affichage depuis un fichier&lt;br /&gt;
****Affichage à la volée lors d'une action de collecte&lt;br /&gt;
&lt;br /&gt;
*Revue de code avec Roudy DAGHER:&lt;br /&gt;
**Structure globale des codes ok&lt;br /&gt;
**Fonctionnement presque ok: fonctionnalités implémentées ok, mais parsage csv ne marche pas&lt;br /&gt;
**Refactoring nécessaire&lt;br /&gt;
**Correction de la fonction STOP et amélioration de la fonction de COLLECTE&lt;br /&gt;
**Faire plus de requêtes Javascript que de requêtes HTML&lt;br /&gt;
**Discussion pour l'implémentation du serveur de localisation (= algorithme de localisation) et des visualisations de données sur le site Web&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous avons d'abord revue l'ensemble de notre code et les méthode utilisé avec notre tuteur '''Roudy Dagher'''. Nous nous approchons d'un serveur de collecte de donné stable et fonctionnel. Nous avons refait les différentes connexions entre l'interface et le serveur afin de ne faire que des requêtes sur des '''WebServices'''. Il nous ai possible de commencer la deuxième partie qui est l'envoie de ces tableaux de données afin de les envoyer vers le serveur de localisation via des API afin de recevoir des matrice de positions.&lt;br /&gt;
Nous pourrons grâce a ces matrices afficher une carte 3d des balises  et du TAG dans l'espace.&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Observations'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Problèmes rencontrés'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Solutions apportées'''&amp;lt;/span&amp;gt;===&lt;/div&gt;</summary>
		<author><name>Hdelatte</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=P18_Localisation_of_quadrotors&amp;diff=46788</id>
		<title>P18 Localisation of quadrotors</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=P18_Localisation_of_quadrotors&amp;diff=46788"/>
				<updated>2017-12-10T16:40:36Z</updated>
		
		<summary type="html">&lt;p&gt;Hdelatte : /* Semaine 9 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Cahier des charges'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;Présentation générale du projet&amp;lt;/span&amp;gt;=== &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Contexte&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
Dans un monde de plus en plus connecté, de nombreux drones sont déployés pour diverses applications comme l'espionnage, la surveillance, la cartographie de lieux et la livraison de colis. Les technologies nécessaires pour contrôler ces drones sont des sujets de recherche actuels. &lt;br /&gt;
&lt;br /&gt;
Le contrôle de ceux-ci passe tout d'abord par la maîtrise de leur position dans l'espace. Le développement des applications liées à l'utilisation de drones nécessite un travail important sur la localisation spatiale d'objets connectés. &lt;br /&gt;
&lt;br /&gt;
De plus, dans un souci d'utilisation, il est essentiel de développer des interfaces logicielles permettant d'exploiter ces données.&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Objectif du projet&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
L'objectif de ce projet est de développer une interface logicielle permettant de traiter en temps réel les informations de localisation d'un drone et de balises, dans le but de définir leur localisation dans l'espace, en intérieur.&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Description du projet&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
Pour réaliser le contrôle de drones, la première étape importante est de donner ses informations de position. Le but du projet est de développer une interface logicielle permettant de localiser le drone en temps réel en intérieur. Le drone se déplace dans un environnement dans lequel ont été installées de multiples balises. Il est équipé d'une carte, lui permettant de recevoir les distances relatives entre lui-même et les balises, sur laquelle différents algorithmes vont être implémentés pour effectuer la localisation en temps réel. Le projet requiert des compétences en développement hardware (Crazyflie 2.0, voir https://wiki.bitcraze.io/) et software (langage C/C++/Python/Javascript/HTML...).&lt;br /&gt;
&lt;br /&gt;
Il se divise en 4 étapes principales, qui sont:&lt;br /&gt;
*1) Choisir les technologies utilisées&lt;br /&gt;
*2) Choisir l'architecture (OS / APIs)&lt;br /&gt;
*3) Développer les différentes parties du projet&lt;br /&gt;
*4) Intégrer et connecter les différentes parties du projet&lt;br /&gt;
&lt;br /&gt;
La localisation étant en intérieur, le protocole GPS n'est donc pas assez précis pour les applications ciblées. La mise en place d'un tel dispositif permettrait grâce à l'utilisation d'un algorithme d'estimer avec une bonne précision les positions en intérieur d'une balise centrale (appelée Tag) et de balises (appelées Anchor). Le Tag scanne en temps réel la distance relative aux différentes balises, et il nous est retourné la position des balises et du Tag grâce à l'algorithme de localisation.&lt;br /&gt;
&lt;br /&gt;
Le projet se compose de 3 parties:&lt;br /&gt;
* Collect &amp;amp; parse: collecter les données envoyées par les balises en communiquant avec un serveur et récupérer les données adéquates par un tri&lt;br /&gt;
* Localise: déterminer la matrice de position des balises et du Tag en traitant les données récupérées&lt;br /&gt;
* Display: développer l'interface homme machine pour afficher, étudier et utiliser les données traitées&lt;br /&gt;
&lt;br /&gt;
Nous travaillerons dans un premier temps dans une optique temps différé avant de travailler en temps réel. Cela nous permettra d'acquérir des données utiles et réutilisables en aval. &lt;br /&gt;
&lt;br /&gt;
A l'aboutissement du projet, nous devrions être capable via l'interface homme machine développée d'afficher précisément la position spatiale des balises ainsi que du Tag, grâce àl'utilisation d'un algorithme de localisation et des données récupérées, et d'afficher d'autres données relatives au déplacement du Tag ou des balises dans l'espace. &lt;br /&gt;
&lt;br /&gt;
Si le temps le permet, nous pourrons aussi être amenés à adapter et utiliser l'interface développée pour l'utilisation d'un drone.&lt;br /&gt;
&lt;br /&gt;
''Sujet originel''&lt;br /&gt;
&lt;br /&gt;
To achieve the control of quadrotors, the first important task to give its position information. This project is to develop a software(GUI) to localize the quadrotors in real-time. The quadrotor is flying in an environment where several transmitters have been installed. The quadrotor is equipped with a deck to receive the relative distances between the deck and all transmitters, based on which different algorithms will be implemented to realize the real-time localization. The candidates need to have both experiences on hardware (Crazyflie 2.0, see https://wiki.bitcraze.io/) and software development (C/C , Python…). &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Calendrier&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
''[[Avant le 29/09/17]]'' - Élaboration du Cahier des charges, de la liste des tâches et du calendrier prévisionnel&lt;br /&gt;
&lt;br /&gt;
''[[Avant fin Octobre]]'' - Serveur de collecte et début du développement de l'interface logicielle&lt;br /&gt;
&lt;br /&gt;
''[[Avant fin Décembre]]'' - Interface logicielle&lt;br /&gt;
&lt;br /&gt;
''[[A la fin du PFE]]'' - Intégration finale des différentes parties (Serveur de collecte des données &amp;amp; Serveur de localisation &amp;amp; Interface logicielle)&lt;br /&gt;
&lt;br /&gt;
Répartition du volume de travail (***h):&lt;br /&gt;
&lt;br /&gt;
* Recherche sur les technologies à utiliser (**h)&lt;br /&gt;
* Développement du serveur de collecte de données (**h)&lt;br /&gt;
* Réalisation de l'interface logicielle (Web//Logiciel/Application) (**h)&lt;br /&gt;
* Intégration des différentes parties (**h)&lt;br /&gt;
* Test et débuggage (**h)&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Choix techniques : matériel et logiciel&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
Afin de développer ce dispositif, nous allons utiliser une Raspberry Pi 3 associée à une carte réceptrice, qui communique avec 4 balises composées chacune d'un microcontrôleur et d'une carte émettrice radio (UWB5C) et alimentées par batteries. La carte réceptrice joue le rôle du drone à localiser et communiquera les données émises par les balises vers l'ordinateur via Bluetooth.&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Choix technologiques&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
Voici les technologies que nous utilisons pour chacune des parties de ce projet.&lt;br /&gt;
&lt;br /&gt;
    1) Serveur de collecte des données:&lt;br /&gt;
       Scanne et parse les données récupérées pour fournir la matrice D des distances relatives du tag aux 4 balises&lt;br /&gt;
        - API&lt;br /&gt;
        - Python / Serveur Flask&lt;br /&gt;
&lt;br /&gt;
    2) Serveur de localisation (fourni):&lt;br /&gt;
       Calcule grâce à l'algorithme de localisation et la matrice D les positions spatiales des 4 noeuds et du tag&lt;br /&gt;
        - API&lt;br /&gt;
        - Bootstrap&lt;br /&gt;
        - Jquery&lt;br /&gt;
        - Python&lt;br /&gt;
&lt;br /&gt;
    3) Interface utilisateur:&lt;br /&gt;
       Affiche courbes, visualisation 3D, boutons ou données des fichiers envoyées par le serveur de localisation&lt;br /&gt;
        - HTML5 / Javascript&lt;br /&gt;
        - Fichiers JSON (serveurs de collecte et de localisation)&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Calendrier prévisionnel'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Liste des tâches à effectuer&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
# Se documenter sur le projet&lt;br /&gt;
##Langages et technologies utilisées&lt;br /&gt;
##Matériel utilisé&lt;br /&gt;
##Mettre en place du travail sur le Git&lt;br /&gt;
# Réaliser le serveur de collecte&lt;br /&gt;
##Récupérer les trames envoyées par bluetooth par le TAG via la Raspberry Pi&lt;br /&gt;
##Intégrer le serveur de localisation pour interpréter les trames&lt;br /&gt;
##Tester et optimiser&lt;br /&gt;
# Réaliser l'interface Web utilisateur&lt;br /&gt;
##Implémenter le serveur de collecte et de localisation&lt;br /&gt;
##Afficher et traiter les données stockées dans les fichiers JSON via le serveur (temps différé + temps réel)&lt;br /&gt;
##Tester et optimiser&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;Replanification du cahier des charges / calendrier&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Feuille d'heures'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Tâche !! Prélude !! Heures S1 !! Heures S2 !! Heures S3 !! Heures S4 !! Heures S5 !! Heures S6 !! Heures S7 !! Heures S8 !! Heures S9 !! Heures S10 !! Heures S11 !! Heures S12 !! Après Noël !! Total&lt;br /&gt;
|-&lt;br /&gt;
| Cahier des charges / Wiki / Gitlab&lt;br /&gt;
|  4h&lt;br /&gt;
|  3h&lt;br /&gt;
|  1h&lt;br /&gt;
|  x&lt;br /&gt;
|  1h30&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h30&lt;br /&gt;
|  1h&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Documentation sur les technos utilisées&lt;br /&gt;
|  2h&lt;br /&gt;
|  4h&lt;br /&gt;
|  3h&lt;br /&gt;
|  2h&lt;br /&gt;
|  3h&lt;br /&gt;
|  4h&lt;br /&gt;
|  5h&lt;br /&gt;
|  5h30&lt;br /&gt;
|  4h30&lt;br /&gt;
|  3h30&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Documentation sur le matériel&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Recherche et développement du serveur de collecte&lt;br /&gt;
|  x&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  3h&lt;br /&gt;
|  3h30&lt;br /&gt;
|  4h&lt;br /&gt;
|  5h&lt;br /&gt;
|  7h&lt;br /&gt;
|  4h30&lt;br /&gt;
|  0,5h&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| Recherche et développement de l'interface Web&lt;br /&gt;
|  x&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  3h&lt;br /&gt;
|  5h&lt;br /&gt;
|  6h&lt;br /&gt;
|  4h&lt;br /&gt;
|  7h&lt;br /&gt;
|  5h30&lt;br /&gt;
|  2h30&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| Recherche et intégration du serveur de localisation&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x &lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| Intégration des différentes parties&lt;br /&gt;
|  x&lt;br /&gt;
|  x  &lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  2h&lt;br /&gt;
|  2h&lt;br /&gt;
|  2h&lt;br /&gt;
|  3h&lt;br /&gt;
|  1h30&lt;br /&gt;
|  x&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| Tests et débuggage&lt;br /&gt;
|  x&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  1h&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  3h&lt;br /&gt;
|  4h&lt;br /&gt;
|  0,5h&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Optimisation/Correction des programmes&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Avancement du Projet'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Phase préparatoire'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Jeu 21/09/17 - Ven 22/09/17]]'' &lt;br /&gt;
*Rendez-vous de mise au point du cahier des charges avec les encadrants/intervenants (M. ZHENG Gang et M. DAGHER Roudy)&lt;br /&gt;
*Elaboration du cahier des charges&lt;br /&gt;
*Elaboration de la page Wiki (préparation de la mise en page et présentation du sujet)&lt;br /&gt;
*Préparation du travail sous forme de Mind Map&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous nous sommes tout d’abord rendus au laboratoire de l'INRIA afin de pouvoir définir le plus précisément possible le cahier des charges avec nos tuteurs.&lt;br /&gt;
Nous avons donc défini avec eux les technologies qu'il faudrait étudier. Vous retrouverez le choix des technologies dans la partie '''choix technologiques'''&lt;br /&gt;
&lt;br /&gt;
Nous avons en même temps créé notre page Wiki, et structuré celui-ci avec les parties qui nous seraient utiles pour développer nos explications par la suite.&lt;br /&gt;
&lt;br /&gt;
Nous avons de plus découpé le travail en sous-parties que nous avions mis dans un '''Mind map''' afin d'y voir plus clair sur la ligne à suivre.&lt;br /&gt;
&lt;br /&gt;
Vous trouverez ce Mind map juste ci-dessous. Nous ne mettrons pas à jour ce Mind map chaque semaine mais il est fort probable que nous en referions un en milieu de projet pour pouvoir cibler les objectifs réussis et ceux à atteindre. Nous pourrons de plus redéfinir certains objectifs qui nous aurait semblé trop vague au début du projet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Projet de fin d'étude.png|centre|600px]]&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 1'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Jeu 28/09/17 - Ven 29/09/17]]'' &lt;br /&gt;
*Revue du Cahier des Charges avec les encadrants&lt;br /&gt;
*Lecture et recherches sur les technologies adaptées&lt;br /&gt;
*Construction de la suite de la Mind Map&lt;br /&gt;
*Création du Gitlab&lt;br /&gt;
&lt;br /&gt;
Nous commençons les recherches sur le projet et sur les premières technologies engagées dans celui-ci. Nous en profitons pour formuler des à présent des questions sur le bon choix de celles-ci. Nous commençons donc des tests ayant seulement pour but de nous familiariser avec l'environnement de travail et de réellement comprendre les fonctions déjà présentes qu'il faudra exploiter et implanter notre interface web.&lt;br /&gt;
Nous créons un gitlab avec notre tuteur et commençons a définir les taches premières sur celui-ci.&lt;br /&gt;
Nous en profitons pour affiner le Mind Map.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 2'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Jeu 05/10/17 - Ven 06/10/17]]''  &lt;br /&gt;
*Précisions sur le cahier des charges&lt;br /&gt;
*Listage du matériel&lt;br /&gt;
*Recherche et détermination de solutions technologiques possibles pour les fonctions demandées&lt;br /&gt;
*Début du travail sur le serveur de collecte&lt;br /&gt;
*Apprentissage du langage Python et de l'utilisation du framework Flask&lt;br /&gt;
&lt;br /&gt;
Nous avons finalisé les précisions sur le cahier des charges. Nous avons donc pu cibler le matériel dont nous nous servirons pour ce Projet. Vous trouverez donc cette liste la section correspondante. Il est évident que le matériel utilisé est dans l'ensemble déjà fourni par le laboratoire et qu'il nous reste dans l'ensemble à créer l'interface web et les API qui nous permettrons de faire communiquer cette interface avec la Raspberrypi et le serveur de position déjà créé.&lt;br /&gt;
Nous avons donc pu commencer a ce former sur les technologies qui nous serviraient par la suite. Nous avaons donc utilisé le cours d'openclassroom sur les serveur flask pour en apprendre les bases. Ce serveur flask est programmé en python et nous permets donc une grande liberté au niveau de l’exécutions de certains scripts. En effet les script de connexion bluetooth et de redirection de port qui nous permette de recuperer les données de distance sont eux meme codé en python et sont directement appelé via le serveur.&lt;br /&gt;
Dans ce serveur, représentant notre interface web, vous retrouverez la page '''/collecte''' qui représentera notre partie collecte de données ainsi que l'affichage de ces distances. Nous appellerons cette partie le serveur de collecte.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 3'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 11/10/17 - Jeu 12/10/17]]''  &lt;br /&gt;
*Recherche et développement initial du serveur de collecte de données&lt;br /&gt;
*Complément du Git sur les tâches à effectuer&lt;br /&gt;
&lt;br /&gt;
Nous avons commencé à créer un serveur flask renvoyant pour l'instant une matrice aléatoire. Lors de la requête URL &amp;quot;../matrice&amp;quot;, nous voyons bien une matrice aléatoire apparaître sur la page Web. Nous essayons de nous connecter à la Raspberry Pi en redirigeant son port série vers le Bluetooth de façon à récupérer de vraies matrices de distance entre le drone (ie commutateur central) et les balises. Nous pourrons afficher ensuite ces matrices, ou alors les stocker dans un fichier en attendant le traitement de celles-ci.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Requete s3.PNG|300px|serveur flask]]&lt;br /&gt;
&lt;br /&gt;
Nous avons plusieurs problèmes avec le Bluetooth pour se connecter avec la Raspberry Pi. Quand nous aurons réussi à nous connecter au port série de la Raspberry pi alors nous pour gérer le traitement des données récupérées.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 4'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 18/10/17 - Jeu 19/10/17]]''  &lt;br /&gt;
*Configuration de la Raspberry Pi car problèmes de connectivité Bluetooth rencontrés&lt;br /&gt;
**Nous arrivons à connecter la Raspberry Pi sous Windows mais la connexion sous Linux pose problème (travail en suspens en attendant la disponibilité de l'encadrant)&lt;br /&gt;
*Début du développement de l'interface Web&lt;br /&gt;
**Traitement d'une matrice dans un fichier JSON&lt;br /&gt;
**Affichage sous forme de tableau de la matrice&lt;br /&gt;
**Utilisation du serveur de requête en Python avec chargement de template HTML&lt;br /&gt;
**Mise en forme de la trame de la page en HTML/CSS avec le framework Bootstrap&lt;br /&gt;
**Ajout d'un set de distances (d1, d2, d3, d4) dans la matrice lors d'un appui sur un bouton Chargement en utilisant un fichier Javascript&lt;br /&gt;
&lt;br /&gt;
Nous Avons reçus des fonctions pythons de notre tuteurs afin d'obtenir une connexion bluetooth entre notre raspberrypi et notre ordinateur ainsi qu'une redirection de port de celle ci vers la connexion. Nous n'arrivons pas à utiliser ces fonctions sous linux et nous necessitons une explication de notre tuteur n'etant pas disponible a ce moment. Pour ne pas perdre de temps nous nous attaquons la creation de l'interface web a proprement parler. c'est a dire la création des pages html ainsi que le document javascript qui nous servira de bibliotheque de fonctions.chaque route de notre serveur sont relié a une series de fonctions python s'executant a l'apelle des url puis suivis d'un template de la page HTML en question. Nous en profitons de plus pour explorer le framework CSS bootstrap afin de mettre un premier design et une structure a notre page collecte qui sera la page principale de notre site pour ce début de projet.&lt;br /&gt;
&lt;br /&gt;
Nous nous essayons de plus à différents tests sur des fichiers de format '''Json''' que nous devrons réussir à traiter correctement plus tard dans notre projet.&lt;br /&gt;
Nous récupérons une matrice que nous créons nous même en python (simulation d'une série de distances récupérée) que nous transformons au format Json pour ensuite l'afficher sur notre page web. Pour pouvoir proprement afficher se fichier '''Json''' renvoyé vers notre page, nous nous servons du fichier javascript afin de créer du code html contenant la matrice.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 5'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 25/10/17 - Ven 27/10/17]]''  &lt;br /&gt;
*Résolution des problèmes de connectique Bluetooth sur la Raspberry Pi&lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Traitement d'une matrice dans un fichier JSON&lt;br /&gt;
**Début de l'ajout d'un set de distances depuis une matrice contenue dans un fichier JSON&lt;br /&gt;
&lt;br /&gt;
Nous avons pu nous entretenir avec notre tuteur et donc comprendre les fonctions de connexion et de redirection de port. Nous pouvons donc continuer le développement de notre interface web. Nous arrivons à traiter un set de donné au format json et à l'afficher dans le code html. Toutefois nous créons nous mème ce set, il est maintenant nécessaire que nous arrivions à récupérer les set de distance réels reçus par la connexions bluetooth. Nous commencerons par un traitement asynchrone. L'idée est d’enregistrer les sets de distances dans un fichier '''Json''' stocké dans un dossier. Nous appellerons ce dossier plus tard via une requête ajax.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 6'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 08/11/17 - Ven 10/11/17]]''  &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
**Mise en place de la communication entre le port série de notre machine et le port série de la carte via Bluetooth de la RPi3&lt;br /&gt;
**Récupération et traitement (parse) manuels des données de distances dans un fichier .log via TCP/IP&amp;lt;-&amp;gt;Bluetooth&lt;br /&gt;
**Début de l'automatisation du procédé par script Python (requete.py) et mise en place de sockets de communication&lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Chargement sur commande d'un set de distances depuis une matrice contenue dans un fichier JSON&lt;br /&gt;
*Travail sur le layout du site&lt;br /&gt;
&lt;br /&gt;
Après avoir regardé le code de ces différentes fonctions nous avons pu faire des test manuels via le shell pour récupérer des données de distances et les stocker dans un fichier '''Json''' sur notre ordinateur.&lt;br /&gt;
&lt;br /&gt;
Nous utilisons les commandes suivante pour se connecter via bluetooth:&lt;br /&gt;
&lt;br /&gt;
 ///////////////////&lt;br /&gt;
&lt;br /&gt;
Rediriger le port de la raspberrypi3 vers la connexion:&lt;br /&gt;
&lt;br /&gt;
 ////////////////////&lt;br /&gt;
&lt;br /&gt;
Collecter la données dans un fichier dont nous définissons le nom:&lt;br /&gt;
&lt;br /&gt;
 ////////////////////&lt;br /&gt;
&lt;br /&gt;
Nous pouvons '''parser''' le flux de donner avant de le stocker dans le fichier via cette commande:&lt;br /&gt;
&lt;br /&gt;
 ////////////////////&lt;br /&gt;
&lt;br /&gt;
Il est donc nécessaire d'inclure via des '''thread''' ces différente fonctions dans notre serveur python (Flask) afin d'automatiser le processus. Le but est de pouvoir choisir sur l'interface web quels fonctions il faut exécuter et les déclencher via l'appuie sur des boutons.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 7'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 15/11/17 - Ven 17/11/17]]''  &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
**Récupération et traitement (parse) manuels des données de distances dans un fichier .log via TCP/IP&amp;lt;-&amp;gt;Bluetooth&lt;br /&gt;
**Automatisation du procédé par script Python (requete.py)&lt;br /&gt;
***Mise en place de sockets de communication pour le contrôle de la collecte -&amp;gt; abandonné (servait à commander la collecte manuellement)&lt;br /&gt;
***Développement d'un script engine.py regroupant les commandes exécutables par l'utilisateur via la page Web&lt;br /&gt;
***Début du travail sur la fonction &amp;quot;STOP&amp;quot; manuel d'une action de collecte de données (liaison entre script html, javascript, et script python)&lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Chargement sur commande d'un set de distances depuis une matrice contenue dans un fichier JSON&lt;br /&gt;
**Travail sur le layout du site&lt;br /&gt;
***Ajout des différentes commandes (connexion bluetooth, lancement commande cu, collecte des données, collecte durée donnée)&lt;br /&gt;
***Début de l'implémentation de la visualisation des fichiers .json obtenus après collecte et affichage dans un tableau matriciel du fichier sélectionné&lt;br /&gt;
&lt;br /&gt;
Nous avons continuez a travaillez sur le serveur de collecte: Les données que nous savons récupérer via bluetooth sont stockée dans un fichier .log. Apres avoir bien compris comment marchait la fonction '''parse''' manuellement( lors de son utilisation dans le shell, nous l'avons implanter dans notre serveur de collecte qui lance cette commande lors de l’appuie sur un bouton via notre interface virtuelle. Un problème rencontré était de savoir quand la récolte des données devait s’arrêté. nous avons donc rajouté un temps à entré nous même sur l'interface. La fonction '''parse''' est effectué commence et le sous processus va attendre le temps donné avant de lancer une commande permettant de tuer le processus et mettant donc fin au remplissage du fichier '''.log'''. Nous voulons de plus réussir à lancer une fonction de collecte sans temps. c'est à dire que nous coupons la collecte via un bouton par nous même. nous voulions utiliser des Sockets pour pouvoir définir nous même la gestions de la communication mais l'idée a été abandonné car nous avons réussi a sauvegarder le PID du processus lancé. Il nous suffit donc de l’arrêter grâce à un autre bouton qui récupère cette variable et l’arrête ensuite. &lt;br /&gt;
&lt;br /&gt;
Toutes nos fonctions pythons étant regroupées dans notre serveur '''requete.py''' nous avons décidé de créé un module qui regroupera toutes ces fonction que nous pourrons utilisé dans '''requete.py'''. ceci nous permet de voir plus claire dans notre code et de faciliter le travail lorsque nous modifions le code tous les deux.&lt;br /&gt;
&lt;br /&gt;
Nous essayons en continues d'adapter le layout du site pour le rendre le plus attractif et simple possible. de facon a ce que chaque bouton et tableau soient claires et compréhensibles.&lt;br /&gt;
&lt;br /&gt;
Nous avons commencé à récupéré les fichier '''json''' créé à partir des fichier '''log'''. c'est a dire que ces fichiers sont automatiquement stockés coté serveur dans un dossier nommé '''static/log'''. Notre but est de récupérer le nom des fichier json et de les afficher dans un composant sur notre interface web. il nous sera donc possible ensuite de sélectionner le nom d'un fichier. lors de la sélection de ce nom de fichier, un tableau apparaît avec les valeurs de distances à l’intérieur.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 8'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 22/11/17 - Ven 24/11/17]]''  &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
**Automatisation du procédé de collecte par script Python (requete.py qui fait appel à engine.py)&lt;br /&gt;
***Développement d'un script engine.py regroupant les commandes exécutables par l'utilisateur via la page Web&lt;br /&gt;
***Travail sur la fonction &amp;quot;STOP&amp;quot; manuel d'une action de collecte de données (liaison entre script html, javascript, et script python)&lt;br /&gt;
***Mise en place d'un serveur HTTP Simple sous Python pour accéder aux fichiers de données à partir de la page Web&lt;br /&gt;
***Mise à jour de fonctions de connexion &lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Travail sur le layout du site (ajout de pages, navigation entre les pages, apparence, nettoyage des codes)&lt;br /&gt;
**Bon fonctionnement de l'ensemble serveur collecte + serveur HTTP + client Web&lt;br /&gt;
**Affichage de la liste des fichiers de données de distance (log, csv, json) via serveur HTTP en Python sur port 9999&lt;br /&gt;
*Corrections et nettoyage du dépôt GIT&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous continuons a développer les points énoncé la semaine dernière. Nous avons décidé de nous dirigé vers un serveur HTTP Simple pour accéder à nos fichiers. il s’avère que nous finirons par ne pas utiliser ce serveur. Nous irons récupérer les fichiers en question via des requêtes '''ajax''' faites à la sélection du nom du fichier.&lt;br /&gt;
&lt;br /&gt;
Nous rencontrons depuis le début des problèmes avec les fonctions de connexion qui peuvent ne pas marcher a un moment donner. Nous essayons de trouver pourquoi ce bug est un bug qui ne se produit pas à chaque fois. Nous avons déterminé qu'il ne se produisait seulement lorsque les fonctions de connexions étaient lancée dans des threads. Nous ne savons toujours pas pourquoi ces thread bug seulement parfois et non à chaque essaie de connexion.&lt;br /&gt;
&lt;br /&gt;
Nous avons nettoyé notre dépot '''Git''' car il s’avère que nous utilisions une mauvais méthode de fusion et de stockage des documents.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 9'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 29/11/17 - Jeudi 30/11/17]]''  &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
**Automatisation du procédé de collecte par script Python (requete.py qui fait appel à engine.py)&lt;br /&gt;
***Travail sur la fonction &amp;quot;STOP&amp;quot; manuel d'une action de collecte de données (liaison entre script html, javascript, et script python)&lt;br /&gt;
***Recherches sur l'utilisation de fichiers json accessibles via le serveur HTTP&lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Travail sur le layout du site &lt;br /&gt;
**Travail sur la liaison entre fichiers json et affichage Web des données de distance&lt;br /&gt;
***Recherches et tests de solutions&lt;br /&gt;
****Affichage depuis un fichier&lt;br /&gt;
****Affichage à la volée lors d'une action de collecte&lt;br /&gt;
&lt;br /&gt;
*Revue de code avec Roudy DAGHER:&lt;br /&gt;
**Structure globale des codes ok&lt;br /&gt;
**Fonctionnement presque ok: fonctionnalités implémentées ok, mais parsage csv ne marche pas&lt;br /&gt;
**Refactoring nécessaire&lt;br /&gt;
**Correction de la fonction STOP et amélioration de la fonction de COLLECTE&lt;br /&gt;
**Faire plus de requêtes Javascript que de requêtes HTML&lt;br /&gt;
**Discussion pour l'implémentation du serveur de localisation (= algorithme de localisation) et des visualisations de données sur le site Web&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous avons d'abord revue l'ensemble de notre code et les méthode utilisé avec notre tuteur '''Roudy Dagher'''. Nous nous approchons d'un serveur de collecte de donné stable et fonctionnel. Nous avons refait les différentes connexions entre l'interface et le serveur afin de ne faire que des requêtes sur des '''WebServices'''. Il nous ai possible de commencer la deuxième partie qui est l'envoie de ces tableaux de données afin de les envoyer vers le serveur de localisation via des API afin de recevoir des matrice de positions.&lt;br /&gt;
Nous pourrons grâce a ces matrices afficher une carte 3d des balises  et du TAG dans l'espace.&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Observations'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Problèmes rencontrés'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Solutions apportées'''&amp;lt;/span&amp;gt;===&lt;/div&gt;</summary>
		<author><name>Hdelatte</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=P18_Localisation_of_quadrotors&amp;diff=46787</id>
		<title>P18 Localisation of quadrotors</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=P18_Localisation_of_quadrotors&amp;diff=46787"/>
				<updated>2017-12-10T16:35:52Z</updated>
		
		<summary type="html">&lt;p&gt;Hdelatte : /* Semaine 8 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Cahier des charges'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;Présentation générale du projet&amp;lt;/span&amp;gt;=== &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Contexte&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
Dans un monde de plus en plus connecté, de nombreux drones sont déployés pour diverses applications comme l'espionnage, la surveillance, la cartographie de lieux et la livraison de colis. Les technologies nécessaires pour contrôler ces drones sont des sujets de recherche actuels. &lt;br /&gt;
&lt;br /&gt;
Le contrôle de ceux-ci passe tout d'abord par la maîtrise de leur position dans l'espace. Le développement des applications liées à l'utilisation de drones nécessite un travail important sur la localisation spatiale d'objets connectés. &lt;br /&gt;
&lt;br /&gt;
De plus, dans un souci d'utilisation, il est essentiel de développer des interfaces logicielles permettant d'exploiter ces données.&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Objectif du projet&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
L'objectif de ce projet est de développer une interface logicielle permettant de traiter en temps réel les informations de localisation d'un drone et de balises, dans le but de définir leur localisation dans l'espace, en intérieur.&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Description du projet&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
Pour réaliser le contrôle de drones, la première étape importante est de donner ses informations de position. Le but du projet est de développer une interface logicielle permettant de localiser le drone en temps réel en intérieur. Le drone se déplace dans un environnement dans lequel ont été installées de multiples balises. Il est équipé d'une carte, lui permettant de recevoir les distances relatives entre lui-même et les balises, sur laquelle différents algorithmes vont être implémentés pour effectuer la localisation en temps réel. Le projet requiert des compétences en développement hardware (Crazyflie 2.0, voir https://wiki.bitcraze.io/) et software (langage C/C++/Python/Javascript/HTML...).&lt;br /&gt;
&lt;br /&gt;
Il se divise en 4 étapes principales, qui sont:&lt;br /&gt;
*1) Choisir les technologies utilisées&lt;br /&gt;
*2) Choisir l'architecture (OS / APIs)&lt;br /&gt;
*3) Développer les différentes parties du projet&lt;br /&gt;
*4) Intégrer et connecter les différentes parties du projet&lt;br /&gt;
&lt;br /&gt;
La localisation étant en intérieur, le protocole GPS n'est donc pas assez précis pour les applications ciblées. La mise en place d'un tel dispositif permettrait grâce à l'utilisation d'un algorithme d'estimer avec une bonne précision les positions en intérieur d'une balise centrale (appelée Tag) et de balises (appelées Anchor). Le Tag scanne en temps réel la distance relative aux différentes balises, et il nous est retourné la position des balises et du Tag grâce à l'algorithme de localisation.&lt;br /&gt;
&lt;br /&gt;
Le projet se compose de 3 parties:&lt;br /&gt;
* Collect &amp;amp; parse: collecter les données envoyées par les balises en communiquant avec un serveur et récupérer les données adéquates par un tri&lt;br /&gt;
* Localise: déterminer la matrice de position des balises et du Tag en traitant les données récupérées&lt;br /&gt;
* Display: développer l'interface homme machine pour afficher, étudier et utiliser les données traitées&lt;br /&gt;
&lt;br /&gt;
Nous travaillerons dans un premier temps dans une optique temps différé avant de travailler en temps réel. Cela nous permettra d'acquérir des données utiles et réutilisables en aval. &lt;br /&gt;
&lt;br /&gt;
A l'aboutissement du projet, nous devrions être capable via l'interface homme machine développée d'afficher précisément la position spatiale des balises ainsi que du Tag, grâce àl'utilisation d'un algorithme de localisation et des données récupérées, et d'afficher d'autres données relatives au déplacement du Tag ou des balises dans l'espace. &lt;br /&gt;
&lt;br /&gt;
Si le temps le permet, nous pourrons aussi être amenés à adapter et utiliser l'interface développée pour l'utilisation d'un drone.&lt;br /&gt;
&lt;br /&gt;
''Sujet originel''&lt;br /&gt;
&lt;br /&gt;
To achieve the control of quadrotors, the first important task to give its position information. This project is to develop a software(GUI) to localize the quadrotors in real-time. The quadrotor is flying in an environment where several transmitters have been installed. The quadrotor is equipped with a deck to receive the relative distances between the deck and all transmitters, based on which different algorithms will be implemented to realize the real-time localization. The candidates need to have both experiences on hardware (Crazyflie 2.0, see https://wiki.bitcraze.io/) and software development (C/C , Python…). &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Calendrier&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
''[[Avant le 29/09/17]]'' - Élaboration du Cahier des charges, de la liste des tâches et du calendrier prévisionnel&lt;br /&gt;
&lt;br /&gt;
''[[Avant fin Octobre]]'' - Serveur de collecte et début du développement de l'interface logicielle&lt;br /&gt;
&lt;br /&gt;
''[[Avant fin Décembre]]'' - Interface logicielle&lt;br /&gt;
&lt;br /&gt;
''[[A la fin du PFE]]'' - Intégration finale des différentes parties (Serveur de collecte des données &amp;amp; Serveur de localisation &amp;amp; Interface logicielle)&lt;br /&gt;
&lt;br /&gt;
Répartition du volume de travail (***h):&lt;br /&gt;
&lt;br /&gt;
* Recherche sur les technologies à utiliser (**h)&lt;br /&gt;
* Développement du serveur de collecte de données (**h)&lt;br /&gt;
* Réalisation de l'interface logicielle (Web//Logiciel/Application) (**h)&lt;br /&gt;
* Intégration des différentes parties (**h)&lt;br /&gt;
* Test et débuggage (**h)&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Choix techniques : matériel et logiciel&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
Afin de développer ce dispositif, nous allons utiliser une Raspberry Pi 3 associée à une carte réceptrice, qui communique avec 4 balises composées chacune d'un microcontrôleur et d'une carte émettrice radio (UWB5C) et alimentées par batteries. La carte réceptrice joue le rôle du drone à localiser et communiquera les données émises par les balises vers l'ordinateur via Bluetooth.&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Choix technologiques&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
Voici les technologies que nous utilisons pour chacune des parties de ce projet.&lt;br /&gt;
&lt;br /&gt;
    1) Serveur de collecte des données:&lt;br /&gt;
       Scanne et parse les données récupérées pour fournir la matrice D des distances relatives du tag aux 4 balises&lt;br /&gt;
        - API&lt;br /&gt;
        - Python / Serveur Flask&lt;br /&gt;
&lt;br /&gt;
    2) Serveur de localisation (fourni):&lt;br /&gt;
       Calcule grâce à l'algorithme de localisation et la matrice D les positions spatiales des 4 noeuds et du tag&lt;br /&gt;
        - API&lt;br /&gt;
        - Bootstrap&lt;br /&gt;
        - Jquery&lt;br /&gt;
        - Python&lt;br /&gt;
&lt;br /&gt;
    3) Interface utilisateur:&lt;br /&gt;
       Affiche courbes, visualisation 3D, boutons ou données des fichiers envoyées par le serveur de localisation&lt;br /&gt;
        - HTML5 / Javascript&lt;br /&gt;
        - Fichiers JSON (serveurs de collecte et de localisation)&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Calendrier prévisionnel'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Liste des tâches à effectuer&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
# Se documenter sur le projet&lt;br /&gt;
##Langages et technologies utilisées&lt;br /&gt;
##Matériel utilisé&lt;br /&gt;
##Mettre en place du travail sur le Git&lt;br /&gt;
# Réaliser le serveur de collecte&lt;br /&gt;
##Récupérer les trames envoyées par bluetooth par le TAG via la Raspberry Pi&lt;br /&gt;
##Intégrer le serveur de localisation pour interpréter les trames&lt;br /&gt;
##Tester et optimiser&lt;br /&gt;
# Réaliser l'interface Web utilisateur&lt;br /&gt;
##Implémenter le serveur de collecte et de localisation&lt;br /&gt;
##Afficher et traiter les données stockées dans les fichiers JSON via le serveur (temps différé + temps réel)&lt;br /&gt;
##Tester et optimiser&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;Replanification du cahier des charges / calendrier&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Feuille d'heures'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Tâche !! Prélude !! Heures S1 !! Heures S2 !! Heures S3 !! Heures S4 !! Heures S5 !! Heures S6 !! Heures S7 !! Heures S8 !! Heures S9 !! Heures S10 !! Heures S11 !! Heures S12 !! Après Noël !! Total&lt;br /&gt;
|-&lt;br /&gt;
| Cahier des charges / Wiki / Gitlab&lt;br /&gt;
|  4h&lt;br /&gt;
|  3h&lt;br /&gt;
|  1h&lt;br /&gt;
|  x&lt;br /&gt;
|  1h30&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h30&lt;br /&gt;
|  1h&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Documentation sur les technos utilisées&lt;br /&gt;
|  2h&lt;br /&gt;
|  4h&lt;br /&gt;
|  3h&lt;br /&gt;
|  2h&lt;br /&gt;
|  3h&lt;br /&gt;
|  4h&lt;br /&gt;
|  5h&lt;br /&gt;
|  5h30&lt;br /&gt;
|  4h30&lt;br /&gt;
|  3h30&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Documentation sur le matériel&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Recherche et développement du serveur de collecte&lt;br /&gt;
|  x&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  3h&lt;br /&gt;
|  3h30&lt;br /&gt;
|  4h&lt;br /&gt;
|  5h&lt;br /&gt;
|  7h&lt;br /&gt;
|  4h30&lt;br /&gt;
|  0,5h&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| Recherche et développement de l'interface Web&lt;br /&gt;
|  x&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  3h&lt;br /&gt;
|  5h&lt;br /&gt;
|  6h&lt;br /&gt;
|  4h&lt;br /&gt;
|  7h&lt;br /&gt;
|  5h30&lt;br /&gt;
|  2h30&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| Recherche et intégration du serveur de localisation&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x &lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| Intégration des différentes parties&lt;br /&gt;
|  x&lt;br /&gt;
|  x  &lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  2h&lt;br /&gt;
|  2h&lt;br /&gt;
|  2h&lt;br /&gt;
|  3h&lt;br /&gt;
|  1h30&lt;br /&gt;
|  x&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| Tests et débuggage&lt;br /&gt;
|  x&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  1h&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  3h&lt;br /&gt;
|  4h&lt;br /&gt;
|  0,5h&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Optimisation/Correction des programmes&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Avancement du Projet'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Phase préparatoire'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Jeu 21/09/17 - Ven 22/09/17]]'' &lt;br /&gt;
*Rendez-vous de mise au point du cahier des charges avec les encadrants/intervenants (M. ZHENG Gang et M. DAGHER Roudy)&lt;br /&gt;
*Elaboration du cahier des charges&lt;br /&gt;
*Elaboration de la page Wiki (préparation de la mise en page et présentation du sujet)&lt;br /&gt;
*Préparation du travail sous forme de Mind Map&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous nous sommes tout d’abord rendus au laboratoire de l'INRIA afin de pouvoir définir le plus précisément possible le cahier des charges avec nos tuteurs.&lt;br /&gt;
Nous avons donc défini avec eux les technologies qu'il faudrait étudier. Vous retrouverez le choix des technologies dans la partie '''choix technologiques'''&lt;br /&gt;
&lt;br /&gt;
Nous avons en même temps créé notre page Wiki, et structuré celui-ci avec les parties qui nous seraient utiles pour développer nos explications par la suite.&lt;br /&gt;
&lt;br /&gt;
Nous avons de plus découpé le travail en sous-parties que nous avions mis dans un '''Mind map''' afin d'y voir plus clair sur la ligne à suivre.&lt;br /&gt;
&lt;br /&gt;
Vous trouverez ce Mind map juste ci-dessous. Nous ne mettrons pas à jour ce Mind map chaque semaine mais il est fort probable que nous en referions un en milieu de projet pour pouvoir cibler les objectifs réussis et ceux à atteindre. Nous pourrons de plus redéfinir certains objectifs qui nous aurait semblé trop vague au début du projet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Projet de fin d'étude.png|centre|600px]]&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 1'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Jeu 28/09/17 - Ven 29/09/17]]'' &lt;br /&gt;
*Revue du Cahier des Charges avec les encadrants&lt;br /&gt;
*Lecture et recherches sur les technologies adaptées&lt;br /&gt;
*Construction de la suite de la Mind Map&lt;br /&gt;
*Création du Gitlab&lt;br /&gt;
&lt;br /&gt;
Nous commençons les recherches sur le projet et sur les premières technologies engagées dans celui-ci. Nous en profitons pour formuler des à présent des questions sur le bon choix de celles-ci. Nous commençons donc des tests ayant seulement pour but de nous familiariser avec l'environnement de travail et de réellement comprendre les fonctions déjà présentes qu'il faudra exploiter et implanter notre interface web.&lt;br /&gt;
Nous créons un gitlab avec notre tuteur et commençons a définir les taches premières sur celui-ci.&lt;br /&gt;
Nous en profitons pour affiner le Mind Map.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 2'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Jeu 05/10/17 - Ven 06/10/17]]''  &lt;br /&gt;
*Précisions sur le cahier des charges&lt;br /&gt;
*Listage du matériel&lt;br /&gt;
*Recherche et détermination de solutions technologiques possibles pour les fonctions demandées&lt;br /&gt;
*Début du travail sur le serveur de collecte&lt;br /&gt;
*Apprentissage du langage Python et de l'utilisation du framework Flask&lt;br /&gt;
&lt;br /&gt;
Nous avons finalisé les précisions sur le cahier des charges. Nous avons donc pu cibler le matériel dont nous nous servirons pour ce Projet. Vous trouverez donc cette liste la section correspondante. Il est évident que le matériel utilisé est dans l'ensemble déjà fourni par le laboratoire et qu'il nous reste dans l'ensemble à créer l'interface web et les API qui nous permettrons de faire communiquer cette interface avec la Raspberrypi et le serveur de position déjà créé.&lt;br /&gt;
Nous avons donc pu commencer a ce former sur les technologies qui nous serviraient par la suite. Nous avaons donc utilisé le cours d'openclassroom sur les serveur flask pour en apprendre les bases. Ce serveur flask est programmé en python et nous permets donc une grande liberté au niveau de l’exécutions de certains scripts. En effet les script de connexion bluetooth et de redirection de port qui nous permette de recuperer les données de distance sont eux meme codé en python et sont directement appelé via le serveur.&lt;br /&gt;
Dans ce serveur, représentant notre interface web, vous retrouverez la page '''/collecte''' qui représentera notre partie collecte de données ainsi que l'affichage de ces distances. Nous appellerons cette partie le serveur de collecte.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 3'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 11/10/17 - Jeu 12/10/17]]''  &lt;br /&gt;
*Recherche et développement initial du serveur de collecte de données&lt;br /&gt;
*Complément du Git sur les tâches à effectuer&lt;br /&gt;
&lt;br /&gt;
Nous avons commencé à créer un serveur flask renvoyant pour l'instant une matrice aléatoire. Lors de la requête URL &amp;quot;../matrice&amp;quot;, nous voyons bien une matrice aléatoire apparaître sur la page Web. Nous essayons de nous connecter à la Raspberry Pi en redirigeant son port série vers le Bluetooth de façon à récupérer de vraies matrices de distance entre le drone (ie commutateur central) et les balises. Nous pourrons afficher ensuite ces matrices, ou alors les stocker dans un fichier en attendant le traitement de celles-ci.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Requete s3.PNG|300px|serveur flask]]&lt;br /&gt;
&lt;br /&gt;
Nous avons plusieurs problèmes avec le Bluetooth pour se connecter avec la Raspberry Pi. Quand nous aurons réussi à nous connecter au port série de la Raspberry pi alors nous pour gérer le traitement des données récupérées.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 4'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 18/10/17 - Jeu 19/10/17]]''  &lt;br /&gt;
*Configuration de la Raspberry Pi car problèmes de connectivité Bluetooth rencontrés&lt;br /&gt;
**Nous arrivons à connecter la Raspberry Pi sous Windows mais la connexion sous Linux pose problème (travail en suspens en attendant la disponibilité de l'encadrant)&lt;br /&gt;
*Début du développement de l'interface Web&lt;br /&gt;
**Traitement d'une matrice dans un fichier JSON&lt;br /&gt;
**Affichage sous forme de tableau de la matrice&lt;br /&gt;
**Utilisation du serveur de requête en Python avec chargement de template HTML&lt;br /&gt;
**Mise en forme de la trame de la page en HTML/CSS avec le framework Bootstrap&lt;br /&gt;
**Ajout d'un set de distances (d1, d2, d3, d4) dans la matrice lors d'un appui sur un bouton Chargement en utilisant un fichier Javascript&lt;br /&gt;
&lt;br /&gt;
Nous Avons reçus des fonctions pythons de notre tuteurs afin d'obtenir une connexion bluetooth entre notre raspberrypi et notre ordinateur ainsi qu'une redirection de port de celle ci vers la connexion. Nous n'arrivons pas à utiliser ces fonctions sous linux et nous necessitons une explication de notre tuteur n'etant pas disponible a ce moment. Pour ne pas perdre de temps nous nous attaquons la creation de l'interface web a proprement parler. c'est a dire la création des pages html ainsi que le document javascript qui nous servira de bibliotheque de fonctions.chaque route de notre serveur sont relié a une series de fonctions python s'executant a l'apelle des url puis suivis d'un template de la page HTML en question. Nous en profitons de plus pour explorer le framework CSS bootstrap afin de mettre un premier design et une structure a notre page collecte qui sera la page principale de notre site pour ce début de projet.&lt;br /&gt;
&lt;br /&gt;
Nous nous essayons de plus à différents tests sur des fichiers de format '''Json''' que nous devrons réussir à traiter correctement plus tard dans notre projet.&lt;br /&gt;
Nous récupérons une matrice que nous créons nous même en python (simulation d'une série de distances récupérée) que nous transformons au format Json pour ensuite l'afficher sur notre page web. Pour pouvoir proprement afficher se fichier '''Json''' renvoyé vers notre page, nous nous servons du fichier javascript afin de créer du code html contenant la matrice.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 5'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 25/10/17 - Ven 27/10/17]]''  &lt;br /&gt;
*Résolution des problèmes de connectique Bluetooth sur la Raspberry Pi&lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Traitement d'une matrice dans un fichier JSON&lt;br /&gt;
**Début de l'ajout d'un set de distances depuis une matrice contenue dans un fichier JSON&lt;br /&gt;
&lt;br /&gt;
Nous avons pu nous entretenir avec notre tuteur et donc comprendre les fonctions de connexion et de redirection de port. Nous pouvons donc continuer le développement de notre interface web. Nous arrivons à traiter un set de donné au format json et à l'afficher dans le code html. Toutefois nous créons nous mème ce set, il est maintenant nécessaire que nous arrivions à récupérer les set de distance réels reçus par la connexions bluetooth. Nous commencerons par un traitement asynchrone. L'idée est d’enregistrer les sets de distances dans un fichier '''Json''' stocké dans un dossier. Nous appellerons ce dossier plus tard via une requête ajax.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 6'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 08/11/17 - Ven 10/11/17]]''  &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
**Mise en place de la communication entre le port série de notre machine et le port série de la carte via Bluetooth de la RPi3&lt;br /&gt;
**Récupération et traitement (parse) manuels des données de distances dans un fichier .log via TCP/IP&amp;lt;-&amp;gt;Bluetooth&lt;br /&gt;
**Début de l'automatisation du procédé par script Python (requete.py) et mise en place de sockets de communication&lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Chargement sur commande d'un set de distances depuis une matrice contenue dans un fichier JSON&lt;br /&gt;
*Travail sur le layout du site&lt;br /&gt;
&lt;br /&gt;
Après avoir regardé le code de ces différentes fonctions nous avons pu faire des test manuels via le shell pour récupérer des données de distances et les stocker dans un fichier '''Json''' sur notre ordinateur.&lt;br /&gt;
&lt;br /&gt;
Nous utilisons les commandes suivante pour se connecter via bluetooth:&lt;br /&gt;
&lt;br /&gt;
 ///////////////////&lt;br /&gt;
&lt;br /&gt;
Rediriger le port de la raspberrypi3 vers la connexion:&lt;br /&gt;
&lt;br /&gt;
 ////////////////////&lt;br /&gt;
&lt;br /&gt;
Collecter la données dans un fichier dont nous définissons le nom:&lt;br /&gt;
&lt;br /&gt;
 ////////////////////&lt;br /&gt;
&lt;br /&gt;
Nous pouvons '''parser''' le flux de donner avant de le stocker dans le fichier via cette commande:&lt;br /&gt;
&lt;br /&gt;
 ////////////////////&lt;br /&gt;
&lt;br /&gt;
Il est donc nécessaire d'inclure via des '''thread''' ces différente fonctions dans notre serveur python (Flask) afin d'automatiser le processus. Le but est de pouvoir choisir sur l'interface web quels fonctions il faut exécuter et les déclencher via l'appuie sur des boutons.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 7'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 15/11/17 - Ven 17/11/17]]''  &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
**Récupération et traitement (parse) manuels des données de distances dans un fichier .log via TCP/IP&amp;lt;-&amp;gt;Bluetooth&lt;br /&gt;
**Automatisation du procédé par script Python (requete.py)&lt;br /&gt;
***Mise en place de sockets de communication pour le contrôle de la collecte -&amp;gt; abandonné (servait à commander la collecte manuellement)&lt;br /&gt;
***Développement d'un script engine.py regroupant les commandes exécutables par l'utilisateur via la page Web&lt;br /&gt;
***Début du travail sur la fonction &amp;quot;STOP&amp;quot; manuel d'une action de collecte de données (liaison entre script html, javascript, et script python)&lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Chargement sur commande d'un set de distances depuis une matrice contenue dans un fichier JSON&lt;br /&gt;
**Travail sur le layout du site&lt;br /&gt;
***Ajout des différentes commandes (connexion bluetooth, lancement commande cu, collecte des données, collecte durée donnée)&lt;br /&gt;
***Début de l'implémentation de la visualisation des fichiers .json obtenus après collecte et affichage dans un tableau matriciel du fichier sélectionné&lt;br /&gt;
&lt;br /&gt;
Nous avons continuez a travaillez sur le serveur de collecte: Les données que nous savons récupérer via bluetooth sont stockée dans un fichier .log. Apres avoir bien compris comment marchait la fonction '''parse''' manuellement( lors de son utilisation dans le shell, nous l'avons implanter dans notre serveur de collecte qui lance cette commande lors de l’appuie sur un bouton via notre interface virtuelle. Un problème rencontré était de savoir quand la récolte des données devait s’arrêté. nous avons donc rajouté un temps à entré nous même sur l'interface. La fonction '''parse''' est effectué commence et le sous processus va attendre le temps donné avant de lancer une commande permettant de tuer le processus et mettant donc fin au remplissage du fichier '''.log'''. Nous voulons de plus réussir à lancer une fonction de collecte sans temps. c'est à dire que nous coupons la collecte via un bouton par nous même. nous voulions utiliser des Sockets pour pouvoir définir nous même la gestions de la communication mais l'idée a été abandonné car nous avons réussi a sauvegarder le PID du processus lancé. Il nous suffit donc de l’arrêter grâce à un autre bouton qui récupère cette variable et l’arrête ensuite. &lt;br /&gt;
&lt;br /&gt;
Toutes nos fonctions pythons étant regroupées dans notre serveur '''requete.py''' nous avons décidé de créé un module qui regroupera toutes ces fonction que nous pourrons utilisé dans '''requete.py'''. ceci nous permet de voir plus claire dans notre code et de faciliter le travail lorsque nous modifions le code tous les deux.&lt;br /&gt;
&lt;br /&gt;
Nous essayons en continues d'adapter le layout du site pour le rendre le plus attractif et simple possible. de facon a ce que chaque bouton et tableau soient claires et compréhensibles.&lt;br /&gt;
&lt;br /&gt;
Nous avons commencé à récupéré les fichier '''json''' créé à partir des fichier '''log'''. c'est a dire que ces fichiers sont automatiquement stockés coté serveur dans un dossier nommé '''static/log'''. Notre but est de récupérer le nom des fichier json et de les afficher dans un composant sur notre interface web. il nous sera donc possible ensuite de sélectionner le nom d'un fichier. lors de la sélection de ce nom de fichier, un tableau apparaît avec les valeurs de distances à l’intérieur.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 8'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 22/11/17 - Ven 24/11/17]]''  &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
**Automatisation du procédé de collecte par script Python (requete.py qui fait appel à engine.py)&lt;br /&gt;
***Développement d'un script engine.py regroupant les commandes exécutables par l'utilisateur via la page Web&lt;br /&gt;
***Travail sur la fonction &amp;quot;STOP&amp;quot; manuel d'une action de collecte de données (liaison entre script html, javascript, et script python)&lt;br /&gt;
***Mise en place d'un serveur HTTP Simple sous Python pour accéder aux fichiers de données à partir de la page Web&lt;br /&gt;
***Mise à jour de fonctions de connexion &lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Travail sur le layout du site (ajout de pages, navigation entre les pages, apparence, nettoyage des codes)&lt;br /&gt;
**Bon fonctionnement de l'ensemble serveur collecte + serveur HTTP + client Web&lt;br /&gt;
**Affichage de la liste des fichiers de données de distance (log, csv, json) via serveur HTTP en Python sur port 9999&lt;br /&gt;
*Corrections et nettoyage du dépôt GIT&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous continuons a développer les points énoncé la semaine dernière. Nous avons décidé de nous dirigé vers un serveur HTTP Simple pour accéder à nos fichiers. il s’avère que nous finirons par ne pas utiliser ce serveur. Nous irons récupérer les fichiers en question via des requêtes '''ajax''' faites à la sélection du nom du fichier.&lt;br /&gt;
&lt;br /&gt;
Nous rencontrons depuis le début des problèmes avec les fonctions de connexion qui peuvent ne pas marcher a un moment donner. Nous essayons de trouver pourquoi ce bug est un bug qui ne se produit pas à chaque fois. Nous avons déterminé qu'il ne se produisait seulement lorsque les fonctions de connexions étaient lancée dans des threads. Nous ne savons toujours pas pourquoi ces thread bug seulement parfois et non à chaque essaie de connexion.&lt;br /&gt;
&lt;br /&gt;
Nous avons nettoyé notre dépot '''Git''' car il s’avère que nous utilisions une mauvais méthode de fusion et de stockage des documents.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 9'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 29/11/17 - Jeudi 30/11/17]]''  &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
**Automatisation du procédé de collecte par script Python (requete.py qui fait appel à engine.py)&lt;br /&gt;
***Travail sur la fonction &amp;quot;STOP&amp;quot; manuel d'une action de collecte de données (liaison entre script html, javascript, et script python)&lt;br /&gt;
***Recherches sur l'utilisation de fichiers json accessibles via le serveur HTTP&lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Travail sur le layout du site &lt;br /&gt;
**Travail sur la liaison entre fichiers json et affichage Web des données de distance&lt;br /&gt;
***Recherches et tests de solutions&lt;br /&gt;
****Affichage depuis un fichier&lt;br /&gt;
****Affichage à la volée lors d'une action de collecte&lt;br /&gt;
&lt;br /&gt;
*Revue de code avec Roudy DAGHER:&lt;br /&gt;
**Structure globale des codes ok&lt;br /&gt;
**Fonctionnement presque ok: fonctionnalités implémentées ok, mais parsage csv ne marche pas&lt;br /&gt;
**Refactoring nécessaire&lt;br /&gt;
**Correction de la fonction STOP et amélioration de la fonction de COLLECTE&lt;br /&gt;
**Faire plus de requêtes Javascript que de requêtes HTML&lt;br /&gt;
**Discussion pour l'implémentation du serveur de localisation (= algorithme de localisation) et des visualisations de données sur le site Web&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Observations'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Problèmes rencontrés'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Solutions apportées'''&amp;lt;/span&amp;gt;===&lt;/div&gt;</summary>
		<author><name>Hdelatte</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=P18_Localisation_of_quadrotors&amp;diff=46786</id>
		<title>P18 Localisation of quadrotors</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=P18_Localisation_of_quadrotors&amp;diff=46786"/>
				<updated>2017-12-10T16:29:27Z</updated>
		
		<summary type="html">&lt;p&gt;Hdelatte : /* Semaine 7 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Cahier des charges'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;Présentation générale du projet&amp;lt;/span&amp;gt;=== &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Contexte&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
Dans un monde de plus en plus connecté, de nombreux drones sont déployés pour diverses applications comme l'espionnage, la surveillance, la cartographie de lieux et la livraison de colis. Les technologies nécessaires pour contrôler ces drones sont des sujets de recherche actuels. &lt;br /&gt;
&lt;br /&gt;
Le contrôle de ceux-ci passe tout d'abord par la maîtrise de leur position dans l'espace. Le développement des applications liées à l'utilisation de drones nécessite un travail important sur la localisation spatiale d'objets connectés. &lt;br /&gt;
&lt;br /&gt;
De plus, dans un souci d'utilisation, il est essentiel de développer des interfaces logicielles permettant d'exploiter ces données.&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Objectif du projet&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
L'objectif de ce projet est de développer une interface logicielle permettant de traiter en temps réel les informations de localisation d'un drone et de balises, dans le but de définir leur localisation dans l'espace, en intérieur.&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Description du projet&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
Pour réaliser le contrôle de drones, la première étape importante est de donner ses informations de position. Le but du projet est de développer une interface logicielle permettant de localiser le drone en temps réel en intérieur. Le drone se déplace dans un environnement dans lequel ont été installées de multiples balises. Il est équipé d'une carte, lui permettant de recevoir les distances relatives entre lui-même et les balises, sur laquelle différents algorithmes vont être implémentés pour effectuer la localisation en temps réel. Le projet requiert des compétences en développement hardware (Crazyflie 2.0, voir https://wiki.bitcraze.io/) et software (langage C/C++/Python/Javascript/HTML...).&lt;br /&gt;
&lt;br /&gt;
Il se divise en 4 étapes principales, qui sont:&lt;br /&gt;
*1) Choisir les technologies utilisées&lt;br /&gt;
*2) Choisir l'architecture (OS / APIs)&lt;br /&gt;
*3) Développer les différentes parties du projet&lt;br /&gt;
*4) Intégrer et connecter les différentes parties du projet&lt;br /&gt;
&lt;br /&gt;
La localisation étant en intérieur, le protocole GPS n'est donc pas assez précis pour les applications ciblées. La mise en place d'un tel dispositif permettrait grâce à l'utilisation d'un algorithme d'estimer avec une bonne précision les positions en intérieur d'une balise centrale (appelée Tag) et de balises (appelées Anchor). Le Tag scanne en temps réel la distance relative aux différentes balises, et il nous est retourné la position des balises et du Tag grâce à l'algorithme de localisation.&lt;br /&gt;
&lt;br /&gt;
Le projet se compose de 3 parties:&lt;br /&gt;
* Collect &amp;amp; parse: collecter les données envoyées par les balises en communiquant avec un serveur et récupérer les données adéquates par un tri&lt;br /&gt;
* Localise: déterminer la matrice de position des balises et du Tag en traitant les données récupérées&lt;br /&gt;
* Display: développer l'interface homme machine pour afficher, étudier et utiliser les données traitées&lt;br /&gt;
&lt;br /&gt;
Nous travaillerons dans un premier temps dans une optique temps différé avant de travailler en temps réel. Cela nous permettra d'acquérir des données utiles et réutilisables en aval. &lt;br /&gt;
&lt;br /&gt;
A l'aboutissement du projet, nous devrions être capable via l'interface homme machine développée d'afficher précisément la position spatiale des balises ainsi que du Tag, grâce àl'utilisation d'un algorithme de localisation et des données récupérées, et d'afficher d'autres données relatives au déplacement du Tag ou des balises dans l'espace. &lt;br /&gt;
&lt;br /&gt;
Si le temps le permet, nous pourrons aussi être amenés à adapter et utiliser l'interface développée pour l'utilisation d'un drone.&lt;br /&gt;
&lt;br /&gt;
''Sujet originel''&lt;br /&gt;
&lt;br /&gt;
To achieve the control of quadrotors, the first important task to give its position information. This project is to develop a software(GUI) to localize the quadrotors in real-time. The quadrotor is flying in an environment where several transmitters have been installed. The quadrotor is equipped with a deck to receive the relative distances between the deck and all transmitters, based on which different algorithms will be implemented to realize the real-time localization. The candidates need to have both experiences on hardware (Crazyflie 2.0, see https://wiki.bitcraze.io/) and software development (C/C , Python…). &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Calendrier&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
''[[Avant le 29/09/17]]'' - Élaboration du Cahier des charges, de la liste des tâches et du calendrier prévisionnel&lt;br /&gt;
&lt;br /&gt;
''[[Avant fin Octobre]]'' - Serveur de collecte et début du développement de l'interface logicielle&lt;br /&gt;
&lt;br /&gt;
''[[Avant fin Décembre]]'' - Interface logicielle&lt;br /&gt;
&lt;br /&gt;
''[[A la fin du PFE]]'' - Intégration finale des différentes parties (Serveur de collecte des données &amp;amp; Serveur de localisation &amp;amp; Interface logicielle)&lt;br /&gt;
&lt;br /&gt;
Répartition du volume de travail (***h):&lt;br /&gt;
&lt;br /&gt;
* Recherche sur les technologies à utiliser (**h)&lt;br /&gt;
* Développement du serveur de collecte de données (**h)&lt;br /&gt;
* Réalisation de l'interface logicielle (Web//Logiciel/Application) (**h)&lt;br /&gt;
* Intégration des différentes parties (**h)&lt;br /&gt;
* Test et débuggage (**h)&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Choix techniques : matériel et logiciel&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
Afin de développer ce dispositif, nous allons utiliser une Raspberry Pi 3 associée à une carte réceptrice, qui communique avec 4 balises composées chacune d'un microcontrôleur et d'une carte émettrice radio (UWB5C) et alimentées par batteries. La carte réceptrice joue le rôle du drone à localiser et communiquera les données émises par les balises vers l'ordinateur via Bluetooth.&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Choix technologiques&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
Voici les technologies que nous utilisons pour chacune des parties de ce projet.&lt;br /&gt;
&lt;br /&gt;
    1) Serveur de collecte des données:&lt;br /&gt;
       Scanne et parse les données récupérées pour fournir la matrice D des distances relatives du tag aux 4 balises&lt;br /&gt;
        - API&lt;br /&gt;
        - Python / Serveur Flask&lt;br /&gt;
&lt;br /&gt;
    2) Serveur de localisation (fourni):&lt;br /&gt;
       Calcule grâce à l'algorithme de localisation et la matrice D les positions spatiales des 4 noeuds et du tag&lt;br /&gt;
        - API&lt;br /&gt;
        - Bootstrap&lt;br /&gt;
        - Jquery&lt;br /&gt;
        - Python&lt;br /&gt;
&lt;br /&gt;
    3) Interface utilisateur:&lt;br /&gt;
       Affiche courbes, visualisation 3D, boutons ou données des fichiers envoyées par le serveur de localisation&lt;br /&gt;
        - HTML5 / Javascript&lt;br /&gt;
        - Fichiers JSON (serveurs de collecte et de localisation)&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Calendrier prévisionnel'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Liste des tâches à effectuer&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
# Se documenter sur le projet&lt;br /&gt;
##Langages et technologies utilisées&lt;br /&gt;
##Matériel utilisé&lt;br /&gt;
##Mettre en place du travail sur le Git&lt;br /&gt;
# Réaliser le serveur de collecte&lt;br /&gt;
##Récupérer les trames envoyées par bluetooth par le TAG via la Raspberry Pi&lt;br /&gt;
##Intégrer le serveur de localisation pour interpréter les trames&lt;br /&gt;
##Tester et optimiser&lt;br /&gt;
# Réaliser l'interface Web utilisateur&lt;br /&gt;
##Implémenter le serveur de collecte et de localisation&lt;br /&gt;
##Afficher et traiter les données stockées dans les fichiers JSON via le serveur (temps différé + temps réel)&lt;br /&gt;
##Tester et optimiser&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;Replanification du cahier des charges / calendrier&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Feuille d'heures'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Tâche !! Prélude !! Heures S1 !! Heures S2 !! Heures S3 !! Heures S4 !! Heures S5 !! Heures S6 !! Heures S7 !! Heures S8 !! Heures S9 !! Heures S10 !! Heures S11 !! Heures S12 !! Après Noël !! Total&lt;br /&gt;
|-&lt;br /&gt;
| Cahier des charges / Wiki / Gitlab&lt;br /&gt;
|  4h&lt;br /&gt;
|  3h&lt;br /&gt;
|  1h&lt;br /&gt;
|  x&lt;br /&gt;
|  1h30&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h30&lt;br /&gt;
|  1h&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Documentation sur les technos utilisées&lt;br /&gt;
|  2h&lt;br /&gt;
|  4h&lt;br /&gt;
|  3h&lt;br /&gt;
|  2h&lt;br /&gt;
|  3h&lt;br /&gt;
|  4h&lt;br /&gt;
|  5h&lt;br /&gt;
|  5h30&lt;br /&gt;
|  4h30&lt;br /&gt;
|  3h30&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Documentation sur le matériel&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Recherche et développement du serveur de collecte&lt;br /&gt;
|  x&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  3h&lt;br /&gt;
|  3h30&lt;br /&gt;
|  4h&lt;br /&gt;
|  5h&lt;br /&gt;
|  7h&lt;br /&gt;
|  4h30&lt;br /&gt;
|  0,5h&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| Recherche et développement de l'interface Web&lt;br /&gt;
|  x&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  3h&lt;br /&gt;
|  5h&lt;br /&gt;
|  6h&lt;br /&gt;
|  4h&lt;br /&gt;
|  7h&lt;br /&gt;
|  5h30&lt;br /&gt;
|  2h30&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| Recherche et intégration du serveur de localisation&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x &lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| Intégration des différentes parties&lt;br /&gt;
|  x&lt;br /&gt;
|  x  &lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  2h&lt;br /&gt;
|  2h&lt;br /&gt;
|  2h&lt;br /&gt;
|  3h&lt;br /&gt;
|  1h30&lt;br /&gt;
|  x&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| Tests et débuggage&lt;br /&gt;
|  x&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  1h&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  3h&lt;br /&gt;
|  4h&lt;br /&gt;
|  0,5h&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Optimisation/Correction des programmes&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Avancement du Projet'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Phase préparatoire'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Jeu 21/09/17 - Ven 22/09/17]]'' &lt;br /&gt;
*Rendez-vous de mise au point du cahier des charges avec les encadrants/intervenants (M. ZHENG Gang et M. DAGHER Roudy)&lt;br /&gt;
*Elaboration du cahier des charges&lt;br /&gt;
*Elaboration de la page Wiki (préparation de la mise en page et présentation du sujet)&lt;br /&gt;
*Préparation du travail sous forme de Mind Map&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous nous sommes tout d’abord rendus au laboratoire de l'INRIA afin de pouvoir définir le plus précisément possible le cahier des charges avec nos tuteurs.&lt;br /&gt;
Nous avons donc défini avec eux les technologies qu'il faudrait étudier. Vous retrouverez le choix des technologies dans la partie '''choix technologiques'''&lt;br /&gt;
&lt;br /&gt;
Nous avons en même temps créé notre page Wiki, et structuré celui-ci avec les parties qui nous seraient utiles pour développer nos explications par la suite.&lt;br /&gt;
&lt;br /&gt;
Nous avons de plus découpé le travail en sous-parties que nous avions mis dans un '''Mind map''' afin d'y voir plus clair sur la ligne à suivre.&lt;br /&gt;
&lt;br /&gt;
Vous trouverez ce Mind map juste ci-dessous. Nous ne mettrons pas à jour ce Mind map chaque semaine mais il est fort probable que nous en referions un en milieu de projet pour pouvoir cibler les objectifs réussis et ceux à atteindre. Nous pourrons de plus redéfinir certains objectifs qui nous aurait semblé trop vague au début du projet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Projet de fin d'étude.png|centre|600px]]&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 1'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Jeu 28/09/17 - Ven 29/09/17]]'' &lt;br /&gt;
*Revue du Cahier des Charges avec les encadrants&lt;br /&gt;
*Lecture et recherches sur les technologies adaptées&lt;br /&gt;
*Construction de la suite de la Mind Map&lt;br /&gt;
*Création du Gitlab&lt;br /&gt;
&lt;br /&gt;
Nous commençons les recherches sur le projet et sur les premières technologies engagées dans celui-ci. Nous en profitons pour formuler des à présent des questions sur le bon choix de celles-ci. Nous commençons donc des tests ayant seulement pour but de nous familiariser avec l'environnement de travail et de réellement comprendre les fonctions déjà présentes qu'il faudra exploiter et implanter notre interface web.&lt;br /&gt;
Nous créons un gitlab avec notre tuteur et commençons a définir les taches premières sur celui-ci.&lt;br /&gt;
Nous en profitons pour affiner le Mind Map.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 2'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Jeu 05/10/17 - Ven 06/10/17]]''  &lt;br /&gt;
*Précisions sur le cahier des charges&lt;br /&gt;
*Listage du matériel&lt;br /&gt;
*Recherche et détermination de solutions technologiques possibles pour les fonctions demandées&lt;br /&gt;
*Début du travail sur le serveur de collecte&lt;br /&gt;
*Apprentissage du langage Python et de l'utilisation du framework Flask&lt;br /&gt;
&lt;br /&gt;
Nous avons finalisé les précisions sur le cahier des charges. Nous avons donc pu cibler le matériel dont nous nous servirons pour ce Projet. Vous trouverez donc cette liste la section correspondante. Il est évident que le matériel utilisé est dans l'ensemble déjà fourni par le laboratoire et qu'il nous reste dans l'ensemble à créer l'interface web et les API qui nous permettrons de faire communiquer cette interface avec la Raspberrypi et le serveur de position déjà créé.&lt;br /&gt;
Nous avons donc pu commencer a ce former sur les technologies qui nous serviraient par la suite. Nous avaons donc utilisé le cours d'openclassroom sur les serveur flask pour en apprendre les bases. Ce serveur flask est programmé en python et nous permets donc une grande liberté au niveau de l’exécutions de certains scripts. En effet les script de connexion bluetooth et de redirection de port qui nous permette de recuperer les données de distance sont eux meme codé en python et sont directement appelé via le serveur.&lt;br /&gt;
Dans ce serveur, représentant notre interface web, vous retrouverez la page '''/collecte''' qui représentera notre partie collecte de données ainsi que l'affichage de ces distances. Nous appellerons cette partie le serveur de collecte.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 3'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 11/10/17 - Jeu 12/10/17]]''  &lt;br /&gt;
*Recherche et développement initial du serveur de collecte de données&lt;br /&gt;
*Complément du Git sur les tâches à effectuer&lt;br /&gt;
&lt;br /&gt;
Nous avons commencé à créer un serveur flask renvoyant pour l'instant une matrice aléatoire. Lors de la requête URL &amp;quot;../matrice&amp;quot;, nous voyons bien une matrice aléatoire apparaître sur la page Web. Nous essayons de nous connecter à la Raspberry Pi en redirigeant son port série vers le Bluetooth de façon à récupérer de vraies matrices de distance entre le drone (ie commutateur central) et les balises. Nous pourrons afficher ensuite ces matrices, ou alors les stocker dans un fichier en attendant le traitement de celles-ci.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Requete s3.PNG|300px|serveur flask]]&lt;br /&gt;
&lt;br /&gt;
Nous avons plusieurs problèmes avec le Bluetooth pour se connecter avec la Raspberry Pi. Quand nous aurons réussi à nous connecter au port série de la Raspberry pi alors nous pour gérer le traitement des données récupérées.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 4'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 18/10/17 - Jeu 19/10/17]]''  &lt;br /&gt;
*Configuration de la Raspberry Pi car problèmes de connectivité Bluetooth rencontrés&lt;br /&gt;
**Nous arrivons à connecter la Raspberry Pi sous Windows mais la connexion sous Linux pose problème (travail en suspens en attendant la disponibilité de l'encadrant)&lt;br /&gt;
*Début du développement de l'interface Web&lt;br /&gt;
**Traitement d'une matrice dans un fichier JSON&lt;br /&gt;
**Affichage sous forme de tableau de la matrice&lt;br /&gt;
**Utilisation du serveur de requête en Python avec chargement de template HTML&lt;br /&gt;
**Mise en forme de la trame de la page en HTML/CSS avec le framework Bootstrap&lt;br /&gt;
**Ajout d'un set de distances (d1, d2, d3, d4) dans la matrice lors d'un appui sur un bouton Chargement en utilisant un fichier Javascript&lt;br /&gt;
&lt;br /&gt;
Nous Avons reçus des fonctions pythons de notre tuteurs afin d'obtenir une connexion bluetooth entre notre raspberrypi et notre ordinateur ainsi qu'une redirection de port de celle ci vers la connexion. Nous n'arrivons pas à utiliser ces fonctions sous linux et nous necessitons une explication de notre tuteur n'etant pas disponible a ce moment. Pour ne pas perdre de temps nous nous attaquons la creation de l'interface web a proprement parler. c'est a dire la création des pages html ainsi que le document javascript qui nous servira de bibliotheque de fonctions.chaque route de notre serveur sont relié a une series de fonctions python s'executant a l'apelle des url puis suivis d'un template de la page HTML en question. Nous en profitons de plus pour explorer le framework CSS bootstrap afin de mettre un premier design et une structure a notre page collecte qui sera la page principale de notre site pour ce début de projet.&lt;br /&gt;
&lt;br /&gt;
Nous nous essayons de plus à différents tests sur des fichiers de format '''Json''' que nous devrons réussir à traiter correctement plus tard dans notre projet.&lt;br /&gt;
Nous récupérons une matrice que nous créons nous même en python (simulation d'une série de distances récupérée) que nous transformons au format Json pour ensuite l'afficher sur notre page web. Pour pouvoir proprement afficher se fichier '''Json''' renvoyé vers notre page, nous nous servons du fichier javascript afin de créer du code html contenant la matrice.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 5'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 25/10/17 - Ven 27/10/17]]''  &lt;br /&gt;
*Résolution des problèmes de connectique Bluetooth sur la Raspberry Pi&lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Traitement d'une matrice dans un fichier JSON&lt;br /&gt;
**Début de l'ajout d'un set de distances depuis une matrice contenue dans un fichier JSON&lt;br /&gt;
&lt;br /&gt;
Nous avons pu nous entretenir avec notre tuteur et donc comprendre les fonctions de connexion et de redirection de port. Nous pouvons donc continuer le développement de notre interface web. Nous arrivons à traiter un set de donné au format json et à l'afficher dans le code html. Toutefois nous créons nous mème ce set, il est maintenant nécessaire que nous arrivions à récupérer les set de distance réels reçus par la connexions bluetooth. Nous commencerons par un traitement asynchrone. L'idée est d’enregistrer les sets de distances dans un fichier '''Json''' stocké dans un dossier. Nous appellerons ce dossier plus tard via une requête ajax.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 6'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 08/11/17 - Ven 10/11/17]]''  &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
**Mise en place de la communication entre le port série de notre machine et le port série de la carte via Bluetooth de la RPi3&lt;br /&gt;
**Récupération et traitement (parse) manuels des données de distances dans un fichier .log via TCP/IP&amp;lt;-&amp;gt;Bluetooth&lt;br /&gt;
**Début de l'automatisation du procédé par script Python (requete.py) et mise en place de sockets de communication&lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Chargement sur commande d'un set de distances depuis une matrice contenue dans un fichier JSON&lt;br /&gt;
*Travail sur le layout du site&lt;br /&gt;
&lt;br /&gt;
Après avoir regardé le code de ces différentes fonctions nous avons pu faire des test manuels via le shell pour récupérer des données de distances et les stocker dans un fichier '''Json''' sur notre ordinateur.&lt;br /&gt;
&lt;br /&gt;
Nous utilisons les commandes suivante pour se connecter via bluetooth:&lt;br /&gt;
&lt;br /&gt;
 ///////////////////&lt;br /&gt;
&lt;br /&gt;
Rediriger le port de la raspberrypi3 vers la connexion:&lt;br /&gt;
&lt;br /&gt;
 ////////////////////&lt;br /&gt;
&lt;br /&gt;
Collecter la données dans un fichier dont nous définissons le nom:&lt;br /&gt;
&lt;br /&gt;
 ////////////////////&lt;br /&gt;
&lt;br /&gt;
Nous pouvons '''parser''' le flux de donner avant de le stocker dans le fichier via cette commande:&lt;br /&gt;
&lt;br /&gt;
 ////////////////////&lt;br /&gt;
&lt;br /&gt;
Il est donc nécessaire d'inclure via des '''thread''' ces différente fonctions dans notre serveur python (Flask) afin d'automatiser le processus. Le but est de pouvoir choisir sur l'interface web quels fonctions il faut exécuter et les déclencher via l'appuie sur des boutons.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 7'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 15/11/17 - Ven 17/11/17]]''  &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
**Récupération et traitement (parse) manuels des données de distances dans un fichier .log via TCP/IP&amp;lt;-&amp;gt;Bluetooth&lt;br /&gt;
**Automatisation du procédé par script Python (requete.py)&lt;br /&gt;
***Mise en place de sockets de communication pour le contrôle de la collecte -&amp;gt; abandonné (servait à commander la collecte manuellement)&lt;br /&gt;
***Développement d'un script engine.py regroupant les commandes exécutables par l'utilisateur via la page Web&lt;br /&gt;
***Début du travail sur la fonction &amp;quot;STOP&amp;quot; manuel d'une action de collecte de données (liaison entre script html, javascript, et script python)&lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Chargement sur commande d'un set de distances depuis une matrice contenue dans un fichier JSON&lt;br /&gt;
**Travail sur le layout du site&lt;br /&gt;
***Ajout des différentes commandes (connexion bluetooth, lancement commande cu, collecte des données, collecte durée donnée)&lt;br /&gt;
***Début de l'implémentation de la visualisation des fichiers .json obtenus après collecte et affichage dans un tableau matriciel du fichier sélectionné&lt;br /&gt;
&lt;br /&gt;
Nous avons continuez a travaillez sur le serveur de collecte: Les données que nous savons récupérer via bluetooth sont stockée dans un fichier .log. Apres avoir bien compris comment marchait la fonction '''parse''' manuellement( lors de son utilisation dans le shell, nous l'avons implanter dans notre serveur de collecte qui lance cette commande lors de l’appuie sur un bouton via notre interface virtuelle. Un problème rencontré était de savoir quand la récolte des données devait s’arrêté. nous avons donc rajouté un temps à entré nous même sur l'interface. La fonction '''parse''' est effectué commence et le sous processus va attendre le temps donné avant de lancer une commande permettant de tuer le processus et mettant donc fin au remplissage du fichier '''.log'''. Nous voulons de plus réussir à lancer une fonction de collecte sans temps. c'est à dire que nous coupons la collecte via un bouton par nous même. nous voulions utiliser des Sockets pour pouvoir définir nous même la gestions de la communication mais l'idée a été abandonné car nous avons réussi a sauvegarder le PID du processus lancé. Il nous suffit donc de l’arrêter grâce à un autre bouton qui récupère cette variable et l’arrête ensuite. &lt;br /&gt;
&lt;br /&gt;
Toutes nos fonctions pythons étant regroupées dans notre serveur '''requete.py''' nous avons décidé de créé un module qui regroupera toutes ces fonction que nous pourrons utilisé dans '''requete.py'''. ceci nous permet de voir plus claire dans notre code et de faciliter le travail lorsque nous modifions le code tous les deux.&lt;br /&gt;
&lt;br /&gt;
Nous essayons en continues d'adapter le layout du site pour le rendre le plus attractif et simple possible. de facon a ce que chaque bouton et tableau soient claires et compréhensibles.&lt;br /&gt;
&lt;br /&gt;
Nous avons commencé à récupéré les fichier '''json''' créé à partir des fichier '''log'''. c'est a dire que ces fichiers sont automatiquement stockés coté serveur dans un dossier nommé '''static/log'''. Notre but est de récupérer le nom des fichier json et de les afficher dans un composant sur notre interface web. il nous sera donc possible ensuite de sélectionner le nom d'un fichier. lors de la sélection de ce nom de fichier, un tableau apparaît avec les valeurs de distances à l’intérieur.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 8'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 22/11/17 - Ven 24/11/17]]''  &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
**Automatisation du procédé de collecte par script Python (requete.py qui fait appel à engine.py)&lt;br /&gt;
***Développement d'un script engine.py regroupant les commandes exécutables par l'utilisateur via la page Web&lt;br /&gt;
***Travail sur la fonction &amp;quot;STOP&amp;quot; manuel d'une action de collecte de données (liaison entre script html, javascript, et script python)&lt;br /&gt;
***Mise en place d'un serveur HTTP Simple sous Python pour accéder aux fichiers de données à partir de la page Web&lt;br /&gt;
***Mise à jour de fonctions de connexion &lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Travail sur le layout du site (ajout de pages, navigation entre les pages, apparence, nettoyage des codes)&lt;br /&gt;
**Bon fonctionnement de l'ensemble serveur collecte + serveur HTTP + client Web&lt;br /&gt;
**Affichage de la liste des fichiers de données de distance (log, csv, json) via serveur HTTP en Python sur port 9999&lt;br /&gt;
*Corrections et nettoyage du dépôt GIT&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 9'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 29/11/17 - Jeudi 30/11/17]]''  &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
**Automatisation du procédé de collecte par script Python (requete.py qui fait appel à engine.py)&lt;br /&gt;
***Travail sur la fonction &amp;quot;STOP&amp;quot; manuel d'une action de collecte de données (liaison entre script html, javascript, et script python)&lt;br /&gt;
***Recherches sur l'utilisation de fichiers json accessibles via le serveur HTTP&lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Travail sur le layout du site &lt;br /&gt;
**Travail sur la liaison entre fichiers json et affichage Web des données de distance&lt;br /&gt;
***Recherches et tests de solutions&lt;br /&gt;
****Affichage depuis un fichier&lt;br /&gt;
****Affichage à la volée lors d'une action de collecte&lt;br /&gt;
&lt;br /&gt;
*Revue de code avec Roudy DAGHER:&lt;br /&gt;
**Structure globale des codes ok&lt;br /&gt;
**Fonctionnement presque ok: fonctionnalités implémentées ok, mais parsage csv ne marche pas&lt;br /&gt;
**Refactoring nécessaire&lt;br /&gt;
**Correction de la fonction STOP et amélioration de la fonction de COLLECTE&lt;br /&gt;
**Faire plus de requêtes Javascript que de requêtes HTML&lt;br /&gt;
**Discussion pour l'implémentation du serveur de localisation (= algorithme de localisation) et des visualisations de données sur le site Web&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Observations'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Problèmes rencontrés'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Solutions apportées'''&amp;lt;/span&amp;gt;===&lt;/div&gt;</summary>
		<author><name>Hdelatte</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=P18_Localisation_of_quadrotors&amp;diff=46774</id>
		<title>P18 Localisation of quadrotors</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=P18_Localisation_of_quadrotors&amp;diff=46774"/>
				<updated>2017-12-07T14:37:42Z</updated>
		
		<summary type="html">&lt;p&gt;Hdelatte : /* Semaine 6 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Cahier des charges'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;Présentation générale du projet&amp;lt;/span&amp;gt;=== &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Contexte&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
Dans un monde de plus en plus connecté, de nombreux drones sont déployés pour diverses applications comme l'espionnage, la surveillance, la cartographie de lieux et la livraison de colis. Les technologies nécessaires pour contrôler ces drones sont des sujets de recherche actuels. &lt;br /&gt;
&lt;br /&gt;
Le contrôle de ceux-ci passe tout d'abord par la maîtrise de leur position dans l'espace. Le développement des applications liées à l'utilisation de drones nécessite un travail important sur la localisation spatiale d'objets connectés. &lt;br /&gt;
&lt;br /&gt;
De plus, dans un souci d'utilisation, il est essentiel de développer des interfaces logicielles permettant d'exploiter ces données.&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Objectif du projet&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
L'objectif de ce projet est de développer une interface logicielle permettant de traiter en temps réel les informations de localisation d'un drone et de balises, dans le but de définir leur localisation dans l'espace, en intérieur.&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Description du projet&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
Pour réaliser le contrôle de drones, la première étape importante est de donner ses informations de position. Le but du projet est de développer une interface logicielle permettant de localiser le drone en temps réel en intérieur. Le drone se déplace dans un environnement dans lequel ont été installées de multiples balises. Il est équipé d'une carte, lui permettant de recevoir les distances relatives entre lui-même et les balises, sur laquelle différents algorithmes vont être implémentés pour effectuer la localisation en temps réel. Le projet requiert des compétences en développement hardware (Crazyflie 2.0, voir https://wiki.bitcraze.io/) et software (langage C/C++/Python/Javascript/HTML...).&lt;br /&gt;
&lt;br /&gt;
Il se divise en 4 étapes principales, qui sont:&lt;br /&gt;
*1) Choisir les technologies utilisées&lt;br /&gt;
*2) Choisir l'architecture (OS / APIs)&lt;br /&gt;
*3) Développer les différentes parties du projet&lt;br /&gt;
*4) Intégrer et connecter les différentes parties du projet&lt;br /&gt;
&lt;br /&gt;
La localisation étant en intérieur, le protocole GPS n'est donc pas assez précis pour les applications ciblées. La mise en place d'un tel dispositif permettrait grâce à l'utilisation d'un algorithme d'estimer avec une bonne précision les positions en intérieur d'une balise centrale (appelée Tag) et de balises (appelées Anchor). Le Tag scanne en temps réel la distance relative aux différentes balises, et il nous est retourné la position des balises et du Tag grâce à l'algorithme de localisation.&lt;br /&gt;
&lt;br /&gt;
Le projet se compose de 3 parties:&lt;br /&gt;
* Collect &amp;amp; parse: collecter les données envoyées par les balises en communiquant avec un serveur et récupérer les données adéquates par un tri&lt;br /&gt;
* Localise: déterminer la matrice de position des balises et du Tag en traitant les données récupérées&lt;br /&gt;
* Display: développer l'interface homme machine pour afficher, étudier et utiliser les données traitées&lt;br /&gt;
&lt;br /&gt;
Nous travaillerons dans un premier temps dans une optique temps différé avant de travailler en temps réel. Cela nous permettra d'acquérir des données utiles et réutilisables en aval. &lt;br /&gt;
&lt;br /&gt;
A l'aboutissement du projet, nous devrions être capable via l'interface homme machine développée d'afficher précisément la position spatiale des balises ainsi que du Tag, grâce àl'utilisation d'un algorithme de localisation et des données récupérées, et d'afficher d'autres données relatives au déplacement du Tag ou des balises dans l'espace. &lt;br /&gt;
&lt;br /&gt;
Si le temps le permet, nous pourrons aussi être amenés à adapter et utiliser l'interface développée pour l'utilisation d'un drone.&lt;br /&gt;
&lt;br /&gt;
''Sujet originel''&lt;br /&gt;
&lt;br /&gt;
To achieve the control of quadrotors, the first important task to give its position information. This project is to develop a software(GUI) to localize the quadrotors in real-time. The quadrotor is flying in an environment where several transmitters have been installed. The quadrotor is equipped with a deck to receive the relative distances between the deck and all transmitters, based on which different algorithms will be implemented to realize the real-time localization. The candidates need to have both experiences on hardware (Crazyflie 2.0, see https://wiki.bitcraze.io/) and software development (C/C , Python…). &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Calendrier&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
''[[Avant le 29/09/17]]'' - Élaboration du Cahier des charges, de la liste des tâches et du calendrier prévisionnel&lt;br /&gt;
&lt;br /&gt;
''[[Avant fin Octobre]]'' - Serveur de collecte et début du développement de l'interface logicielle&lt;br /&gt;
&lt;br /&gt;
''[[Avant fin Décembre]]'' - Interface logicielle&lt;br /&gt;
&lt;br /&gt;
''[[A la fin du PFE]]'' - Intégration finale des différentes parties (Serveur de collecte des données &amp;amp; Serveur de localisation &amp;amp; Interface logicielle)&lt;br /&gt;
&lt;br /&gt;
Répartition du volume de travail (***h):&lt;br /&gt;
&lt;br /&gt;
* Recherche sur les technologies à utiliser (**h)&lt;br /&gt;
* Développement du serveur de collecte de données (**h)&lt;br /&gt;
* Réalisation de l'interface logicielle (Web//Logiciel/Application) (**h)&lt;br /&gt;
* Intégration des différentes parties (**h)&lt;br /&gt;
* Test et débuggage (**h)&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Choix techniques : matériel et logiciel&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
Afin de développer ce dispositif, nous allons utiliser une Raspberry Pi 3 associée à une carte réceptrice, qui communique avec 4 balises composées chacune d'un microcontrôleur et d'une carte émettrice radio (UWB5C) et alimentées par batteries. La carte réceptrice joue le rôle du drone à localiser et communiquera les données émises par les balises vers l'ordinateur via Bluetooth.&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Choix technologiques&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
Voici les technologies que nous utilisons pour chacune des parties de ce projet.&lt;br /&gt;
&lt;br /&gt;
    1) Serveur de collecte des données:&lt;br /&gt;
       Scanne et parse les données récupérées pour fournir la matrice D des distances relatives du tag aux 4 balises&lt;br /&gt;
        - API&lt;br /&gt;
        - Python / Serveur Flask&lt;br /&gt;
&lt;br /&gt;
    2) Serveur de localisation (fourni):&lt;br /&gt;
       Calcule grâce à l'algorithme de localisation et la matrice D les positions spatiales des 4 noeuds et du tag&lt;br /&gt;
        - API&lt;br /&gt;
        - Bootstrap&lt;br /&gt;
        - Jquery&lt;br /&gt;
        - Python&lt;br /&gt;
&lt;br /&gt;
    3) Interface utilisateur:&lt;br /&gt;
       Affiche courbes, visualisation 3D, boutons ou données des fichiers envoyées par le serveur de localisation&lt;br /&gt;
        - HTML5 / Javascript&lt;br /&gt;
        - Fichiers JSON (serveurs de collecte et de localisation)&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Calendrier prévisionnel'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Liste des tâches à effectuer&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
# Se documenter sur le projet&lt;br /&gt;
##Langages et technologies utilisées&lt;br /&gt;
##Matériel utilisé&lt;br /&gt;
##Mettre en place du travail sur le Git&lt;br /&gt;
# Réaliser le serveur de collecte&lt;br /&gt;
##Récupérer les trames envoyées par bluetooth par le TAG via la Raspberry Pi&lt;br /&gt;
##Intégrer le serveur de localisation pour interpréter les trames&lt;br /&gt;
##Tester et optimiser&lt;br /&gt;
# Réaliser l'interface Web utilisateur&lt;br /&gt;
##Implémenter le serveur de collecte et de localisation&lt;br /&gt;
##Afficher et traiter les données stockées dans les fichiers JSON via le serveur (temps différé + temps réel)&lt;br /&gt;
##Tester et optimiser&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;Replanification du cahier des charges / calendrier&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Feuille d'heures'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Tâche !! Prélude !! Heures S1 !! Heures S2 !! Heures S3 !! Heures S4 !! Heures S5 !! Heures S6 !! Heures S7 !! Heures S8 !! Heures S9 !! Heures S10 !! Heures S11 !! Heures S12 !! Après Noël !! Total&lt;br /&gt;
|-&lt;br /&gt;
| Cahier des charges / Wiki / Gitlab&lt;br /&gt;
|  4h&lt;br /&gt;
|  3h&lt;br /&gt;
|  1h&lt;br /&gt;
|  x&lt;br /&gt;
|  1h30&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h30&lt;br /&gt;
|  1h&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Documentation sur les technos utilisées&lt;br /&gt;
|  2h&lt;br /&gt;
|  4h&lt;br /&gt;
|  3h&lt;br /&gt;
|  2h&lt;br /&gt;
|  3h&lt;br /&gt;
|  4h&lt;br /&gt;
|  5h&lt;br /&gt;
|  5h30&lt;br /&gt;
|  4h30&lt;br /&gt;
|  3h30&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Documentation sur le matériel&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Recherche et développement du serveur de collecte&lt;br /&gt;
|  x&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  3h&lt;br /&gt;
|  3h30&lt;br /&gt;
|  4h&lt;br /&gt;
|  5h&lt;br /&gt;
|  7h&lt;br /&gt;
|  4h30&lt;br /&gt;
|  0,5h&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| Recherche et développement de l'interface Web&lt;br /&gt;
|  x&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  3h&lt;br /&gt;
|  5h&lt;br /&gt;
|  6h&lt;br /&gt;
|  4h&lt;br /&gt;
|  7h&lt;br /&gt;
|  5h30&lt;br /&gt;
|  2h30&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| Recherche et intégration du serveur de localisation&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x &lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| Intégration des différentes parties&lt;br /&gt;
|  x&lt;br /&gt;
|  x  &lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  2h&lt;br /&gt;
|  2h&lt;br /&gt;
|  2h&lt;br /&gt;
|  3h&lt;br /&gt;
|  1h30&lt;br /&gt;
|  x&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| Tests et débuggage&lt;br /&gt;
|  x&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  1h&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  3h&lt;br /&gt;
|  4h&lt;br /&gt;
|  0,5h&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Optimisation/Correction des programmes&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Avancement du Projet'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Phase préparatoire'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Jeu 21/09/17 - Ven 22/09/17]]'' &lt;br /&gt;
*Rendez-vous de mise au point du cahier des charges avec les encadrants/intervenants (M. ZHENG Gang et M. DAGHER Roudy)&lt;br /&gt;
*Elaboration du cahier des charges&lt;br /&gt;
*Elaboration de la page Wiki (préparation de la mise en page et présentation du sujet)&lt;br /&gt;
*Préparation du travail sous forme de Mind Map&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous nous sommes tout d’abord rendus au laboratoire de l'INRIA afin de pouvoir définir le plus précisément possible le cahier des charges avec nos tuteurs.&lt;br /&gt;
Nous avons donc défini avec eux les technologies qu'il faudrait étudier. Vous retrouverez le choix des technologies dans la partie '''choix technologiques'''&lt;br /&gt;
&lt;br /&gt;
Nous avons en même temps créé notre page Wiki, et structuré celui-ci avec les parties qui nous seraient utiles pour développer nos explications par la suite.&lt;br /&gt;
&lt;br /&gt;
Nous avons de plus découpé le travail en sous-parties que nous avions mis dans un '''Mind map''' afin d'y voir plus clair sur la ligne à suivre.&lt;br /&gt;
&lt;br /&gt;
Vous trouverez ce Mind map juste ci-dessous. Nous ne mettrons pas à jour ce Mind map chaque semaine mais il est fort probable que nous en referions un en milieu de projet pour pouvoir cibler les objectifs réussis et ceux à atteindre. Nous pourrons de plus redéfinir certains objectifs qui nous aurait semblé trop vague au début du projet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Projet de fin d'étude.png|centre|600px]]&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 1'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Jeu 28/09/17 - Ven 29/09/17]]'' &lt;br /&gt;
*Revue du Cahier des Charges avec les encadrants&lt;br /&gt;
*Lecture et recherches sur les technologies adaptées&lt;br /&gt;
*Construction de la suite de la Mind Map&lt;br /&gt;
*Création du Gitlab&lt;br /&gt;
&lt;br /&gt;
Nous commençons les recherches sur le projet et sur les premières technologies engagées dans celui-ci. Nous en profitons pour formuler des à présent des questions sur le bon choix de celles-ci. Nous commençons donc des tests ayant seulement pour but de nous familiariser avec l'environnement de travail et de réellement comprendre les fonctions déjà présentes qu'il faudra exploiter et implanter notre interface web.&lt;br /&gt;
Nous créons un gitlab avec notre tuteur et commençons a définir les taches premières sur celui-ci.&lt;br /&gt;
Nous en profitons pour affiner le Mind Map.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 2'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Jeu 05/10/17 - Ven 06/10/17]]''  &lt;br /&gt;
*Précisions sur le cahier des charges&lt;br /&gt;
*Listage du matériel&lt;br /&gt;
*Recherche et détermination de solutions technologiques possibles pour les fonctions demandées&lt;br /&gt;
*Début du travail sur le serveur de collecte&lt;br /&gt;
*Apprentissage du langage Python et de l'utilisation du framework Flask&lt;br /&gt;
&lt;br /&gt;
Nous avons finalisé les précisions sur le cahier des charges. Nous avons donc pu cibler le matériel dont nous nous servirons pour ce Projet. Vous trouverez donc cette liste la section correspondante. Il est évident que le matériel utilisé est dans l'ensemble déjà fourni par le laboratoire et qu'il nous reste dans l'ensemble à créer l'interface web et les API qui nous permettrons de faire communiquer cette interface avec la Raspberrypi et le serveur de position déjà créé.&lt;br /&gt;
Nous avons donc pu commencer a ce former sur les technologies qui nous serviraient par la suite. Nous avaons donc utilisé le cours d'openclassroom sur les serveur flask pour en apprendre les bases. Ce serveur flask est programmé en python et nous permets donc une grande liberté au niveau de l’exécutions de certains scripts. En effet les script de connexion bluetooth et de redirection de port qui nous permette de recuperer les données de distance sont eux meme codé en python et sont directement appelé via le serveur.&lt;br /&gt;
Dans ce serveur, représentant notre interface web, vous retrouverez la page '''/collecte''' qui représentera notre partie collecte de données ainsi que l'affichage de ces distances. Nous appellerons cette partie le serveur de collecte.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 3'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 11/10/17 - Jeu 12/10/17]]''  &lt;br /&gt;
*Recherche et développement initial du serveur de collecte de données&lt;br /&gt;
*Complément du Git sur les tâches à effectuer&lt;br /&gt;
&lt;br /&gt;
Nous avons commencé à créer un serveur flask renvoyant pour l'instant une matrice aléatoire. Lors de la requête URL &amp;quot;../matrice&amp;quot;, nous voyons bien une matrice aléatoire apparaître sur la page Web. Nous essayons de nous connecter à la Raspberry Pi en redirigeant son port série vers le Bluetooth de façon à récupérer de vraies matrices de distance entre le drone (ie commutateur central) et les balises. Nous pourrons afficher ensuite ces matrices, ou alors les stocker dans un fichier en attendant le traitement de celles-ci.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Requete s3.PNG|300px|serveur flask]]&lt;br /&gt;
&lt;br /&gt;
Nous avons plusieurs problèmes avec le Bluetooth pour se connecter avec la Raspberry Pi. Quand nous aurons réussi à nous connecter au port série de la Raspberry pi alors nous pour gérer le traitement des données récupérées.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 4'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 18/10/17 - Jeu 19/10/17]]''  &lt;br /&gt;
*Configuration de la Raspberry Pi car problèmes de connectivité Bluetooth rencontrés&lt;br /&gt;
**Nous arrivons à connecter la Raspberry Pi sous Windows mais la connexion sous Linux pose problème (travail en suspens en attendant la disponibilité de l'encadrant)&lt;br /&gt;
*Début du développement de l'interface Web&lt;br /&gt;
**Traitement d'une matrice dans un fichier JSON&lt;br /&gt;
**Affichage sous forme de tableau de la matrice&lt;br /&gt;
**Utilisation du serveur de requête en Python avec chargement de template HTML&lt;br /&gt;
**Mise en forme de la trame de la page en HTML/CSS avec le framework Bootstrap&lt;br /&gt;
**Ajout d'un set de distances (d1, d2, d3, d4) dans la matrice lors d'un appui sur un bouton Chargement en utilisant un fichier Javascript&lt;br /&gt;
&lt;br /&gt;
Nous Avons reçus des fonctions pythons de notre tuteurs afin d'obtenir une connexion bluetooth entre notre raspberrypi et notre ordinateur ainsi qu'une redirection de port de celle ci vers la connexion. Nous n'arrivons pas à utiliser ces fonctions sous linux et nous necessitons une explication de notre tuteur n'etant pas disponible a ce moment. Pour ne pas perdre de temps nous nous attaquons la creation de l'interface web a proprement parler. c'est a dire la création des pages html ainsi que le document javascript qui nous servira de bibliotheque de fonctions.chaque route de notre serveur sont relié a une series de fonctions python s'executant a l'apelle des url puis suivis d'un template de la page HTML en question. Nous en profitons de plus pour explorer le framework CSS bootstrap afin de mettre un premier design et une structure a notre page collecte qui sera la page principale de notre site pour ce début de projet.&lt;br /&gt;
&lt;br /&gt;
Nous nous essayons de plus à différents tests sur des fichiers de format '''Json''' que nous devrons réussir à traiter correctement plus tard dans notre projet.&lt;br /&gt;
Nous récupérons une matrice que nous créons nous même en python (simulation d'une série de distances récupérée) que nous transformons au format Json pour ensuite l'afficher sur notre page web. Pour pouvoir proprement afficher se fichier '''Json''' renvoyé vers notre page, nous nous servons du fichier javascript afin de créer du code html contenant la matrice.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 5'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 25/10/17 - Ven 27/10/17]]''  &lt;br /&gt;
*Résolution des problèmes de connectique Bluetooth sur la Raspberry Pi&lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Traitement d'une matrice dans un fichier JSON&lt;br /&gt;
**Début de l'ajout d'un set de distances depuis une matrice contenue dans un fichier JSON&lt;br /&gt;
&lt;br /&gt;
Nous avons pu nous entretenir avec notre tuteur et donc comprendre les fonctions de connexion et de redirection de port. Nous pouvons donc continuer le développement de notre interface web. Nous arrivons à traiter un set de donné au format json et à l'afficher dans le code html. Toutefois nous créons nous mème ce set, il est maintenant nécessaire que nous arrivions à récupérer les set de distance réels reçus par la connexions bluetooth. Nous commencerons par un traitement asynchrone. L'idée est d’enregistrer les sets de distances dans un fichier '''Json''' stocké dans un dossier. Nous appellerons ce dossier plus tard via une requête ajax.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 6'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 08/11/17 - Ven 10/11/17]]''  &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
**Mise en place de la communication entre le port série de notre machine et le port série de la carte via Bluetooth de la RPi3&lt;br /&gt;
**Récupération et traitement (parse) manuels des données de distances dans un fichier .log via TCP/IP&amp;lt;-&amp;gt;Bluetooth&lt;br /&gt;
**Début de l'automatisation du procédé par script Python (requete.py) et mise en place de sockets de communication&lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Chargement sur commande d'un set de distances depuis une matrice contenue dans un fichier JSON&lt;br /&gt;
*Travail sur le layout du site&lt;br /&gt;
&lt;br /&gt;
Après avoir regardé le code de ces différentes fonctions nous avons pu faire des test manuels via le shell pour récupérer des données de distances et les stocker dans un fichier '''Json''' sur notre ordinateur.&lt;br /&gt;
&lt;br /&gt;
Nous utilisons les commandes suivante pour se connecter via bluetooth:&lt;br /&gt;
&lt;br /&gt;
 ///////////////////&lt;br /&gt;
&lt;br /&gt;
Rediriger le port de la raspberrypi3 vers la connexion:&lt;br /&gt;
&lt;br /&gt;
 ////////////////////&lt;br /&gt;
&lt;br /&gt;
Collecter la données dans un fichier dont nous définissons le nom:&lt;br /&gt;
&lt;br /&gt;
 ////////////////////&lt;br /&gt;
&lt;br /&gt;
Nous pouvons '''parser''' le flux de donner avant de le stocker dans le fichier via cette commande:&lt;br /&gt;
&lt;br /&gt;
 ////////////////////&lt;br /&gt;
&lt;br /&gt;
Il est donc nécessaire d'inclure via des '''thread''' ces différente fonctions dans notre serveur python (Flask) afin d'automatiser le processus. Le but est de pouvoir choisir sur l'interface web quels fonctions il faut exécuter et les déclencher via l'appuie sur des boutons.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 7'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 15/11/17 - Ven 17/11/17]]''  &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
**Récupération et traitement (parse) manuels des données de distances dans un fichier .log via TCP/IP&amp;lt;-&amp;gt;Bluetooth&lt;br /&gt;
**Automatisation du procédé par script Python (requete.py)&lt;br /&gt;
***Mise en place de sockets de communication pour le contrôle de la collecte -&amp;gt; abandonné (servait à commander la collecte manuellement)&lt;br /&gt;
***Développement d'un script engine.py regroupant les commandes exécutables par l'utilisateur via la page Web&lt;br /&gt;
***Début du travail sur la fonction &amp;quot;STOP&amp;quot; manuel d'une action de collecte de données (liaison entre script html, javascript, et script python)&lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Chargement sur commande d'un set de distances depuis une matrice contenue dans un fichier JSON&lt;br /&gt;
**Travail sur le layout du site&lt;br /&gt;
***Ajout des différentes commandes (connexion bluetooth, lancement commande cu, collecte des données, collecte durée donnée)&lt;br /&gt;
***Début de l'implémentation de la visualisation des fichiers .json obtenus après collecte et affichage dans un tableau matriciel du fichier sélectionné&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 8'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 22/11/17 - Ven 24/11/17]]''  &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
**Automatisation du procédé de collecte par script Python (requete.py qui fait appel à engine.py)&lt;br /&gt;
***Développement d'un script engine.py regroupant les commandes exécutables par l'utilisateur via la page Web&lt;br /&gt;
***Travail sur la fonction &amp;quot;STOP&amp;quot; manuel d'une action de collecte de données (liaison entre script html, javascript, et script python)&lt;br /&gt;
***Mise en place d'un serveur HTTP Simple sous Python pour accéder aux fichiers de données à partir de la page Web&lt;br /&gt;
***Mise à jour de fonctions de connexion &lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Travail sur le layout du site (ajout de pages, navigation entre les pages, apparence, nettoyage des codes)&lt;br /&gt;
**Bon fonctionnement de l'ensemble serveur collecte + serveur HTTP + client Web&lt;br /&gt;
**Affichage de la liste des fichiers de données de distance (log, csv, json) via serveur HTTP en Python sur port 9999&lt;br /&gt;
*Corrections et nettoyage du dépôt GIT&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 9'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 29/11/17 - Jeudi 30/11/17]]''  &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
**Automatisation du procédé de collecte par script Python (requete.py qui fait appel à engine.py)&lt;br /&gt;
***Travail sur la fonction &amp;quot;STOP&amp;quot; manuel d'une action de collecte de données (liaison entre script html, javascript, et script python)&lt;br /&gt;
***Recherches sur l'utilisation de fichiers json accessibles via le serveur HTTP&lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Travail sur le layout du site &lt;br /&gt;
**Travail sur la liaison entre fichiers json et affichage Web des données de distance&lt;br /&gt;
***Recherches et tests de solutions&lt;br /&gt;
****Affichage depuis un fichier&lt;br /&gt;
****Affichage à la volée lors d'une action de collecte&lt;br /&gt;
&lt;br /&gt;
*Revue de code avec Roudy DAGHER:&lt;br /&gt;
**Structure globale des codes ok&lt;br /&gt;
**Fonctionnement presque ok: fonctionnalités implémentées ok, mais parsage csv ne marche pas&lt;br /&gt;
**Refactoring nécessaire&lt;br /&gt;
**Correction de la fonction STOP et amélioration de la fonction de COLLECTE&lt;br /&gt;
**Faire plus de requêtes Javascript que de requêtes HTML&lt;br /&gt;
**Discussion pour l'implémentation du serveur de localisation (= algorithme de localisation) et des visualisations de données sur le site Web&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Observations'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Problèmes rencontrés'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Solutions apportées'''&amp;lt;/span&amp;gt;===&lt;/div&gt;</summary>
		<author><name>Hdelatte</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=P18_Localisation_of_quadrotors&amp;diff=46773</id>
		<title>P18 Localisation of quadrotors</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=P18_Localisation_of_quadrotors&amp;diff=46773"/>
				<updated>2017-12-07T14:29:25Z</updated>
		
		<summary type="html">&lt;p&gt;Hdelatte : /* Semaine 5 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Cahier des charges'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;Présentation générale du projet&amp;lt;/span&amp;gt;=== &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Contexte&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
Dans un monde de plus en plus connecté, de nombreux drones sont déployés pour diverses applications comme l'espionnage, la surveillance, la cartographie de lieux et la livraison de colis. Les technologies nécessaires pour contrôler ces drones sont des sujets de recherche actuels. &lt;br /&gt;
&lt;br /&gt;
Le contrôle de ceux-ci passe tout d'abord par la maîtrise de leur position dans l'espace. Le développement des applications liées à l'utilisation de drones nécessite un travail important sur la localisation spatiale d'objets connectés. &lt;br /&gt;
&lt;br /&gt;
De plus, dans un souci d'utilisation, il est essentiel de développer des interfaces logicielles permettant d'exploiter ces données.&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Objectif du projet&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
L'objectif de ce projet est de développer une interface logicielle permettant de traiter en temps réel les informations de localisation d'un drone et de balises, dans le but de définir leur localisation dans l'espace, en intérieur.&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Description du projet&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
Pour réaliser le contrôle de drones, la première étape importante est de donner ses informations de position. Le but du projet est de développer une interface logicielle permettant de localiser le drone en temps réel en intérieur. Le drone se déplace dans un environnement dans lequel ont été installées de multiples balises. Il est équipé d'une carte, lui permettant de recevoir les distances relatives entre lui-même et les balises, sur laquelle différents algorithmes vont être implémentés pour effectuer la localisation en temps réel. Le projet requiert des compétences en développement hardware (Crazyflie 2.0, voir https://wiki.bitcraze.io/) et software (langage C/C++/Python/Javascript/HTML...).&lt;br /&gt;
&lt;br /&gt;
Il se divise en 4 étapes principales, qui sont:&lt;br /&gt;
*1) Choisir les technologies utilisées&lt;br /&gt;
*2) Choisir l'architecture (OS / APIs)&lt;br /&gt;
*3) Développer les différentes parties du projet&lt;br /&gt;
*4) Intégrer et connecter les différentes parties du projet&lt;br /&gt;
&lt;br /&gt;
La localisation étant en intérieur, le protocole GPS n'est donc pas assez précis pour les applications ciblées. La mise en place d'un tel dispositif permettrait grâce à l'utilisation d'un algorithme d'estimer avec une bonne précision les positions en intérieur d'une balise centrale (appelée Tag) et de balises (appelées Anchor). Le Tag scanne en temps réel la distance relative aux différentes balises, et il nous est retourné la position des balises et du Tag grâce à l'algorithme de localisation.&lt;br /&gt;
&lt;br /&gt;
Le projet se compose de 3 parties:&lt;br /&gt;
* Collect &amp;amp; parse: collecter les données envoyées par les balises en communiquant avec un serveur et récupérer les données adéquates par un tri&lt;br /&gt;
* Localise: déterminer la matrice de position des balises et du Tag en traitant les données récupérées&lt;br /&gt;
* Display: développer l'interface homme machine pour afficher, étudier et utiliser les données traitées&lt;br /&gt;
&lt;br /&gt;
Nous travaillerons dans un premier temps dans une optique temps différé avant de travailler en temps réel. Cela nous permettra d'acquérir des données utiles et réutilisables en aval. &lt;br /&gt;
&lt;br /&gt;
A l'aboutissement du projet, nous devrions être capable via l'interface homme machine développée d'afficher précisément la position spatiale des balises ainsi que du Tag, grâce àl'utilisation d'un algorithme de localisation et des données récupérées, et d'afficher d'autres données relatives au déplacement du Tag ou des balises dans l'espace. &lt;br /&gt;
&lt;br /&gt;
Si le temps le permet, nous pourrons aussi être amenés à adapter et utiliser l'interface développée pour l'utilisation d'un drone.&lt;br /&gt;
&lt;br /&gt;
''Sujet originel''&lt;br /&gt;
&lt;br /&gt;
To achieve the control of quadrotors, the first important task to give its position information. This project is to develop a software(GUI) to localize the quadrotors in real-time. The quadrotor is flying in an environment where several transmitters have been installed. The quadrotor is equipped with a deck to receive the relative distances between the deck and all transmitters, based on which different algorithms will be implemented to realize the real-time localization. The candidates need to have both experiences on hardware (Crazyflie 2.0, see https://wiki.bitcraze.io/) and software development (C/C , Python…). &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Calendrier&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
''[[Avant le 29/09/17]]'' - Élaboration du Cahier des charges, de la liste des tâches et du calendrier prévisionnel&lt;br /&gt;
&lt;br /&gt;
''[[Avant fin Octobre]]'' - Serveur de collecte et début du développement de l'interface logicielle&lt;br /&gt;
&lt;br /&gt;
''[[Avant fin Décembre]]'' - Interface logicielle&lt;br /&gt;
&lt;br /&gt;
''[[A la fin du PFE]]'' - Intégration finale des différentes parties (Serveur de collecte des données &amp;amp; Serveur de localisation &amp;amp; Interface logicielle)&lt;br /&gt;
&lt;br /&gt;
Répartition du volume de travail (***h):&lt;br /&gt;
&lt;br /&gt;
* Recherche sur les technologies à utiliser (**h)&lt;br /&gt;
* Développement du serveur de collecte de données (**h)&lt;br /&gt;
* Réalisation de l'interface logicielle (Web//Logiciel/Application) (**h)&lt;br /&gt;
* Intégration des différentes parties (**h)&lt;br /&gt;
* Test et débuggage (**h)&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Choix techniques : matériel et logiciel&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
Afin de développer ce dispositif, nous allons utiliser une Raspberry Pi 3 associée à une carte réceptrice, qui communique avec 4 balises composées chacune d'un microcontrôleur et d'une carte émettrice radio (UWB5C) et alimentées par batteries. La carte réceptrice joue le rôle du drone à localiser et communiquera les données émises par les balises vers l'ordinateur via Bluetooth.&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Choix technologiques&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
Voici les technologies que nous utilisons pour chacune des parties de ce projet.&lt;br /&gt;
&lt;br /&gt;
    1) Serveur de collecte des données:&lt;br /&gt;
       Scanne et parse les données récupérées pour fournir la matrice D des distances relatives du tag aux 4 balises&lt;br /&gt;
        - API&lt;br /&gt;
        - Python / Serveur Flask&lt;br /&gt;
&lt;br /&gt;
    2) Serveur de localisation (fourni):&lt;br /&gt;
       Calcule grâce à l'algorithme de localisation et la matrice D les positions spatiales des 4 noeuds et du tag&lt;br /&gt;
        - API&lt;br /&gt;
        - Bootstrap&lt;br /&gt;
        - Jquery&lt;br /&gt;
        - Python&lt;br /&gt;
&lt;br /&gt;
    3) Interface utilisateur:&lt;br /&gt;
       Affiche courbes, visualisation 3D, boutons ou données des fichiers envoyées par le serveur de localisation&lt;br /&gt;
        - HTML5 / Javascript&lt;br /&gt;
        - Fichiers JSON (serveurs de collecte et de localisation)&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Calendrier prévisionnel'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Liste des tâches à effectuer&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
# Se documenter sur le projet&lt;br /&gt;
##Langages et technologies utilisées&lt;br /&gt;
##Matériel utilisé&lt;br /&gt;
##Mettre en place du travail sur le Git&lt;br /&gt;
# Réaliser le serveur de collecte&lt;br /&gt;
##Récupérer les trames envoyées par bluetooth par le TAG via la Raspberry Pi&lt;br /&gt;
##Intégrer le serveur de localisation pour interpréter les trames&lt;br /&gt;
##Tester et optimiser&lt;br /&gt;
# Réaliser l'interface Web utilisateur&lt;br /&gt;
##Implémenter le serveur de collecte et de localisation&lt;br /&gt;
##Afficher et traiter les données stockées dans les fichiers JSON via le serveur (temps différé + temps réel)&lt;br /&gt;
##Tester et optimiser&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;Replanification du cahier des charges / calendrier&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Feuille d'heures'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Tâche !! Prélude !! Heures S1 !! Heures S2 !! Heures S3 !! Heures S4 !! Heures S5 !! Heures S6 !! Heures S7 !! Heures S8 !! Heures S9 !! Heures S10 !! Heures S11 !! Heures S12 !! Après Noël !! Total&lt;br /&gt;
|-&lt;br /&gt;
| Cahier des charges / Wiki / Gitlab&lt;br /&gt;
|  4h&lt;br /&gt;
|  3h&lt;br /&gt;
|  1h&lt;br /&gt;
|  x&lt;br /&gt;
|  1h30&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h30&lt;br /&gt;
|  1h&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Documentation sur les technos utilisées&lt;br /&gt;
|  2h&lt;br /&gt;
|  4h&lt;br /&gt;
|  3h&lt;br /&gt;
|  2h&lt;br /&gt;
|  3h&lt;br /&gt;
|  4h&lt;br /&gt;
|  5h&lt;br /&gt;
|  5h30&lt;br /&gt;
|  4h30&lt;br /&gt;
|  3h30&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Documentation sur le matériel&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Recherche et développement du serveur de collecte&lt;br /&gt;
|  x&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  3h&lt;br /&gt;
|  3h30&lt;br /&gt;
|  4h&lt;br /&gt;
|  5h&lt;br /&gt;
|  7h&lt;br /&gt;
|  4h30&lt;br /&gt;
|  0,5h&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| Recherche et développement de l'interface Web&lt;br /&gt;
|  x&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  3h&lt;br /&gt;
|  5h&lt;br /&gt;
|  6h&lt;br /&gt;
|  4h&lt;br /&gt;
|  7h&lt;br /&gt;
|  5h30&lt;br /&gt;
|  2h30&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| Recherche et intégration du serveur de localisation&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x &lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| Intégration des différentes parties&lt;br /&gt;
|  x&lt;br /&gt;
|  x  &lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  2h&lt;br /&gt;
|  2h&lt;br /&gt;
|  2h&lt;br /&gt;
|  3h&lt;br /&gt;
|  1h30&lt;br /&gt;
|  x&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| Tests et débuggage&lt;br /&gt;
|  x&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  1h&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  3h&lt;br /&gt;
|  4h&lt;br /&gt;
|  0,5h&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Optimisation/Correction des programmes&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Avancement du Projet'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Phase préparatoire'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Jeu 21/09/17 - Ven 22/09/17]]'' &lt;br /&gt;
*Rendez-vous de mise au point du cahier des charges avec les encadrants/intervenants (M. ZHENG Gang et M. DAGHER Roudy)&lt;br /&gt;
*Elaboration du cahier des charges&lt;br /&gt;
*Elaboration de la page Wiki (préparation de la mise en page et présentation du sujet)&lt;br /&gt;
*Préparation du travail sous forme de Mind Map&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous nous sommes tout d’abord rendus au laboratoire de l'INRIA afin de pouvoir définir le plus précisément possible le cahier des charges avec nos tuteurs.&lt;br /&gt;
Nous avons donc défini avec eux les technologies qu'il faudrait étudier. Vous retrouverez le choix des technologies dans la partie '''choix technologiques'''&lt;br /&gt;
&lt;br /&gt;
Nous avons en même temps créé notre page Wiki, et structuré celui-ci avec les parties qui nous seraient utiles pour développer nos explications par la suite.&lt;br /&gt;
&lt;br /&gt;
Nous avons de plus découpé le travail en sous-parties que nous avions mis dans un '''Mind map''' afin d'y voir plus clair sur la ligne à suivre.&lt;br /&gt;
&lt;br /&gt;
Vous trouverez ce Mind map juste ci-dessous. Nous ne mettrons pas à jour ce Mind map chaque semaine mais il est fort probable que nous en referions un en milieu de projet pour pouvoir cibler les objectifs réussis et ceux à atteindre. Nous pourrons de plus redéfinir certains objectifs qui nous aurait semblé trop vague au début du projet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Projet de fin d'étude.png|centre|600px]]&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 1'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Jeu 28/09/17 - Ven 29/09/17]]'' &lt;br /&gt;
*Revue du Cahier des Charges avec les encadrants&lt;br /&gt;
*Lecture et recherches sur les technologies adaptées&lt;br /&gt;
*Construction de la suite de la Mind Map&lt;br /&gt;
*Création du Gitlab&lt;br /&gt;
&lt;br /&gt;
Nous commençons les recherches sur le projet et sur les premières technologies engagées dans celui-ci. Nous en profitons pour formuler des à présent des questions sur le bon choix de celles-ci. Nous commençons donc des tests ayant seulement pour but de nous familiariser avec l'environnement de travail et de réellement comprendre les fonctions déjà présentes qu'il faudra exploiter et implanter notre interface web.&lt;br /&gt;
Nous créons un gitlab avec notre tuteur et commençons a définir les taches premières sur celui-ci.&lt;br /&gt;
Nous en profitons pour affiner le Mind Map.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 2'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Jeu 05/10/17 - Ven 06/10/17]]''  &lt;br /&gt;
*Précisions sur le cahier des charges&lt;br /&gt;
*Listage du matériel&lt;br /&gt;
*Recherche et détermination de solutions technologiques possibles pour les fonctions demandées&lt;br /&gt;
*Début du travail sur le serveur de collecte&lt;br /&gt;
*Apprentissage du langage Python et de l'utilisation du framework Flask&lt;br /&gt;
&lt;br /&gt;
Nous avons finalisé les précisions sur le cahier des charges. Nous avons donc pu cibler le matériel dont nous nous servirons pour ce Projet. Vous trouverez donc cette liste la section correspondante. Il est évident que le matériel utilisé est dans l'ensemble déjà fourni par le laboratoire et qu'il nous reste dans l'ensemble à créer l'interface web et les API qui nous permettrons de faire communiquer cette interface avec la Raspberrypi et le serveur de position déjà créé.&lt;br /&gt;
Nous avons donc pu commencer a ce former sur les technologies qui nous serviraient par la suite. Nous avaons donc utilisé le cours d'openclassroom sur les serveur flask pour en apprendre les bases. Ce serveur flask est programmé en python et nous permets donc une grande liberté au niveau de l’exécutions de certains scripts. En effet les script de connexion bluetooth et de redirection de port qui nous permette de recuperer les données de distance sont eux meme codé en python et sont directement appelé via le serveur.&lt;br /&gt;
Dans ce serveur, représentant notre interface web, vous retrouverez la page '''/collecte''' qui représentera notre partie collecte de données ainsi que l'affichage de ces distances. Nous appellerons cette partie le serveur de collecte.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 3'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 11/10/17 - Jeu 12/10/17]]''  &lt;br /&gt;
*Recherche et développement initial du serveur de collecte de données&lt;br /&gt;
*Complément du Git sur les tâches à effectuer&lt;br /&gt;
&lt;br /&gt;
Nous avons commencé à créer un serveur flask renvoyant pour l'instant une matrice aléatoire. Lors de la requête URL &amp;quot;../matrice&amp;quot;, nous voyons bien une matrice aléatoire apparaître sur la page Web. Nous essayons de nous connecter à la Raspberry Pi en redirigeant son port série vers le Bluetooth de façon à récupérer de vraies matrices de distance entre le drone (ie commutateur central) et les balises. Nous pourrons afficher ensuite ces matrices, ou alors les stocker dans un fichier en attendant le traitement de celles-ci.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Requete s3.PNG|300px|serveur flask]]&lt;br /&gt;
&lt;br /&gt;
Nous avons plusieurs problèmes avec le Bluetooth pour se connecter avec la Raspberry Pi. Quand nous aurons réussi à nous connecter au port série de la Raspberry pi alors nous pour gérer le traitement des données récupérées.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 4'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 18/10/17 - Jeu 19/10/17]]''  &lt;br /&gt;
*Configuration de la Raspberry Pi car problèmes de connectivité Bluetooth rencontrés&lt;br /&gt;
**Nous arrivons à connecter la Raspberry Pi sous Windows mais la connexion sous Linux pose problème (travail en suspens en attendant la disponibilité de l'encadrant)&lt;br /&gt;
*Début du développement de l'interface Web&lt;br /&gt;
**Traitement d'une matrice dans un fichier JSON&lt;br /&gt;
**Affichage sous forme de tableau de la matrice&lt;br /&gt;
**Utilisation du serveur de requête en Python avec chargement de template HTML&lt;br /&gt;
**Mise en forme de la trame de la page en HTML/CSS avec le framework Bootstrap&lt;br /&gt;
**Ajout d'un set de distances (d1, d2, d3, d4) dans la matrice lors d'un appui sur un bouton Chargement en utilisant un fichier Javascript&lt;br /&gt;
&lt;br /&gt;
Nous Avons reçus des fonctions pythons de notre tuteurs afin d'obtenir une connexion bluetooth entre notre raspberrypi et notre ordinateur ainsi qu'une redirection de port de celle ci vers la connexion. Nous n'arrivons pas à utiliser ces fonctions sous linux et nous necessitons une explication de notre tuteur n'etant pas disponible a ce moment. Pour ne pas perdre de temps nous nous attaquons la creation de l'interface web a proprement parler. c'est a dire la création des pages html ainsi que le document javascript qui nous servira de bibliotheque de fonctions.chaque route de notre serveur sont relié a une series de fonctions python s'executant a l'apelle des url puis suivis d'un template de la page HTML en question. Nous en profitons de plus pour explorer le framework CSS bootstrap afin de mettre un premier design et une structure a notre page collecte qui sera la page principale de notre site pour ce début de projet.&lt;br /&gt;
&lt;br /&gt;
Nous nous essayons de plus à différents tests sur des fichiers de format '''Json''' que nous devrons réussir à traiter correctement plus tard dans notre projet.&lt;br /&gt;
Nous récupérons une matrice que nous créons nous même en python (simulation d'une série de distances récupérée) que nous transformons au format Json pour ensuite l'afficher sur notre page web. Pour pouvoir proprement afficher se fichier '''Json''' renvoyé vers notre page, nous nous servons du fichier javascript afin de créer du code html contenant la matrice.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 5'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 25/10/17 - Ven 27/10/17]]''  &lt;br /&gt;
*Résolution des problèmes de connectique Bluetooth sur la Raspberry Pi&lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Traitement d'une matrice dans un fichier JSON&lt;br /&gt;
**Début de l'ajout d'un set de distances depuis une matrice contenue dans un fichier JSON&lt;br /&gt;
&lt;br /&gt;
Nous avons pu nous entretenir avec notre tuteur et donc comprendre les fonctions de connexion et de redirection de port. Nous pouvons donc continuer le développement de notre interface web. Nous arrivons à traiter un set de donné au format json et à l'afficher dans le code html. Toutefois nous créons nous mème ce set, il est maintenant nécessaire que nous arrivions à récupérer les set de distance réels reçus par la connexions bluetooth. Nous commencerons par un traitement asynchrone. L'idée est d’enregistrer les sets de distances dans un fichier '''Json''' stocké dans un dossier. Nous appellerons ce dossier plus tard via une requête ajax.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 6'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 08/11/17 - Ven 10/11/17]]''  &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
**Mise en place de la communication entre le port série de notre machine et le port série de la carte via Bluetooth de la RPi3&lt;br /&gt;
**Récupération et traitement (parse) manuels des données de distances dans un fichier .log via TCP/IP&amp;lt;-&amp;gt;Bluetooth&lt;br /&gt;
**Début de l'automatisation du procédé par script Python (requete.py) et mise en place de sockets de communication&lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Chargement sur commande d'un set de distances depuis une matrice contenue dans un fichier JSON&lt;br /&gt;
*Travail sur le layout du site&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 7'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 15/11/17 - Ven 17/11/17]]''  &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
**Récupération et traitement (parse) manuels des données de distances dans un fichier .log via TCP/IP&amp;lt;-&amp;gt;Bluetooth&lt;br /&gt;
**Automatisation du procédé par script Python (requete.py)&lt;br /&gt;
***Mise en place de sockets de communication pour le contrôle de la collecte -&amp;gt; abandonné (servait à commander la collecte manuellement)&lt;br /&gt;
***Développement d'un script engine.py regroupant les commandes exécutables par l'utilisateur via la page Web&lt;br /&gt;
***Début du travail sur la fonction &amp;quot;STOP&amp;quot; manuel d'une action de collecte de données (liaison entre script html, javascript, et script python)&lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Chargement sur commande d'un set de distances depuis une matrice contenue dans un fichier JSON&lt;br /&gt;
**Travail sur le layout du site&lt;br /&gt;
***Ajout des différentes commandes (connexion bluetooth, lancement commande cu, collecte des données, collecte durée donnée)&lt;br /&gt;
***Début de l'implémentation de la visualisation des fichiers .json obtenus après collecte et affichage dans un tableau matriciel du fichier sélectionné&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 8'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 22/11/17 - Ven 24/11/17]]''  &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
**Automatisation du procédé de collecte par script Python (requete.py qui fait appel à engine.py)&lt;br /&gt;
***Développement d'un script engine.py regroupant les commandes exécutables par l'utilisateur via la page Web&lt;br /&gt;
***Travail sur la fonction &amp;quot;STOP&amp;quot; manuel d'une action de collecte de données (liaison entre script html, javascript, et script python)&lt;br /&gt;
***Mise en place d'un serveur HTTP Simple sous Python pour accéder aux fichiers de données à partir de la page Web&lt;br /&gt;
***Mise à jour de fonctions de connexion &lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Travail sur le layout du site (ajout de pages, navigation entre les pages, apparence, nettoyage des codes)&lt;br /&gt;
**Bon fonctionnement de l'ensemble serveur collecte + serveur HTTP + client Web&lt;br /&gt;
**Affichage de la liste des fichiers de données de distance (log, csv, json) via serveur HTTP en Python sur port 9999&lt;br /&gt;
*Corrections et nettoyage du dépôt GIT&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 9'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 29/11/17 - Jeudi 30/11/17]]''  &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
**Automatisation du procédé de collecte par script Python (requete.py qui fait appel à engine.py)&lt;br /&gt;
***Travail sur la fonction &amp;quot;STOP&amp;quot; manuel d'une action de collecte de données (liaison entre script html, javascript, et script python)&lt;br /&gt;
***Recherches sur l'utilisation de fichiers json accessibles via le serveur HTTP&lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Travail sur le layout du site &lt;br /&gt;
**Travail sur la liaison entre fichiers json et affichage Web des données de distance&lt;br /&gt;
***Recherches et tests de solutions&lt;br /&gt;
****Affichage depuis un fichier&lt;br /&gt;
****Affichage à la volée lors d'une action de collecte&lt;br /&gt;
&lt;br /&gt;
*Revue de code avec Roudy DAGHER:&lt;br /&gt;
**Structure globale des codes ok&lt;br /&gt;
**Fonctionnement presque ok: fonctionnalités implémentées ok, mais parsage csv ne marche pas&lt;br /&gt;
**Refactoring nécessaire&lt;br /&gt;
**Correction de la fonction STOP et amélioration de la fonction de COLLECTE&lt;br /&gt;
**Faire plus de requêtes Javascript que de requêtes HTML&lt;br /&gt;
**Discussion pour l'implémentation du serveur de localisation (= algorithme de localisation) et des visualisations de données sur le site Web&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Observations'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Problèmes rencontrés'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Solutions apportées'''&amp;lt;/span&amp;gt;===&lt;/div&gt;</summary>
		<author><name>Hdelatte</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=P18_Localisation_of_quadrotors&amp;diff=46772</id>
		<title>P18 Localisation of quadrotors</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=P18_Localisation_of_quadrotors&amp;diff=46772"/>
				<updated>2017-12-07T14:19:17Z</updated>
		
		<summary type="html">&lt;p&gt;Hdelatte : /* Semaine 5 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Cahier des charges'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;Présentation générale du projet&amp;lt;/span&amp;gt;=== &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Contexte&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
Dans un monde de plus en plus connecté, de nombreux drones sont déployés pour diverses applications comme l'espionnage, la surveillance, la cartographie de lieux et la livraison de colis. Les technologies nécessaires pour contrôler ces drones sont des sujets de recherche actuels. &lt;br /&gt;
&lt;br /&gt;
Le contrôle de ceux-ci passe tout d'abord par la maîtrise de leur position dans l'espace. Le développement des applications liées à l'utilisation de drones nécessite un travail important sur la localisation spatiale d'objets connectés. &lt;br /&gt;
&lt;br /&gt;
De plus, dans un souci d'utilisation, il est essentiel de développer des interfaces logicielles permettant d'exploiter ces données.&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Objectif du projet&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
L'objectif de ce projet est de développer une interface logicielle permettant de traiter en temps réel les informations de localisation d'un drone et de balises, dans le but de définir leur localisation dans l'espace, en intérieur.&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Description du projet&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
Pour réaliser le contrôle de drones, la première étape importante est de donner ses informations de position. Le but du projet est de développer une interface logicielle permettant de localiser le drone en temps réel en intérieur. Le drone se déplace dans un environnement dans lequel ont été installées de multiples balises. Il est équipé d'une carte, lui permettant de recevoir les distances relatives entre lui-même et les balises, sur laquelle différents algorithmes vont être implémentés pour effectuer la localisation en temps réel. Le projet requiert des compétences en développement hardware (Crazyflie 2.0, voir https://wiki.bitcraze.io/) et software (langage C/C++/Python/Javascript/HTML...).&lt;br /&gt;
&lt;br /&gt;
Il se divise en 4 étapes principales, qui sont:&lt;br /&gt;
*1) Choisir les technologies utilisées&lt;br /&gt;
*2) Choisir l'architecture (OS / APIs)&lt;br /&gt;
*3) Développer les différentes parties du projet&lt;br /&gt;
*4) Intégrer et connecter les différentes parties du projet&lt;br /&gt;
&lt;br /&gt;
La localisation étant en intérieur, le protocole GPS n'est donc pas assez précis pour les applications ciblées. La mise en place d'un tel dispositif permettrait grâce à l'utilisation d'un algorithme d'estimer avec une bonne précision les positions en intérieur d'une balise centrale (appelée Tag) et de balises (appelées Anchor). Le Tag scanne en temps réel la distance relative aux différentes balises, et il nous est retourné la position des balises et du Tag grâce à l'algorithme de localisation.&lt;br /&gt;
&lt;br /&gt;
Le projet se compose de 3 parties:&lt;br /&gt;
* Collect &amp;amp; parse: collecter les données envoyées par les balises en communiquant avec un serveur et récupérer les données adéquates par un tri&lt;br /&gt;
* Localise: déterminer la matrice de position des balises et du Tag en traitant les données récupérées&lt;br /&gt;
* Display: développer l'interface homme machine pour afficher, étudier et utiliser les données traitées&lt;br /&gt;
&lt;br /&gt;
Nous travaillerons dans un premier temps dans une optique temps différé avant de travailler en temps réel. Cela nous permettra d'acquérir des données utiles et réutilisables en aval. &lt;br /&gt;
&lt;br /&gt;
A l'aboutissement du projet, nous devrions être capable via l'interface homme machine développée d'afficher précisément la position spatiale des balises ainsi que du Tag, grâce àl'utilisation d'un algorithme de localisation et des données récupérées, et d'afficher d'autres données relatives au déplacement du Tag ou des balises dans l'espace. &lt;br /&gt;
&lt;br /&gt;
Si le temps le permet, nous pourrons aussi être amenés à adapter et utiliser l'interface développée pour l'utilisation d'un drone.&lt;br /&gt;
&lt;br /&gt;
''Sujet originel''&lt;br /&gt;
&lt;br /&gt;
To achieve the control of quadrotors, the first important task to give its position information. This project is to develop a software(GUI) to localize the quadrotors in real-time. The quadrotor is flying in an environment where several transmitters have been installed. The quadrotor is equipped with a deck to receive the relative distances between the deck and all transmitters, based on which different algorithms will be implemented to realize the real-time localization. The candidates need to have both experiences on hardware (Crazyflie 2.0, see https://wiki.bitcraze.io/) and software development (C/C , Python…). &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Calendrier&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
''[[Avant le 29/09/17]]'' - Élaboration du Cahier des charges, de la liste des tâches et du calendrier prévisionnel&lt;br /&gt;
&lt;br /&gt;
''[[Avant fin Octobre]]'' - Serveur de collecte et début du développement de l'interface logicielle&lt;br /&gt;
&lt;br /&gt;
''[[Avant fin Décembre]]'' - Interface logicielle&lt;br /&gt;
&lt;br /&gt;
''[[A la fin du PFE]]'' - Intégration finale des différentes parties (Serveur de collecte des données &amp;amp; Serveur de localisation &amp;amp; Interface logicielle)&lt;br /&gt;
&lt;br /&gt;
Répartition du volume de travail (***h):&lt;br /&gt;
&lt;br /&gt;
* Recherche sur les technologies à utiliser (**h)&lt;br /&gt;
* Développement du serveur de collecte de données (**h)&lt;br /&gt;
* Réalisation de l'interface logicielle (Web//Logiciel/Application) (**h)&lt;br /&gt;
* Intégration des différentes parties (**h)&lt;br /&gt;
* Test et débuggage (**h)&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Choix techniques : matériel et logiciel&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
Afin de développer ce dispositif, nous allons utiliser une Raspberry Pi 3 associée à une carte réceptrice, qui communique avec 4 balises composées chacune d'un microcontrôleur et d'une carte émettrice radio (UWB5C) et alimentées par batteries. La carte réceptrice joue le rôle du drone à localiser et communiquera les données émises par les balises vers l'ordinateur via Bluetooth.&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Choix technologiques&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
Voici les technologies que nous utilisons pour chacune des parties de ce projet.&lt;br /&gt;
&lt;br /&gt;
    1) Serveur de collecte des données:&lt;br /&gt;
       Scanne et parse les données récupérées pour fournir la matrice D des distances relatives du tag aux 4 balises&lt;br /&gt;
        - API&lt;br /&gt;
        - Python / Serveur Flask&lt;br /&gt;
&lt;br /&gt;
    2) Serveur de localisation (fourni):&lt;br /&gt;
       Calcule grâce à l'algorithme de localisation et la matrice D les positions spatiales des 4 noeuds et du tag&lt;br /&gt;
        - API&lt;br /&gt;
        - Bootstrap&lt;br /&gt;
        - Jquery&lt;br /&gt;
        - Python&lt;br /&gt;
&lt;br /&gt;
    3) Interface utilisateur:&lt;br /&gt;
       Affiche courbes, visualisation 3D, boutons ou données des fichiers envoyées par le serveur de localisation&lt;br /&gt;
        - HTML5 / Javascript&lt;br /&gt;
        - Fichiers JSON (serveurs de collecte et de localisation)&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Calendrier prévisionnel'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Liste des tâches à effectuer&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
# Se documenter sur le projet&lt;br /&gt;
##Langages et technologies utilisées&lt;br /&gt;
##Matériel utilisé&lt;br /&gt;
##Mettre en place du travail sur le Git&lt;br /&gt;
# Réaliser le serveur de collecte&lt;br /&gt;
##Récupérer les trames envoyées par bluetooth par le TAG via la Raspberry Pi&lt;br /&gt;
##Intégrer le serveur de localisation pour interpréter les trames&lt;br /&gt;
##Tester et optimiser&lt;br /&gt;
# Réaliser l'interface Web utilisateur&lt;br /&gt;
##Implémenter le serveur de collecte et de localisation&lt;br /&gt;
##Afficher et traiter les données stockées dans les fichiers JSON via le serveur (temps différé + temps réel)&lt;br /&gt;
##Tester et optimiser&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;Replanification du cahier des charges / calendrier&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Feuille d'heures'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Tâche !! Prélude !! Heures S1 !! Heures S2 !! Heures S3 !! Heures S4 !! Heures S5 !! Heures S6 !! Heures S7 !! Heures S8 !! Heures S9 !! Heures S10 !! Heures S11 !! Heures S12 !! Après Noël !! Total&lt;br /&gt;
|-&lt;br /&gt;
| Cahier des charges / Wiki / Gitlab&lt;br /&gt;
|  4h&lt;br /&gt;
|  3h&lt;br /&gt;
|  1h&lt;br /&gt;
|  x&lt;br /&gt;
|  1h30&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h30&lt;br /&gt;
|  1h&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Documentation sur les technos utilisées&lt;br /&gt;
|  2h&lt;br /&gt;
|  4h&lt;br /&gt;
|  3h&lt;br /&gt;
|  2h&lt;br /&gt;
|  3h&lt;br /&gt;
|  4h&lt;br /&gt;
|  5h&lt;br /&gt;
|  5h30&lt;br /&gt;
|  4h30&lt;br /&gt;
|  3h30&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Documentation sur le matériel&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Recherche et développement du serveur de collecte&lt;br /&gt;
|  x&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  3h&lt;br /&gt;
|  3h30&lt;br /&gt;
|  4h&lt;br /&gt;
|  5h&lt;br /&gt;
|  7h&lt;br /&gt;
|  4h30&lt;br /&gt;
|  0,5h&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| Recherche et développement de l'interface Web&lt;br /&gt;
|  x&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  3h&lt;br /&gt;
|  5h&lt;br /&gt;
|  6h&lt;br /&gt;
|  4h&lt;br /&gt;
|  7h&lt;br /&gt;
|  5h30&lt;br /&gt;
|  2h30&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| Recherche et intégration du serveur de localisation&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x &lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| Intégration des différentes parties&lt;br /&gt;
|  x&lt;br /&gt;
|  x  &lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  2h&lt;br /&gt;
|  2h&lt;br /&gt;
|  2h&lt;br /&gt;
|  3h&lt;br /&gt;
|  1h30&lt;br /&gt;
|  x&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| Tests et débuggage&lt;br /&gt;
|  x&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  1h&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  3h&lt;br /&gt;
|  4h&lt;br /&gt;
|  0,5h&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Optimisation/Correction des programmes&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Avancement du Projet'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Phase préparatoire'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Jeu 21/09/17 - Ven 22/09/17]]'' &lt;br /&gt;
*Rendez-vous de mise au point du cahier des charges avec les encadrants/intervenants (M. ZHENG Gang et M. DAGHER Roudy)&lt;br /&gt;
*Elaboration du cahier des charges&lt;br /&gt;
*Elaboration de la page Wiki (préparation de la mise en page et présentation du sujet)&lt;br /&gt;
*Préparation du travail sous forme de Mind Map&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous nous sommes tout d’abord rendus au laboratoire de l'INRIA afin de pouvoir définir le plus précisément possible le cahier des charges avec nos tuteurs.&lt;br /&gt;
Nous avons donc défini avec eux les technologies qu'il faudrait étudier. Vous retrouverez le choix des technologies dans la partie '''choix technologiques'''&lt;br /&gt;
&lt;br /&gt;
Nous avons en même temps créé notre page Wiki, et structuré celui-ci avec les parties qui nous seraient utiles pour développer nos explications par la suite.&lt;br /&gt;
&lt;br /&gt;
Nous avons de plus découpé le travail en sous-parties que nous avions mis dans un '''Mind map''' afin d'y voir plus clair sur la ligne à suivre.&lt;br /&gt;
&lt;br /&gt;
Vous trouverez ce Mind map juste ci-dessous. Nous ne mettrons pas à jour ce Mind map chaque semaine mais il est fort probable que nous en referions un en milieu de projet pour pouvoir cibler les objectifs réussis et ceux à atteindre. Nous pourrons de plus redéfinir certains objectifs qui nous aurait semblé trop vague au début du projet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Projet de fin d'étude.png|centre|600px]]&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 1'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Jeu 28/09/17 - Ven 29/09/17]]'' &lt;br /&gt;
*Revue du Cahier des Charges avec les encadrants&lt;br /&gt;
*Lecture et recherches sur les technologies adaptées&lt;br /&gt;
*Construction de la suite de la Mind Map&lt;br /&gt;
*Création du Gitlab&lt;br /&gt;
&lt;br /&gt;
Nous commençons les recherches sur le projet et sur les premières technologies engagées dans celui-ci. Nous en profitons pour formuler des à présent des questions sur le bon choix de celles-ci. Nous commençons donc des tests ayant seulement pour but de nous familiariser avec l'environnement de travail et de réellement comprendre les fonctions déjà présentes qu'il faudra exploiter et implanter notre interface web.&lt;br /&gt;
Nous créons un gitlab avec notre tuteur et commençons a définir les taches premières sur celui-ci.&lt;br /&gt;
Nous en profitons pour affiner le Mind Map.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 2'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Jeu 05/10/17 - Ven 06/10/17]]''  &lt;br /&gt;
*Précisions sur le cahier des charges&lt;br /&gt;
*Listage du matériel&lt;br /&gt;
*Recherche et détermination de solutions technologiques possibles pour les fonctions demandées&lt;br /&gt;
*Début du travail sur le serveur de collecte&lt;br /&gt;
*Apprentissage du langage Python et de l'utilisation du framework Flask&lt;br /&gt;
&lt;br /&gt;
Nous avons finalisé les précisions sur le cahier des charges. Nous avons donc pu cibler le matériel dont nous nous servirons pour ce Projet. Vous trouverez donc cette liste la section correspondante. Il est évident que le matériel utilisé est dans l'ensemble déjà fourni par le laboratoire et qu'il nous reste dans l'ensemble à créer l'interface web et les API qui nous permettrons de faire communiquer cette interface avec la Raspberrypi et le serveur de position déjà créé.&lt;br /&gt;
Nous avons donc pu commencer a ce former sur les technologies qui nous serviraient par la suite. Nous avaons donc utilisé le cours d'openclassroom sur les serveur flask pour en apprendre les bases. Ce serveur flask est programmé en python et nous permets donc une grande liberté au niveau de l’exécutions de certains scripts. En effet les script de connexion bluetooth et de redirection de port qui nous permette de recuperer les données de distance sont eux meme codé en python et sont directement appelé via le serveur.&lt;br /&gt;
Dans ce serveur, représentant notre interface web, vous retrouverez la page '''/collecte''' qui représentera notre partie collecte de données ainsi que l'affichage de ces distances. Nous appellerons cette partie le serveur de collecte.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 3'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 11/10/17 - Jeu 12/10/17]]''  &lt;br /&gt;
*Recherche et développement initial du serveur de collecte de données&lt;br /&gt;
*Complément du Git sur les tâches à effectuer&lt;br /&gt;
&lt;br /&gt;
Nous avons commencé à créer un serveur flask renvoyant pour l'instant une matrice aléatoire. Lors de la requête URL &amp;quot;../matrice&amp;quot;, nous voyons bien une matrice aléatoire apparaître sur la page Web. Nous essayons de nous connecter à la Raspberry Pi en redirigeant son port série vers le Bluetooth de façon à récupérer de vraies matrices de distance entre le drone (ie commutateur central) et les balises. Nous pourrons afficher ensuite ces matrices, ou alors les stocker dans un fichier en attendant le traitement de celles-ci.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Requete s3.PNG|300px|serveur flask]]&lt;br /&gt;
&lt;br /&gt;
Nous avons plusieurs problèmes avec le Bluetooth pour se connecter avec la Raspberry Pi. Quand nous aurons réussi à nous connecter au port série de la Raspberry pi alors nous pour gérer le traitement des données récupérées.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 4'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 18/10/17 - Jeu 19/10/17]]''  &lt;br /&gt;
*Configuration de la Raspberry Pi car problèmes de connectivité Bluetooth rencontrés&lt;br /&gt;
**Nous arrivons à connecter la Raspberry Pi sous Windows mais la connexion sous Linux pose problème (travail en suspens en attendant la disponibilité de l'encadrant)&lt;br /&gt;
*Début du développement de l'interface Web&lt;br /&gt;
**Traitement d'une matrice dans un fichier JSON&lt;br /&gt;
**Affichage sous forme de tableau de la matrice&lt;br /&gt;
**Utilisation du serveur de requête en Python avec chargement de template HTML&lt;br /&gt;
**Mise en forme de la trame de la page en HTML/CSS avec le framework Bootstrap&lt;br /&gt;
**Ajout d'un set de distances (d1, d2, d3, d4) dans la matrice lors d'un appui sur un bouton Chargement en utilisant un fichier Javascript&lt;br /&gt;
&lt;br /&gt;
Nous Avons reçus des fonctions pythons de notre tuteurs afin d'obtenir une connexion bluetooth entre notre raspberrypi et notre ordinateur ainsi qu'une redirection de port de celle ci vers la connexion. Nous n'arrivons pas à utiliser ces fonctions sous linux et nous necessitons une explication de notre tuteur n'etant pas disponible a ce moment. Pour ne pas perdre de temps nous nous attaquons la creation de l'interface web a proprement parler. c'est a dire la création des pages html ainsi que le document javascript qui nous servira de bibliotheque de fonctions.chaque route de notre serveur sont relié a une series de fonctions python s'executant a l'apelle des url puis suivis d'un template de la page HTML en question. Nous en profitons de plus pour explorer le framework CSS bootstrap afin de mettre un premier design et une structure a notre page collecte qui sera la page principale de notre site pour ce début de projet.&lt;br /&gt;
&lt;br /&gt;
Nous nous essayons de plus à différents tests sur des fichiers de format '''Json''' que nous devrons réussir à traiter correctement plus tard dans notre projet.&lt;br /&gt;
Nous récupérons une matrice que nous créons nous même en python (simulation d'une série de distances récupérée) que nous transformons au format Json pour ensuite l'afficher sur notre page web. Pour pouvoir proprement afficher se fichier '''Json''' renvoyé vers notre page, nous nous servons du fichier javascript afin de créer du code html contenant la matrice.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 5'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 25/10/17 - Ven 27/10/17]]''  &lt;br /&gt;
*Résolution des problèmes de connectique Bluetooth sur la Raspberry Pi&lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Traitement d'une matrice dans un fichier JSON&lt;br /&gt;
**Début de l'ajout d'un set de distances depuis une matrice contenue dans un fichier JSON&lt;br /&gt;
&lt;br /&gt;
Nous avons pu nous entretenir avec notre tuteur et donc mettre en place la fonctions de connexion et de redirection de port. Nous pouvons donc continuer le développement de notre interface web. Nous arrivons à traiter un set de donné au format json et à l'afficher dans le code html. Toutefois nous créons nous mème ce set, il est maintenant nécessaire que nous arrivions à récupérer les set de distance réels reçus par la connexions bluetooth. Nous commencerons par un traitement asynchrone. L'idée est d’enregistrer les sets de distances dans un fichier '''Json''' stocké dans un dossier. Nous appellerons ce dossier plus tard via une requête ajax.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 6'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 08/11/17 - Ven 10/11/17]]''  &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
**Mise en place de la communication entre le port série de notre machine et le port série de la carte via Bluetooth de la RPi3&lt;br /&gt;
**Récupération et traitement (parse) manuels des données de distances dans un fichier .log via TCP/IP&amp;lt;-&amp;gt;Bluetooth&lt;br /&gt;
**Début de l'automatisation du procédé par script Python (requete.py) et mise en place de sockets de communication&lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Chargement sur commande d'un set de distances depuis une matrice contenue dans un fichier JSON&lt;br /&gt;
*Travail sur le layout du site&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 7'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 15/11/17 - Ven 17/11/17]]''  &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
**Récupération et traitement (parse) manuels des données de distances dans un fichier .log via TCP/IP&amp;lt;-&amp;gt;Bluetooth&lt;br /&gt;
**Automatisation du procédé par script Python (requete.py)&lt;br /&gt;
***Mise en place de sockets de communication pour le contrôle de la collecte -&amp;gt; abandonné (servait à commander la collecte manuellement)&lt;br /&gt;
***Développement d'un script engine.py regroupant les commandes exécutables par l'utilisateur via la page Web&lt;br /&gt;
***Début du travail sur la fonction &amp;quot;STOP&amp;quot; manuel d'une action de collecte de données (liaison entre script html, javascript, et script python)&lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Chargement sur commande d'un set de distances depuis une matrice contenue dans un fichier JSON&lt;br /&gt;
**Travail sur le layout du site&lt;br /&gt;
***Ajout des différentes commandes (connexion bluetooth, lancement commande cu, collecte des données, collecte durée donnée)&lt;br /&gt;
***Début de l'implémentation de la visualisation des fichiers .json obtenus après collecte et affichage dans un tableau matriciel du fichier sélectionné&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 8'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 22/11/17 - Ven 24/11/17]]''  &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
**Automatisation du procédé de collecte par script Python (requete.py qui fait appel à engine.py)&lt;br /&gt;
***Développement d'un script engine.py regroupant les commandes exécutables par l'utilisateur via la page Web&lt;br /&gt;
***Travail sur la fonction &amp;quot;STOP&amp;quot; manuel d'une action de collecte de données (liaison entre script html, javascript, et script python)&lt;br /&gt;
***Mise en place d'un serveur HTTP Simple sous Python pour accéder aux fichiers de données à partir de la page Web&lt;br /&gt;
***Mise à jour de fonctions de connexion &lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Travail sur le layout du site (ajout de pages, navigation entre les pages, apparence, nettoyage des codes)&lt;br /&gt;
**Bon fonctionnement de l'ensemble serveur collecte + serveur HTTP + client Web&lt;br /&gt;
**Affichage de la liste des fichiers de données de distance (log, csv, json) via serveur HTTP en Python sur port 9999&lt;br /&gt;
*Corrections et nettoyage du dépôt GIT&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 9'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 29/11/17 - Jeudi 30/11/17]]''  &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
**Automatisation du procédé de collecte par script Python (requete.py qui fait appel à engine.py)&lt;br /&gt;
***Travail sur la fonction &amp;quot;STOP&amp;quot; manuel d'une action de collecte de données (liaison entre script html, javascript, et script python)&lt;br /&gt;
***Recherches sur l'utilisation de fichiers json accessibles via le serveur HTTP&lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Travail sur le layout du site &lt;br /&gt;
**Travail sur la liaison entre fichiers json et affichage Web des données de distance&lt;br /&gt;
***Recherches et tests de solutions&lt;br /&gt;
****Affichage depuis un fichier&lt;br /&gt;
****Affichage à la volée lors d'une action de collecte&lt;br /&gt;
&lt;br /&gt;
*Revue de code avec Roudy DAGHER:&lt;br /&gt;
**Structure globale des codes ok&lt;br /&gt;
**Fonctionnement presque ok: fonctionnalités implémentées ok, mais parsage csv ne marche pas&lt;br /&gt;
**Refactoring nécessaire&lt;br /&gt;
**Correction de la fonction STOP et amélioration de la fonction de COLLECTE&lt;br /&gt;
**Faire plus de requêtes Javascript que de requêtes HTML&lt;br /&gt;
**Discussion pour l'implémentation du serveur de localisation (= algorithme de localisation) et des visualisations de données sur le site Web&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Observations'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Problèmes rencontrés'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Solutions apportées'''&amp;lt;/span&amp;gt;===&lt;/div&gt;</summary>
		<author><name>Hdelatte</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=P18_Localisation_of_quadrotors&amp;diff=46771</id>
		<title>P18 Localisation of quadrotors</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=P18_Localisation_of_quadrotors&amp;diff=46771"/>
				<updated>2017-12-07T14:13:05Z</updated>
		
		<summary type="html">&lt;p&gt;Hdelatte : /* Semaine 4 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Cahier des charges'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;Présentation générale du projet&amp;lt;/span&amp;gt;=== &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Contexte&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
Dans un monde de plus en plus connecté, de nombreux drones sont déployés pour diverses applications comme l'espionnage, la surveillance, la cartographie de lieux et la livraison de colis. Les technologies nécessaires pour contrôler ces drones sont des sujets de recherche actuels. &lt;br /&gt;
&lt;br /&gt;
Le contrôle de ceux-ci passe tout d'abord par la maîtrise de leur position dans l'espace. Le développement des applications liées à l'utilisation de drones nécessite un travail important sur la localisation spatiale d'objets connectés. &lt;br /&gt;
&lt;br /&gt;
De plus, dans un souci d'utilisation, il est essentiel de développer des interfaces logicielles permettant d'exploiter ces données.&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Objectif du projet&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
L'objectif de ce projet est de développer une interface logicielle permettant de traiter en temps réel les informations de localisation d'un drone et de balises, dans le but de définir leur localisation dans l'espace, en intérieur.&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Description du projet&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
Pour réaliser le contrôle de drones, la première étape importante est de donner ses informations de position. Le but du projet est de développer une interface logicielle permettant de localiser le drone en temps réel en intérieur. Le drone se déplace dans un environnement dans lequel ont été installées de multiples balises. Il est équipé d'une carte, lui permettant de recevoir les distances relatives entre lui-même et les balises, sur laquelle différents algorithmes vont être implémentés pour effectuer la localisation en temps réel. Le projet requiert des compétences en développement hardware (Crazyflie 2.0, voir https://wiki.bitcraze.io/) et software (langage C/C++/Python/Javascript/HTML...).&lt;br /&gt;
&lt;br /&gt;
Il se divise en 4 étapes principales, qui sont:&lt;br /&gt;
*1) Choisir les technologies utilisées&lt;br /&gt;
*2) Choisir l'architecture (OS / APIs)&lt;br /&gt;
*3) Développer les différentes parties du projet&lt;br /&gt;
*4) Intégrer et connecter les différentes parties du projet&lt;br /&gt;
&lt;br /&gt;
La localisation étant en intérieur, le protocole GPS n'est donc pas assez précis pour les applications ciblées. La mise en place d'un tel dispositif permettrait grâce à l'utilisation d'un algorithme d'estimer avec une bonne précision les positions en intérieur d'une balise centrale (appelée Tag) et de balises (appelées Anchor). Le Tag scanne en temps réel la distance relative aux différentes balises, et il nous est retourné la position des balises et du Tag grâce à l'algorithme de localisation.&lt;br /&gt;
&lt;br /&gt;
Le projet se compose de 3 parties:&lt;br /&gt;
* Collect &amp;amp; parse: collecter les données envoyées par les balises en communiquant avec un serveur et récupérer les données adéquates par un tri&lt;br /&gt;
* Localise: déterminer la matrice de position des balises et du Tag en traitant les données récupérées&lt;br /&gt;
* Display: développer l'interface homme machine pour afficher, étudier et utiliser les données traitées&lt;br /&gt;
&lt;br /&gt;
Nous travaillerons dans un premier temps dans une optique temps différé avant de travailler en temps réel. Cela nous permettra d'acquérir des données utiles et réutilisables en aval. &lt;br /&gt;
&lt;br /&gt;
A l'aboutissement du projet, nous devrions être capable via l'interface homme machine développée d'afficher précisément la position spatiale des balises ainsi que du Tag, grâce àl'utilisation d'un algorithme de localisation et des données récupérées, et d'afficher d'autres données relatives au déplacement du Tag ou des balises dans l'espace. &lt;br /&gt;
&lt;br /&gt;
Si le temps le permet, nous pourrons aussi être amenés à adapter et utiliser l'interface développée pour l'utilisation d'un drone.&lt;br /&gt;
&lt;br /&gt;
''Sujet originel''&lt;br /&gt;
&lt;br /&gt;
To achieve the control of quadrotors, the first important task to give its position information. This project is to develop a software(GUI) to localize the quadrotors in real-time. The quadrotor is flying in an environment where several transmitters have been installed. The quadrotor is equipped with a deck to receive the relative distances between the deck and all transmitters, based on which different algorithms will be implemented to realize the real-time localization. The candidates need to have both experiences on hardware (Crazyflie 2.0, see https://wiki.bitcraze.io/) and software development (C/C , Python…). &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Calendrier&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
''[[Avant le 29/09/17]]'' - Élaboration du Cahier des charges, de la liste des tâches et du calendrier prévisionnel&lt;br /&gt;
&lt;br /&gt;
''[[Avant fin Octobre]]'' - Serveur de collecte et début du développement de l'interface logicielle&lt;br /&gt;
&lt;br /&gt;
''[[Avant fin Décembre]]'' - Interface logicielle&lt;br /&gt;
&lt;br /&gt;
''[[A la fin du PFE]]'' - Intégration finale des différentes parties (Serveur de collecte des données &amp;amp; Serveur de localisation &amp;amp; Interface logicielle)&lt;br /&gt;
&lt;br /&gt;
Répartition du volume de travail (***h):&lt;br /&gt;
&lt;br /&gt;
* Recherche sur les technologies à utiliser (**h)&lt;br /&gt;
* Développement du serveur de collecte de données (**h)&lt;br /&gt;
* Réalisation de l'interface logicielle (Web//Logiciel/Application) (**h)&lt;br /&gt;
* Intégration des différentes parties (**h)&lt;br /&gt;
* Test et débuggage (**h)&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Choix techniques : matériel et logiciel&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
Afin de développer ce dispositif, nous allons utiliser une Raspberry Pi 3 associée à une carte réceptrice, qui communique avec 4 balises composées chacune d'un microcontrôleur et d'une carte émettrice radio (UWB5C) et alimentées par batteries. La carte réceptrice joue le rôle du drone à localiser et communiquera les données émises par les balises vers l'ordinateur via Bluetooth.&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Choix technologiques&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
Voici les technologies que nous utilisons pour chacune des parties de ce projet.&lt;br /&gt;
&lt;br /&gt;
    1) Serveur de collecte des données:&lt;br /&gt;
       Scanne et parse les données récupérées pour fournir la matrice D des distances relatives du tag aux 4 balises&lt;br /&gt;
        - API&lt;br /&gt;
        - Python / Serveur Flask&lt;br /&gt;
&lt;br /&gt;
    2) Serveur de localisation (fourni):&lt;br /&gt;
       Calcule grâce à l'algorithme de localisation et la matrice D les positions spatiales des 4 noeuds et du tag&lt;br /&gt;
        - API&lt;br /&gt;
        - Bootstrap&lt;br /&gt;
        - Jquery&lt;br /&gt;
        - Python&lt;br /&gt;
&lt;br /&gt;
    3) Interface utilisateur:&lt;br /&gt;
       Affiche courbes, visualisation 3D, boutons ou données des fichiers envoyées par le serveur de localisation&lt;br /&gt;
        - HTML5 / Javascript&lt;br /&gt;
        - Fichiers JSON (serveurs de collecte et de localisation)&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Calendrier prévisionnel'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Liste des tâches à effectuer&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
# Se documenter sur le projet&lt;br /&gt;
##Langages et technologies utilisées&lt;br /&gt;
##Matériel utilisé&lt;br /&gt;
##Mettre en place du travail sur le Git&lt;br /&gt;
# Réaliser le serveur de collecte&lt;br /&gt;
##Récupérer les trames envoyées par bluetooth par le TAG via la Raspberry Pi&lt;br /&gt;
##Intégrer le serveur de localisation pour interpréter les trames&lt;br /&gt;
##Tester et optimiser&lt;br /&gt;
# Réaliser l'interface Web utilisateur&lt;br /&gt;
##Implémenter le serveur de collecte et de localisation&lt;br /&gt;
##Afficher et traiter les données stockées dans les fichiers JSON via le serveur (temps différé + temps réel)&lt;br /&gt;
##Tester et optimiser&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;Replanification du cahier des charges / calendrier&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Feuille d'heures'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Tâche !! Prélude !! Heures S1 !! Heures S2 !! Heures S3 !! Heures S4 !! Heures S5 !! Heures S6 !! Heures S7 !! Heures S8 !! Heures S9 !! Heures S10 !! Heures S11 !! Heures S12 !! Après Noël !! Total&lt;br /&gt;
|-&lt;br /&gt;
| Cahier des charges / Wiki / Gitlab&lt;br /&gt;
|  4h&lt;br /&gt;
|  3h&lt;br /&gt;
|  1h&lt;br /&gt;
|  x&lt;br /&gt;
|  1h30&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h30&lt;br /&gt;
|  1h&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Documentation sur les technos utilisées&lt;br /&gt;
|  2h&lt;br /&gt;
|  4h&lt;br /&gt;
|  3h&lt;br /&gt;
|  2h&lt;br /&gt;
|  3h&lt;br /&gt;
|  4h&lt;br /&gt;
|  5h&lt;br /&gt;
|  5h30&lt;br /&gt;
|  4h30&lt;br /&gt;
|  3h30&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Documentation sur le matériel&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Recherche et développement du serveur de collecte&lt;br /&gt;
|  x&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  3h&lt;br /&gt;
|  3h30&lt;br /&gt;
|  4h&lt;br /&gt;
|  5h&lt;br /&gt;
|  7h&lt;br /&gt;
|  4h30&lt;br /&gt;
|  0,5h&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| Recherche et développement de l'interface Web&lt;br /&gt;
|  x&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  3h&lt;br /&gt;
|  5h&lt;br /&gt;
|  6h&lt;br /&gt;
|  4h&lt;br /&gt;
|  7h&lt;br /&gt;
|  5h30&lt;br /&gt;
|  2h30&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| Recherche et intégration du serveur de localisation&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x &lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| Intégration des différentes parties&lt;br /&gt;
|  x&lt;br /&gt;
|  x  &lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  2h&lt;br /&gt;
|  2h&lt;br /&gt;
|  2h&lt;br /&gt;
|  3h&lt;br /&gt;
|  1h30&lt;br /&gt;
|  x&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| Tests et débuggage&lt;br /&gt;
|  x&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  1h&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  3h&lt;br /&gt;
|  4h&lt;br /&gt;
|  0,5h&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Optimisation/Correction des programmes&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Avancement du Projet'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Phase préparatoire'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Jeu 21/09/17 - Ven 22/09/17]]'' &lt;br /&gt;
*Rendez-vous de mise au point du cahier des charges avec les encadrants/intervenants (M. ZHENG Gang et M. DAGHER Roudy)&lt;br /&gt;
*Elaboration du cahier des charges&lt;br /&gt;
*Elaboration de la page Wiki (préparation de la mise en page et présentation du sujet)&lt;br /&gt;
*Préparation du travail sous forme de Mind Map&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous nous sommes tout d’abord rendus au laboratoire de l'INRIA afin de pouvoir définir le plus précisément possible le cahier des charges avec nos tuteurs.&lt;br /&gt;
Nous avons donc défini avec eux les technologies qu'il faudrait étudier. Vous retrouverez le choix des technologies dans la partie '''choix technologiques'''&lt;br /&gt;
&lt;br /&gt;
Nous avons en même temps créé notre page Wiki, et structuré celui-ci avec les parties qui nous seraient utiles pour développer nos explications par la suite.&lt;br /&gt;
&lt;br /&gt;
Nous avons de plus découpé le travail en sous-parties que nous avions mis dans un '''Mind map''' afin d'y voir plus clair sur la ligne à suivre.&lt;br /&gt;
&lt;br /&gt;
Vous trouverez ce Mind map juste ci-dessous. Nous ne mettrons pas à jour ce Mind map chaque semaine mais il est fort probable que nous en referions un en milieu de projet pour pouvoir cibler les objectifs réussis et ceux à atteindre. Nous pourrons de plus redéfinir certains objectifs qui nous aurait semblé trop vague au début du projet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Projet de fin d'étude.png|centre|600px]]&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 1'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Jeu 28/09/17 - Ven 29/09/17]]'' &lt;br /&gt;
*Revue du Cahier des Charges avec les encadrants&lt;br /&gt;
*Lecture et recherches sur les technologies adaptées&lt;br /&gt;
*Construction de la suite de la Mind Map&lt;br /&gt;
*Création du Gitlab&lt;br /&gt;
&lt;br /&gt;
Nous commençons les recherches sur le projet et sur les premières technologies engagées dans celui-ci. Nous en profitons pour formuler des à présent des questions sur le bon choix de celles-ci. Nous commençons donc des tests ayant seulement pour but de nous familiariser avec l'environnement de travail et de réellement comprendre les fonctions déjà présentes qu'il faudra exploiter et implanter notre interface web.&lt;br /&gt;
Nous créons un gitlab avec notre tuteur et commençons a définir les taches premières sur celui-ci.&lt;br /&gt;
Nous en profitons pour affiner le Mind Map.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 2'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Jeu 05/10/17 - Ven 06/10/17]]''  &lt;br /&gt;
*Précisions sur le cahier des charges&lt;br /&gt;
*Listage du matériel&lt;br /&gt;
*Recherche et détermination de solutions technologiques possibles pour les fonctions demandées&lt;br /&gt;
*Début du travail sur le serveur de collecte&lt;br /&gt;
*Apprentissage du langage Python et de l'utilisation du framework Flask&lt;br /&gt;
&lt;br /&gt;
Nous avons finalisé les précisions sur le cahier des charges. Nous avons donc pu cibler le matériel dont nous nous servirons pour ce Projet. Vous trouverez donc cette liste la section correspondante. Il est évident que le matériel utilisé est dans l'ensemble déjà fourni par le laboratoire et qu'il nous reste dans l'ensemble à créer l'interface web et les API qui nous permettrons de faire communiquer cette interface avec la Raspberrypi et le serveur de position déjà créé.&lt;br /&gt;
Nous avons donc pu commencer a ce former sur les technologies qui nous serviraient par la suite. Nous avaons donc utilisé le cours d'openclassroom sur les serveur flask pour en apprendre les bases. Ce serveur flask est programmé en python et nous permets donc une grande liberté au niveau de l’exécutions de certains scripts. En effet les script de connexion bluetooth et de redirection de port qui nous permette de recuperer les données de distance sont eux meme codé en python et sont directement appelé via le serveur.&lt;br /&gt;
Dans ce serveur, représentant notre interface web, vous retrouverez la page '''/collecte''' qui représentera notre partie collecte de données ainsi que l'affichage de ces distances. Nous appellerons cette partie le serveur de collecte.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 3'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 11/10/17 - Jeu 12/10/17]]''  &lt;br /&gt;
*Recherche et développement initial du serveur de collecte de données&lt;br /&gt;
*Complément du Git sur les tâches à effectuer&lt;br /&gt;
&lt;br /&gt;
Nous avons commencé à créer un serveur flask renvoyant pour l'instant une matrice aléatoire. Lors de la requête URL &amp;quot;../matrice&amp;quot;, nous voyons bien une matrice aléatoire apparaître sur la page Web. Nous essayons de nous connecter à la Raspberry Pi en redirigeant son port série vers le Bluetooth de façon à récupérer de vraies matrices de distance entre le drone (ie commutateur central) et les balises. Nous pourrons afficher ensuite ces matrices, ou alors les stocker dans un fichier en attendant le traitement de celles-ci.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Requete s3.PNG|300px|serveur flask]]&lt;br /&gt;
&lt;br /&gt;
Nous avons plusieurs problèmes avec le Bluetooth pour se connecter avec la Raspberry Pi. Quand nous aurons réussi à nous connecter au port série de la Raspberry pi alors nous pour gérer le traitement des données récupérées.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 4'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 18/10/17 - Jeu 19/10/17]]''  &lt;br /&gt;
*Configuration de la Raspberry Pi car problèmes de connectivité Bluetooth rencontrés&lt;br /&gt;
**Nous arrivons à connecter la Raspberry Pi sous Windows mais la connexion sous Linux pose problème (travail en suspens en attendant la disponibilité de l'encadrant)&lt;br /&gt;
*Début du développement de l'interface Web&lt;br /&gt;
**Traitement d'une matrice dans un fichier JSON&lt;br /&gt;
**Affichage sous forme de tableau de la matrice&lt;br /&gt;
**Utilisation du serveur de requête en Python avec chargement de template HTML&lt;br /&gt;
**Mise en forme de la trame de la page en HTML/CSS avec le framework Bootstrap&lt;br /&gt;
**Ajout d'un set de distances (d1, d2, d3, d4) dans la matrice lors d'un appui sur un bouton Chargement en utilisant un fichier Javascript&lt;br /&gt;
&lt;br /&gt;
Nous Avons reçus des fonctions pythons de notre tuteurs afin d'obtenir une connexion bluetooth entre notre raspberrypi et notre ordinateur ainsi qu'une redirection de port de celle ci vers la connexion. Nous n'arrivons pas à utiliser ces fonctions sous linux et nous necessitons une explication de notre tuteur n'etant pas disponible a ce moment. Pour ne pas perdre de temps nous nous attaquons la creation de l'interface web a proprement parler. c'est a dire la création des pages html ainsi que le document javascript qui nous servira de bibliotheque de fonctions.chaque route de notre serveur sont relié a une series de fonctions python s'executant a l'apelle des url puis suivis d'un template de la page HTML en question. Nous en profitons de plus pour explorer le framework CSS bootstrap afin de mettre un premier design et une structure a notre page collecte qui sera la page principale de notre site pour ce début de projet.&lt;br /&gt;
&lt;br /&gt;
Nous nous essayons de plus à différents tests sur des fichiers de format '''Json''' que nous devrons réussir à traiter correctement plus tard dans notre projet.&lt;br /&gt;
Nous récupérons une matrice que nous créons nous même en python (simulation d'une série de distances récupérée) que nous transformons au format Json pour ensuite l'afficher sur notre page web. Pour pouvoir proprement afficher se fichier '''Json''' renvoyé vers notre page, nous nous servons du fichier javascript afin de créer du code html contenant la matrice.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 5'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 25/10/17 - Ven 27/10/17]]''  &lt;br /&gt;
*Résolution des problèmes de connectique Bluetooth sur la Raspberry Pi&lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Traitement d'une matrice dans un fichier JSON&lt;br /&gt;
**Début de l'ajout d'un set de distances depuis une matrice contenue dans un fichier JSON&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 6'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 08/11/17 - Ven 10/11/17]]''  &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
**Mise en place de la communication entre le port série de notre machine et le port série de la carte via Bluetooth de la RPi3&lt;br /&gt;
**Récupération et traitement (parse) manuels des données de distances dans un fichier .log via TCP/IP&amp;lt;-&amp;gt;Bluetooth&lt;br /&gt;
**Début de l'automatisation du procédé par script Python (requete.py) et mise en place de sockets de communication&lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Chargement sur commande d'un set de distances depuis une matrice contenue dans un fichier JSON&lt;br /&gt;
*Travail sur le layout du site&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 7'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 15/11/17 - Ven 17/11/17]]''  &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
**Récupération et traitement (parse) manuels des données de distances dans un fichier .log via TCP/IP&amp;lt;-&amp;gt;Bluetooth&lt;br /&gt;
**Automatisation du procédé par script Python (requete.py)&lt;br /&gt;
***Mise en place de sockets de communication pour le contrôle de la collecte -&amp;gt; abandonné (servait à commander la collecte manuellement)&lt;br /&gt;
***Développement d'un script engine.py regroupant les commandes exécutables par l'utilisateur via la page Web&lt;br /&gt;
***Début du travail sur la fonction &amp;quot;STOP&amp;quot; manuel d'une action de collecte de données (liaison entre script html, javascript, et script python)&lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Chargement sur commande d'un set de distances depuis une matrice contenue dans un fichier JSON&lt;br /&gt;
**Travail sur le layout du site&lt;br /&gt;
***Ajout des différentes commandes (connexion bluetooth, lancement commande cu, collecte des données, collecte durée donnée)&lt;br /&gt;
***Début de l'implémentation de la visualisation des fichiers .json obtenus après collecte et affichage dans un tableau matriciel du fichier sélectionné&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 8'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 22/11/17 - Ven 24/11/17]]''  &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
**Automatisation du procédé de collecte par script Python (requete.py qui fait appel à engine.py)&lt;br /&gt;
***Développement d'un script engine.py regroupant les commandes exécutables par l'utilisateur via la page Web&lt;br /&gt;
***Travail sur la fonction &amp;quot;STOP&amp;quot; manuel d'une action de collecte de données (liaison entre script html, javascript, et script python)&lt;br /&gt;
***Mise en place d'un serveur HTTP Simple sous Python pour accéder aux fichiers de données à partir de la page Web&lt;br /&gt;
***Mise à jour de fonctions de connexion &lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Travail sur le layout du site (ajout de pages, navigation entre les pages, apparence, nettoyage des codes)&lt;br /&gt;
**Bon fonctionnement de l'ensemble serveur collecte + serveur HTTP + client Web&lt;br /&gt;
**Affichage de la liste des fichiers de données de distance (log, csv, json) via serveur HTTP en Python sur port 9999&lt;br /&gt;
*Corrections et nettoyage du dépôt GIT&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 9'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 29/11/17 - Jeudi 30/11/17]]''  &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
**Automatisation du procédé de collecte par script Python (requete.py qui fait appel à engine.py)&lt;br /&gt;
***Travail sur la fonction &amp;quot;STOP&amp;quot; manuel d'une action de collecte de données (liaison entre script html, javascript, et script python)&lt;br /&gt;
***Recherches sur l'utilisation de fichiers json accessibles via le serveur HTTP&lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Travail sur le layout du site &lt;br /&gt;
**Travail sur la liaison entre fichiers json et affichage Web des données de distance&lt;br /&gt;
***Recherches et tests de solutions&lt;br /&gt;
****Affichage depuis un fichier&lt;br /&gt;
****Affichage à la volée lors d'une action de collecte&lt;br /&gt;
&lt;br /&gt;
*Revue de code avec Roudy DAGHER:&lt;br /&gt;
**Structure globale des codes ok&lt;br /&gt;
**Fonctionnement presque ok: fonctionnalités implémentées ok, mais parsage csv ne marche pas&lt;br /&gt;
**Refactoring nécessaire&lt;br /&gt;
**Correction de la fonction STOP et amélioration de la fonction de COLLECTE&lt;br /&gt;
**Faire plus de requêtes Javascript que de requêtes HTML&lt;br /&gt;
**Discussion pour l'implémentation du serveur de localisation (= algorithme de localisation) et des visualisations de données sur le site Web&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Observations'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Problèmes rencontrés'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Solutions apportées'''&amp;lt;/span&amp;gt;===&lt;/div&gt;</summary>
		<author><name>Hdelatte</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=P18_Localisation_of_quadrotors&amp;diff=46770</id>
		<title>P18 Localisation of quadrotors</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=P18_Localisation_of_quadrotors&amp;diff=46770"/>
				<updated>2017-12-07T13:47:34Z</updated>
		
		<summary type="html">&lt;p&gt;Hdelatte : /* Semaine 2 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Cahier des charges'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;Présentation générale du projet&amp;lt;/span&amp;gt;=== &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Contexte&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
Dans un monde de plus en plus connecté, de nombreux drones sont déployés pour diverses applications comme l'espionnage, la surveillance, la cartographie de lieux et la livraison de colis. Les technologies nécessaires pour contrôler ces drones sont des sujets de recherche actuels. &lt;br /&gt;
&lt;br /&gt;
Le contrôle de ceux-ci passe tout d'abord par la maîtrise de leur position dans l'espace. Le développement des applications liées à l'utilisation de drones nécessite un travail important sur la localisation spatiale d'objets connectés. &lt;br /&gt;
&lt;br /&gt;
De plus, dans un souci d'utilisation, il est essentiel de développer des interfaces logicielles permettant d'exploiter ces données.&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Objectif du projet&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
L'objectif de ce projet est de développer une interface logicielle permettant de traiter en temps réel les informations de localisation d'un drone et de balises, dans le but de définir leur localisation dans l'espace, en intérieur.&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Description du projet&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
Pour réaliser le contrôle de drones, la première étape importante est de donner ses informations de position. Le but du projet est de développer une interface logicielle permettant de localiser le drone en temps réel en intérieur. Le drone se déplace dans un environnement dans lequel ont été installées de multiples balises. Il est équipé d'une carte, lui permettant de recevoir les distances relatives entre lui-même et les balises, sur laquelle différents algorithmes vont être implémentés pour effectuer la localisation en temps réel. Le projet requiert des compétences en développement hardware (Crazyflie 2.0, voir https://wiki.bitcraze.io/) et software (langage C/C++/Python/Javascript/HTML...).&lt;br /&gt;
&lt;br /&gt;
Il se divise en 4 étapes principales, qui sont:&lt;br /&gt;
*1) Choisir les technologies utilisées&lt;br /&gt;
*2) Choisir l'architecture (OS / APIs)&lt;br /&gt;
*3) Développer les différentes parties du projet&lt;br /&gt;
*4) Intégrer et connecter les différentes parties du projet&lt;br /&gt;
&lt;br /&gt;
La localisation étant en intérieur, le protocole GPS n'est donc pas assez précis pour les applications ciblées. La mise en place d'un tel dispositif permettrait grâce à l'utilisation d'un algorithme d'estimer avec une bonne précision les positions en intérieur d'une balise centrale (appelée Tag) et de balises (appelées Anchor). Le Tag scanne en temps réel la distance relative aux différentes balises, et il nous est retourné la position des balises et du Tag grâce à l'algorithme de localisation.&lt;br /&gt;
&lt;br /&gt;
Le projet se compose de 3 parties:&lt;br /&gt;
* Collect &amp;amp; parse: collecter les données envoyées par les balises en communiquant avec un serveur et récupérer les données adéquates par un tri&lt;br /&gt;
* Localise: déterminer la matrice de position des balises et du Tag en traitant les données récupérées&lt;br /&gt;
* Display: développer l'interface homme machine pour afficher, étudier et utiliser les données traitées&lt;br /&gt;
&lt;br /&gt;
Nous travaillerons dans un premier temps dans une optique temps différé avant de travailler en temps réel. Cela nous permettra d'acquérir des données utiles et réutilisables en aval. &lt;br /&gt;
&lt;br /&gt;
A l'aboutissement du projet, nous devrions être capable via l'interface homme machine développée d'afficher précisément la position spatiale des balises ainsi que du Tag, grâce àl'utilisation d'un algorithme de localisation et des données récupérées, et d'afficher d'autres données relatives au déplacement du Tag ou des balises dans l'espace. &lt;br /&gt;
&lt;br /&gt;
Si le temps le permet, nous pourrons aussi être amenés à adapter et utiliser l'interface développée pour l'utilisation d'un drone.&lt;br /&gt;
&lt;br /&gt;
''Sujet originel''&lt;br /&gt;
&lt;br /&gt;
To achieve the control of quadrotors, the first important task to give its position information. This project is to develop a software(GUI) to localize the quadrotors in real-time. The quadrotor is flying in an environment where several transmitters have been installed. The quadrotor is equipped with a deck to receive the relative distances between the deck and all transmitters, based on which different algorithms will be implemented to realize the real-time localization. The candidates need to have both experiences on hardware (Crazyflie 2.0, see https://wiki.bitcraze.io/) and software development (C/C , Python…). &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Calendrier&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
''[[Avant le 29/09/17]]'' - Élaboration du Cahier des charges, de la liste des tâches et du calendrier prévisionnel&lt;br /&gt;
&lt;br /&gt;
''[[Avant fin Octobre]]'' - Serveur de collecte et début du développement de l'interface logicielle&lt;br /&gt;
&lt;br /&gt;
''[[Avant fin Décembre]]'' - Interface logicielle&lt;br /&gt;
&lt;br /&gt;
''[[A la fin du PFE]]'' - Intégration finale des différentes parties (Serveur de collecte des données &amp;amp; Serveur de localisation &amp;amp; Interface logicielle)&lt;br /&gt;
&lt;br /&gt;
Répartition du volume de travail (***h):&lt;br /&gt;
&lt;br /&gt;
* Recherche sur les technologies à utiliser (**h)&lt;br /&gt;
* Développement du serveur de collecte de données (**h)&lt;br /&gt;
* Réalisation de l'interface logicielle (Web//Logiciel/Application) (**h)&lt;br /&gt;
* Intégration des différentes parties (**h)&lt;br /&gt;
* Test et débuggage (**h)&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Choix techniques : matériel et logiciel&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
Afin de développer ce dispositif, nous allons utiliser une Raspberry Pi 3 associée à une carte réceptrice, qui communique avec 4 balises composées chacune d'un microcontrôleur et d'une carte émettrice radio (UWB5C) et alimentées par batteries. La carte réceptrice joue le rôle du drone à localiser et communiquera les données émises par les balises vers l'ordinateur via Bluetooth.&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Choix technologiques&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
Voici les technologies que nous utilisons pour chacune des parties de ce projet.&lt;br /&gt;
&lt;br /&gt;
    1) Serveur de collecte des données:&lt;br /&gt;
       Scanne et parse les données récupérées pour fournir la matrice D des distances relatives du tag aux 4 balises&lt;br /&gt;
        - API&lt;br /&gt;
        - Python / Serveur Flask&lt;br /&gt;
&lt;br /&gt;
    2) Serveur de localisation (fourni):&lt;br /&gt;
       Calcule grâce à l'algorithme de localisation et la matrice D les positions spatiales des 4 noeuds et du tag&lt;br /&gt;
        - API&lt;br /&gt;
        - Bootstrap&lt;br /&gt;
        - Jquery&lt;br /&gt;
        - Python&lt;br /&gt;
&lt;br /&gt;
    3) Interface utilisateur:&lt;br /&gt;
       Affiche courbes, visualisation 3D, boutons ou données des fichiers envoyées par le serveur de localisation&lt;br /&gt;
        - HTML5 / Javascript&lt;br /&gt;
        - Fichiers JSON (serveurs de collecte et de localisation)&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Calendrier prévisionnel'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Liste des tâches à effectuer&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
# Se documenter sur le projet&lt;br /&gt;
##Langages et technologies utilisées&lt;br /&gt;
##Matériel utilisé&lt;br /&gt;
##Mettre en place du travail sur le Git&lt;br /&gt;
# Réaliser le serveur de collecte&lt;br /&gt;
##Récupérer les trames envoyées par bluetooth par le TAG via la Raspberry Pi&lt;br /&gt;
##Intégrer le serveur de localisation pour interpréter les trames&lt;br /&gt;
##Tester et optimiser&lt;br /&gt;
# Réaliser l'interface Web utilisateur&lt;br /&gt;
##Implémenter le serveur de collecte et de localisation&lt;br /&gt;
##Afficher et traiter les données stockées dans les fichiers JSON via le serveur (temps différé + temps réel)&lt;br /&gt;
##Tester et optimiser&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;Replanification du cahier des charges / calendrier&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Feuille d'heures'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Tâche !! Prélude !! Heures S1 !! Heures S2 !! Heures S3 !! Heures S4 !! Heures S5 !! Heures S6 !! Heures S7 !! Heures S8 !! Heures S9 !! Heures S10 !! Heures S11 !! Heures S12 !! Après Noël !! Total&lt;br /&gt;
|-&lt;br /&gt;
| Cahier des charges / Wiki / Gitlab&lt;br /&gt;
|  4h&lt;br /&gt;
|  3h&lt;br /&gt;
|  1h&lt;br /&gt;
|  x&lt;br /&gt;
|  1h30&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h30&lt;br /&gt;
|  1h&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Documentation sur les technos utilisées&lt;br /&gt;
|  2h&lt;br /&gt;
|  4h&lt;br /&gt;
|  3h&lt;br /&gt;
|  2h&lt;br /&gt;
|  3h&lt;br /&gt;
|  4h&lt;br /&gt;
|  5h&lt;br /&gt;
|  5h30&lt;br /&gt;
|  4h30&lt;br /&gt;
|  3h30&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Documentation sur le matériel&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Recherche et développement du serveur de collecte&lt;br /&gt;
|  x&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  3h&lt;br /&gt;
|  3h30&lt;br /&gt;
|  4h&lt;br /&gt;
|  5h&lt;br /&gt;
|  7h&lt;br /&gt;
|  4h30&lt;br /&gt;
|  0,5h&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| Recherche et développement de l'interface Web&lt;br /&gt;
|  x&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  3h&lt;br /&gt;
|  5h&lt;br /&gt;
|  6h&lt;br /&gt;
|  4h&lt;br /&gt;
|  7h&lt;br /&gt;
|  5h30&lt;br /&gt;
|  2h30&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| Recherche et intégration du serveur de localisation&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x &lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| Intégration des différentes parties&lt;br /&gt;
|  x&lt;br /&gt;
|  x  &lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  2h&lt;br /&gt;
|  2h&lt;br /&gt;
|  2h&lt;br /&gt;
|  3h&lt;br /&gt;
|  1h30&lt;br /&gt;
|  x&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| Tests et débuggage&lt;br /&gt;
|  x&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  1h&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  3h&lt;br /&gt;
|  4h&lt;br /&gt;
|  0,5h&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Optimisation/Correction des programmes&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Avancement du Projet'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Phase préparatoire'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Jeu 21/09/17 - Ven 22/09/17]]'' &lt;br /&gt;
*Rendez-vous de mise au point du cahier des charges avec les encadrants/intervenants (M. ZHENG Gang et M. DAGHER Roudy)&lt;br /&gt;
*Elaboration du cahier des charges&lt;br /&gt;
*Elaboration de la page Wiki (préparation de la mise en page et présentation du sujet)&lt;br /&gt;
*Préparation du travail sous forme de Mind Map&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous nous sommes tout d’abord rendus au laboratoire de l'INRIA afin de pouvoir définir le plus précisément possible le cahier des charges avec nos tuteurs.&lt;br /&gt;
Nous avons donc défini avec eux les technologies qu'il faudrait étudier. Vous retrouverez le choix des technologies dans la partie '''choix technologiques'''&lt;br /&gt;
&lt;br /&gt;
Nous avons en même temps créé notre page Wiki, et structuré celui-ci avec les parties qui nous seraient utiles pour développer nos explications par la suite.&lt;br /&gt;
&lt;br /&gt;
Nous avons de plus découpé le travail en sous-parties que nous avions mis dans un '''Mind map''' afin d'y voir plus clair sur la ligne à suivre.&lt;br /&gt;
&lt;br /&gt;
Vous trouverez ce Mind map juste ci-dessous. Nous ne mettrons pas à jour ce Mind map chaque semaine mais il est fort probable que nous en referions un en milieu de projet pour pouvoir cibler les objectifs réussis et ceux à atteindre. Nous pourrons de plus redéfinir certains objectifs qui nous aurait semblé trop vague au début du projet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Projet de fin d'étude.png|centre|600px]]&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 1'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Jeu 28/09/17 - Ven 29/09/17]]'' &lt;br /&gt;
*Revue du Cahier des Charges avec les encadrants&lt;br /&gt;
*Lecture et recherches sur les technologies adaptées&lt;br /&gt;
*Construction de la suite de la Mind Map&lt;br /&gt;
*Création du Gitlab&lt;br /&gt;
&lt;br /&gt;
Nous commençons les recherches sur le projet et sur les premières technologies engagées dans celui-ci. Nous en profitons pour formuler des à présent des questions sur le bon choix de celles-ci. Nous commençons donc des tests ayant seulement pour but de nous familiariser avec l'environnement de travail et de réellement comprendre les fonctions déjà présentes qu'il faudra exploiter et implanter notre interface web.&lt;br /&gt;
Nous créons un gitlab avec notre tuteur et commençons a définir les taches premières sur celui-ci.&lt;br /&gt;
Nous en profitons pour affiner le Mind Map.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 2'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Jeu 05/10/17 - Ven 06/10/17]]''  &lt;br /&gt;
*Précisions sur le cahier des charges&lt;br /&gt;
*Listage du matériel&lt;br /&gt;
*Recherche et détermination de solutions technologiques possibles pour les fonctions demandées&lt;br /&gt;
*Début du travail sur le serveur de collecte&lt;br /&gt;
*Apprentissage du langage Python et de l'utilisation du framework Flask&lt;br /&gt;
&lt;br /&gt;
Nous avons finalisé les précisions sur le cahier des charges. Nous avons donc pu cibler le matériel dont nous nous servirons pour ce Projet. Vous trouverez donc cette liste la section correspondante. Il est évident que le matériel utilisé est dans l'ensemble déjà fourni par le laboratoire et qu'il nous reste dans l'ensemble à créer l'interface web et les API qui nous permettrons de faire communiquer cette interface avec la Raspberrypi et le serveur de position déjà créé.&lt;br /&gt;
Nous avons donc pu commencer a ce former sur les technologies qui nous serviraient par la suite. Nous avaons donc utilisé le cours d'openclassroom sur les serveur flask pour en apprendre les bases. Ce serveur flask est programmé en python et nous permets donc une grande liberté au niveau de l’exécutions de certains scripts. En effet les script de connexion bluetooth et de redirection de port qui nous permette de recuperer les données de distance sont eux meme codé en python et sont directement appelé via le serveur.&lt;br /&gt;
Dans ce serveur, représentant notre interface web, vous retrouverez la page '''/collecte''' qui représentera notre partie collecte de données ainsi que l'affichage de ces distances. Nous appellerons cette partie le serveur de collecte.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 3'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 11/10/17 - Jeu 12/10/17]]''  &lt;br /&gt;
*Recherche et développement initial du serveur de collecte de données&lt;br /&gt;
*Complément du Git sur les tâches à effectuer&lt;br /&gt;
&lt;br /&gt;
Nous avons commencé à créer un serveur flask renvoyant pour l'instant une matrice aléatoire. Lors de la requête URL &amp;quot;../matrice&amp;quot;, nous voyons bien une matrice aléatoire apparaître sur la page Web. Nous essayons de nous connecter à la Raspberry Pi en redirigeant son port série vers le Bluetooth de façon à récupérer de vraies matrices de distance entre le drone (ie commutateur central) et les balises. Nous pourrons afficher ensuite ces matrices, ou alors les stocker dans un fichier en attendant le traitement de celles-ci.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Requete s3.PNG|300px|serveur flask]]&lt;br /&gt;
&lt;br /&gt;
Nous avons plusieurs problèmes avec le Bluetooth pour se connecter avec la Raspberry Pi. Quand nous aurons réussi à nous connecter au port série de la Raspberry pi alors nous pour gérer le traitement des données récupérées.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 4'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 18/10/17 - Jeu 19/10/17]]''  &lt;br /&gt;
*Configuration de la Raspberry Pi car problèmes de connectivité Bluetooth rencontrés&lt;br /&gt;
**Nous arrivons à connecter la Raspberry Pi sous Windows mais la connexion sous Linux pose problème (travail en suspens en attendant la disponibilité de l'encadrant)&lt;br /&gt;
*Début du développement de l'interface Web&lt;br /&gt;
**Traitement d'une matrice dans un fichier JSON&lt;br /&gt;
**Affichage sous forme de tableau de la matrice&lt;br /&gt;
**Utilisation du serveur de requête en Python avec chargement de template HTML&lt;br /&gt;
**Mise en forme de la trame de la page en HTML/CSS avec le framework Bootstrap&lt;br /&gt;
**Ajout d'un set de distances (d1, d2, d3, d4) dans la matrice lors d'un appui sur un bouton Chargement en utilisant un fichier Javascript&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 5'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 25/10/17 - Ven 27/10/17]]''  &lt;br /&gt;
*Résolution des problèmes de connectique Bluetooth sur la Raspberry Pi&lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Traitement d'une matrice dans un fichier JSON&lt;br /&gt;
**Début de l'ajout d'un set de distances depuis une matrice contenue dans un fichier JSON&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 6'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 08/11/17 - Ven 10/11/17]]''  &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
**Mise en place de la communication entre le port série de notre machine et le port série de la carte via Bluetooth de la RPi3&lt;br /&gt;
**Récupération et traitement (parse) manuels des données de distances dans un fichier .log via TCP/IP&amp;lt;-&amp;gt;Bluetooth&lt;br /&gt;
**Début de l'automatisation du procédé par script Python (requete.py) et mise en place de sockets de communication&lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Chargement sur commande d'un set de distances depuis une matrice contenue dans un fichier JSON&lt;br /&gt;
*Travail sur le layout du site&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 7'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 15/11/17 - Ven 17/11/17]]''  &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
**Récupération et traitement (parse) manuels des données de distances dans un fichier .log via TCP/IP&amp;lt;-&amp;gt;Bluetooth&lt;br /&gt;
**Automatisation du procédé par script Python (requete.py)&lt;br /&gt;
***Mise en place de sockets de communication pour le contrôle de la collecte -&amp;gt; abandonné (servait à commander la collecte manuellement)&lt;br /&gt;
***Développement d'un script engine.py regroupant les commandes exécutables par l'utilisateur via la page Web&lt;br /&gt;
***Début du travail sur la fonction &amp;quot;STOP&amp;quot; manuel d'une action de collecte de données (liaison entre script html, javascript, et script python)&lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Chargement sur commande d'un set de distances depuis une matrice contenue dans un fichier JSON&lt;br /&gt;
**Travail sur le layout du site&lt;br /&gt;
***Ajout des différentes commandes (connexion bluetooth, lancement commande cu, collecte des données, collecte durée donnée)&lt;br /&gt;
***Début de l'implémentation de la visualisation des fichiers .json obtenus après collecte et affichage dans un tableau matriciel du fichier sélectionné&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 8'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 22/11/17 - Ven 24/11/17]]''  &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
**Automatisation du procédé de collecte par script Python (requete.py qui fait appel à engine.py)&lt;br /&gt;
***Développement d'un script engine.py regroupant les commandes exécutables par l'utilisateur via la page Web&lt;br /&gt;
***Travail sur la fonction &amp;quot;STOP&amp;quot; manuel d'une action de collecte de données (liaison entre script html, javascript, et script python)&lt;br /&gt;
***Mise en place d'un serveur HTTP Simple sous Python pour accéder aux fichiers de données à partir de la page Web&lt;br /&gt;
***Mise à jour de fonctions de connexion &lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Travail sur le layout du site (ajout de pages, navigation entre les pages, apparence, nettoyage des codes)&lt;br /&gt;
**Bon fonctionnement de l'ensemble serveur collecte + serveur HTTP + client Web&lt;br /&gt;
**Affichage de la liste des fichiers de données de distance (log, csv, json) via serveur HTTP en Python sur port 9999&lt;br /&gt;
*Corrections et nettoyage du dépôt GIT&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 9'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 29/11/17 - Jeudi 30/11/17]]''  &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
**Automatisation du procédé de collecte par script Python (requete.py qui fait appel à engine.py)&lt;br /&gt;
***Travail sur la fonction &amp;quot;STOP&amp;quot; manuel d'une action de collecte de données (liaison entre script html, javascript, et script python)&lt;br /&gt;
***Recherches sur l'utilisation de fichiers json accessibles via le serveur HTTP&lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Travail sur le layout du site &lt;br /&gt;
**Travail sur la liaison entre fichiers json et affichage Web des données de distance&lt;br /&gt;
***Recherches et tests de solutions&lt;br /&gt;
****Affichage depuis un fichier&lt;br /&gt;
****Affichage à la volée lors d'une action de collecte&lt;br /&gt;
&lt;br /&gt;
*Revue de code avec Roudy DAGHER:&lt;br /&gt;
**Structure globale des codes ok&lt;br /&gt;
**Fonctionnement presque ok: fonctionnalités implémentées ok, mais parsage csv ne marche pas&lt;br /&gt;
**Refactoring nécessaire&lt;br /&gt;
**Correction de la fonction STOP et amélioration de la fonction de COLLECTE&lt;br /&gt;
**Faire plus de requêtes Javascript que de requêtes HTML&lt;br /&gt;
**Discussion pour l'implémentation du serveur de localisation (= algorithme de localisation) et des visualisations de données sur le site Web&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Observations'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Problèmes rencontrés'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Solutions apportées'''&amp;lt;/span&amp;gt;===&lt;/div&gt;</summary>
		<author><name>Hdelatte</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=P18_Localisation_of_quadrotors&amp;diff=46769</id>
		<title>P18 Localisation of quadrotors</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=P18_Localisation_of_quadrotors&amp;diff=46769"/>
				<updated>2017-12-07T13:23:18Z</updated>
		
		<summary type="html">&lt;p&gt;Hdelatte : /* Phase préparatoire */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Cahier des charges'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;Présentation générale du projet&amp;lt;/span&amp;gt;=== &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Contexte&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
Dans un monde de plus en plus connecté, de nombreux drones sont déployés pour diverses applications comme l'espionnage, la surveillance, la cartographie de lieux et la livraison de colis. Les technologies nécessaires pour contrôler ces drones sont des sujets de recherche actuels. &lt;br /&gt;
&lt;br /&gt;
Le contrôle de ceux-ci passe tout d'abord par la maîtrise de leur position dans l'espace. Le développement des applications liées à l'utilisation de drones nécessite un travail important sur la localisation spatiale d'objets connectés. &lt;br /&gt;
&lt;br /&gt;
De plus, dans un souci d'utilisation, il est essentiel de développer des interfaces logicielles permettant d'exploiter ces données.&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Objectif du projet&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
L'objectif de ce projet est de développer une interface logicielle permettant de traiter en temps réel les informations de localisation d'un drone et de balises, dans le but de définir leur localisation dans l'espace, en intérieur.&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Description du projet&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
Pour réaliser le contrôle de drones, la première étape importante est de donner ses informations de position. Le but du projet est de développer une interface logicielle permettant de localiser le drone en temps réel en intérieur. Le drone se déplace dans un environnement dans lequel ont été installées de multiples balises. Il est équipé d'une carte, lui permettant de recevoir les distances relatives entre lui-même et les balises, sur laquelle différents algorithmes vont être implémentés pour effectuer la localisation en temps réel. Le projet requiert des compétences en développement hardware (Crazyflie 2.0, voir https://wiki.bitcraze.io/) et software (langage C/C++/Python/Javascript/HTML...).&lt;br /&gt;
&lt;br /&gt;
Il se divise en 4 étapes principales, qui sont:&lt;br /&gt;
*1) Choisir les technologies utilisées&lt;br /&gt;
*2) Choisir l'architecture (OS / APIs)&lt;br /&gt;
*3) Développer les différentes parties du projet&lt;br /&gt;
*4) Intégrer et connecter les différentes parties du projet&lt;br /&gt;
&lt;br /&gt;
La localisation étant en intérieur, le protocole GPS n'est donc pas assez précis pour les applications ciblées. La mise en place d'un tel dispositif permettrait grâce à l'utilisation d'un algorithme d'estimer avec une bonne précision les positions en intérieur d'une balise centrale (appelée Tag) et de balises (appelées Anchor). Le Tag scanne en temps réel la distance relative aux différentes balises, et il nous est retourné la position des balises et du Tag grâce à l'algorithme de localisation.&lt;br /&gt;
&lt;br /&gt;
Le projet se compose de 3 parties:&lt;br /&gt;
* Collect &amp;amp; parse: collecter les données envoyées par les balises en communiquant avec un serveur et récupérer les données adéquates par un tri&lt;br /&gt;
* Localise: déterminer la matrice de position des balises et du Tag en traitant les données récupérées&lt;br /&gt;
* Display: développer l'interface homme machine pour afficher, étudier et utiliser les données traitées&lt;br /&gt;
&lt;br /&gt;
Nous travaillerons dans un premier temps dans une optique temps différé avant de travailler en temps réel. Cela nous permettra d'acquérir des données utiles et réutilisables en aval. &lt;br /&gt;
&lt;br /&gt;
A l'aboutissement du projet, nous devrions être capable via l'interface homme machine développée d'afficher précisément la position spatiale des balises ainsi que du Tag, grâce àl'utilisation d'un algorithme de localisation et des données récupérées, et d'afficher d'autres données relatives au déplacement du Tag ou des balises dans l'espace. &lt;br /&gt;
&lt;br /&gt;
Si le temps le permet, nous pourrons aussi être amenés à adapter et utiliser l'interface développée pour l'utilisation d'un drone.&lt;br /&gt;
&lt;br /&gt;
''Sujet originel''&lt;br /&gt;
&lt;br /&gt;
To achieve the control of quadrotors, the first important task to give its position information. This project is to develop a software(GUI) to localize the quadrotors in real-time. The quadrotor is flying in an environment where several transmitters have been installed. The quadrotor is equipped with a deck to receive the relative distances between the deck and all transmitters, based on which different algorithms will be implemented to realize the real-time localization. The candidates need to have both experiences on hardware (Crazyflie 2.0, see https://wiki.bitcraze.io/) and software development (C/C , Python…). &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Calendrier&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
''[[Avant le 29/09/17]]'' - Élaboration du Cahier des charges, de la liste des tâches et du calendrier prévisionnel&lt;br /&gt;
&lt;br /&gt;
''[[Avant fin Octobre]]'' - Serveur de collecte et début du développement de l'interface logicielle&lt;br /&gt;
&lt;br /&gt;
''[[Avant fin Décembre]]'' - Interface logicielle&lt;br /&gt;
&lt;br /&gt;
''[[A la fin du PFE]]'' - Intégration finale des différentes parties (Serveur de collecte des données &amp;amp; Serveur de localisation &amp;amp; Interface logicielle)&lt;br /&gt;
&lt;br /&gt;
Répartition du volume de travail (***h):&lt;br /&gt;
&lt;br /&gt;
* Recherche sur les technologies à utiliser (**h)&lt;br /&gt;
* Développement du serveur de collecte de données (**h)&lt;br /&gt;
* Réalisation de l'interface logicielle (Web//Logiciel/Application) (**h)&lt;br /&gt;
* Intégration des différentes parties (**h)&lt;br /&gt;
* Test et débuggage (**h)&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Choix techniques : matériel et logiciel&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
Afin de développer ce dispositif, nous allons utiliser une Raspberry Pi 3 associée à une carte réceptrice, qui communique avec 4 balises composées chacune d'un microcontrôleur et d'une carte émettrice radio (UWB5C) et alimentées par batteries. La carte réceptrice joue le rôle du drone à localiser et communiquera les données émises par les balises vers l'ordinateur via Bluetooth.&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Choix technologiques&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
Voici les technologies que nous utilisons pour chacune des parties de ce projet.&lt;br /&gt;
&lt;br /&gt;
    1) Serveur de collecte des données:&lt;br /&gt;
       Scanne et parse les données récupérées pour fournir la matrice D des distances relatives du tag aux 4 balises&lt;br /&gt;
        - API&lt;br /&gt;
        - Python / Serveur Flask&lt;br /&gt;
&lt;br /&gt;
    2) Serveur de localisation (fourni):&lt;br /&gt;
       Calcule grâce à l'algorithme de localisation et la matrice D les positions spatiales des 4 noeuds et du tag&lt;br /&gt;
        - API&lt;br /&gt;
        - Bootstrap&lt;br /&gt;
        - Jquery&lt;br /&gt;
        - Python&lt;br /&gt;
&lt;br /&gt;
    3) Interface utilisateur:&lt;br /&gt;
       Affiche courbes, visualisation 3D, boutons ou données des fichiers envoyées par le serveur de localisation&lt;br /&gt;
        - HTML5 / Javascript&lt;br /&gt;
        - Fichiers JSON (serveurs de collecte et de localisation)&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Calendrier prévisionnel'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Liste des tâches à effectuer&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
# Se documenter sur le projet&lt;br /&gt;
##Langages et technologies utilisées&lt;br /&gt;
##Matériel utilisé&lt;br /&gt;
##Mettre en place du travail sur le Git&lt;br /&gt;
# Réaliser le serveur de collecte&lt;br /&gt;
##Récupérer les trames envoyées par bluetooth par le TAG via la Raspberry Pi&lt;br /&gt;
##Intégrer le serveur de localisation pour interpréter les trames&lt;br /&gt;
##Tester et optimiser&lt;br /&gt;
# Réaliser l'interface Web utilisateur&lt;br /&gt;
##Implémenter le serveur de collecte et de localisation&lt;br /&gt;
##Afficher et traiter les données stockées dans les fichiers JSON via le serveur (temps différé + temps réel)&lt;br /&gt;
##Tester et optimiser&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;Replanification du cahier des charges / calendrier&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Feuille d'heures'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Tâche !! Prélude !! Heures S1 !! Heures S2 !! Heures S3 !! Heures S4 !! Heures S5 !! Heures S6 !! Heures S7 !! Heures S8 !! Heures S9 !! Heures S10 !! Heures S11 !! Heures S12 !! Après Noël !! Total&lt;br /&gt;
|-&lt;br /&gt;
| Cahier des charges / Wiki / Gitlab&lt;br /&gt;
|  4h&lt;br /&gt;
|  3h&lt;br /&gt;
|  1h&lt;br /&gt;
|  x&lt;br /&gt;
|  1h30&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h30&lt;br /&gt;
|  1h&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Documentation sur les technos utilisées&lt;br /&gt;
|  2h&lt;br /&gt;
|  4h&lt;br /&gt;
|  3h&lt;br /&gt;
|  2h&lt;br /&gt;
|  3h&lt;br /&gt;
|  4h&lt;br /&gt;
|  5h&lt;br /&gt;
|  5h30&lt;br /&gt;
|  4h30&lt;br /&gt;
|  3h30&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Documentation sur le matériel&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Recherche et développement du serveur de collecte&lt;br /&gt;
|  x&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  3h&lt;br /&gt;
|  3h30&lt;br /&gt;
|  4h&lt;br /&gt;
|  5h&lt;br /&gt;
|  7h&lt;br /&gt;
|  4h30&lt;br /&gt;
|  0,5h&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| Recherche et développement de l'interface Web&lt;br /&gt;
|  x&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  3h&lt;br /&gt;
|  5h&lt;br /&gt;
|  6h&lt;br /&gt;
|  4h&lt;br /&gt;
|  7h&lt;br /&gt;
|  5h30&lt;br /&gt;
|  2h30&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| Recherche et intégration du serveur de localisation&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x &lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| Intégration des différentes parties&lt;br /&gt;
|  x&lt;br /&gt;
|  x  &lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  2h&lt;br /&gt;
|  2h&lt;br /&gt;
|  2h&lt;br /&gt;
|  3h&lt;br /&gt;
|  1h30&lt;br /&gt;
|  x&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| Tests et débuggage&lt;br /&gt;
|  x&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  1h&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  3h&lt;br /&gt;
|  4h&lt;br /&gt;
|  0,5h&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Optimisation/Correction des programmes&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Avancement du Projet'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Phase préparatoire'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Jeu 21/09/17 - Ven 22/09/17]]'' &lt;br /&gt;
*Rendez-vous de mise au point du cahier des charges avec les encadrants/intervenants (M. ZHENG Gang et M. DAGHER Roudy)&lt;br /&gt;
*Elaboration du cahier des charges&lt;br /&gt;
*Elaboration de la page Wiki (préparation de la mise en page et présentation du sujet)&lt;br /&gt;
*Préparation du travail sous forme de Mind Map&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous nous sommes tout d’abord rendus au laboratoire de l'INRIA afin de pouvoir définir le plus précisément possible le cahier des charges avec nos tuteurs.&lt;br /&gt;
Nous avons donc défini avec eux les technologies qu'il faudrait étudier. Vous retrouverez le choix des technologies dans la partie '''choix technologiques'''&lt;br /&gt;
&lt;br /&gt;
Nous avons en même temps créé notre page Wiki, et structuré celui-ci avec les parties qui nous seraient utiles pour développer nos explications par la suite.&lt;br /&gt;
&lt;br /&gt;
Nous avons de plus découpé le travail en sous-parties que nous avions mis dans un '''Mind map''' afin d'y voir plus clair sur la ligne à suivre.&lt;br /&gt;
&lt;br /&gt;
Vous trouverez ce Mind map juste ci-dessous. Nous ne mettrons pas à jour ce Mind map chaque semaine mais il est fort probable que nous en referions un en milieu de projet pour pouvoir cibler les objectifs réussis et ceux à atteindre. Nous pourrons de plus redéfinir certains objectifs qui nous aurait semblé trop vague au début du projet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Projet de fin d'étude.png|centre|600px]]&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 1'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Jeu 28/09/17 - Ven 29/09/17]]'' &lt;br /&gt;
*Revue du Cahier des Charges avec les encadrants&lt;br /&gt;
*Lecture et recherches sur les technologies adaptées&lt;br /&gt;
*Construction de la suite de la Mind Map&lt;br /&gt;
*Création du Gitlab&lt;br /&gt;
&lt;br /&gt;
Nous commençons les recherches sur le projet et sur les premières technologies engagées dans celui-ci. Nous en profitons pour formuler des à présent des questions sur le bon choix de celles-ci. Nous commençons donc des tests ayant seulement pour but de nous familiariser avec l'environnement de travail et de réellement comprendre les fonctions déjà présentes qu'il faudra exploiter et implanter notre interface web.&lt;br /&gt;
Nous créons un gitlab avec notre tuteur et commençons a définir les taches premières sur celui-ci.&lt;br /&gt;
Nous en profitons pour affiner le Mind Map.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 2'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Jeu 05/10/17 - Ven 06/10/17]]''  &lt;br /&gt;
*Précisions sur le cahier des charges&lt;br /&gt;
*Listage du matériel&lt;br /&gt;
*Recherche et détermination de solutions technologiques possibles pour les fonctions demandées&lt;br /&gt;
*Début du travail sur le serveur de collecte&lt;br /&gt;
*Apprentissage du langage Python et de l'utilisation du framework Flask&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 3'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 11/10/17 - Jeu 12/10/17]]''  &lt;br /&gt;
*Recherche et développement initial du serveur de collecte de données&lt;br /&gt;
*Complément du Git sur les tâches à effectuer&lt;br /&gt;
&lt;br /&gt;
Nous avons commencé à créer un serveur flask renvoyant pour l'instant une matrice aléatoire. Lors de la requête URL &amp;quot;../matrice&amp;quot;, nous voyons bien une matrice aléatoire apparaître sur la page Web. Nous essayons de nous connecter à la Raspberry Pi en redirigeant son port série vers le Bluetooth de façon à récupérer de vraies matrices de distance entre le drone (ie commutateur central) et les balises. Nous pourrons afficher ensuite ces matrices, ou alors les stocker dans un fichier en attendant le traitement de celles-ci.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Requete s3.PNG|300px|serveur flask]]&lt;br /&gt;
&lt;br /&gt;
Nous avons plusieurs problèmes avec le Bluetooth pour se connecter avec la Raspberry Pi. Quand nous aurons réussi à nous connecter au port série de la Raspberry pi alors nous pour gérer le traitement des données récupérées.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 4'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 18/10/17 - Jeu 19/10/17]]''  &lt;br /&gt;
*Configuration de la Raspberry Pi car problèmes de connectivité Bluetooth rencontrés&lt;br /&gt;
**Nous arrivons à connecter la Raspberry Pi sous Windows mais la connexion sous Linux pose problème (travail en suspens en attendant la disponibilité de l'encadrant)&lt;br /&gt;
*Début du développement de l'interface Web&lt;br /&gt;
**Traitement d'une matrice dans un fichier JSON&lt;br /&gt;
**Affichage sous forme de tableau de la matrice&lt;br /&gt;
**Utilisation du serveur de requête en Python avec chargement de template HTML&lt;br /&gt;
**Mise en forme de la trame de la page en HTML/CSS avec le framework Bootstrap&lt;br /&gt;
**Ajout d'un set de distances (d1, d2, d3, d4) dans la matrice lors d'un appui sur un bouton Chargement en utilisant un fichier Javascript&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 5'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 25/10/17 - Ven 27/10/17]]''  &lt;br /&gt;
*Résolution des problèmes de connectique Bluetooth sur la Raspberry Pi&lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Traitement d'une matrice dans un fichier JSON&lt;br /&gt;
**Début de l'ajout d'un set de distances depuis une matrice contenue dans un fichier JSON&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 6'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 08/11/17 - Ven 10/11/17]]''  &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
**Mise en place de la communication entre le port série de notre machine et le port série de la carte via Bluetooth de la RPi3&lt;br /&gt;
**Récupération et traitement (parse) manuels des données de distances dans un fichier .log via TCP/IP&amp;lt;-&amp;gt;Bluetooth&lt;br /&gt;
**Début de l'automatisation du procédé par script Python (requete.py) et mise en place de sockets de communication&lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Chargement sur commande d'un set de distances depuis une matrice contenue dans un fichier JSON&lt;br /&gt;
*Travail sur le layout du site&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 7'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 15/11/17 - Ven 17/11/17]]''  &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
**Récupération et traitement (parse) manuels des données de distances dans un fichier .log via TCP/IP&amp;lt;-&amp;gt;Bluetooth&lt;br /&gt;
**Automatisation du procédé par script Python (requete.py)&lt;br /&gt;
***Mise en place de sockets de communication pour le contrôle de la collecte -&amp;gt; abandonné (servait à commander la collecte manuellement)&lt;br /&gt;
***Développement d'un script engine.py regroupant les commandes exécutables par l'utilisateur via la page Web&lt;br /&gt;
***Début du travail sur la fonction &amp;quot;STOP&amp;quot; manuel d'une action de collecte de données (liaison entre script html, javascript, et script python)&lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Chargement sur commande d'un set de distances depuis une matrice contenue dans un fichier JSON&lt;br /&gt;
**Travail sur le layout du site&lt;br /&gt;
***Ajout des différentes commandes (connexion bluetooth, lancement commande cu, collecte des données, collecte durée donnée)&lt;br /&gt;
***Début de l'implémentation de la visualisation des fichiers .json obtenus après collecte et affichage dans un tableau matriciel du fichier sélectionné&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 8'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 22/11/17 - Ven 24/11/17]]''  &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
**Automatisation du procédé de collecte par script Python (requete.py qui fait appel à engine.py)&lt;br /&gt;
***Développement d'un script engine.py regroupant les commandes exécutables par l'utilisateur via la page Web&lt;br /&gt;
***Travail sur la fonction &amp;quot;STOP&amp;quot; manuel d'une action de collecte de données (liaison entre script html, javascript, et script python)&lt;br /&gt;
***Mise en place d'un serveur HTTP Simple sous Python pour accéder aux fichiers de données à partir de la page Web&lt;br /&gt;
***Mise à jour de fonctions de connexion &lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Travail sur le layout du site (ajout de pages, navigation entre les pages, apparence, nettoyage des codes)&lt;br /&gt;
**Bon fonctionnement de l'ensemble serveur collecte + serveur HTTP + client Web&lt;br /&gt;
**Affichage de la liste des fichiers de données de distance (log, csv, json) via serveur HTTP en Python sur port 9999&lt;br /&gt;
*Corrections et nettoyage du dépôt GIT&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 9'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 29/11/17 - Jeudi 30/11/17]]''  &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
**Automatisation du procédé de collecte par script Python (requete.py qui fait appel à engine.py)&lt;br /&gt;
***Travail sur la fonction &amp;quot;STOP&amp;quot; manuel d'une action de collecte de données (liaison entre script html, javascript, et script python)&lt;br /&gt;
***Recherches sur l'utilisation de fichiers json accessibles via le serveur HTTP&lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Travail sur le layout du site &lt;br /&gt;
**Travail sur la liaison entre fichiers json et affichage Web des données de distance&lt;br /&gt;
***Recherches et tests de solutions&lt;br /&gt;
****Affichage depuis un fichier&lt;br /&gt;
****Affichage à la volée lors d'une action de collecte&lt;br /&gt;
&lt;br /&gt;
*Revue de code avec Roudy DAGHER:&lt;br /&gt;
**Structure globale des codes ok&lt;br /&gt;
**Fonctionnement presque ok: fonctionnalités implémentées ok, mais parsage csv ne marche pas&lt;br /&gt;
**Refactoring nécessaire&lt;br /&gt;
**Correction de la fonction STOP et amélioration de la fonction de COLLECTE&lt;br /&gt;
**Faire plus de requêtes Javascript que de requêtes HTML&lt;br /&gt;
**Discussion pour l'implémentation du serveur de localisation (= algorithme de localisation) et des visualisations de données sur le site Web&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Observations'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Problèmes rencontrés'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Solutions apportées'''&amp;lt;/span&amp;gt;===&lt;/div&gt;</summary>
		<author><name>Hdelatte</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=Fichier:Projet_de_fin_d%27%C3%A9tude.png&amp;diff=46768</id>
		<title>Fichier:Projet de fin d'étude.png</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=Fichier:Projet_de_fin_d%27%C3%A9tude.png&amp;diff=46768"/>
				<updated>2017-12-07T13:17:29Z</updated>
		
		<summary type="html">&lt;p&gt;Hdelatte : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Hdelatte</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=P18_Localisation_of_quadrotors&amp;diff=46759</id>
		<title>P18 Localisation of quadrotors</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=P18_Localisation_of_quadrotors&amp;diff=46759"/>
				<updated>2017-12-04T15:03:02Z</updated>
		
		<summary type="html">&lt;p&gt;Hdelatte : /* Phase préparatoire */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Cahier des charges'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;Présentation générale du projet&amp;lt;/span&amp;gt;=== &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Contexte&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
Dans un monde de plus en plus connecté, de nombreux drones sont déployés pour diverses applications comme l'espionnage, la surveillance, la cartographie de lieux et la livraison de colis. Les technologies nécessaires pour contrôler ces drones sont des sujets de recherche actuels. &lt;br /&gt;
&lt;br /&gt;
Le contrôle de ceux-ci passe tout d'abord par la maîtrise de leur position dans l'espace. Le développement des applications liées à l'utilisation de drones nécessite un travail important sur la localisation spatiale d'objets connectés. &lt;br /&gt;
&lt;br /&gt;
De plus, dans un souci d'utilisation, il est essentiel de développer des interfaces logicielles permettant d'exploiter ces données.&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Objectif du projet&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
L'objectif de ce projet est de développer une interface logicielle permettant de traiter en temps réel les informations de localisation d'un drone et de balises, dans le but de définir leur localisation dans l'espace, en intérieur.&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Description du projet&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
Pour réaliser le contrôle de drones, la première étape importante est de donner ses informations de position. Le but du projet est de développer une interface logicielle permettant de localiser le drone en temps réel en intérieur. Le drone se déplace dans un environnement dans lequel ont été installées de multiples balises. Il est équipé d'une carte, lui permettant de recevoir les distances relatives entre lui-même et les balises, sur laquelle différents algorithmes vont être implémentés pour effectuer la localisation en temps réel. Le projet requiert des compétences en développement hardware (Crazyflie 2.0, voir https://wiki.bitcraze.io/) et software (langage C/C++/Python/Javascript/HTML...).&lt;br /&gt;
&lt;br /&gt;
Il se divise en 4 étapes principales, qui sont:&lt;br /&gt;
*1) Choisir les technologies utilisées&lt;br /&gt;
*2) Choisir l'architecture (OS / APIs)&lt;br /&gt;
*3) Développer les différentes parties du projet&lt;br /&gt;
*4) Intégrer et connecter les différentes parties du projet&lt;br /&gt;
&lt;br /&gt;
La localisation étant en intérieur, le protocole GPS n'est donc pas assez précis pour les applications ciblées. La mise en place d'un tel dispositif permettrait grâce à l'utilisation d'un algorithme d'estimer avec une bonne précision les positions en intérieur d'une balise centrale (appelée Tag) et de balises (appelées Anchor). Le Tag scanne en temps réel la distance relative aux différentes balises, et il nous est retourné la position des balises et du Tag grâce à l'algorithme de localisation.&lt;br /&gt;
&lt;br /&gt;
Le projet se compose de 3 parties:&lt;br /&gt;
* Collect &amp;amp; parse: collecter les données envoyées par les balises en communiquant avec un serveur et récupérer les données adéquates par un tri&lt;br /&gt;
* Localise: déterminer la matrice de position des balises et du Tag en traitant les données récupérées&lt;br /&gt;
* Display: développer l'interface homme machine pour afficher, étudier et utiliser les données traitées&lt;br /&gt;
&lt;br /&gt;
Nous travaillerons dans un premier temps dans une optique temps différé avant de travailler en temps réel. Cela nous permettra d'acquérir des données utiles et réutilisables en aval. &lt;br /&gt;
&lt;br /&gt;
A l'aboutissement du projet, nous devrions être capable via l'interface homme machine développée d'afficher précisément la position spatiale des balises ainsi que du Tag, grâce àl'utilisation d'un algorithme de localisation et des données récupérées, et d'afficher d'autres données relatives au déplacement du Tag ou des balises dans l'espace. &lt;br /&gt;
&lt;br /&gt;
Si le temps le permet, nous pourrons aussi être amenés à adapter et utiliser l'interface développée pour l'utilisation d'un drone.&lt;br /&gt;
&lt;br /&gt;
''Sujet originel''&lt;br /&gt;
&lt;br /&gt;
To achieve the control of quadrotors, the first important task to give its position information. This project is to develop a software(GUI) to localize the quadrotors in real-time. The quadrotor is flying in an environment where several transmitters have been installed. The quadrotor is equipped with a deck to receive the relative distances between the deck and all transmitters, based on which different algorithms will be implemented to realize the real-time localization. The candidates need to have both experiences on hardware (Crazyflie 2.0, see https://wiki.bitcraze.io/) and software development (C/C , Python…). &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Calendrier&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
''[[Avant le 29/09/17]]'' - Élaboration du Cahier des charges, de la liste des tâches et du calendrier prévisionnel&lt;br /&gt;
&lt;br /&gt;
''[[Avant fin Octobre]]'' - Serveur de collecte et début du développement de l'interface logicielle&lt;br /&gt;
&lt;br /&gt;
''[[Avant fin Décembre]]'' - Interface logicielle&lt;br /&gt;
&lt;br /&gt;
''[[A la fin du PFE]]'' - Intégration finale des différentes parties (Serveur de collecte des données &amp;amp; Serveur de localisation &amp;amp; Interface logicielle)&lt;br /&gt;
&lt;br /&gt;
Répartition du volume de travail (***h):&lt;br /&gt;
&lt;br /&gt;
* Recherche sur les technologies à utiliser (**h)&lt;br /&gt;
* Développement du serveur de collecte de données (**h)&lt;br /&gt;
* Réalisation de l'interface logicielle (Web//Logiciel/Application) (**h)&lt;br /&gt;
* Intégration des différentes parties (**h)&lt;br /&gt;
* Test et débuggage (**h)&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Choix techniques : matériel et logiciel&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
Afin de développer ce dispositif, nous allons utiliser une Raspberry Pi 3 associée à une carte réceptrice, qui communique avec 4 balises composées chacune d'un microcontrôleur et d'une carte émettrice radio (UWB5C) et alimentées par batteries. La carte réceptrice joue le rôle du drone à localiser et communiquera les données émises par les balises vers l'ordinateur via Bluetooth.&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Choix technologiques&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
Voici les technologies que nous utilisons pour chacune des parties de ce projet.&lt;br /&gt;
&lt;br /&gt;
    1) Serveur de collecte des données:&lt;br /&gt;
       Scanne et parse les données récupérées pour fournir la matrice D des distances relatives du tag aux 4 balises&lt;br /&gt;
        - API&lt;br /&gt;
        - Python / Serveur Flask&lt;br /&gt;
&lt;br /&gt;
    2) Serveur de localisation (fourni):&lt;br /&gt;
       Calcule grâce à l'algorithme de localisation et la matrice D les positions spatiales des 4 noeuds et du tag&lt;br /&gt;
        - API&lt;br /&gt;
        - Bootstrap&lt;br /&gt;
        - Jquery&lt;br /&gt;
        - Python&lt;br /&gt;
&lt;br /&gt;
    3) Interface utilisateur:&lt;br /&gt;
       Affiche courbes, visualisation 3D, boutons ou données des fichiers envoyées par le serveur de localisation&lt;br /&gt;
        - HTML5 / Javascript&lt;br /&gt;
        - Fichiers JSON (serveurs de collecte et de localisation)&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Calendrier prévisionnel'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Liste des tâches à effectuer&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
# Se documenter sur le projet&lt;br /&gt;
##Langages et technologies utilisées&lt;br /&gt;
##Matériel utilisé&lt;br /&gt;
##Mettre en place du travail sur le Git&lt;br /&gt;
# Réaliser le serveur de collecte&lt;br /&gt;
##Récupérer les trames envoyées par bluetooth par le TAG via la Raspberry Pi&lt;br /&gt;
##Intégrer le serveur de localisation pour interpréter les trames&lt;br /&gt;
##Tester et optimiser&lt;br /&gt;
# Réaliser l'interface Web utilisateur&lt;br /&gt;
##Implémenter le serveur de collecte et de localisation&lt;br /&gt;
##Afficher et traiter les données stockées dans les fichiers JSON via le serveur (temps différé + temps réel)&lt;br /&gt;
##Tester et optimiser&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;Replanification du cahier des charges / calendrier&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Feuille d'heures'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Tâche !! Prélude !! Heures S1 !! Heures S2 !! Heures S3 !! Heures S4 !! Heures S5 !! Heures S6 !! Heures S7 !! Heures S8 !! Heures S9 !! Heures S10 !! Heures S11 !! Heures S12 !! Après Noël !! Total&lt;br /&gt;
|-&lt;br /&gt;
| Cahier des charges / Wiki / Gitlab&lt;br /&gt;
|  4h&lt;br /&gt;
|  3h&lt;br /&gt;
|  1h&lt;br /&gt;
|  x&lt;br /&gt;
|  1h30&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h30&lt;br /&gt;
|  0,5h&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Documentation sur les technos utilisées&lt;br /&gt;
|  2h&lt;br /&gt;
|  4h&lt;br /&gt;
|  3h&lt;br /&gt;
|  2h&lt;br /&gt;
|  3h&lt;br /&gt;
|  4h&lt;br /&gt;
|  5h&lt;br /&gt;
|  5h30&lt;br /&gt;
|  4h30&lt;br /&gt;
|  2h&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Documentation sur le matériel&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Recherche et développement du serveur de collecte&lt;br /&gt;
| &lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  3h&lt;br /&gt;
|  3h30&lt;br /&gt;
|  4h&lt;br /&gt;
|  5h&lt;br /&gt;
|  7h&lt;br /&gt;
|  4h30&lt;br /&gt;
|  x&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| Recherche et développement de l'interface Web&lt;br /&gt;
|  &lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  3h&lt;br /&gt;
|  5h&lt;br /&gt;
|  6h&lt;br /&gt;
|  4h&lt;br /&gt;
|  7h&lt;br /&gt;
|  5h30&lt;br /&gt;
|  2h&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| Recherche et intégration du serveur de localisation&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| Intégration des différentes parties&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|  2h&lt;br /&gt;
|  2h&lt;br /&gt;
|  2h&lt;br /&gt;
|  3h&lt;br /&gt;
|  1h30&lt;br /&gt;
|  x&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| Tests et débuggage&lt;br /&gt;
| &lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  1h&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  3h&lt;br /&gt;
|  4h&lt;br /&gt;
|  0,5h&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Optimisation/Correction des programmes&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Avancement du Projet'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Phase préparatoire'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Jeu 21/09/17 - Ven 22/09/17]]'' &lt;br /&gt;
*Rendez-vous de mise au point du cahier des charges avec les encadrants/intervenants (M. ZHENG Gang et M. DAGHER Roudy)&lt;br /&gt;
*Elaboration du cahier des charges&lt;br /&gt;
*Elaboration de la page Wiki (préparation de la mise en page et présentation du sujet)&lt;br /&gt;
*Préparation du travail sous forme de Mind Map&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous nous somme tout d’abord rendu au laboratoire INRIA afin de pouvoir redéfinir le plus précisément possible le cahier des charges avec nos tuteurs&lt;br /&gt;
Nous avons donc définis avec eux les technologies qu'il faudrait étudier. Vous retrouverez le choix des technologies dans la partie '''choix technologique'''&lt;br /&gt;
&lt;br /&gt;
Nous avons en même temps créé notre page wiki, et structuré celui-ci avec les parties qui nous seraient utile pour développer nos explications par la suite.&lt;br /&gt;
&lt;br /&gt;
Nous avons de plus découpé le travail en sous parties que nous avions mis dans un '''mind map''' afin d'y voir plus claire sur la ligne a suivre&lt;br /&gt;
&lt;br /&gt;
Vous trouverez ce mind map juste ci-dessous. Nous ne mettrons pas à jour ce mind map chaque semaine mais il est fort probable que nous en referions un en milieu de de projet pour pouvoir cibler les objectifs réussis et ceux à atteindre. Nous pourrons de plus redéfinir certains objectifs qui nous aurai semblé trop vague au début du projet.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 1'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Jeu 28/09/17 - Ven 29/09/17]]'' &lt;br /&gt;
*Revue du Cahier des Charges avec les encadrants&lt;br /&gt;
*Lecture et recherches sur les technologies adaptées&lt;br /&gt;
*Construction de la suite de la Mind Map&lt;br /&gt;
*Création du Gitlab&lt;br /&gt;
&lt;br /&gt;
Nous commençons les recherches sur le projet et sur les premières technologies engagées dans celui-ci. Nous en profitons pour formuler des à présent des questions sur le bon choix de celles-ci. Nous commençons donc des tests ayant seulement pour but de nous familiariser avec l'environnement de travail et de réellement comprendre les fonctions déjà présentes qu'il faudra exploiter et implanter notre interface web.&lt;br /&gt;
Nous créons un gitlab avec notre tuteur et commençons a définir les taches premières sur celui-ci.&lt;br /&gt;
Nous en profitons pour affiner le Mind Map.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 2'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Jeu 05/10/17 - Ven 06/10/17]]''  &lt;br /&gt;
*Précisions sur le cahier des charges&lt;br /&gt;
*Listage du matériel&lt;br /&gt;
*Recherche et détermination de solutions technologiques possibles pour les fonctions demandées&lt;br /&gt;
*Début du travail sur le serveur de collecte&lt;br /&gt;
*Apprentissage du langage Python et de l'utilisation du framework Flask&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 3'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 11/10/17 - Jeu 12/10/17]]''  &lt;br /&gt;
*Recherche et développement initial du serveur de collecte de données&lt;br /&gt;
*Complément du Git sur les tâches à effectuer&lt;br /&gt;
&lt;br /&gt;
Nous avons commencé à créer un serveur flask renvoyant pour l'instant une matrice aléatoire. Lors de la requête URL &amp;quot;../matrice&amp;quot;, nous voyons bien une matrice aléatoire apparaître sur la page Web. Nous essayons de nous connecter à la Raspberry Pi en redirigeant son port série vers le Bluetooth de façon à récupérer de vraies matrices de distance entre le drone (ie commutateur central) et les balises. Nous pourrons afficher ensuite ces matrices, ou alors les stocker dans un fichier en attendant le traitement de celles-ci.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Requete s3.PNG|300px|serveur flask]]&lt;br /&gt;
&lt;br /&gt;
Nous avons plusieurs problèmes avec le Bluetooth pour se connecter avec la Raspberry Pi. Quand nous aurons réussi à nous connecter au port série de la Raspberry pi alors nous pour gérer le traitement des données récupérées.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 4'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 18/10/17 - Jeu 19/10/17]]''  &lt;br /&gt;
*Configuration de la Raspberry Pi car problèmes de connectivité Bluetooth rencontrés&lt;br /&gt;
**Nous arrivons à connecter la Raspberry Pi sous Windows mais la connexion sous Linux pose problème (travail en suspens en attendant la disponibilité de l'encadrant)&lt;br /&gt;
*Début du développement de l'interface Web&lt;br /&gt;
**Traitement d'une matrice dans un fichier JSON&lt;br /&gt;
**Affichage sous forme de tableau de la matrice&lt;br /&gt;
**Utilisation du serveur de requête en Python avec chargement de template HTML&lt;br /&gt;
**Mise en forme de la trame de la page en HTML/CSS avec le framework Bootstrap&lt;br /&gt;
**Ajout d'un set de distances (d1, d2, d3, d4) dans la matrice lors d'un appui sur un bouton Chargement en utilisant un fichier Javascript&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 5'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 25/10/17 - Ven 27/10/17]]''  &lt;br /&gt;
*Résolution des problèmes de connectique Bluetooth sur la Raspberry Pi&lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Traitement d'une matrice dans un fichier JSON&lt;br /&gt;
**Début de l'ajout d'un set de distances depuis une matrice contenue dans un fichier JSON&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 6'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 08/11/17 - Ven 10/11/17]]''  &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
**Mise en place de la communication entre le port série de notre machine et le port série de la carte via Bluetooth de la RPi3&lt;br /&gt;
**Récupération et traitement (parse) manuels des données de distances dans un fichier .log via TCP/IP&amp;lt;-&amp;gt;Bluetooth&lt;br /&gt;
**Début de l'automatisation du procédé par script Python (requete.py) et mise en place de sockets de communication&lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Chargement sur commande d'un set de distances depuis une matrice contenue dans un fichier JSON&lt;br /&gt;
*Travail sur le layout du site&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 7'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 15/11/17 - Ven 17/11/17]]''  &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
**Récupération et traitement (parse) manuels des données de distances dans un fichier .log via TCP/IP&amp;lt;-&amp;gt;Bluetooth&lt;br /&gt;
**Automatisation du procédé par script Python (requete.py)&lt;br /&gt;
***Mise en place de sockets de communication pour le contrôle de la collecte -&amp;gt; abandonné (servait à commander la collecte manuellement)&lt;br /&gt;
***Développement d'un script engine.py regroupant les commandes exécutables par l'utilisateur via la page Web&lt;br /&gt;
***Début du travail sur la fonction &amp;quot;STOP&amp;quot; manuel d'une action de collecte de données (liaison entre script html, javascript, et script python)&lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Chargement sur commande d'un set de distances depuis une matrice contenue dans un fichier JSON&lt;br /&gt;
**Travail sur le layout du site&lt;br /&gt;
***Ajout des différentes commandes (connexion bluetooth, lancement commande cu, collecte des données, collecte durée donnée)&lt;br /&gt;
***Début de l'implémentation de la visualisation des fichiers .json obtenus après collecte et affichage dans un tableau matriciel du fichier sélectionné&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 8'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 22/11/17 - Ven 24/11/17]]''  &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
**Automatisation du procédé de collecte par script Python (requete.py qui fait appel à engine.py)&lt;br /&gt;
***Développement d'un script engine.py regroupant les commandes exécutables par l'utilisateur via la page Web&lt;br /&gt;
***Travail sur la fonction &amp;quot;STOP&amp;quot; manuel d'une action de collecte de données (liaison entre script html, javascript, et script python)&lt;br /&gt;
***Mise en place d'un serveur HTTP Simple sous Python pour accéder aux fichiers de données à partir de la page Web&lt;br /&gt;
***Mise à jour de fonctions de connexion &lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Travail sur le layout du site (ajout de pages, navigation entre les pages, apparence, nettoyage des codes)&lt;br /&gt;
**Bon fonctionnement de l'ensemble serveur collecte + serveur HTTP + client Web&lt;br /&gt;
**Affichage de la liste des fichiers de données de distance (log, csv, json) via serveur HTTP en Python sur port 9999&lt;br /&gt;
*Corrections et nettoyage du dépôt GIT&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 9'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 29/11/17 - Jeudi 30/11/17]]''  &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
**Automatisation du procédé de collecte par script Python (requete.py qui fait appel à engine.py)&lt;br /&gt;
***Travail sur la fonction &amp;quot;STOP&amp;quot; manuel d'une action de collecte de données (liaison entre script html, javascript, et script python)&lt;br /&gt;
***Recherches sur l'utilisation de fichiers json accessibles via le serveur HTTP&lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Travail sur le layout du site &lt;br /&gt;
**Travail sur la liaison entre fichiers json et affichage Web des données de distance&lt;br /&gt;
***Recherches et tests de solutions&lt;br /&gt;
****Affichage depuis un fichier&lt;br /&gt;
****Affichage à la volée lors d'une action de collecte&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Observations'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Problèmes rencontrés'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Solutions apportées'''&amp;lt;/span&amp;gt;===&lt;/div&gt;</summary>
		<author><name>Hdelatte</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=P18_Localisation_of_quadrotors&amp;diff=46758</id>
		<title>P18 Localisation of quadrotors</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=P18_Localisation_of_quadrotors&amp;diff=46758"/>
				<updated>2017-12-04T15:01:27Z</updated>
		
		<summary type="html">&lt;p&gt;Hdelatte : /* Avancement du Projet */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Cahier des charges'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;Présentation générale du projet&amp;lt;/span&amp;gt;=== &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Contexte&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
Dans un monde de plus en plus connecté, de nombreux drones sont déployés pour diverses applications comme l'espionnage, la surveillance, la cartographie de lieux et la livraison de colis. Les technologies nécessaires pour contrôler ces drones sont des sujets de recherche actuels. &lt;br /&gt;
&lt;br /&gt;
Le contrôle de ceux-ci passe tout d'abord par la maîtrise de leur position dans l'espace. Le développement des applications liées à l'utilisation de drones nécessite un travail important sur la localisation spatiale d'objets connectés. &lt;br /&gt;
&lt;br /&gt;
De plus, dans un souci d'utilisation, il est essentiel de développer des interfaces logicielles permettant d'exploiter ces données.&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Objectif du projet&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
L'objectif de ce projet est de développer une interface logicielle permettant de traiter en temps réel les informations de localisation d'un drone et de balises, dans le but de définir leur localisation dans l'espace, en intérieur.&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Description du projet&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
Pour réaliser le contrôle de drones, la première étape importante est de donner ses informations de position. Le but du projet est de développer une interface logicielle permettant de localiser le drone en temps réel en intérieur. Le drone se déplace dans un environnement dans lequel ont été installées de multiples balises. Il est équipé d'une carte, lui permettant de recevoir les distances relatives entre lui-même et les balises, sur laquelle différents algorithmes vont être implémentés pour effectuer la localisation en temps réel. Le projet requiert des compétences en développement hardware (Crazyflie 2.0, voir https://wiki.bitcraze.io/) et software (langage C/C++/Python/Javascript/HTML...).&lt;br /&gt;
&lt;br /&gt;
Il se divise en 4 étapes principales, qui sont:&lt;br /&gt;
*1) Choisir les technologies utilisées&lt;br /&gt;
*2) Choisir l'architecture (OS / APIs)&lt;br /&gt;
*3) Développer les différentes parties du projet&lt;br /&gt;
*4) Intégrer et connecter les différentes parties du projet&lt;br /&gt;
&lt;br /&gt;
La localisation étant en intérieur, le protocole GPS n'est donc pas assez précis pour les applications ciblées. La mise en place d'un tel dispositif permettrait grâce à l'utilisation d'un algorithme d'estimer avec une bonne précision les positions en intérieur d'une balise centrale (appelée Tag) et de balises (appelées Anchor). Le Tag scanne en temps réel la distance relative aux différentes balises, et il nous est retourné la position des balises et du Tag grâce à l'algorithme de localisation.&lt;br /&gt;
&lt;br /&gt;
Le projet se compose de 3 parties:&lt;br /&gt;
* Collect &amp;amp; parse: collecter les données envoyées par les balises en communiquant avec un serveur et récupérer les données adéquates par un tri&lt;br /&gt;
* Localise: déterminer la matrice de position des balises et du Tag en traitant les données récupérées&lt;br /&gt;
* Display: développer l'interface homme machine pour afficher, étudier et utiliser les données traitées&lt;br /&gt;
&lt;br /&gt;
Nous travaillerons dans un premier temps dans une optique temps différé avant de travailler en temps réel. Cela nous permettra d'acquérir des données utiles et réutilisables en aval. &lt;br /&gt;
&lt;br /&gt;
A l'aboutissement du projet, nous devrions être capable via l'interface homme machine développée d'afficher précisément la position spatiale des balises ainsi que du Tag, grâce àl'utilisation d'un algorithme de localisation et des données récupérées, et d'afficher d'autres données relatives au déplacement du Tag ou des balises dans l'espace. &lt;br /&gt;
&lt;br /&gt;
Si le temps le permet, nous pourrons aussi être amenés à adapter et utiliser l'interface développée pour l'utilisation d'un drone.&lt;br /&gt;
&lt;br /&gt;
''Sujet originel''&lt;br /&gt;
&lt;br /&gt;
To achieve the control of quadrotors, the first important task to give its position information. This project is to develop a software(GUI) to localize the quadrotors in real-time. The quadrotor is flying in an environment where several transmitters have been installed. The quadrotor is equipped with a deck to receive the relative distances between the deck and all transmitters, based on which different algorithms will be implemented to realize the real-time localization. The candidates need to have both experiences on hardware (Crazyflie 2.0, see https://wiki.bitcraze.io/) and software development (C/C , Python…). &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Calendrier&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
''[[Avant le 29/09/17]]'' - Élaboration du Cahier des charges, de la liste des tâches et du calendrier prévisionnel&lt;br /&gt;
&lt;br /&gt;
''[[Avant fin Octobre]]'' - Serveur de collecte et début du développement de l'interface logicielle&lt;br /&gt;
&lt;br /&gt;
''[[Avant fin Décembre]]'' - Interface logicielle&lt;br /&gt;
&lt;br /&gt;
''[[A la fin du PFE]]'' - Intégration finale des différentes parties (Serveur de collecte des données &amp;amp; Serveur de localisation &amp;amp; Interface logicielle)&lt;br /&gt;
&lt;br /&gt;
Répartition du volume de travail (***h):&lt;br /&gt;
&lt;br /&gt;
* Recherche sur les technologies à utiliser (**h)&lt;br /&gt;
* Développement du serveur de collecte de données (**h)&lt;br /&gt;
* Réalisation de l'interface logicielle (Web//Logiciel/Application) (**h)&lt;br /&gt;
* Intégration des différentes parties (**h)&lt;br /&gt;
* Test et débuggage (**h)&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Choix techniques : matériel et logiciel&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
Afin de développer ce dispositif, nous allons utiliser une Raspberry Pi 3 associée à une carte réceptrice, qui communique avec 4 balises composées chacune d'un microcontrôleur et d'une carte émettrice radio (UWB5C) et alimentées par batteries. La carte réceptrice joue le rôle du drone à localiser et communiquera les données émises par les balises vers l'ordinateur via Bluetooth.&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Choix technologiques&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
Voici les technologies que nous utilisons pour chacune des parties de ce projet.&lt;br /&gt;
&lt;br /&gt;
    1) Serveur de collecte des données:&lt;br /&gt;
       Scanne et parse les données récupérées pour fournir la matrice D des distances relatives du tag aux 4 balises&lt;br /&gt;
        - API&lt;br /&gt;
        - Python / Serveur Flask&lt;br /&gt;
&lt;br /&gt;
    2) Serveur de localisation (fourni):&lt;br /&gt;
       Calcule grâce à l'algorithme de localisation et la matrice D les positions spatiales des 4 noeuds et du tag&lt;br /&gt;
        - API&lt;br /&gt;
        - Bootstrap&lt;br /&gt;
        - Jquery&lt;br /&gt;
        - Python&lt;br /&gt;
&lt;br /&gt;
    3) Interface utilisateur:&lt;br /&gt;
       Affiche courbes, visualisation 3D, boutons ou données des fichiers envoyées par le serveur de localisation&lt;br /&gt;
        - HTML5 / Javascript&lt;br /&gt;
        - Fichiers JSON (serveurs de collecte et de localisation)&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Calendrier prévisionnel'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Liste des tâches à effectuer&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
# Se documenter sur le projet&lt;br /&gt;
##Langages et technologies utilisées&lt;br /&gt;
##Matériel utilisé&lt;br /&gt;
##Mettre en place du travail sur le Git&lt;br /&gt;
# Réaliser le serveur de collecte&lt;br /&gt;
##Récupérer les trames envoyées par bluetooth par le TAG via la Raspberry Pi&lt;br /&gt;
##Intégrer le serveur de localisation pour interpréter les trames&lt;br /&gt;
##Tester et optimiser&lt;br /&gt;
# Réaliser l'interface Web utilisateur&lt;br /&gt;
##Implémenter le serveur de collecte et de localisation&lt;br /&gt;
##Afficher et traiter les données stockées dans les fichiers JSON via le serveur (temps différé + temps réel)&lt;br /&gt;
##Tester et optimiser&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;Replanification du cahier des charges / calendrier&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Feuille d'heures'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Tâche !! Prélude !! Heures S1 !! Heures S2 !! Heures S3 !! Heures S4 !! Heures S5 !! Heures S6 !! Heures S7 !! Heures S8 !! Heures S9 !! Heures S10 !! Heures S11 !! Heures S12 !! Après Noël !! Total&lt;br /&gt;
|-&lt;br /&gt;
| Cahier des charges / Wiki / Gitlab&lt;br /&gt;
|  4h&lt;br /&gt;
|  3h&lt;br /&gt;
|  1h&lt;br /&gt;
|  x&lt;br /&gt;
|  1h30&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h30&lt;br /&gt;
|  0,5h&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Documentation sur les technos utilisées&lt;br /&gt;
|  2h&lt;br /&gt;
|  4h&lt;br /&gt;
|  3h&lt;br /&gt;
|  2h&lt;br /&gt;
|  3h&lt;br /&gt;
|  4h&lt;br /&gt;
|  5h&lt;br /&gt;
|  5h30&lt;br /&gt;
|  4h30&lt;br /&gt;
|  2h&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Documentation sur le matériel&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Recherche et développement du serveur de collecte&lt;br /&gt;
| &lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  3h&lt;br /&gt;
|  3h30&lt;br /&gt;
|  4h&lt;br /&gt;
|  5h&lt;br /&gt;
|  7h&lt;br /&gt;
|  4h30&lt;br /&gt;
|  x&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| Recherche et développement de l'interface Web&lt;br /&gt;
|  &lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  3h&lt;br /&gt;
|  5h&lt;br /&gt;
|  6h&lt;br /&gt;
|  4h&lt;br /&gt;
|  7h&lt;br /&gt;
|  5h30&lt;br /&gt;
|  2h&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| Recherche et intégration du serveur de localisation&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| Intégration des différentes parties&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|  2h&lt;br /&gt;
|  2h&lt;br /&gt;
|  2h&lt;br /&gt;
|  3h&lt;br /&gt;
|  1h30&lt;br /&gt;
|  x&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| Tests et débuggage&lt;br /&gt;
| &lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  1h&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  3h&lt;br /&gt;
|  4h&lt;br /&gt;
|  0,5h&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Optimisation/Correction des programmes&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Avancement du Projet'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Phase préparatoire'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Jeu 21/09/17 - Ven 22/09/17]]'' &lt;br /&gt;
*Rendez-vous de mise au point du cahier des charges avec les encadrants/intervenants (M. ZHENG Gang et M. DAGHER Roudy)&lt;br /&gt;
*Elaboration du cahier des charges&lt;br /&gt;
*Elaboration de la page Wiki (préparation de la mise en page et présentation du sujet)&lt;br /&gt;
*Préparation du travail sous forme de Mind Map&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous nous somme tout d’abord rendu au laboratoire INRIA afin de pouvoir redéfinir le plus précisément possible le cahier des charges avec nos tuteurs&lt;br /&gt;
Nous avons donc définis avec eux les technologies qu'il faudrait étudier. Vous retrouverez le choix des technologies dans la partie '''choix des technologies'''&lt;br /&gt;
&lt;br /&gt;
Nous avons en même temps créé notre page wiki, et structuré celui-ci avec les parties qui nous seraient utile pour développer nos explications par la suite.&lt;br /&gt;
&lt;br /&gt;
Nous avons de plus découpé le travail en sous parties que nous avions mis dans un '''mind map''' afin d'y voir plus claire sur la ligne a suivre&lt;br /&gt;
&lt;br /&gt;
Vous trouverez ce mind map juste ci-dessous. Nous ne mettrons pas à jour ce mind map chaque semaine mais il est fort probable que nous en referions un en milieu de de projet pour pouvoir cibler les objectifs réussis et ceux à atteindre. Nous pourrons de plus redéfinir certains objectifs qui nous aurai semblé trop vague au début du projet.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 1'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Jeu 28/09/17 - Ven 29/09/17]]'' &lt;br /&gt;
*Revue du Cahier des Charges avec les encadrants&lt;br /&gt;
*Lecture et recherches sur les technologies adaptées&lt;br /&gt;
*Construction de la suite de la Mind Map&lt;br /&gt;
*Création du Gitlab&lt;br /&gt;
&lt;br /&gt;
Nous commençons les recherches sur le projet et sur les premières technologies engagées dans celui-ci. Nous en profitons pour formuler des à présent des questions sur le bon choix de celles-ci. Nous commençons donc des tests ayant seulement pour but de nous familiariser avec l'environnement de travail et de réellement comprendre les fonctions déjà présentes qu'il faudra exploiter et implanter notre interface web.&lt;br /&gt;
Nous créons un gitlab avec notre tuteur et commençons a définir les taches premières sur celui-ci.&lt;br /&gt;
Nous en profitons pour affiner le Mind Map.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 2'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Jeu 05/10/17 - Ven 06/10/17]]''  &lt;br /&gt;
*Précisions sur le cahier des charges&lt;br /&gt;
*Listage du matériel&lt;br /&gt;
*Recherche et détermination de solutions technologiques possibles pour les fonctions demandées&lt;br /&gt;
*Début du travail sur le serveur de collecte&lt;br /&gt;
*Apprentissage du langage Python et de l'utilisation du framework Flask&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 3'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 11/10/17 - Jeu 12/10/17]]''  &lt;br /&gt;
*Recherche et développement initial du serveur de collecte de données&lt;br /&gt;
*Complément du Git sur les tâches à effectuer&lt;br /&gt;
&lt;br /&gt;
Nous avons commencé à créer un serveur flask renvoyant pour l'instant une matrice aléatoire. Lors de la requête URL &amp;quot;../matrice&amp;quot;, nous voyons bien une matrice aléatoire apparaître sur la page Web. Nous essayons de nous connecter à la Raspberry Pi en redirigeant son port série vers le Bluetooth de façon à récupérer de vraies matrices de distance entre le drone (ie commutateur central) et les balises. Nous pourrons afficher ensuite ces matrices, ou alors les stocker dans un fichier en attendant le traitement de celles-ci.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Requete s3.PNG|300px|serveur flask]]&lt;br /&gt;
&lt;br /&gt;
Nous avons plusieurs problèmes avec le Bluetooth pour se connecter avec la Raspberry Pi. Quand nous aurons réussi à nous connecter au port série de la Raspberry pi alors nous pour gérer le traitement des données récupérées.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 4'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 18/10/17 - Jeu 19/10/17]]''  &lt;br /&gt;
*Configuration de la Raspberry Pi car problèmes de connectivité Bluetooth rencontrés&lt;br /&gt;
**Nous arrivons à connecter la Raspberry Pi sous Windows mais la connexion sous Linux pose problème (travail en suspens en attendant la disponibilité de l'encadrant)&lt;br /&gt;
*Début du développement de l'interface Web&lt;br /&gt;
**Traitement d'une matrice dans un fichier JSON&lt;br /&gt;
**Affichage sous forme de tableau de la matrice&lt;br /&gt;
**Utilisation du serveur de requête en Python avec chargement de template HTML&lt;br /&gt;
**Mise en forme de la trame de la page en HTML/CSS avec le framework Bootstrap&lt;br /&gt;
**Ajout d'un set de distances (d1, d2, d3, d4) dans la matrice lors d'un appui sur un bouton Chargement en utilisant un fichier Javascript&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 5'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 25/10/17 - Ven 27/10/17]]''  &lt;br /&gt;
*Résolution des problèmes de connectique Bluetooth sur la Raspberry Pi&lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Traitement d'une matrice dans un fichier JSON&lt;br /&gt;
**Début de l'ajout d'un set de distances depuis une matrice contenue dans un fichier JSON&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 6'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 08/11/17 - Ven 10/11/17]]''  &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
**Mise en place de la communication entre le port série de notre machine et le port série de la carte via Bluetooth de la RPi3&lt;br /&gt;
**Récupération et traitement (parse) manuels des données de distances dans un fichier .log via TCP/IP&amp;lt;-&amp;gt;Bluetooth&lt;br /&gt;
**Début de l'automatisation du procédé par script Python (requete.py) et mise en place de sockets de communication&lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Chargement sur commande d'un set de distances depuis une matrice contenue dans un fichier JSON&lt;br /&gt;
*Travail sur le layout du site&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 7'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 15/11/17 - Ven 17/11/17]]''  &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
**Récupération et traitement (parse) manuels des données de distances dans un fichier .log via TCP/IP&amp;lt;-&amp;gt;Bluetooth&lt;br /&gt;
**Automatisation du procédé par script Python (requete.py)&lt;br /&gt;
***Mise en place de sockets de communication pour le contrôle de la collecte -&amp;gt; abandonné (servait à commander la collecte manuellement)&lt;br /&gt;
***Développement d'un script engine.py regroupant les commandes exécutables par l'utilisateur via la page Web&lt;br /&gt;
***Début du travail sur la fonction &amp;quot;STOP&amp;quot; manuel d'une action de collecte de données (liaison entre script html, javascript, et script python)&lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Chargement sur commande d'un set de distances depuis une matrice contenue dans un fichier JSON&lt;br /&gt;
**Travail sur le layout du site&lt;br /&gt;
***Ajout des différentes commandes (connexion bluetooth, lancement commande cu, collecte des données, collecte durée donnée)&lt;br /&gt;
***Début de l'implémentation de la visualisation des fichiers .json obtenus après collecte et affichage dans un tableau matriciel du fichier sélectionné&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 8'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 22/11/17 - Ven 24/11/17]]''  &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
**Automatisation du procédé de collecte par script Python (requete.py qui fait appel à engine.py)&lt;br /&gt;
***Développement d'un script engine.py regroupant les commandes exécutables par l'utilisateur via la page Web&lt;br /&gt;
***Travail sur la fonction &amp;quot;STOP&amp;quot; manuel d'une action de collecte de données (liaison entre script html, javascript, et script python)&lt;br /&gt;
***Mise en place d'un serveur HTTP Simple sous Python pour accéder aux fichiers de données à partir de la page Web&lt;br /&gt;
***Mise à jour de fonctions de connexion &lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Travail sur le layout du site (ajout de pages, navigation entre les pages, apparence, nettoyage des codes)&lt;br /&gt;
**Bon fonctionnement de l'ensemble serveur collecte + serveur HTTP + client Web&lt;br /&gt;
**Affichage de la liste des fichiers de données de distance (log, csv, json) via serveur HTTP en Python sur port 9999&lt;br /&gt;
*Corrections et nettoyage du dépôt GIT&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 9'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 29/11/17 - Jeudi 30/11/17]]''  &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
**Automatisation du procédé de collecte par script Python (requete.py qui fait appel à engine.py)&lt;br /&gt;
***Travail sur la fonction &amp;quot;STOP&amp;quot; manuel d'une action de collecte de données (liaison entre script html, javascript, et script python)&lt;br /&gt;
***Recherches sur l'utilisation de fichiers json accessibles via le serveur HTTP&lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Travail sur le layout du site &lt;br /&gt;
**Travail sur la liaison entre fichiers json et affichage Web des données de distance&lt;br /&gt;
***Recherches et tests de solutions&lt;br /&gt;
****Affichage depuis un fichier&lt;br /&gt;
****Affichage à la volée lors d'une action de collecte&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Observations'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Problèmes rencontrés'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Solutions apportées'''&amp;lt;/span&amp;gt;===&lt;/div&gt;</summary>
		<author><name>Hdelatte</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=P18_Localisation_of_quadrotors&amp;diff=46757</id>
		<title>P18 Localisation of quadrotors</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=P18_Localisation_of_quadrotors&amp;diff=46757"/>
				<updated>2017-12-04T14:54:23Z</updated>
		
		<summary type="html">&lt;p&gt;Hdelatte : /* Phase préparatoire */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Cahier des charges'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;Présentation générale du projet&amp;lt;/span&amp;gt;=== &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Contexte&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
Dans un monde de plus en plus connecté, de nombreux drones sont déployés pour diverses applications comme l'espionnage, la surveillance, la cartographie de lieux et la livraison de colis. Les technologies nécessaires pour contrôler ces drones sont des sujets de recherche actuels. &lt;br /&gt;
&lt;br /&gt;
Le contrôle de ceux-ci passe tout d'abord par la maîtrise de leur position dans l'espace. Le développement des applications liées à l'utilisation de drones nécessite un travail important sur la localisation spatiale d'objets connectés. &lt;br /&gt;
&lt;br /&gt;
De plus, dans un souci d'utilisation, il est essentiel de développer des interfaces logicielles permettant d'exploiter ces données.&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Objectif du projet&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
L'objectif de ce projet est de développer une interface logicielle permettant de traiter en temps réel les informations de localisation d'un drone et de balises, dans le but de définir leur localisation dans l'espace, en intérieur.&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Description du projet&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
Pour réaliser le contrôle de drones, la première étape importante est de donner ses informations de position. Le but du projet est de développer une interface logicielle permettant de localiser le drone en temps réel en intérieur. Le drone se déplace dans un environnement dans lequel ont été installées de multiples balises. Il est équipé d'une carte, lui permettant de recevoir les distances relatives entre lui-même et les balises, sur laquelle différents algorithmes vont être implémentés pour effectuer la localisation en temps réel. Le projet requiert des compétences en développement hardware (Crazyflie 2.0, voir https://wiki.bitcraze.io/) et software (langage C/C++/Python/Javascript/HTML...).&lt;br /&gt;
&lt;br /&gt;
Il se divise en 4 étapes principales, qui sont:&lt;br /&gt;
*1) Choisir les technologies utilisées&lt;br /&gt;
*2) Choisir l'architecture (OS / APIs)&lt;br /&gt;
*3) Développer les différentes parties du projet&lt;br /&gt;
*4) Intégrer et connecter les différentes parties du projet&lt;br /&gt;
&lt;br /&gt;
La localisation étant en intérieur, le protocole GPS n'est donc pas assez précis pour les applications ciblées. La mise en place d'un tel dispositif permettrait grâce à l'utilisation d'un algorithme d'estimer avec une bonne précision les positions en intérieur d'une balise centrale (appelée Tag) et de balises (appelées Anchor). Le Tag scanne en temps réel la distance relative aux différentes balises, et il nous est retourné la position des balises et du Tag grâce à l'algorithme de localisation.&lt;br /&gt;
&lt;br /&gt;
Le projet se compose de 3 parties:&lt;br /&gt;
* Collect &amp;amp; parse: collecter les données envoyées par les balises en communiquant avec un serveur et récupérer les données adéquates par un tri&lt;br /&gt;
* Localise: déterminer la matrice de position des balises et du Tag en traitant les données récupérées&lt;br /&gt;
* Display: développer l'interface homme machine pour afficher, étudier et utiliser les données traitées&lt;br /&gt;
&lt;br /&gt;
Nous travaillerons dans un premier temps dans une optique temps différé avant de travailler en temps réel. Cela nous permettra d'acquérir des données utiles et réutilisables en aval. &lt;br /&gt;
&lt;br /&gt;
A l'aboutissement du projet, nous devrions être capable via l'interface homme machine développée d'afficher précisément la position spatiale des balises ainsi que du Tag, grâce àl'utilisation d'un algorithme de localisation et des données récupérées, et d'afficher d'autres données relatives au déplacement du Tag ou des balises dans l'espace. &lt;br /&gt;
&lt;br /&gt;
Si le temps le permet, nous pourrons aussi être amenés à adapter et utiliser l'interface développée pour l'utilisation d'un drone.&lt;br /&gt;
&lt;br /&gt;
''Sujet originel''&lt;br /&gt;
&lt;br /&gt;
To achieve the control of quadrotors, the first important task to give its position information. This project is to develop a software(GUI) to localize the quadrotors in real-time. The quadrotor is flying in an environment where several transmitters have been installed. The quadrotor is equipped with a deck to receive the relative distances between the deck and all transmitters, based on which different algorithms will be implemented to realize the real-time localization. The candidates need to have both experiences on hardware (Crazyflie 2.0, see https://wiki.bitcraze.io/) and software development (C/C , Python…). &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Calendrier&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
''[[Avant le 29/09/17]]'' - Élaboration du Cahier des charges, de la liste des tâches et du calendrier prévisionnel&lt;br /&gt;
&lt;br /&gt;
''[[Avant fin Octobre]]'' - Serveur de collecte et début du développement de l'interface logicielle&lt;br /&gt;
&lt;br /&gt;
''[[Avant fin Décembre]]'' - Interface logicielle&lt;br /&gt;
&lt;br /&gt;
''[[A la fin du PFE]]'' - Intégration finale des différentes parties (Serveur de collecte des données &amp;amp; Serveur de localisation &amp;amp; Interface logicielle)&lt;br /&gt;
&lt;br /&gt;
Répartition du volume de travail (***h):&lt;br /&gt;
&lt;br /&gt;
* Recherche sur les technologies à utiliser (**h)&lt;br /&gt;
* Développement du serveur de collecte de données (**h)&lt;br /&gt;
* Réalisation de l'interface logicielle (Web//Logiciel/Application) (**h)&lt;br /&gt;
* Intégration des différentes parties (**h)&lt;br /&gt;
* Test et débuggage (**h)&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Choix techniques : matériel et logiciel&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
Afin de développer ce dispositif, nous allons utiliser une Raspberry Pi 3 associée à une carte réceptrice, qui communique avec 4 balises composées chacune d'un microcontrôleur et d'une carte émettrice radio (UWB5C) et alimentées par batteries. La carte réceptrice joue le rôle du drone à localiser et communiquera les données émises par les balises vers l'ordinateur via Bluetooth.&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Choix technologiques&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
Voici les technologies que nous utilisons pour chacune des parties de ce projet.&lt;br /&gt;
&lt;br /&gt;
    1) Serveur de collecte des données:&lt;br /&gt;
       Scanne et parse les données récupérées pour fournir la matrice D des distances relatives du tag aux 4 balises&lt;br /&gt;
        - API&lt;br /&gt;
        - Python / Serveur Flask&lt;br /&gt;
&lt;br /&gt;
    2) Serveur de localisation (fourni):&lt;br /&gt;
       Calcule grâce à l'algorithme de localisation et la matrice D les positions spatiales des 4 noeuds et du tag&lt;br /&gt;
        - API&lt;br /&gt;
        - Bootstrap&lt;br /&gt;
        - Jquery&lt;br /&gt;
        - Python&lt;br /&gt;
&lt;br /&gt;
    3) Interface utilisateur:&lt;br /&gt;
       Affiche courbes, visualisation 3D, boutons ou données des fichiers envoyées par le serveur de localisation&lt;br /&gt;
        - HTML5 / Javascript&lt;br /&gt;
        - Fichiers JSON (serveurs de collecte et de localisation)&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Calendrier prévisionnel'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;Liste des tâches à effectuer&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
# Se documenter sur le projet&lt;br /&gt;
##Langages et technologies utilisées&lt;br /&gt;
##Matériel utilisé&lt;br /&gt;
##Mettre en place du travail sur le Git&lt;br /&gt;
# Réaliser le serveur de collecte&lt;br /&gt;
##Récupérer les trames envoyées par bluetooth par le TAG via la Raspberry Pi&lt;br /&gt;
##Intégrer le serveur de localisation pour interpréter les trames&lt;br /&gt;
##Tester et optimiser&lt;br /&gt;
# Réaliser l'interface Web utilisateur&lt;br /&gt;
##Implémenter le serveur de collecte et de localisation&lt;br /&gt;
##Afficher et traiter les données stockées dans les fichiers JSON via le serveur (temps différé + temps réel)&lt;br /&gt;
##Tester et optimiser&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;Replanification du cahier des charges / calendrier&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Feuille d'heures'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Tâche !! Prélude !! Heures S1 !! Heures S2 !! Heures S3 !! Heures S4 !! Heures S5 !! Heures S6 !! Heures S7 !! Heures S8 !! Heures S9 !! Heures S10 !! Heures S11 !! Heures S12 !! Après Noël !! Total&lt;br /&gt;
|-&lt;br /&gt;
| Cahier des charges / Wiki / Gitlab&lt;br /&gt;
|  4h&lt;br /&gt;
|  3h&lt;br /&gt;
|  1h&lt;br /&gt;
|  x&lt;br /&gt;
|  1h30&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h30&lt;br /&gt;
|  0,5h&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Documentation sur les technos utilisées&lt;br /&gt;
|  2h&lt;br /&gt;
|  4h&lt;br /&gt;
|  3h&lt;br /&gt;
|  2h&lt;br /&gt;
|  3h&lt;br /&gt;
|  4h&lt;br /&gt;
|  5h&lt;br /&gt;
|  5h30&lt;br /&gt;
|  4h30&lt;br /&gt;
|  2h&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Documentation sur le matériel&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|  x&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Recherche et développement du serveur de collecte&lt;br /&gt;
| &lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  3h&lt;br /&gt;
|  3h30&lt;br /&gt;
|  4h&lt;br /&gt;
|  5h&lt;br /&gt;
|  7h&lt;br /&gt;
|  4h30&lt;br /&gt;
|  x&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| Recherche et développement de l'interface Web&lt;br /&gt;
|  &lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  3h&lt;br /&gt;
|  5h&lt;br /&gt;
|  6h&lt;br /&gt;
|  4h&lt;br /&gt;
|  7h&lt;br /&gt;
|  5h30&lt;br /&gt;
|  2h&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| Recherche et intégration du serveur de localisation&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| Intégration des différentes parties&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|  2h&lt;br /&gt;
|  2h&lt;br /&gt;
|  2h&lt;br /&gt;
|  3h&lt;br /&gt;
|  1h30&lt;br /&gt;
|  x&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| Tests et débuggage&lt;br /&gt;
| &lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  1h&lt;br /&gt;
|  1h&lt;br /&gt;
|  1h&lt;br /&gt;
|  2h&lt;br /&gt;
|  3h&lt;br /&gt;
|  4h&lt;br /&gt;
|  0,5h&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Optimisation/Correction des programmes&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Avancement du Projet'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Phase préparatoire'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Jeu 21/09/17 - Ven 22/09/17]]'' &lt;br /&gt;
*Rendez-vous de mise au point du cahier des charges avec les encadrants/intervenants (M. ZHENG Gang et M. DAGHER Roudy)&lt;br /&gt;
*Elaboration du cahier des charges&lt;br /&gt;
*Elaboration de la page Wiki (préparation de la mise en page et présentation du sujet)&lt;br /&gt;
*Préparation du travail sous forme de Mind Map&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous nous somme tout d’abord rendu au laboratoire INRIA afin de pouvoir redéfinir le plus précisément possible le cahier des charges avec nos tuteurs&lt;br /&gt;
Nous avons donc définis avec eux les technologies qu'il faudrait étudier. Vous retrouverez le choix des technologies dans la partie '''choix des technologies'''&lt;br /&gt;
&lt;br /&gt;
Nous avons en même temps créé notre page wiki, et structuré celui-ci avec les parties qui nous seraient utile pour développer nos explications par la suite.&lt;br /&gt;
&lt;br /&gt;
Nous avons de plus découpé le travail en sous parties que nous avions mis dans un '''mind map''' afin d'y voir plus claire sur la ligne a suivre&lt;br /&gt;
&lt;br /&gt;
Vous trouverez ce mind map juste ci-dessous. Nous ne mettrons pas à jour ce mind map chaque semaine mais il est fort probable que nous en referions un en milieu de de projet pour pouvoir cibler les objectifs réussis et ceux à atteindre. Nous pourrons de plus redéfinir certains objectifs qui nous aurai semblé trop vague au début du projet.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 1'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Jeu 28/09/17 - Ven 29/09/17]]'' &lt;br /&gt;
*Revue du Cahier des Charges avec les encadrants&lt;br /&gt;
*Lecture et recherches sur les technologies adaptées&lt;br /&gt;
*Construction de la suite de la Mind Map&lt;br /&gt;
*Création du Gitlab&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 2'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Jeu 05/10/17 - Ven 06/10/17]]''  &lt;br /&gt;
*Précisions sur le cahier des charges&lt;br /&gt;
*Listage du matériel&lt;br /&gt;
*Recherche et détermination de solutions technologiques possibles pour les fonctions demandées&lt;br /&gt;
*Début du travail sur le serveur de collecte&lt;br /&gt;
*Apprentissage du langage Python et de l'utilisation du framework Flask&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 3'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 11/10/17 - Jeu 12/10/17]]''  &lt;br /&gt;
*Recherche et développement initial du serveur de collecte de données&lt;br /&gt;
*Complément du Git sur les tâches à effectuer&lt;br /&gt;
&lt;br /&gt;
Nous avons commencé à créer un serveur flask renvoyant pour l'instant une matrice aléatoire. Lors de la requête URL &amp;quot;../matrice&amp;quot;, nous voyons bien une matrice aléatoire apparaître sur la page Web. Nous essayons de nous connecter à la Raspberry Pi en redirigeant son port série vers le Bluetooth de façon à récupérer de vraies matrices de distance entre le drone (ie commutateur central) et les balises. Nous pourrons afficher ensuite ces matrices, ou alors les stocker dans un fichier en attendant le traitement de celles-ci.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Requete s3.PNG|300px|serveur flask]]&lt;br /&gt;
&lt;br /&gt;
Nous avons plusieurs problèmes avec le Bluetooth pour se connecter avec la Raspberry Pi. Quand nous aurons réussi à nous connecter au port série de la Raspberry pi alors nous pour gérer le traitement des données récupérées.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 4'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 18/10/17 - Jeu 19/10/17]]''  &lt;br /&gt;
*Configuration de la Raspberry Pi car problèmes de connectivité Bluetooth rencontrés&lt;br /&gt;
**Nous arrivons à connecter la Raspberry Pi sous Windows mais la connexion sous Linux pose problème (travail en suspens en attendant la disponibilité de l'encadrant)&lt;br /&gt;
*Début du développement de l'interface Web&lt;br /&gt;
**Traitement d'une matrice dans un fichier JSON&lt;br /&gt;
**Affichage sous forme de tableau de la matrice&lt;br /&gt;
**Utilisation du serveur de requête en Python avec chargement de template HTML&lt;br /&gt;
**Mise en forme de la trame de la page en HTML/CSS avec le framework Bootstrap&lt;br /&gt;
**Ajout d'un set de distances (d1, d2, d3, d4) dans la matrice lors d'un appui sur un bouton Chargement en utilisant un fichier Javascript&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 5'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 25/10/17 - Ven 27/10/17]]''  &lt;br /&gt;
*Résolution des problèmes de connectique Bluetooth sur la Raspberry Pi&lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Traitement d'une matrice dans un fichier JSON&lt;br /&gt;
**Début de l'ajout d'un set de distances depuis une matrice contenue dans un fichier JSON&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 6'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 08/11/17 - Ven 10/11/17]]''  &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
**Mise en place de la communication entre le port série de notre machine et le port série de la carte via Bluetooth de la RPi3&lt;br /&gt;
**Récupération et traitement (parse) manuels des données de distances dans un fichier .log via TCP/IP&amp;lt;-&amp;gt;Bluetooth&lt;br /&gt;
**Début de l'automatisation du procédé par script Python (requete.py) et mise en place de sockets de communication&lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Chargement sur commande d'un set de distances depuis une matrice contenue dans un fichier JSON&lt;br /&gt;
*Travail sur le layout du site&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 7'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 15/11/17 - Ven 17/11/17]]''  &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
**Récupération et traitement (parse) manuels des données de distances dans un fichier .log via TCP/IP&amp;lt;-&amp;gt;Bluetooth&lt;br /&gt;
**Automatisation du procédé par script Python (requete.py)&lt;br /&gt;
***Mise en place de sockets de communication pour le contrôle de la collecte -&amp;gt; abandonné (servait à commander la collecte manuellement)&lt;br /&gt;
***Développement d'un script engine.py regroupant les commandes exécutables par l'utilisateur via la page Web&lt;br /&gt;
***Début du travail sur la fonction &amp;quot;STOP&amp;quot; manuel d'une action de collecte de données (liaison entre script html, javascript, et script python)&lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Chargement sur commande d'un set de distances depuis une matrice contenue dans un fichier JSON&lt;br /&gt;
**Travail sur le layout du site&lt;br /&gt;
***Ajout des différentes commandes (connexion bluetooth, lancement commande cu, collecte des données, collecte durée donnée)&lt;br /&gt;
***Début de l'implémentation de la visualisation des fichiers .json obtenus après collecte et affichage dans un tableau matriciel du fichier sélectionné&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 8'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 22/11/17 - Ven 24/11/17]]''  &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
**Automatisation du procédé de collecte par script Python (requete.py qui fait appel à engine.py)&lt;br /&gt;
***Développement d'un script engine.py regroupant les commandes exécutables par l'utilisateur via la page Web&lt;br /&gt;
***Travail sur la fonction &amp;quot;STOP&amp;quot; manuel d'une action de collecte de données (liaison entre script html, javascript, et script python)&lt;br /&gt;
***Mise en place d'un serveur HTTP Simple sous Python pour accéder aux fichiers de données à partir de la page Web&lt;br /&gt;
***Mise à jour de fonctions de connexion &lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Travail sur le layout du site (ajout de pages, navigation entre les pages, apparence, nettoyage des codes)&lt;br /&gt;
**Bon fonctionnement de l'ensemble serveur collecte + serveur HTTP + client Web&lt;br /&gt;
**Affichage de la liste des fichiers de données de distance (log, csv, json) via serveur HTTP en Python sur port 9999&lt;br /&gt;
*Corrections et nettoyage du dépôt GIT&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Semaine 9'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
''[[Mer 29/11/17 - Jeudi 30/11/17]]''  &lt;br /&gt;
*Travail sur le serveur de collecte des données&lt;br /&gt;
**Automatisation du procédé de collecte par script Python (requete.py qui fait appel à engine.py)&lt;br /&gt;
***Travail sur la fonction &amp;quot;STOP&amp;quot; manuel d'une action de collecte de données (liaison entre script html, javascript, et script python)&lt;br /&gt;
***Recherches sur l'utilisation de fichiers json accessibles via le serveur HTTP&lt;br /&gt;
*Développement de l'interface Web&lt;br /&gt;
**Travail sur le layout du site &lt;br /&gt;
**Travail sur la liaison entre fichiers json et affichage Web des données de distance&lt;br /&gt;
***Recherches et tests de solutions&lt;br /&gt;
****Affichage depuis un fichier&lt;br /&gt;
****Affichage à la volée lors d'une action de collecte&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Observations'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Problèmes rencontrés'''&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;'''Solutions apportées'''&amp;lt;/span&amp;gt;===&lt;/div&gt;</summary>
		<author><name>Hdelatte</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=Cahier_2017_groupe_n%C2%B05&amp;diff=46352</id>
		<title>Cahier 2017 groupe n°5</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=Cahier_2017_groupe_n%C2%B05&amp;diff=46352"/>
				<updated>2017-11-17T14:11:25Z</updated>
		
		<summary type="html">&lt;p&gt;Hdelatte : /* Sécurisation des données */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Présentation générale'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;Mise en contexte&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
Le projet de Réseau Avancé est composé d'une partie commune et d'une tâche particulière par binôme. Ce projet consiste en la configuration d'une architecture réseau avec différentes parties, en plus du câblage et de la configuration des routeurs et commutateurs.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
La partie commune consiste en la création et la mise en réseau d'une machine virtuelle; ainsi que la création d'un site sécurisé avec la configuration du serveur SSH, DNS sécurisé et du certificat SSL. La virtualisation permet de faire fonctionner sur une même machine plusieurs OS isolés ou des logiciels grâce aux machines virtuelles. Au-delà de la réduction des coûts, la virtualisation permet aussi de manipuler et gérer plus facilement des OS. Cependant, on s'oriente de plus en plus vers l'isolation par des conteneurs car ils permettent au sein d'un même OS, d'isoler les ressources matérielles et d'éviter des surcharges.&lt;br /&gt;
&lt;br /&gt;
Notre tâche particulière est donc de réaliser la gestion des conteneurs au sein d'une machine virtuelle configurée en réseau.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;Tâches à effectuer&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
* Création d'une machine virtuelle sur le serveur de virtualisation Cordouan&lt;br /&gt;
* Mettre la machine virtuelle en réseau&lt;br /&gt;
* Configuration des services Internet (Serveur SSH, DNS, DNSSEC, Certificat SSL)&lt;br /&gt;
* Crackage de clé Wi-Fi&lt;br /&gt;
* Créer les différents conteneurs et configurer leur accès au réseau (tâche particulière)&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Travail effectué'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
                     &lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;Création d'une machine virtuelle Xen sur Cordouan&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
On commence par créer une machine virtuelle Xen sur le serveur de virtualisation cordouan.insecserv.deule.net. On se connecte tout d'abord en SSH sur le serveur cordouan.&lt;br /&gt;
&lt;br /&gt;
    1) ssh root@cordouan.insecserv.deule.net&lt;br /&gt;
       Mot de passe: mot de passe root habituel&lt;br /&gt;
&lt;br /&gt;
On précise:&lt;br /&gt;
&lt;br /&gt;
* le nom de machine virtuelle: IMA5-BANANE&lt;br /&gt;
* son adresse IP sur le réseau: 193.48.57.179/28&lt;br /&gt;
* le répertoire où créer les disques virtuels: /usr/local/xen&lt;br /&gt;
* le miroir Debian: http://debian.polytech-lille.fr/debian&lt;br /&gt;
* la distribution: jessie (qui est la distribution stable courante)&lt;br /&gt;
&lt;br /&gt;
    2) xen-create-image --hostname=&amp;lt;IMA5-BANANE&amp;gt; --ip 193.48.57.179/28 --dir /usr/local/xen --netmask=255.255.255.240 --gateway=193.48.57.177 --mirror=http://debian.polytech-lille.fr/debian/ --dist=jessie&lt;br /&gt;
&lt;br /&gt;
On modifie le fichier de configuration de la machine virtuelle pour faire en sorte que les répertoires var et home de la machine virtuelle soient sur des partitions LVM de l'hôte. Installez les paquetages nécessaires pour SSH, le serveur Web apache2 et le serveur DNS bind (voir la partie services).&lt;br /&gt;
&lt;br /&gt;
    3) xl create /etc/xen/IMA5-BANANE.cfg&lt;br /&gt;
       vi /etc/xen/IMA5-BANANE.cfg&lt;br /&gt;
       lvcreate -L 10G -n /dev/virtual/IMA5-BANANE-home -v&lt;br /&gt;
       lvcreate -L 10G -n /dev/virtual/IMA5-BANANE-var -v&lt;br /&gt;
&lt;br /&gt;
       root@cordouan:~# cat /etc/xen/IMA5-BANANE.cfg&lt;br /&gt;
       #&lt;br /&gt;
       # Configuration file for the Xen instance IMA5-BANANE, created&lt;br /&gt;
       # by xen-tools 4.5 on Mon Sep 11 19:01:21 2017.&lt;br /&gt;
       #&lt;br /&gt;
       #&lt;br /&gt;
       #  Kernel + memory size&lt;br /&gt;
       #&lt;br /&gt;
       kernel      = '/boot/vmlinuz-3.16.0-4-amd64'&lt;br /&gt;
       extra       = 'elevator=noop'&lt;br /&gt;
       ramdisk     = '/boot/initrd.img-3.16.0-4-amd64'&lt;br /&gt;
       vcpus       = '1'&lt;br /&gt;
       memory      = '512'&lt;br /&gt;
       #&lt;br /&gt;
       #  Disk device(s).&lt;br /&gt;
       #&lt;br /&gt;
       root        = '/dev/xvda2 ro'&lt;br /&gt;
       disk        = [&lt;br /&gt;
                  'file:/usr/local/xen/domains/IMA5-BANANE/disk.img,xvda2,w',&lt;br /&gt;
                  'file:/usr/local/xen/domains/IMA5-BANANE/swap.img,xvda1,w',&lt;br /&gt;
                  'phy:/dev/virtual/IMA5-BANANE-home,xvdb1,w',&lt;br /&gt;
  		  'phy:/dev/virtual/IMA5-BANANE-var,xvdc1,w',		 &lt;br /&gt;
       #&lt;br /&gt;
       #  Physical volumes&lt;br /&gt;
       #&lt;br /&gt;
       #&lt;br /&gt;
       #  Hostname&lt;br /&gt;
       #&lt;br /&gt;
       name        = 'IMA5-BANANE'  &lt;br /&gt;
       #&lt;br /&gt;
       #  Networking&lt;br /&gt;
       #&lt;br /&gt;
       vif         = [ 'ip=193.48.57.179/28 ,mac=00:16:3E:56:71:47,bridge=IMA5sc' ]       &lt;br /&gt;
       #&lt;br /&gt;
       #  Behaviour&lt;br /&gt;
       on_poweroff = 'destroy'&lt;br /&gt;
       on_reboot   = 'restart'&lt;br /&gt;
       on_crash    = 'restart'&lt;br /&gt;
&lt;br /&gt;
On modifie le fichier de configuration en faisant en sorte que les répertoires var et home de la machine virtuelle soient sur des partitions LVM de l'hôte:&lt;br /&gt;
&lt;br /&gt;
* la mémoire attribuée: 512 Mo&lt;br /&gt;
* l'adresse ip de la MV: 193.48.57.179/28&lt;br /&gt;
* bridge: IMA5sc&lt;br /&gt;
&lt;br /&gt;
    4) xl list&lt;br /&gt;
&lt;br /&gt;
       root@cordouan:~# xl list&lt;br /&gt;
       Name                                        ID   Mem VCPUs	State	Time(s)&lt;br /&gt;
       Domain-0                                     0  1993     8     r-----   52219.3&lt;br /&gt;
       karmeliett                                   1   128     1     -b----    2483.6&lt;br /&gt;
       duvel                                        2   512     1     -b----    4225.6&lt;br /&gt;
       deus                                         3   512     1     -b----    4226.4&lt;br /&gt;
       trappe                                       4   512     1     -b----    4082.4&lt;br /&gt;
       Rincecochon                                  6   512     1     -b----    3788.2&lt;br /&gt;
       IMA5-Durian                                 62   512     1     -b----    3237.7&lt;br /&gt;
       IMA5-BANANE                                 84   512     1     -b----     152.9&lt;br /&gt;
       IMA5-Papaye                                 89   512     1     -b----      35.4&lt;br /&gt;
       IMA5-Ananas                                 91   512     1     -b----      27.0&lt;br /&gt;
&lt;br /&gt;
On vérifie que la MV IMA5-BANANE a bien été créée.&lt;br /&gt;
&lt;br /&gt;
    5) xl console IMA5-BANANE&lt;br /&gt;
&lt;br /&gt;
On lance IMA5-BANANE en utilisant le log root et le mot de passe configuré.&lt;br /&gt;
&lt;br /&gt;
Commandes de base pour démarrer la VM proprement: &lt;br /&gt;
&lt;br /&gt;
 ssh root@cordouan.insecserv.deule.net&lt;br /&gt;
 xl create /etc/xen/IMA5-BANANE.cfg&lt;br /&gt;
 ssh username@weppes&lt;br /&gt;
 ssh root@193.48.57.179&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;Services Internet (SSH, DNS sécurisé et certificat SSL)&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
On configure à présent les services Internet après avoir acheté un nom de domaine (https://www.banane.space) sur gandi.net pour créer notre site Web sécurisé.&lt;br /&gt;
&lt;br /&gt;
=====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;''Serveur SSH''&amp;lt;/span&amp;gt;=====&lt;br /&gt;
&lt;br /&gt;
Sur notre machine virtuelle, nous avons configuré le fichier sshd_config (PubkeyAuthentication ) :&lt;br /&gt;
&lt;br /&gt;
       root@IMA5-BANANE:~# vim /etc/ssh/sshd_config&lt;br /&gt;
       &lt;br /&gt;
       RSAAuthentication yes&lt;br /&gt;
       PubkeyAuthentication yes&lt;br /&gt;
       #AuthorizedKeysFile     %h/.ssh/authorized_keys&lt;br /&gt;
       PermitRootLogin yes&lt;br /&gt;
       &lt;br /&gt;
       root@IMA5-BANANE:~# service ssh restart&lt;br /&gt;
&lt;br /&gt;
=====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;''Certification SSL''&amp;lt;/span&amp;gt;=====&lt;br /&gt;
Nous commencons par acheter un certificat SSL. Puis, sur la VM nous générons le CSR grâce à cette commande:&lt;br /&gt;
&lt;br /&gt;
 root@IMA5-BANANE:/etc/apache2/sites-available/clef# openssl req -nodes -newkey rsa:2048 -sha256 -keyout banane.key -out banane.csr&lt;br /&gt;
 Generating a 2048 bit RSA private key&lt;br /&gt;
 If you enter '.', the field will be left blank.&lt;br /&gt;
 -----&lt;br /&gt;
 Country Name (2 letter code) [AU]:FR&lt;br /&gt;
 State or Province Name (full name) [Some-State]:Nord&lt;br /&gt;
 Locality Name (eg, city) []:Lille&lt;br /&gt;
 Organization Name (eg, company) [Internet Widgits Pty Ltd]:PolytechLille&lt;br /&gt;
 Organizational Unit Name (eg, section) []:IMA&lt;br /&gt;
 Common Name (e.g. server FQDN or YOUR name) []:banane.space&lt;br /&gt;
 Email Address []:&lt;br /&gt;
 A challenge password []:&lt;br /&gt;
 An optional company name []:&lt;br /&gt;
 root@IMA5-BANANE:/etc/apache2/sites-available/clef# ls banane.csr banane.key&lt;br /&gt;
 root@IMA5-BANANE:/etc/apache2/sites-available/clef# cat banane.csr&lt;br /&gt;
 -----BEGIN CERTIFICATE REQUEST-----&lt;br /&gt;
 &amp;lt;CSR à renseigner sur Gandi lors de l'achat du certificat&amp;gt;&lt;br /&gt;
 -----END CERTIFICATE REQUEST-----&lt;br /&gt;
&lt;br /&gt;
Pour recevoir le mail contenant le lien pour activer le certificat, nous installons les packages suivants :&lt;br /&gt;
&lt;br /&gt;
 root@IMA5-BANANE:~# apt-get install postfix mailx&lt;br /&gt;
&lt;br /&gt;
Une fois le certificat récupéré, nous les copions tous dans le bon répertoire, puis nous hashons le tout :&lt;br /&gt;
&lt;br /&gt;
 root@IMA5-BANANE:/etc/bind# cp certificat.crt /etc/ssl/certs/banane.space.crt&lt;br /&gt;
 root@IMA5-BANANE:/etc/bind# cp serveur.key /etc/ssl/private/banane.space.key&lt;br /&gt;
 root@IMA5-BANANE:/etc/bind# cp GandiStandardSSLCA2.pem /etc/ssl/certs/GandiStandardSSLCA2.pem&lt;br /&gt;
 root@IMA5-BANANE:/etc/bind# c_rehash /etc/ssl/certs&lt;br /&gt;
&lt;br /&gt;
Enfin, la dernière étape consiste en la modification des fichiers 000-banane.space-ssl.conf et ports.conf :&lt;br /&gt;
&lt;br /&gt;
 root@IMA5-BANANE:/etc/apache2/sites-available# cat 000-banane.space-ssl.conf &lt;br /&gt;
     &amp;lt;VirtualHost *:443&amp;gt;&lt;br /&gt;
         ServerName www.banane.space&lt;br /&gt;
         ServerAlias banane.space&lt;br /&gt;
         DocumentRoot /var/www/&lt;br /&gt;
         CustomLog /var/log/apache2/secure_access.log combined&lt;br /&gt;
         SSLEngine on&lt;br /&gt;
         SSLCertificateFile /etc/ssl/certs/banane.space.crt&lt;br /&gt;
         SSLCertificateKeyFile /etc/ssl/private/banane.space.key&lt;br /&gt;
         SSLCertificateChainFile /etc/ssl/certs/GandiStandardSSLCA2.pem&lt;br /&gt;
         SSLVerifyClient None&lt;br /&gt;
     &amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 root@IMA5-BANANE:/etc/apache2# cat ports.conf &lt;br /&gt;
 Listen 80&lt;br /&gt;
 &amp;lt;IfModule ssl_module&amp;gt;&lt;br /&gt;
 Listen 443&lt;br /&gt;
 &amp;lt;/IfModule&amp;gt;&lt;br /&gt;
 &amp;lt;IfModule mod_gnutls.c&amp;gt;&lt;br /&gt;
 Listen 443&lt;br /&gt;
 &amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Un redémarrage du service apache2 est maintenant nécessaire :&lt;br /&gt;
&lt;br /&gt;
 root@IMA5-BANANE:/etc/apache2# service apache2 stop&lt;br /&gt;
 root@IMA5-BANANE:/etc/apache2# service apache2 start&lt;br /&gt;
 root@IMA5-BANANE:/etc/apache2# service apache2 reload&lt;br /&gt;
&lt;br /&gt;
Nous pouvons voir que notre site est maintenant sécurisé, un cadenas vert est bien présent.&lt;br /&gt;
&lt;br /&gt;
=====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;''Serveur DNS''&amp;lt;/span&amp;gt;=====&lt;br /&gt;
&lt;br /&gt;
On commence par modifier les informations de notre nom de domaine sur le site de Gandi. Ensuite, dans ''&amp;quot;Gérer les Glue Records&amp;quot;'', nous modifions les informations concernant notre nom de domaine.&lt;br /&gt;
&lt;br /&gt;
* nom du serveur: ns.banane.space&lt;br /&gt;
* adresse IP: 193.48.57.179&lt;br /&gt;
* serveurs de nom:&lt;br /&gt;
** DNS1: ns.banane.space&lt;br /&gt;
** DNS2: ns6.gandi.net (serveur secondaire de Gandi)&lt;br /&gt;
&lt;br /&gt;
Une fois ces étapes effectuées, nous pouvons passer à la configuration du DNS avec bind. On se place alors dans le dossier /etc/bind de notre machine virtuelle.&lt;br /&gt;
Nous modifions dans un premier temps le fichier named.conf.local afin d'y créer nos zones :&lt;br /&gt;
&lt;br /&gt;
 root@IMA5-BANANE:/etc/bind# vim /etc/bind/named.conf.local&lt;br /&gt;
 zone &amp;quot;banane.space&amp;quot; IN {&lt;br /&gt;
             type master;&lt;br /&gt;
             file &amp;quot;/etc/bind/db.banane.space&amp;quot;;&lt;br /&gt;
        };&lt;br /&gt;
&lt;br /&gt;
On créée ensuite le fichier db.banane.space:&lt;br /&gt;
&lt;br /&gt;
 $TTL    604800&lt;br /&gt;
 @       IN      SOA     ns.banane.space. root.banane.space. (&lt;br /&gt;
                       2016113007       ; Serial&lt;br /&gt;
                         604800         ; Refresh&lt;br /&gt;
                          86400         ; Retry&lt;br /&gt;
                        2419200         ; Expire&lt;br /&gt;
                         604800 )       ; Negative Cache TTL&lt;br /&gt;
 ;&lt;br /&gt;
 @       IN      NS      ns.banane.space. &lt;br /&gt;
 @       IN      NS      ns6.gandi.net.&lt;br /&gt;
 ns      IN      A       193.48.57.179&lt;br /&gt;
 www     IN      A       193.48.57.179&lt;br /&gt;
 @       IN      A       193.48.57.179&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
 root@IMA5-BANANE:/etc/bind# vim /etc/resolv.conf&lt;br /&gt;
 search banane.space&lt;br /&gt;
 nameserver 193.48.57.179&lt;br /&gt;
&lt;br /&gt;
=====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;''DNS SEC''&amp;lt;/span&amp;gt;=====&lt;br /&gt;
&lt;br /&gt;
Génération des clefs asymétriques: &lt;br /&gt;
&lt;br /&gt;
 dnssec-keygen -a RSASHA1 -b 2048 -r /dev/urandom -f KSK -n ZONE banane.space&lt;br /&gt;
 dnssec-keygen -a RSASHA1 -b 1024 -r /dev/urandom -n ZONE banane.space&lt;br /&gt;
&lt;br /&gt;
On modifie le nom des clefs: &lt;br /&gt;
&lt;br /&gt;
 /etc/bind/banane.space.dnssec# ls&lt;br /&gt;
 ????&lt;br /&gt;
&lt;br /&gt;
Nous signons ensuite les zones:&lt;br /&gt;
&lt;br /&gt;
 dnssec-signzone -o banane.space -k banane.space-ksk &lt;br /&gt;
 ../db.banane.space banane.space-zsk&lt;br /&gt;
&lt;br /&gt;
Pour finir nous ajoutons la clef KSK sur Gandi avec l'algorithme RSA/SHA1.&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;Sécurisation des données&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;Sécurisation des données&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
Nous créons trois nouvelles partitions qui vont représenter nos disques.&lt;br /&gt;
&lt;br /&gt;
    1) vi /etc/xen/IMA5-BANANE.cfg&lt;br /&gt;
       lvcreate -L 10G -n /dev/virtual/banane-1 -v&lt;br /&gt;
       lvcreate -L 10G -n /dev/virtual/banane-2 -v&lt;br /&gt;
       lvcreate -L 10G -n /dev/virtual/banane-3 -v&lt;br /&gt;
&lt;br /&gt;
Nous ajoutons ces partitions dans la machine virtuelle via le fichier IMA5-BANANE.conf&lt;br /&gt;
&lt;br /&gt;
       root@cordouan:~# cat /etc/xen/IMA5-BANANE.cfg&lt;br /&gt;
       #&lt;br /&gt;
       # Configuration file for the Xen instance IMA5-BANANE, created&lt;br /&gt;
       # by xen-tools 4.5 on Mon Sep 11 19:01:21 2017.&lt;br /&gt;
       #&lt;br /&gt;
       #&lt;br /&gt;
       #  Kernel + memory size&lt;br /&gt;
       #&lt;br /&gt;
       kernel      = '/boot/vmlinuz-3.16.0-4-amd64'&lt;br /&gt;
       extra       = 'elevator=noop'&lt;br /&gt;
       ramdisk     = '/boot/initrd.img-3.16.0-4-amd64'&lt;br /&gt;
       vcpus       = '1'&lt;br /&gt;
       memory      = '512'&lt;br /&gt;
       #&lt;br /&gt;
       #  Disk device(s).&lt;br /&gt;
       #&lt;br /&gt;
       root        = '/dev/xvda2 ro'&lt;br /&gt;
       disk        = [&lt;br /&gt;
                  'file:/usr/local/xen/domains/IMA5-BANANE/disk.img,xvda2,w',&lt;br /&gt;
                  'file:/usr/local/xen/domains/IMA5-BANANE/swap.img,xvda1,w',&lt;br /&gt;
                  'phy:/dev/virtual/IMA5-BANANE-home,xvdb1,w',&lt;br /&gt;
  		  'phy:/dev/virtual/IMA5-BANANE-var,xvdc1,w',&lt;br /&gt;
                  'phy:/dev/virtual/banane-1,xvdd,w',&lt;br /&gt;
                  'phy:/dev/virtual/banane-2,xvde,w',&lt;br /&gt;
                  'phy:/dev/virtual/banane-3,xvdf,w',		 &lt;br /&gt;
       #&lt;br /&gt;
       #  Physical volumes&lt;br /&gt;
       #&lt;br /&gt;
       #&lt;br /&gt;
       #  Hostname&lt;br /&gt;
       #&lt;br /&gt;
       name        = 'IMA5-BANANE'  &lt;br /&gt;
       #&lt;br /&gt;
       #  Networking&lt;br /&gt;
       #&lt;br /&gt;
       vif         = [ 'ip=193.48.57.179/28 ,mac=00:16:3E:56:71:47,bridge=IMA5sc' ]       &lt;br /&gt;
       #&lt;br /&gt;
       #  Behaviour&lt;br /&gt;
       on_poweroff = 'destroy'&lt;br /&gt;
       on_reboot   = 'restart'&lt;br /&gt;
       on_crash    = 'restart'&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On installe mdadm dans notre MV&lt;br /&gt;
&lt;br /&gt;
    apt-get install mdadm&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite installé l paquetage mdadm puis rebooté la MV.&lt;br /&gt;
&lt;br /&gt;
    4) mdadm --create /dev/md0 --level=5 --assume-clean --raid-devices=3 /dev/xvdd /dev/xvde /dev/xvdf&lt;br /&gt;
&lt;br /&gt;
Nous créons le volume /dev/md0 pour créer un RAID5 logiciel avec les trois partitions obtenues. On sauvegarde ensuite la configuration actelle.&lt;br /&gt;
 root@IMA5-BANANE:~# mdadm --detail --scan &amp;gt;&amp;gt; /etc/mdadm/mdadm.conf&lt;br /&gt;
 root@IMA5-BANANE:~# mkfs /dev/md0&lt;br /&gt;
 root@IMA5-BANANE:~# mkdir /datamd0&lt;br /&gt;
 root@IMA5-BANANE:/datamd0# mount /dev/md0 /datamd0/&lt;br /&gt;
&lt;br /&gt;
Ensuite il faut éditer le fichier /etc/fstab en rajoutant la ligne suivante à la fin du fichier afin d'être sûr que la partition soit encore montée après le reboot:&lt;br /&gt;
&lt;br /&gt;
 /dev/md0 /datamd0&lt;br /&gt;
&lt;br /&gt;
Nous créons un fichier texte sur le raid5:&lt;br /&gt;
&lt;br /&gt;
 root@IMA5-BANANE:/datamd0# vim raid5test.txt&lt;br /&gt;
&lt;br /&gt;
Pour avoir le détail de la configuration actuelle:&lt;br /&gt;
&lt;br /&gt;
 root@IMA5-BANANE:~# mdadm --detail /dev/md0&lt;br /&gt;
 /dev/md0:&lt;br /&gt;
        Version : 1.2&lt;br /&gt;
  Creation Time : Wed Oct 25 18:27:13 2017&lt;br /&gt;
     Raid Level : raid5&lt;br /&gt;
     Array Size : 2095104 (2046.34 MiB 2145.39 MB)&lt;br /&gt;
  Used Dev Size : 1047552 (1023.17 MiB 1072.69 MB)&lt;br /&gt;
   Raid Devices : 3&lt;br /&gt;
  Total Devices : 3&lt;br /&gt;
    Persistence : Superblock is persistent&lt;br /&gt;
    Update Time : Wed Oct 25 17:03:20 2017&lt;br /&gt;
          State : clean &lt;br /&gt;
 Active Devices : 3&lt;br /&gt;
 Working Devices : 3&lt;br /&gt;
 Failed Devices : 0&lt;br /&gt;
  Spare Devices : 0&lt;br /&gt;
         Layout : left-symmetric&lt;br /&gt;
     Chunk Size : 512K&lt;br /&gt;
           Name : IMA5-BANANE:0  (local to host IMA5-BANANE)&lt;br /&gt;
           UUID : b70ad336:fb198d84:a5909f1c:f4b33229&lt;br /&gt;
         Events : 2&lt;br /&gt;
    Number   Major   Minor   RaidDevice State&lt;br /&gt;
       0     202       48        0      active sync   /dev/xvdd&lt;br /&gt;
       1     202       64        1      active sync   /dev/xvde&lt;br /&gt;
       2     202       80        2      active sync   /dev/xvdf&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous arrêtons la MV, mettons en commentaire la 1ère partition dans le fichier de configuration, puis redémarrons la machine. On constaste que la premiere partition a été &amp;quot;removed&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
 root@IMA5-BANANE:~# mdadm --detail /dev/md0&lt;br /&gt;
 /dev/md0:&lt;br /&gt;
        Version : 1.2&lt;br /&gt;
  Creation Time : Wed Oct 25 18:27:13 2017&lt;br /&gt;
     Raid Level : raid5&lt;br /&gt;
     Array Size : 2095104 (2046.34 MiB 2145.39 MB)&lt;br /&gt;
  Used Dev Size : 1047552 (1023.17 MiB 1072.69 MB)&lt;br /&gt;
   Raid Devices : 3&lt;br /&gt;
  Total Devices : 2&lt;br /&gt;
    Persistence : Superblock is persistent&lt;br /&gt;
    Update Time : Wed Oct 25 18:51:56 2017&lt;br /&gt;
          State : clean, degraded &lt;br /&gt;
 Active Devices : 2&lt;br /&gt;
 Working Devices : 2&lt;br /&gt;
 Failed Devices : 0&lt;br /&gt;
  Spare Devices : 0&lt;br /&gt;
         Layout : left-symmetric&lt;br /&gt;
     Chunk Size : 512K&lt;br /&gt;
           Name : IMA5-BANANE:0  (local to host IMA5-BANANE)&lt;br /&gt;
           UUID : b70ad336:fb198d84:a5909f1c:f4b33229&lt;br /&gt;
         Events : 12&lt;br /&gt;
    Number   Major   Minor   RaidDevice State&lt;br /&gt;
       0       0        0        0      removed&lt;br /&gt;
       1     202       64        1      active sync   /dev/xvde&lt;br /&gt;
       2     202       80        2      active sync   /dev/xvdf&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On voit bien qu'une partition a été supprimée mais que le fichier créé auparavant est toujours présent:&lt;br /&gt;
&lt;br /&gt;
 root@IMA5-BANANE:~# ls /datamd0/&lt;br /&gt;
 raid5test.txt&lt;br /&gt;
&lt;br /&gt;
Pour remettre la partition dans le raid5 il faut taper la commande suivante&lt;br /&gt;
&lt;br /&gt;
 root@IMA5-BANANE:~# mdadm --add /dev/md0 /dev/xvdd&lt;br /&gt;
&lt;br /&gt;
Pour le test de réparation, afin de bien voir l'avancement de la reconstruction, nous avons procédé comme dans l'exemple du cours: Suppression de la partition xvdd:&lt;br /&gt;
&lt;br /&gt;
 root@IMA5-BANANE:~# mdadm --set-faulty /dev/md0 /dev/xvdd&lt;br /&gt;
 root@IMA5-BANANE:~# mdadm --remove /dev/md0 /dev/xvdd&lt;br /&gt;
 La partition est bien supprimée:&lt;br /&gt;
 Personalities : [raid6] [raid5] [raid4] &lt;br /&gt;
 md0 : active raid5 xvde[1] xvdf[2]&lt;br /&gt;
      2095104 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/2] [UU_]&lt;br /&gt;
&lt;br /&gt;
On remet à présent la partition supprimée:&lt;br /&gt;
 root@IMA5-BANANE:~# mdadm --add /dev/md0 /dev/xvdd&lt;br /&gt;
&lt;br /&gt;
On essaie ensuite de remonter le RAID5 et on peut constater l'avancement de la reconstruction en lançant la même commande assez régulièrement:&lt;br /&gt;
&lt;br /&gt;
 root@IMA5-BANANE:~# cat /proc/mdstat&lt;br /&gt;
 Personalities : [raid6] [raid5] [raid4] &lt;br /&gt;
 md0 : active raid5 xvdd[3] xvde[1] xvdf[2]&lt;br /&gt;
      2095104 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/2] [_UU]&lt;br /&gt;
      [===========&amp;gt;.........]  recovery = 59.7% (627140/1047552) finish=0.2min speed=28506K/sec&lt;br /&gt;
 unused devices: &amp;lt;none&amp;gt;&lt;br /&gt;
 root@IMA5-BANANE:~# cat /proc/mdstat&lt;br /&gt;
 Personalities : [raid6] [raid5] [raid4] &lt;br /&gt;
 md0 : active raid5 xvdd[3] xvde[1] xvdf[2]&lt;br /&gt;
      2095104 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/2] [_UU]&lt;br /&gt;
      [============&amp;gt;........]  recovery = 64.5% (676392/1047552) finish=0.2min speed=29408K/sec     &lt;br /&gt;
 unused devices: &amp;lt;none&amp;gt;&lt;br /&gt;
 root@IMA5-BANANE:~# cat /proc/mdstat&lt;br /&gt;
 Personalities : [raid6] [raid5] [raid4] &lt;br /&gt;
 md0 : active raid5 xvdd[3] xvde[1] xvdf[2]&lt;br /&gt;
      2095104 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/2] [_UU]&lt;br /&gt;
      [=============&amp;gt;.......]  recovery = 66.2% (695080/1047552) finish=0.2min speed=28961K/sec     &lt;br /&gt;
 unused devices: &amp;lt;none&amp;gt;&lt;br /&gt;
 root@IMA5-BANANE:~# cat /proc/mdstat&lt;br /&gt;
 Personalities : [raid6] [raid5] [raid4] &lt;br /&gt;
 md0 : active raid5 xvdd[3] xvde[1] xvdf[2]&lt;br /&gt;
      2095104 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/2] [_UU]&lt;br /&gt;
      [=============&amp;gt;.......]  recovery = 68.1% (714664/1047552) finish=0.1min speed=28586K/sec&lt;br /&gt;
 unused devices: &amp;lt;none&amp;gt;&lt;br /&gt;
 root@IMA5-BANANE:~# cat /proc/mdstat&lt;br /&gt;
 Personalities : [raid6] [raid5] [raid4] &lt;br /&gt;
 md0 : active raid5 xvdd[3] xvde[1] xvdf[2]&lt;br /&gt;
      2095104 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/2] [_UU]&lt;br /&gt;
      [==================&amp;gt;..]  recovery = 94.6% (991996/1047552) finish=0.0min speed=29206K/sec   &lt;br /&gt;
 unused devices: &amp;lt;none&amp;gt;&lt;br /&gt;
 root@IMA5-BANANE:~# cat /proc/mdstat&lt;br /&gt;
 Personalities : [raid6] [raid5] [raid4] &lt;br /&gt;
 md0 : active raid5 xvdd[3] xvde[1] xvdf[2]&lt;br /&gt;
      2095104 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/3] [UUU]     &lt;br /&gt;
 unused devices: &amp;lt;none&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;Cryptage des données&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
 cryptsetup luksFormat -c aes -h sha256 /dev/mmcblk1&lt;br /&gt;
 cryptsetup luksOpen /dev/sdb1 crypt_sd&lt;br /&gt;
 mkfs.ext4 /dev/mapper/crypt_sd&lt;br /&gt;
 mount /dev/mapper/crypt_sd /mnt&lt;br /&gt;
 vi /mnt/test.txt #on marque un texte dans le fichier&lt;br /&gt;
 umount /mnt&lt;br /&gt;
 cryptsetup luksClose crypt_sd&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;Mise en réseau et création de conteneurs sous Machine Virtuelle Linux&amp;lt;/span&amp;gt;====&lt;/div&gt;</summary>
		<author><name>Hdelatte</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=Cahier_2016_groupe_n%C2%B02&amp;diff=46351</id>
		<title>Cahier 2016 groupe n°2</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=Cahier_2016_groupe_n%C2%B02&amp;diff=46351"/>
				<updated>2017-11-17T13:58:29Z</updated>
		
		<summary type="html">&lt;p&gt;Hdelatte : Annulation des modifications 46348 de Hdelatte (discussion)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Tâche particulière ==&lt;br /&gt;
&lt;br /&gt;
Câblage de la fibre: &lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Prise de connaissance du sujet de PRA et le choix des tâches particulières. Nous avons également commencer à essayer d'identifier les câbles de fibres déjà existants.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Toujours sur la tâche particulière. Identification de tous les câbles déjà tirés. Test de link de chaque câble. Nous avons également commencé à passer les câbles restants.&lt;br /&gt;
Tous les câbles nécessaires ont été tirés entre les deux salles, tous les link sont up. Nous avons identifié chaque câble par un scotch de couleur différente. Nous avons également percé la gouttière de la E304 pour laisser passer un raccord de fibre proprement. &lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Nous avons pu identifier les câbles déjà présents. Il y a donc 2 câbles déjà tirés entre les 2 piles, 2 câbles qui partent de la E306 jusqu'au boîtier ainsi qu'un câble par salle quid descend dans le local technique. &lt;br /&gt;
* Nous allons donc prolonger les 2 câbles s'arrêtant dans le boîtier et tirer 2 nouveaux câbles entre les deux piles: nous aurons donc 6 fils au total. &lt;br /&gt;
* 2 Grands câbles de 30m ~ -&amp;gt; Estimation de 26m entre les 2 piles.&lt;br /&gt;
* 2 petits câbles de 15m ~ -&amp;gt; Estimation de 13m du boîtier à la pile&lt;br /&gt;
* Retirer le câble ethernet qui était tiré entre les 2 piles.&lt;br /&gt;
* 7 heures passées au total sur la tâche particulière&lt;br /&gt;
[[Fichier:im1.JPG|300px|thumb|left|Fibre passant entre les 2 salles]]&lt;br /&gt;
[[Fichier:im2.JPG|300px|thumb|right|Câbles dans le faux plafond]]&lt;br /&gt;
[[Fichier:im4.JPG|300px|thumb|left|Guide câbles pour le faux plafond]]&lt;br /&gt;
[[Fichier:im5.JPG|300px|thumb|right|Boîtiers contenant les raccords de fibres]]&lt;br /&gt;
[[Fichier:im6.JPG|300px|thumb|left|Les fibres en E304 disponibles]]&lt;br /&gt;
[[Fichier:im7.JPG|300px|thumb|right|Trou dans le cache laissant passer la fibre]] &amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Travail commun ==&lt;br /&gt;
&lt;br /&gt;
* Installation de la machine virtuelle XEN&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
xen-create-image --hostname=GreenArrow --ip=193.48.57.162 --netmask=255.255.255.240 --gateway=193.48.57.172&lt;br /&gt;
  --dir=/usr/local/xen --mirror=http://debian.polytech-lille.fr/debian/ --dist=jessie&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Modification du fichier de configuration de la machine virtuelle pour faire en sorte que les répertoires var et home de la machine virtuelle soient sur des partitions LVM de l'hôte:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
lvcreate -L 10G -n /dev/virtual/ima5-GreenArrow-home -v&lt;br /&gt;
lvcreate -L 10G -n /dev/virtual/ima5-GreenArrow-var -v&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
disk        = [&lt;br /&gt;
                  'file:/usr/local/xen/domains/GreenArrow/disk.img,xvda2,w',&lt;br /&gt;
                  'file:/usr/local/xen/domains/GreenArrow/swap.img,xvda1,w',&lt;br /&gt;
                  'phy:/dev/virtual/ima5-GreenArrow-home,xvdc,w',&lt;br /&gt;
                  'phy:/dev/virtual/ima5-GreenArrow-var,xvdb,w',&lt;br /&gt;
              ]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Commandes de base pour démarrer la VM proprement:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh root@cordouan.insecserv.deule.net&lt;br /&gt;
xl create /etc/xen/GreenArrow.cfg&lt;br /&gt;
ssh username@weppes&lt;br /&gt;
ssh root@193.48.57.162&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Achat du nom de domaine [http://jjlddelamuerto.space] sur Gandi pour 1.19€ TTC&lt;br /&gt;
&lt;br /&gt;
=== Services Internet ===&lt;br /&gt;
&lt;br /&gt;
==== Serveur SSH ====&lt;br /&gt;
&lt;br /&gt;
Sur notre machine virtuelle nous avons configuré le fichier sshd_config (changement de la ligne PubkeyAuthentication) :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@GreenArrow:~# vim /etc/ssh/sshd_config&lt;br /&gt;
&lt;br /&gt;
RSAAuthentication yes&lt;br /&gt;
PubkeyAuthentication yes&lt;br /&gt;
#AuthorizedKeysFile     %h/.ssh/authorized_keys&lt;br /&gt;
&lt;br /&gt;
root@GreenArrow:~# service ssh restart&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite réussi à nous connecter en SSH sur notre VM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
jjoignau@weppes:~$ ssh root@193.48.57.162&lt;br /&gt;
root@193.48.57.162's password: &lt;br /&gt;
&lt;br /&gt;
The programs included with the Debian GNU/Linux system are free software;&lt;br /&gt;
the exact distribution terms for each program are described in the&lt;br /&gt;
individual files in /usr/share/doc/*/copyright.&lt;br /&gt;
&lt;br /&gt;
Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent&lt;br /&gt;
permitted by applicable law.&lt;br /&gt;
Last login: Mon Nov  7 10:06:49 2016&lt;br /&gt;
root@GreenArrow:~# exit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Serveur DNS ====&lt;br /&gt;
&lt;br /&gt;
Tout d'abord, nous modifions le fichier '''named.conf.local''' pour créer les zones nécessaires :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@GreenArrow:/etc/bind# vim /etc/bind/named.conf.local&lt;br /&gt;
zone &amp;quot;jjlddelamuerto.space&amp;quot; IN {&lt;br /&gt;
             type master;&lt;br /&gt;
             file &amp;quot;/etc/bind/db.jjlddelamuerto.space&amp;quot;;&lt;br /&gt;
        };&lt;br /&gt;
&lt;br /&gt;
zone &amp;quot;57.48.193.in-addr.arpa&amp;quot; IN {&lt;br /&gt;
             type master;&lt;br /&gt;
             file &amp;quot;/etc/bind/db.57.48.193.in-addr.arpa&amp;quot;;&lt;br /&gt;
        };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous créons ensuite les fichiers '''db.jjlddelamuerto.space''' et '''db.57.48.193.in-addr.arpa''' :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$TTL    604800&lt;br /&gt;
@       IN      SOA     ns.jjlddelamuerto.space. root.jjlddelamuerto.space. (&lt;br /&gt;
                       2016113007       ; Serial&lt;br /&gt;
                         604800         ; Refresh&lt;br /&gt;
                          86400         ; Retry&lt;br /&gt;
                        2419200         ; Expire&lt;br /&gt;
                         604800 )       ; Negative Cache TTL&lt;br /&gt;
;&lt;br /&gt;
@       IN      NS      ns.jjlddelamuerto.space. &lt;br /&gt;
@       IN      NS      ns6.gandi.net.&lt;br /&gt;
ns      IN      A       193.48.57.162&lt;br /&gt;
www     IN      A       193.48.57.162&lt;br /&gt;
@       IN      A       193.48.57.162&lt;br /&gt;
ns      IN      AAAA       2001:660:4401:60ba:216:3eff:fe80:efa8&lt;br /&gt;
www     IN      AAAA       2001:660:4401:60ba:216:3eff:fe80:efa8&lt;br /&gt;
@       IN      AAAA       2001:660:4401:60ba:216:3eff:fe80:efa8&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$TTL    604800&lt;br /&gt;
@       IN      SOA     jjlddelamuerto.space. root.jjlddelamuerto.space. (&lt;br /&gt;
                        2016113007      ; Serial&lt;br /&gt;
                         604800         ; Refresh&lt;br /&gt;
                          86400         ; Retry&lt;br /&gt;
                        2419200         ; Expire&lt;br /&gt;
                         604800 )       ; Negative Cache TTL&lt;br /&gt;
;&lt;br /&gt;
57.48.193.in-addr.arpa.         IN      NS      ns.jjlddelamuerto.space.&lt;br /&gt;
57.48.193.in-addr.arpa.         IN      NS      ns2.gandi.net.&lt;br /&gt;
&lt;br /&gt;
162                             IN      PTR     jjlddelamuerto.space.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous modifions ensuite le fichier /etc/resolv.conf afin de passer par notre serveur :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@GreenArrow:/etc/bind# vim /etc/resolv.conf&lt;br /&gt;
search jjlddelamuerto.space&lt;br /&gt;
nameserver 193.48.57.162&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Enfin, nous vérifions notre configuration :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@GreenArrow:/etc/bind# host www.jjlddelamuerto.space&lt;br /&gt;
www.jjlddelamuerto.space has address 193.48.57.162&lt;br /&gt;
www.jjlddelamuerto.space has IPv6 address 2001:660:4401:60ba:216:3eff:fe80:efa8&lt;br /&gt;
&lt;br /&gt;
root@GreenArrow:/etc/bind# host -tany jjlddelamuerto.space&lt;br /&gt;
jjlddelamuerto.space has IPv6 address 2001:660:4401:60ba:216:3eff:fe80:efa8&lt;br /&gt;
jjlddelamuerto.space has address 193.48.57.162&lt;br /&gt;
jjlddelamuerto.space has SOA record ns.jjlddelamuerto.space. root.jjlddelamuerto.space. 2016113007 604800 86400 2419200 604800&lt;br /&gt;
jjlddelamuerto.space name server ns6.gandi.net.&lt;br /&gt;
jjlddelamuerto.space name server ns.jjlddelamuerto.space.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Sécurisation de site web par certificat ====&lt;br /&gt;
&lt;br /&gt;
Premièrement, sur Gandi nous lançons l'étape d'achat d'un certificat SSL.&lt;br /&gt;
Puis, sur la VM nous générons le CSR grâce à cette commande:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@GreenArrow:/etc/apache2/sites-available/clef# openssl req -nodes -newkey rsa:2048 -sha256 -keyout GreenArrow.key -out GreenArrow.csr&lt;br /&gt;
Generating a 2048 bit RSA private key&lt;br /&gt;
&lt;br /&gt;
If you enter '.', the field will be left blank.&lt;br /&gt;
-----&lt;br /&gt;
Country Name (2 letter code) [AU]:FR&lt;br /&gt;
State or Province Name (full name) [Some-State]:Nord&lt;br /&gt;
Locality Name (eg, city) []:Lille&lt;br /&gt;
Organization Name (eg, company) [Internet Widgits Pty Ltd]:PolytechLille&lt;br /&gt;
Organizational Unit Name (eg, section) []:IMA&lt;br /&gt;
Common Name (e.g. server FQDN or YOUR name) []:jjlddelamuerto.space&lt;br /&gt;
Email Address []:&lt;br /&gt;
A challenge password []:&lt;br /&gt;
An optional company name []:&lt;br /&gt;
&lt;br /&gt;
root@GreenArrow:/etc/apache2/sites-available/clef# ls&lt;br /&gt;
GreenArrow.csr	GreenArrow.key&lt;br /&gt;
&lt;br /&gt;
root@GreenArrow:/etc/apache2/sites-available/clef# cat GreenArrow.csr&lt;br /&gt;
&lt;br /&gt;
-----BEGIN CERTIFICATE REQUEST-----&lt;br /&gt;
&amp;lt;CSR à renseigner sur Gandi lors de l'achat du certificat&amp;gt;&lt;br /&gt;
-----END CERTIFICATE REQUEST-----&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous continuons donc la procédure pour obtenir le certificat, et attendons donc sa mise en place.&lt;br /&gt;
&lt;br /&gt;
Pour recevoir le mail contenant le lien pour activer le certificat, nous installons les packages suivants :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@GreenArrow:~# apt-get install postfix mailx&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Une fois le certificat récupéré, nous les copions tous dans le bon répertoire, puis nous hashons le tout :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@GreenArrow:/etc/bind# cp certificat.crt /etc/ssl/certs/jjlddelamuerto.space.crt&lt;br /&gt;
root@GreenArrow:/etc/bind# cp serveur.key /etc/ssl/private/jjlddelamuerto.space.key&lt;br /&gt;
root@GreenArrow:/etc/bind# cp GandiStandardSSLCA2.pem /etc/ssl/certs/GandiStandardSSLCA2.pem&lt;br /&gt;
root@GreenArrow:/etc/bind# c_rehash /etc/ssl/certs&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Enfin, la dernière étape consiste en la modification des fichiers 000-jjlddelamuerto.space-ssl.conf et ports.conf :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@GreenArrow:/etc/apache2/sites-available# cat 000-jjlddelamuerto.space-ssl.conf &lt;br /&gt;
     &amp;lt;VirtualHost *:443&amp;gt;&lt;br /&gt;
         ServerName www.jjlddelamuerto.space&lt;br /&gt;
         ServerAlias jjlddelamuerto.space&lt;br /&gt;
         DocumentRoot /var/www/&lt;br /&gt;
         CustomLog /var/log/apache2/secure_access.log combined&lt;br /&gt;
   &lt;br /&gt;
         SSLEngine on&lt;br /&gt;
         SSLCertificateFile /etc/ssl/certs/jjlddelamuerto.space.crt&lt;br /&gt;
         SSLCertificateKeyFile /etc/ssl/private/jjlddelamuerto.space.key&lt;br /&gt;
         SSLCertificateChainFile /etc/ssl/certs/GandiStandardSSLCA2.pem&lt;br /&gt;
         SSLVerifyClient None&lt;br /&gt;
     &amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&lt;br /&gt;
root@GreenArrow:/etc/apache2# cat ports.conf &lt;br /&gt;
Listen 80&lt;br /&gt;
&lt;br /&gt;
&amp;lt;IfModule ssl_module&amp;gt;&lt;br /&gt;
	Listen 443&lt;br /&gt;
&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;IfModule mod_gnutls.c&amp;gt;&lt;br /&gt;
	Listen 443&lt;br /&gt;
&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Un redémarrage du service apache2 est maintenant nécessaire :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@GreenArrow:/etc/apache2# service apache2 stop&lt;br /&gt;
root@GreenArrow:/etc/apache2# service apache2 start&lt;br /&gt;
root@GreenArrow:/etc/apache2# service apache2 reload&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous pouvons voir que notre  site [https://jjlddelamuerto.space] est maintenant sécurisé, un cadenas vert est bien présent.&lt;br /&gt;
&lt;br /&gt;
==== Sécurisation de serveur DNS par DNSSEC ====&lt;br /&gt;
&lt;br /&gt;
Génération des clefs asymétriques:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   dnssec-keygen -a RSASHA1 -b 2048 -r /dev/urandom -f KSK -n ZONE jjlddelamuerto.space&lt;br /&gt;
   dnssec-keygen -a RSASHA1 -b 1024 -r /dev/urandom -n ZONE jjlddelamuerto.space&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On modifie le nom des clefs:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@GreenArrow:/etc/bind/jjlddelamuerto.space.dnssec# ls&lt;br /&gt;
dsset-jjlddelamuerto.space.	  jjlddelamuerto.space-zsk.key&lt;br /&gt;
jjlddelamuerto.space-ksk.key	  jjlddelamuerto.space-zsk.private&lt;br /&gt;
jjlddelamuerto.space-ksk.private&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ensuite nous signons les zones:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@GreenArrow:/etc/bind/jjlddelamuerto.space.dnssec# dnssec-signzone -o jjlddelamuerto.space -k jjlddelamuerto.space-ksk &lt;br /&gt;
../db.jjlddelamuerto.space jjlddelamuerto.space-zsk&lt;br /&gt;
Verifying the zone using the following algorithms: RSASHA1.&lt;br /&gt;
Zone fully signed:&lt;br /&gt;
Algorithm: RSASHA1: KSKs: 1 active, 0 stand-by, 0 revoked&lt;br /&gt;
                    ZSKs: 1 active, 0 stand-by, 0 revoked&lt;br /&gt;
../db.jjlddelamuerto.space.signed&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour finir nous ajoutons la clef KSK sur Gandi avec l'algorithme RSA/SHA1.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:jjlddnssec.png]]&lt;br /&gt;
&lt;br /&gt;
=== Tests d'intrusion ===&lt;br /&gt;
&lt;br /&gt;
==== Intrusion par changement d'adresse MAC ====&lt;br /&gt;
&lt;br /&gt;
Tout d'abord nous modifions le fichier /etc/network/interfaces:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@zebrasoma:/home/pifou# vim /etc/network/interfaces&lt;br /&gt;
auto wlan5&lt;br /&gt;
iface wlan5 inet static&lt;br /&gt;
        address 172.26.79.21&lt;br /&gt;
        netmask 255.255.240.0&lt;br /&gt;
        gateway 172.26.79.254&lt;br /&gt;
        wireless mode-managed&lt;br /&gt;
        wireless-essid Wolverine&lt;br /&gt;
        wireless-key 0123456789&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous vérifions ensuite que nous sommes associés à Wolverine:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@zebrasoma:/home/pifou# iwconfig&lt;br /&gt;
wlan5     IEEE 802.11abg  ESSID:&amp;quot;Wolverine&amp;quot;  &lt;br /&gt;
          Mode:Managed  Frequency:2.462 GHz  Access Point: 44:AD:D9:5F:87:00   &lt;br /&gt;
          Bit Rate=54 Mb/s   Tx-Power=200 dBm   &lt;br /&gt;
          Retry short limit:7   RTS thr:off   Fragment thr:off&lt;br /&gt;
          Encryption key:0123-4567-89&lt;br /&gt;
          Power Management:off&lt;br /&gt;
          Link Quality=50/70  Signal level=-60 dBm  &lt;br /&gt;
          Rx invalid nwid:0  Rx invalid crypt:0  Rx invalid frag:0&lt;br /&gt;
          Tx excessive retries:0  Invalid misc:0   Missed beacon:0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous changeons ensuite l'@ MAC:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@zebrasoma:/home/pifou# ip link set wlan5 address 00:1a:56:a4:4b:ff&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@zebrasoma:/home/pifou# ip a&lt;br /&gt;
3: wlan5: &amp;lt;NO-CARRIER,BROADCAST,MULTICAST,UP&amp;gt; mtu 1500 qdisc mq state DOWN group default qlen 1000&lt;br /&gt;
    link/ether 00:1a:56:a4:4b:ff brd ff:ff:ff:ff:ff:ff&lt;br /&gt;
    inet 172.26.79.21/20 brd 172.26.79.255 scope global wlan5&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Après le changement d'@ MAC, l'association est bien impossible:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@zebrasoma:/home/pifou# ifconfig wlan5 up&lt;br /&gt;
root@zebrasoma:/home/pifou# iwconfig        &lt;br /&gt;
wlan5     IEEE 802.11bgn  ESSID:&amp;quot;Wolverine&amp;quot;  &lt;br /&gt;
          Mode:Managed  Access Point: Not-Associated   Tx-Power=20 dBm   &lt;br /&gt;
          Retry short limit:7   RTS thr:off   Fragment thr:off&lt;br /&gt;
          Encryption key:0123-4567-89&lt;br /&gt;
          Power Management:off&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Crackage de la clef WEP ====&lt;br /&gt;
&lt;br /&gt;
Nous avons fait le crack de la clé WEP sur cracotte08.&lt;br /&gt;
Pour cracker la clef WEP, nous avons tout d'abord utiliser airmon-ng afin de voir le statut des interfaces réseau.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@zebrasoma:/home/pifou# airmon-ng&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Interface	Chipset		Driver&lt;br /&gt;
&lt;br /&gt;
mon0		Ralink RT2870/3070	rt2800usb - [phy1]&lt;br /&gt;
wlan0		Broadcom	wl - [phy0]&lt;br /&gt;
wlan5		Ralink RT2870/3070	rt2800usb - [phy1]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On entre ensuite en mode monitoring sur l'interface wlan5 :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@zebrasoma:/home/pifou# airmon-ng start wlan5&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Found 2 processes that could cause trouble.&lt;br /&gt;
If airodump-ng, aireplay-ng or airtun-ng stops working after&lt;br /&gt;
a short period of time, you may want to kill (some of) them!&lt;br /&gt;
&lt;br /&gt;
PID	Name&lt;br /&gt;
1986	avahi-daemon&lt;br /&gt;
1987	avahi-daemon&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Interface	Chipset		Driver&lt;br /&gt;
&lt;br /&gt;
mon0		Ralink RT2870/3070	rt2800usb - [phy1]&lt;br /&gt;
wlan0		Broadcom	wl - [phy0]&lt;br /&gt;
wlan5		Ralink RT2870/3070	rt2800usb - [phy1]&lt;br /&gt;
				(monitor mode enabled on mon1)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour continuer, nous capturons les paquets transitant afin de collecter les paquets nécessaires au décryptage de la clef WEP. L'option --encrypt wep permet de filtrer uniquement les points d'accès WEP.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@zebrasoma:/home/pifou# airodump-ng --encrypt wep wlan5&lt;br /&gt;
&lt;br /&gt;
 CH  5 ][ Elapsed: 0 s ][ 2016-03-31 18:36                                         &lt;br /&gt;
                                                                                                       &lt;br /&gt;
 BSSID              PWR  Beacons    #Data, #/s  CH  MB   ENC  CIPHER AUTH ESSID&lt;br /&gt;
                                                                                                       &lt;br /&gt;
 44:AD:D9:5F:87:00  -42        3        0    0   3  54e. WEP  WEP         Wolverine                    &lt;br /&gt;
 04:DA:D2:9C:50:50  -59        2       11    0   2  54e. WEP  WEP         cracotte01                   &lt;br /&gt;
 04:DA:D2:9C:50:56  -59        3       19    0   2  54e. WEP  WEP         cracotte07                   &lt;br /&gt;
 04:DA:D2:9C:50:59  -59        2        0    0   2  54e. WEP  WEP         cracotte10                   &lt;br /&gt;
 04:DA:D2:9C:50:57  -59        2       15    0   2  54e. WEP  WEP         cracotte08                   &lt;br /&gt;
 04:DA:D2:9C:50:52  -58        3       85   42   2  54e. WEP  WEP         cracotte03                   &lt;br /&gt;
 04:DA:D2:9C:50:54  -58        1       20    9   2  54e. WEP  WEP         cracotte05                    &lt;br /&gt;
 04:DA:D2:9C:50:55  -60        1        9    4   2  54e. WEP  WEP         cracotte06                    &lt;br /&gt;
 04:DA:D2:9C:50:51  -59        2      134   66   2  54e. WEP  WEP         cracotte02                   &lt;br /&gt;
 04:DA:D2:9C:50:53  -61        6       95   47   2  54e. WEP  WEP         cracotte04                   &lt;br /&gt;
                                                                                                       &lt;br /&gt;
 BSSID              STATION            PWR   Rate    Lost    Frames  Probe                              &lt;br /&gt;
                                                                                                        &lt;br /&gt;
 04:DA:D2:9C:50:50  00:0F:B5:92:23:75  -66   54e-48e    68       10                                     &lt;br /&gt;
 04:DA:D2:9C:50:56  00:0F:B5:92:23:71  -72   36e- 2e   133       19                                     &lt;br /&gt;
 04:DA:D2:9C:50:57  00:0F:B5:92:22:66  -66   54e-36e    89       15                                     &lt;br /&gt;
 04:DA:D2:9C:50:52  00:0F:B5:92:23:6A  -62   54e-48e    23       84                                     &lt;br /&gt;
 04:DA:D2:9C:50:54  00:0F:B5:92:23:74  -66   54e-36e   576       20                                     &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi de récuperer la clef WEP de cracotte03 (son BSSID est lié à une station)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@zebrasoma:/home/pifou# airodump-ng --essid cracotte03 --channel 2 -w crackWEP wlan5&lt;br /&gt;
&lt;br /&gt;
 CH  2 ][ Elapsed: 12 s ][ 2016-03-31 18:42                                         &lt;br /&gt;
                                                                                                       &lt;br /&gt;
 BSSID              PWR RXQ  Beacons    #Data, #/s  CH  MB   ENC  CIPHER AUTH ESSID&lt;br /&gt;
                                                                                                       &lt;br /&gt;
 04:DA:D2:9C:50:52  -57  35       43     1066   87   2  54e. WEP  WEP         cracotte03               &lt;br /&gt;
                                                                                                       &lt;br /&gt;
 BSSID              STATION            PWR   Rate    Lost    Frames  Probe                             &lt;br /&gt;
                                                                                                                                   &lt;br /&gt;
 04:DA:D2:9C:50:52  00:0F:B5:92:23:6A  -64   36e-48e  1232     1067                                     &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Enfin, nous lançons le crack de la clef à l'aide de aircrack-ng :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@zebrasoma:/home/pifou# aircrack-ng crackWEP-02.cap&lt;br /&gt;
                           Aircrack-ng 1.2 beta3&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                 [00:00:04] Tested 112801 keys (got 3050 IVs)&lt;br /&gt;
&lt;br /&gt;
   KB    depth   byte(vote)&lt;br /&gt;
    0    6/ 10   CD(5120) 15(4864) 6D(4864) 8C(4864) A7(4864) &lt;br /&gt;
    1   46/  1   E9(4352) 04(4096) 0E(4096) 0F(4096) 16(4096) &lt;br /&gt;
    2   14/ 42   C8(4864) 10(4608) 11(4608) 1D(4608) 58(4608) &lt;br /&gt;
    3   19/  3   CF(4864) 0A(4608) 5E(4608) 8E(4608) 90(4608) &lt;br /&gt;
    4    2/ 16   08(5632) 89(5376) 96(5376) B4(5376) F7(5376) &lt;br /&gt;
&lt;br /&gt;
Failed. Next try with 5000 IVs.&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Il est nécessaire d'être proche du point d’accès (sinon le débit est trop faible, ce qui rend l'opération longue), ainsi que de capturer un minimum de 10 000 paquets.&lt;br /&gt;
&lt;br /&gt;
Au final, nous arrivons bien à récupérer la clef WEP : &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
                               Aircrack-ng 1.2 beta3&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                 [00:04:10] Tested 799 keys (got 42913 IVs)&lt;br /&gt;
&lt;br /&gt;
   KB    depth   byte(vote)&lt;br /&gt;
    0    0/  1   EE(56320) B4(51712) 9D(50944) 4E(50688) 28(50432) &lt;br /&gt;
    1    1/  2   D9(55552) 3D(50176) 68(49664) 08(49408) 49(49152) &lt;br /&gt;
    2    1/  5   A2(53504) 5B(52480) 93(52480) 73(52224) 10(50432) &lt;br /&gt;
    3    1/  3   30(53248) 81(51456) 5B(49920) 6E(49920) 1E(49664) &lt;br /&gt;
    4    9/  4   9D(50176) 31(49408) 18(49152) 72(49152) E1(49152) &lt;br /&gt;
&lt;br /&gt;
             KEY FOUND! [ EE:EE:EE:EE:EE:EE:EE:EE:EE:EE:EE:E4:44 ] &lt;br /&gt;
	Decrypted correctly: 100%&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Cassage de mot de passe WPA-PSK par force brute ====&lt;br /&gt;
Nous refaisons les mêmes actions que pour le crackage de clef WEP.&lt;br /&gt;
Cette fois nous essayons de cracker la clef WPA sur cracotte03.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@zebrasoma:/home/pifou# airodump-ng --encrypt wpa wlan5&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@zebrasoma:/home/pifou# airodump-ng --essid cracotte03 --channel 13 -w crackWPA wlan5&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Une fois le handshake récupéré:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@zebrasoma:/home/pifou# aircrack-ng -w dico.txt crackWPA-01.cap&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Nous avons lancé ceci sur le eeePC qui a une vitesse de traitement 5 fois inférieure à celle d'une zabeth environ (environ 5h de traitement). Puis nous obtenons le résultat suivant:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
                                   Aircrack-ng 1.2 beta3&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                   [04:32:42] 12399908 keys tested (759.63 k/s)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                           KEY FOUND! [ 12399903 ]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
      Master Key     : 33 2B 69 DD 95 0A 5A E0 01 22 7E FF 98 DA 99 87 &lt;br /&gt;
                       40 7A CB CC 8A E5 32 9F FE 4E 5C 44 91 38 13 93 &lt;br /&gt;
&lt;br /&gt;
      Transient Key  : 70 EE 27 96 5B 34 B5 4F 06 A1 F2 B6 A7 16 1E 21 &lt;br /&gt;
                       7A 0B BD F4 13 67 5B 4C ED 30 A9 0D 91 E3 F9 7F &lt;br /&gt;
                       88 E6 12 68 9C 77 4B 48 EB 5E 6A 5A DD 1D D9 08 &lt;br /&gt;
                       36 40 94 7D B4 05 80 B2 60 FA 84 81 50 CE DC 87 &lt;br /&gt;
&lt;br /&gt;
      EAPOL HMAC     : 83 03 24 AC 39 AB 67 E7 7B C4 40 E8 6B 6D 7D 47 &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Réalisations ===&lt;br /&gt;
==== Sécurisation des données ====&lt;br /&gt;
&lt;br /&gt;
Nous créons d'abord 3 nouvelles partitions, que nous associons à notre VM en modifiant le fichier GreenArrow.cfg :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
lvcreate -L 1G -n /dev/virtual/GreenArrow-1 -v&lt;br /&gt;
lvcreate -L 1G -n /dev/virtual/GreenArrow-2 -v&lt;br /&gt;
lvcreate -L 1G -n /dev/virtual/GreenArrow-3 -v&lt;br /&gt;
&lt;br /&gt;
'phy:/dev/virtual/GreenArrow-1,xvdd,w',&lt;br /&gt;
'phy:/dev/virtual/GreenArrow-2,xvde,w',&lt;br /&gt;
'phy:/dev/virtual/GreenArrow-3,xvdf,w',&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Il faut ensuite installer mdadm :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt-get install mdadm&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous avions une erreur à propos du subsystem. Pour que cela fonctionne, il nous manquait la commande : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt-get install linux-image-3.16.0-4-amd64&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Après un reboot de la machine, nous créons le volume /dev/md0:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mdadm --create /dev/md0 --level=5 --assume-clean --raid-devices=3 /dev/xvdd /dev/xvde /dev/xvdf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour avoir le détail de la configuration actuelle:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@GreenArrow:~# mdadm --detail /dev/md0&lt;br /&gt;
/dev/md0:&lt;br /&gt;
        Version : 1.2&lt;br /&gt;
  Creation Time : Mon Nov 28 12:56:23 2016&lt;br /&gt;
     Raid Level : raid5&lt;br /&gt;
     Array Size : 2095104 (2046.34 MiB 2145.39 MB)&lt;br /&gt;
  Used Dev Size : 1047552 (1023.17 MiB 1072.69 MB)&lt;br /&gt;
   Raid Devices : 3&lt;br /&gt;
  Total Devices : 3&lt;br /&gt;
    Persistence : Superblock is persistent&lt;br /&gt;
&lt;br /&gt;
    Update Time : Mon Nov 28 12:56:23 2016&lt;br /&gt;
          State : clean &lt;br /&gt;
 Active Devices : 3&lt;br /&gt;
Working Devices : 3&lt;br /&gt;
 Failed Devices : 0&lt;br /&gt;
  Spare Devices : 0&lt;br /&gt;
&lt;br /&gt;
         Layout : left-symmetric&lt;br /&gt;
     Chunk Size : 512K&lt;br /&gt;
&lt;br /&gt;
           Name : GreenArrow:0  (local to host GreenArrow)&lt;br /&gt;
           UUID : f70ca72e:e8adc585:ec023dca:21061341&lt;br /&gt;
         Events : 0&lt;br /&gt;
&lt;br /&gt;
    Number   Major   Minor   RaidDevice State&lt;br /&gt;
       0     202       48        0      active sync   /dev/xvdd&lt;br /&gt;
       1     202       64        1      active sync   /dev/xvde&lt;br /&gt;
       2     202       80        2      active sync   /dev/xvdf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Puis nous sauvons cette dernière afin de conserver md0:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@GreenArrow:~# mdadm --detail --scan &amp;gt;&amp;gt; /etc/mdadm/mdadm.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Puis:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@GreenArrow:~# mkfs /dev/md0&lt;br /&gt;
root@GreenArrow:~# mkdir /datamd0&lt;br /&gt;
root@GreenArrow:/datamd0# mount /dev/md0 /datamd0/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Ensuite il faut éditer le fichier /etc/fstab en rajoutant la ligne suivante à la fin du fichier afin d'être surs que la partition soit encore montée après le reboot:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/dev/md0 /datamd0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous créons un fichier texte sur le raid5:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@GreenArrow:/datamd0# vim testraid5.txt&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous mettons en commentaire la 2ème partition dans le fichier de conf, puis redémarrons la machine:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@GreenArrow:/datamd0# mdadm --detail /dev/md0&lt;br /&gt;
/dev/md0:&lt;br /&gt;
        Version : 1.2&lt;br /&gt;
  Creation Time : Mon Nov 28 12:56:23 2016&lt;br /&gt;
     Raid Level : raid5&lt;br /&gt;
     Array Size : 2095104 (2046.34 MiB 2145.39 MB)&lt;br /&gt;
  Used Dev Size : 1047552 (1023.17 MiB 1072.69 MB)&lt;br /&gt;
   Raid Devices : 3&lt;br /&gt;
  Total Devices : 2&lt;br /&gt;
    Persistence : Superblock is persistent&lt;br /&gt;
&lt;br /&gt;
    Update Time : Mon Nov 28 13:20:27 2016&lt;br /&gt;
          State : clean, degraded &lt;br /&gt;
 Active Devices : 2&lt;br /&gt;
Working Devices : 2&lt;br /&gt;
 Failed Devices : 0&lt;br /&gt;
  Spare Devices : 0&lt;br /&gt;
&lt;br /&gt;
         Layout : left-symmetric&lt;br /&gt;
     Chunk Size : 512K&lt;br /&gt;
&lt;br /&gt;
           Name : GreenArrow:0  (local to host GreenArrow)&lt;br /&gt;
           UUID : f70ca72e:e8adc585:ec023dca:21061341&lt;br /&gt;
         Events : 4&lt;br /&gt;
&lt;br /&gt;
    Number   Major   Minor   RaidDevice State&lt;br /&gt;
       0     202       48        0      active sync   /dev/xvdd&lt;br /&gt;
       2       0        0        2      removed&lt;br /&gt;
       2     202       80        2      active sync   /dev/xvdf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
On voit bien qu'une partition a été supprimée mais que le fichier créé auparavant est toujours présent:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@GreenArrow:~# ls /datamd0/&lt;br /&gt;
testraid5.txt&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour le test de réparation, afin de bien voir l'avancement de la reconstruction, nous avons procédé comme dans l'exemple du cours:&lt;br /&gt;
Suppression de la partition xvdf:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@GreenArrow:~# mdadm --set-faulty /dev/md0 /dev/xvdf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@GreenArrow:~# mdadm --remove /dev/md0 /dev/xvdf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
La partition est bien supprimée:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Personalities : [raid6] [raid5] [raid4] &lt;br /&gt;
md0 : active raid5 xvdd[0] xvde[1]&lt;br /&gt;
      2095104 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/2] [UU_]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
On remet la partition:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@GreenArrow:~# mdadm --add /dev/md0 /dev/xvdf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
On peut ensuite constater l'avancement de la reconstruction en lançant la même commande assez régulièrement:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@GreenArrow:~# cat /proc/mdstat &lt;br /&gt;
Personalities : [raid6] [raid5] [raid4] &lt;br /&gt;
md0 : active raid5 xvdf[3] xvdd[0] xvde[1]&lt;br /&gt;
      2095104 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/2] [UU_]&lt;br /&gt;
      [===&amp;gt;.................]  recovery = 18.2% (191112/1047552) finish=0.4min speed=31852K/sec&lt;br /&gt;
      &lt;br /&gt;
unused devices: &amp;lt;none&amp;gt;&lt;br /&gt;
root@GreenArrow:~# cat /proc/mdstat &lt;br /&gt;
Personalities : [raid6] [raid5] [raid4] &lt;br /&gt;
md0 : active raid5 xvdf[3] xvdd[0] xvde[1]&lt;br /&gt;
      2095104 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/2] [UU_]&lt;br /&gt;
      [====&amp;gt;................]  recovery = 20.0% (210764/1047552) finish=0.4min speed=30109K/sec&lt;br /&gt;
      &lt;br /&gt;
unused devices: &amp;lt;none&amp;gt;&lt;br /&gt;
root@GreenArrow:~# cat /proc/mdstat &lt;br /&gt;
Personalities : [raid6] [raid5] [raid4] &lt;br /&gt;
md0 : active raid5 xvdf[3] xvdd[0] xvde[1]&lt;br /&gt;
      2095104 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/2] [UU_]&lt;br /&gt;
      [====&amp;gt;................]  recovery = 21.8% (229836/1047552) finish=0.4min speed=32833K/sec&lt;br /&gt;
      &lt;br /&gt;
unused devices: &amp;lt;none&amp;gt;&lt;br /&gt;
root@GreenArrow:~# cat /proc/mdstat &lt;br /&gt;
Personalities : [raid6] [raid5] [raid4] &lt;br /&gt;
md0 : active raid5 xvdf[3] xvdd[0] xvde[1]&lt;br /&gt;
      2095104 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/2] [UU_]&lt;br /&gt;
      [===========&amp;gt;.........]  recovery = 59.6% (626140/1047552) finish=0.2min speed=29816K/sec&lt;br /&gt;
      &lt;br /&gt;
unused devices: &amp;lt;none&amp;gt;&lt;br /&gt;
root@GreenArrow:~# cat /proc/mdstat &lt;br /&gt;
Personalities : [raid6] [raid5] [raid4] &lt;br /&gt;
md0 : active raid5 xvdf[3] xvdd[0] xvde[1]&lt;br /&gt;
      2095104 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/2] [UU_]&lt;br /&gt;
      [==================&amp;gt;..]  recovery = 94.3% (989688/1047552) finish=0.0min speed=30124K/sec&lt;br /&gt;
      &lt;br /&gt;
unused devices: &amp;lt;none&amp;gt;&lt;br /&gt;
root@GreenArrow:~# [  446.720069] md: md0: recovery done.&lt;br /&gt;
cat /proc/mdstat &lt;br /&gt;
Personalities : [raid6] [raid5] [raid4] &lt;br /&gt;
md0 : active raid5 xvdf[3] xvdd[0] xvde[1]&lt;br /&gt;
      2095104 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/3] [UUU]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Cryptage de données ====&lt;br /&gt;
&lt;br /&gt;
Tout d'abord, nous vérifions grâce à Gparted que la carte SD fournie comporte une seule partition.&lt;br /&gt;
Une fois ce test passé, nous regardons grâce à dmesg où est localisé la carte SD :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@zebrasoma:/# dmesg&lt;br /&gt;
[...]&lt;br /&gt;
[1126726.403767] mmcblk1: mmc1:59b4 NCard 14.7 GiB&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Notre carte SD se situe donc sur /dev/mmcblk1.&lt;br /&gt;
Nous faisons donc un chiffrage AES avec un hashage SHA256 de la carte SD :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@zebrasoma:/# cryptsetup luksFormat -c aes -h sha256 /dev/mmcblk1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous devons alors renseigner un mot de passe pour crypter la clef.&lt;br /&gt;
Ensuite, nous ouvrons la partition Luks, puis nous formatons la carte :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@zebrasoma:/# cryptsetup luksOpen /dev/sdb1 crypt_sd&lt;br /&gt;
root@zebrasoma:/# mkfs.ext4 /dev/mapper/crypt_sd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous montons la partition, puis créons un fichier sur la carte :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@zebrasoma:/# mount /dev/mapper/crypt_sd /mnt&lt;br /&gt;
root@zebrasoma:/# vi /mnt/test.txt #on marque un texte dans le fichier&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Enfin, nous démontons la carte SD et fermons la partition Luks :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@zebrasoma:/# umount /mnt&lt;br /&gt;
root@zebrasoma:/# cryptsetup luksClose crypt_sd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous essayons ensuite d'accéder à la carte SD. En renseignant un mauvais mot de passe, une erreur apparaît.&lt;br /&gt;
Cependant, une fois le bon mot de passe renseigné, tout re-devient possible.&lt;br /&gt;
&lt;br /&gt;
==== Sécurisation Wifi par WPA2-EAP ====&lt;br /&gt;
Tout d'abord, nous installons FreeRadius sur notre machine virtuelle.&amp;lt;br /&amp;gt;&lt;br /&gt;
Dans le fichier '''users''', nous renseignons le login et le mot de passe pour se connecter à la borne Wifi : &amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
GreenArrow Cleartext-Password:=&amp;quot;glopglop&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Dans le fichier '''clients.conf''', nous ajoutons la configuration de la borne E306 et E304 :&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
client E306 {&lt;br /&gt;
	ipaddr		= 10.60.1.2&lt;br /&gt;
	secret		= password&lt;br /&gt;
}&lt;br /&gt;
client E304 {&lt;br /&gt;
	ipaddr		= 10.60.1.4&lt;br /&gt;
	secret		= password&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ensuite, on passe à la configuration de la borne Wifi. On se connecte en telnet via '''telnet 10.60.1.2''', puis nous rentrons en mode configuration : &amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
aaa authentication login eap_greenarrow group radius_greenarrow&lt;br /&gt;
radius-server host 193.48.57.162 auth-port 1812 acct-port 1813 key glopglop&lt;br /&gt;
aaa group server radius radius_greenarrow&lt;br /&gt;
server 193.48.57.162 auth-port 1812 acct-port 1813&lt;br /&gt;
&lt;br /&gt;
dot11 ssid SSID_GREENARROW&lt;br /&gt;
vlan 3&lt;br /&gt;
authentication open eap eap_greenarrow&lt;br /&gt;
authentication network-eap eap_greenarrow&lt;br /&gt;
authentication key-management wpa&lt;br /&gt;
mbssid guest-mode&lt;br /&gt;
&lt;br /&gt;
exit&lt;br /&gt;
&lt;br /&gt;
interface Dot11Radio0&lt;br /&gt;
encryption vlan 3 mode ciphers aes-ccm tkip&lt;br /&gt;
ssid SSID_GREENARROW&lt;br /&gt;
&lt;br /&gt;
interface Dot11Radio0.3&lt;br /&gt;
encapsulation dot1Q 3&lt;br /&gt;
no ip route-cache&lt;br /&gt;
bridge-group 3&lt;br /&gt;
bridge-group 3 subscriber-loop-control&lt;br /&gt;
bridge-group 3 spanning-disabled&lt;br /&gt;
bridge-group 3 block-unknown-source&lt;br /&gt;
no bridge-group 3 source-learning&lt;br /&gt;
no bridge-group 3 unicast-flooding &lt;br /&gt;
&lt;br /&gt;
interface GigabitEthernet0.3&lt;br /&gt;
encapsulation dot1Q 3&lt;br /&gt;
bridge-group 3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Une fois ces modifications effectuées, nous configurons l'interface wlan0 de l'eeePC pour pouvoir se connecter au Wifi à l'aide de '''ifup wlan0''' : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
auto wlan0&lt;br /&gt;
iface wlan0 inet static&lt;br /&gt;
  address 10.60.3.2&lt;br /&gt;
  netmask 255.255.255.0&lt;br /&gt;
  gateway 10.60.3.1&lt;br /&gt;
  wpa-ssid SSID_GREENARROW&lt;br /&gt;
  wpa-key-mgmt WPA-EAP&lt;br /&gt;
  wpa-identity GreenArrow&lt;br /&gt;
  wpa-password glopglop&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On lance le serveur FreeRadius via freeradius -X (mode debug).&lt;br /&gt;
Sur smartphone, nous arrivons à détecter notre SSID (SSID_GREENARROW). Nous pouvons également ping notre eeePC depuis la machine virtuelle, tout comme nous arrivons à pinger des Vm d'autres groupes depuis notre eeePC.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@GreenArrow:/etc/freeradius# ping 10.60.3.2&lt;br /&gt;
PING 10.60.3.2 (10.60.3.2) 56(84) bytes of data.&lt;br /&gt;
64 bytes from 10.60.3.2: icmp_seq=1 ttl=255 time=1.30 ms&lt;br /&gt;
64 bytes from 10.60.3.2: icmp_seq=2 ttl=255 time=1.96 ms&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Serveur DCHP ====&lt;br /&gt;
&lt;br /&gt;
Pour cette partie, nous avons d'abord installer le paquet isc-dhcp-server.&lt;br /&gt;
Ensuite, nous avons modifier le fichier dhcpd.conf :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
option domain-name &amp;quot;jjlddelamuerto.space&amp;quot;;&lt;br /&gt;
option domain-name-servers 193.48.57.162;&lt;br /&gt;
&lt;br /&gt;
subnet 10.60.3.0 netmask 255.255.255.0 {&lt;br /&gt;
      range 10.60.3.10 10.60.3.40;&lt;br /&gt;
      option routers 10.60.3.1;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous modifions ensuite isc-dhcp-server pour rajouter l'interface wlan0 : &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
INTERFACES=&amp;quot;wlan0&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous pouvons maintenant nous connecter sur le reseau Wifi via smartphone, le serveur DHCP fonctionne correctement.&lt;br /&gt;
[[Fichier:Connexioniphone.JPG|thumb|center|Connexion via smartphone]]&lt;br /&gt;
&lt;br /&gt;
==== Configuration et utilisation du PCBX ====&lt;br /&gt;
&lt;br /&gt;
Nous avons modifiés le fichier sip.conf :&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;[general]&lt;br /&gt;
hasvoicemail=yes&lt;br /&gt;
hassip=yes&lt;br /&gt;
hasiax=yes&lt;br /&gt;
callwaiting=yes&lt;br /&gt;
threewaycalling=yes&lt;br /&gt;
callwaitingcallerid=yes&lt;br /&gt;
transfer=yes&lt;br /&gt;
canpark=yes&lt;br /&gt;
cancallforward=yes&lt;br /&gt;
callreturn=yes&lt;br /&gt;
callgroup=1&lt;br /&gt;
pickupgroup=1&lt;br /&gt;
nat=yes&lt;br /&gt;
&lt;br /&gt;
[6001]&lt;br /&gt;
type=friend&lt;br /&gt;
host=dynamic&lt;br /&gt;
dtmfmode=rfc2833&lt;br /&gt;
disallow=all&lt;br /&gt;
allow=ulaw&lt;br /&gt;
fullname=JulienJoignaux&lt;br /&gt;
username=jjoignaux&lt;br /&gt;
secret=secret&lt;br /&gt;
context=work&lt;br /&gt;
&lt;br /&gt;
[6002]&lt;br /&gt;
type=friend&lt;br /&gt;
host=dynamic&lt;br /&gt;
dtmfmode=rfc2833&lt;br /&gt;
disallow=all&lt;br /&gt;
allow=ulaw&lt;br /&gt;
fullname=LoicDelecroix&lt;br /&gt;
username=ldelecro&lt;br /&gt;
secret=secret&lt;br /&gt;
context=work&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Puis nous modifions le fichier extensions.conf&lt;br /&gt;
&amp;lt;pre&amp;gt;[work]&lt;br /&gt;
exten=&amp;gt;_6XXX,1,Dial(SIP/${EXTEN},20)&lt;br /&gt;
exten =&amp;gt; _6XXX,2,Hangup()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:voipjjld.jpg|thumb|center|Appel entre 2 smartphones]]&lt;br /&gt;
&lt;br /&gt;
== Références ==&lt;br /&gt;
&lt;br /&gt;
* Crackage de la clef WEP : [http://wiki.backtrack-fr.net/index.php/Casser_une_cl%C3%A9_wep/wpa_avec_la_suite_Aircrack-ng]&lt;br /&gt;
* Cassage de mot de passe WPA-PSK : [http://www.crack-wifi.com/tutoriel-crack-wpa.php]&lt;br /&gt;
* Cryptage de données : [https://doc.ubuntu-fr.org/cryptsetup]&lt;br /&gt;
* DHCP : [https://doc.ubuntu-fr.org/isc-dhcp-server]&lt;br /&gt;
* Asterisk : [http://denisrosenkranz.com/tuto-installer-et-configurer-asterisk-sous-debian-6-et-ubuntu/]&lt;/div&gt;</summary>
		<author><name>Hdelatte</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=Cahier_2016_groupe_n%C2%B02&amp;diff=46350</id>
		<title>Cahier 2016 groupe n°2</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=Cahier_2016_groupe_n%C2%B02&amp;diff=46350"/>
				<updated>2017-11-17T13:55:37Z</updated>
		
		<summary type="html">&lt;p&gt;Hdelatte : Annulation des modifications 46349 de Hdelatte (discussion)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Tâche particulière ==&lt;br /&gt;
&lt;br /&gt;
Câblage de la fibre: &lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Prise de connaissance du sujet de PRA et le choix des tâches particulières. Nous avons également commencer à essayer d'identifier les câbles de fibres déjà existants.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Toujours sur la tâche particulière. Identification de tous les câbles déjà tirés. Test de link de chaque câble. Nous avons également commencé à passer les câbles restants.&lt;br /&gt;
Tous les câbles nécessaires ont été tirés entre les deux salles, tous les link sont up. Nous avons identifié chaque câble par un scotch de couleur différente. Nous avons également percé la gouttière de la E304 pour laisser passer un raccord de fibre proprement. &lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Nous avons pu identifier les câbles déjà présents. Il y a donc 2 câbles déjà tirés entre les 2 piles, 2 câbles qui partent de la E306 jusqu'au boîtier ainsi qu'un câble par salle quid descend dans le local technique. &lt;br /&gt;
* Nous allons donc prolonger les 2 câbles s'arrêtant dans le boîtier et tirer 2 nouveaux câbles entre les deux piles: nous aurons donc 6 fils au total. &lt;br /&gt;
* 2 Grands câbles de 30m ~ -&amp;gt; Estimation de 26m entre les 2 piles.&lt;br /&gt;
* 2 petits câbles de 15m ~ -&amp;gt; Estimation de 13m du boîtier à la pile&lt;br /&gt;
* Retirer le câble ethernet qui était tiré entre les 2 piles.&lt;br /&gt;
* 7 heures passées au total sur la tâche particulière&lt;br /&gt;
[[Fichier:im1.JPG|300px|thumb|left|Fibre passant entre les 2 salles]]&lt;br /&gt;
[[Fichier:im2.JPG|300px|thumb|right|Câbles dans le faux plafond]]&lt;br /&gt;
[[Fichier:im4.JPG|300px|thumb|left|Guide câbles pour le faux plafond]]&lt;br /&gt;
[[Fichier:im5.JPG|300px|thumb|right|Boîtiers contenant les raccords de fibres]]&lt;br /&gt;
[[Fichier:im6.JPG|300px|thumb|left|Les fibres en E304 disponibles]]&lt;br /&gt;
[[Fichier:im7.JPG|300px|thumb|right|Trou dans le cache laissant passer la fibre]] &amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Travail commun ==&lt;br /&gt;
&lt;br /&gt;
* Installation de la machine virtuelle XEN&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
xen-create-image --hostname=GreenArrow --ip=193.48.57.162 --netmask=255.255.255.240 --gateway=193.48.57.172&lt;br /&gt;
  --dir=/usr/local/xen --mirror=http://debian.polytech-lille.fr/debian/ --dist=jessie&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Modification du fichier de configuration de la machine virtuelle pour faire en sorte que les répertoires var et home de la machine virtuelle soient sur des partitions LVM de l'hôte:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
lvcreate -L 10G -n /dev/virtual/ima5-GreenArrow-home -v&lt;br /&gt;
lvcreate -L 10G -n /dev/virtual/ima5-GreenArrow-var -v&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
disk        = [&lt;br /&gt;
                  'file:/usr/local/xen/domains/GreenArrow/disk.img,xvda2,w',&lt;br /&gt;
                  'file:/usr/local/xen/domains/GreenArrow/swap.img,xvda1,w',&lt;br /&gt;
                  'phy:/dev/virtual/ima5-GreenArrow-home,xvdc,w',&lt;br /&gt;
                  'phy:/dev/virtual/ima5-GreenArrow-var,xvdb,w',&lt;br /&gt;
              ]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Commandes de base pour démarrer la VM proprement:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh root@cordouan.insecserv.deule.net&lt;br /&gt;
xl create /etc/xen/GreenArrow.cfg&lt;br /&gt;
ssh username@weppes&lt;br /&gt;
ssh root@193.48.57.162&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Achat du nom de domaine [http://jjlddelamuerto.space] sur Gandi pour 1.19€ TTC&lt;br /&gt;
&lt;br /&gt;
=== Services Internet ===&lt;br /&gt;
&lt;br /&gt;
==== Serveur SSH ====&lt;br /&gt;
&lt;br /&gt;
Sur notre machine virtuelle nous avons configuré le fichier sshd_config (changement de la ligne PubkeyAuthentication) :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@GreenArrow:~# vim /etc/ssh/sshd_config&lt;br /&gt;
&lt;br /&gt;
RSAAuthentication yes&lt;br /&gt;
PubkeyAuthentication yes&lt;br /&gt;
#AuthorizedKeysFile     %h/.ssh/authorized_keys&lt;br /&gt;
&lt;br /&gt;
root@GreenArrow:~# service ssh restart&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite réussi à nous connecter en SSH sur notre VM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
jjoignau@weppes:~$ ssh root@193.48.57.162&lt;br /&gt;
root@193.48.57.162's password: &lt;br /&gt;
&lt;br /&gt;
The programs included with the Debian GNU/Linux system are free software;&lt;br /&gt;
the exact distribution terms for each program are described in the&lt;br /&gt;
individual files in /usr/share/doc/*/copyright.&lt;br /&gt;
&lt;br /&gt;
Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent&lt;br /&gt;
permitted by applicable law.&lt;br /&gt;
Last login: Mon Nov  7 10:06:49 2016&lt;br /&gt;
root@GreenArrow:~# exit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Serveur DNS ====&lt;br /&gt;
&lt;br /&gt;
Tout d'abord, nous modifions le fichier '''named.conf.local''' pour créer les zones nécessaires :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@GreenArrow:/etc/bind# vim /etc/bind/named.conf.local&lt;br /&gt;
zone &amp;quot;jjlddelamuerto.space&amp;quot; IN {&lt;br /&gt;
             type master;&lt;br /&gt;
             file &amp;quot;/etc/bind/db.jjlddelamuerto.space&amp;quot;;&lt;br /&gt;
        };&lt;br /&gt;
&lt;br /&gt;
zone &amp;quot;57.48.193.in-addr.arpa&amp;quot; IN {&lt;br /&gt;
             type master;&lt;br /&gt;
             file &amp;quot;/etc/bind/db.57.48.193.in-addr.arpa&amp;quot;;&lt;br /&gt;
        };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous créons ensuite les fichiers '''db.jjlddelamuerto.space''' et '''db.57.48.193.in-addr.arpa''' :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$TTL    604800&lt;br /&gt;
@       IN      SOA     ns.jjlddelamuerto.space. root.jjlddelamuerto.space. (&lt;br /&gt;
                       2016113007       ; Serial&lt;br /&gt;
                         604800         ; Refresh&lt;br /&gt;
                          86400         ; Retry&lt;br /&gt;
                        2419200         ; Expire&lt;br /&gt;
                         604800 )       ; Negative Cache TTL&lt;br /&gt;
;&lt;br /&gt;
@       IN      NS      ns.jjlddelamuerto.space. &lt;br /&gt;
@       IN      NS      ns6.gandi.net.&lt;br /&gt;
ns      IN      A       193.48.57.162&lt;br /&gt;
www     IN      A       193.48.57.162&lt;br /&gt;
@       IN      A       193.48.57.162&lt;br /&gt;
ns      IN      AAAA       2001:660:4401:60ba:216:3eff:fe80:efa8&lt;br /&gt;
www     IN      AAAA       2001:660:4401:60ba:216:3eff:fe80:efa8&lt;br /&gt;
@       IN      AAAA       2001:660:4401:60ba:216:3eff:fe80:efa8&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$TTL    604800&lt;br /&gt;
@       IN      SOA     jjlddelamuerto.space. root.jjlddelamuerto.space. (&lt;br /&gt;
                        2016113007      ; Serial&lt;br /&gt;
                         604800         ; Refresh&lt;br /&gt;
                          86400         ; Retry&lt;br /&gt;
                        2419200         ; Expire&lt;br /&gt;
                         604800 )       ; Negative Cache TTL&lt;br /&gt;
;&lt;br /&gt;
57.48.193.in-addr.arpa.         IN      NS      ns.jjlddelamuerto.space.&lt;br /&gt;
57.48.193.in-addr.arpa.         IN      NS      ns2.gandi.net.&lt;br /&gt;
&lt;br /&gt;
162                             IN      PTR     jjlddelamuerto.space.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous modifions ensuite le fichier /etc/resolv.conf afin de passer par notre serveur :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@GreenArrow:/etc/bind# vim /etc/resolv.conf&lt;br /&gt;
search jjlddelamuerto.space&lt;br /&gt;
nameserver 193.48.57.162&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Enfin, nous vérifions notre configuration :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@GreenArrow:/etc/bind# host www.jjlddelamuerto.space&lt;br /&gt;
www.jjlddelamuerto.space has address 193.48.57.162&lt;br /&gt;
www.jjlddelamuerto.space has IPv6 address 2001:660:4401:60ba:216:3eff:fe80:efa8&lt;br /&gt;
&lt;br /&gt;
root@GreenArrow:/etc/bind# host -tany jjlddelamuerto.space&lt;br /&gt;
jjlddelamuerto.space has IPv6 address 2001:660:4401:60ba:216:3eff:fe80:efa8&lt;br /&gt;
jjlddelamuerto.space has address 193.48.57.162&lt;br /&gt;
jjlddelamuerto.space has SOA record ns.jjlddelamuerto.space. root.jjlddelamuerto.space. 2016113007 604800 86400 2419200 604800&lt;br /&gt;
jjlddelamuerto.space name server ns6.gandi.net.&lt;br /&gt;
jjlddelamuerto.space name server ns.jjlddelamuerto.space.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Sécurisation de site web par certificat ====&lt;br /&gt;
&lt;br /&gt;
Premièrement, sur Gandi nous lançons l'étape d'achat d'un certificat SSL.&lt;br /&gt;
Puis, sur la VM nous générons le CSR grâce à cette commande:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@GreenArrow:/etc/apache2/sites-available/clef# openssl req -nodes -newkey rsa:2048 -sha256 -keyout GreenArrow.key -out GreenArrow.csr&lt;br /&gt;
Generating a 2048 bit RSA private key&lt;br /&gt;
&lt;br /&gt;
If you enter '.', the field will be left blank.&lt;br /&gt;
-----&lt;br /&gt;
Country Name (2 letter code) [AU]:FR&lt;br /&gt;
State or Province Name (full name) [Some-State]:Nord&lt;br /&gt;
Locality Name (eg, city) []:Lille&lt;br /&gt;
Organization Name (eg, company) [Internet Widgits Pty Ltd]:PolytechLille&lt;br /&gt;
Organizational Unit Name (eg, section) []:IMA&lt;br /&gt;
Common Name (e.g. server FQDN or YOUR name) []:jjlddelamuerto.space&lt;br /&gt;
Email Address []:&lt;br /&gt;
A challenge password []:&lt;br /&gt;
An optional company name []:&lt;br /&gt;
&lt;br /&gt;
root@GreenArrow:/etc/apache2/sites-available/clef# ls&lt;br /&gt;
GreenArrow.csr	GreenArrow.key&lt;br /&gt;
&lt;br /&gt;
root@GreenArrow:/etc/apache2/sites-available/clef# cat GreenArrow.csr&lt;br /&gt;
&lt;br /&gt;
-----BEGIN CERTIFICATE REQUEST-----&lt;br /&gt;
&amp;lt;CSR à renseigner sur Gandi lors de l'achat du certificat&amp;gt;&lt;br /&gt;
-----END CERTIFICATE REQUEST-----&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous continuons donc la procédure pour obtenir le certificat, et attendons donc sa mise en place.&lt;br /&gt;
&lt;br /&gt;
Pour recevoir le mail contenant le lien pour activer le certificat, nous installons les packages suivants :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@GreenArrow:~# apt-get install postfix mailx&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Une fois le certificat récupéré, nous les copions tous dans le bon répertoire, puis nous hashons le tout :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@GreenArrow:/etc/bind# cp certificat.crt /etc/ssl/certs/jjlddelamuerto.space.crt&lt;br /&gt;
root@GreenArrow:/etc/bind# cp serveur.key /etc/ssl/private/jjlddelamuerto.space.key&lt;br /&gt;
root@GreenArrow:/etc/bind# cp GandiStandardSSLCA2.pem /etc/ssl/certs/GandiStandardSSLCA2.pem&lt;br /&gt;
root@GreenArrow:/etc/bind# c_rehash /etc/ssl/certs&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Enfin, la dernière étape consiste en la modification des fichiers 000-jjlddelamuerto.space-ssl.conf et ports.conf :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@GreenArrow:/etc/apache2/sites-available# cat 000-jjlddelamuerto.space-ssl.conf &lt;br /&gt;
     &amp;lt;VirtualHost *:443&amp;gt;&lt;br /&gt;
         ServerName www.jjlddelamuerto.space&lt;br /&gt;
         ServerAlias jjlddelamuerto.space&lt;br /&gt;
         DocumentRoot /var/www/&lt;br /&gt;
         CustomLog /var/log/apache2/secure_access.log combined&lt;br /&gt;
   &lt;br /&gt;
         SSLEngine on&lt;br /&gt;
         SSLCertificateFile /etc/ssl/certs/jjlddelamuerto.space.crt&lt;br /&gt;
         SSLCertificateKeyFile /etc/ssl/private/jjlddelamuerto.space.key&lt;br /&gt;
         SSLCertificateChainFile /etc/ssl/certs/GandiStandardSSLCA2.pem&lt;br /&gt;
         SSLVerifyClient None&lt;br /&gt;
     &amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&lt;br /&gt;
root@GreenArrow:/etc/apache2# cat ports.conf &lt;br /&gt;
Listen 80&lt;br /&gt;
&lt;br /&gt;
&amp;lt;IfModule ssl_module&amp;gt;&lt;br /&gt;
	Listen 443&lt;br /&gt;
&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;IfModule mod_gnutls.c&amp;gt;&lt;br /&gt;
	Listen 443&lt;br /&gt;
&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Un redémarrage du service apache2 est maintenant nécessaire :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@GreenArrow:/etc/apache2# service apache2 stop&lt;br /&gt;
root@GreenArrow:/etc/apache2# service apache2 start&lt;br /&gt;
root@GreenArrow:/etc/apache2# service apache2 reload&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous pouvons voir que notre  site [https://jjlddelamuerto.space] est maintenant sécurisé, un cadenas vert est bien présent.&lt;br /&gt;
&lt;br /&gt;
==== Sécurisation de serveur DNS par DNSSEC ====&lt;br /&gt;
&lt;br /&gt;
Génération des clefs asymétriques:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   dnssec-keygen -a RSASHA1 -b 2048 -r /dev/urandom -f KSK -n ZONE jjlddelamuerto.space&lt;br /&gt;
   dnssec-keygen -a RSASHA1 -b 1024 -r /dev/urandom -n ZONE jjlddelamuerto.space&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On modifie le nom des clefs:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@GreenArrow:/etc/bind/jjlddelamuerto.space.dnssec# ls&lt;br /&gt;
dsset-jjlddelamuerto.space.	  jjlddelamuerto.space-zsk.key&lt;br /&gt;
jjlddelamuerto.space-ksk.key	  jjlddelamuerto.space-zsk.private&lt;br /&gt;
jjlddelamuerto.space-ksk.private&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ensuite nous signons les zones:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@GreenArrow:/etc/bind/jjlddelamuerto.space.dnssec# dnssec-signzone -o jjlddelamuerto.space -k jjlddelamuerto.space-ksk &lt;br /&gt;
../db.jjlddelamuerto.space jjlddelamuerto.space-zsk&lt;br /&gt;
Verifying the zone using the following algorithms: RSASHA1.&lt;br /&gt;
Zone fully signed:&lt;br /&gt;
Algorithm: RSASHA1: KSKs: 1 active, 0 stand-by, 0 revoked&lt;br /&gt;
                    ZSKs: 1 active, 0 stand-by, 0 revoked&lt;br /&gt;
../db.jjlddelamuerto.space.signed&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour finir nous ajoutons la clef KSK sur Gandi avec l'algorithme RSA/SHA1.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:jjlddnssec.png]]&lt;br /&gt;
&lt;br /&gt;
=== Tests d'intrusion ===&lt;br /&gt;
&lt;br /&gt;
==== Intrusion par changement d'adresse MAC ====&lt;br /&gt;
&lt;br /&gt;
Tout d'abord nous modifions le fichier /etc/network/interfaces:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@zebrasoma:/home/pifou# vim /etc/network/interfaces&lt;br /&gt;
auto wlan5&lt;br /&gt;
iface wlan5 inet static&lt;br /&gt;
        address 172.26.79.21&lt;br /&gt;
        netmask 255.255.240.0&lt;br /&gt;
        gateway 172.26.79.254&lt;br /&gt;
        wireless mode-managed&lt;br /&gt;
        wireless-essid Wolverine&lt;br /&gt;
        wireless-key 0123456789&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous vérifions ensuite que nous sommes associés à Wolverine:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@zebrasoma:/home/pifou# iwconfig&lt;br /&gt;
wlan5     IEEE 802.11abg  ESSID:&amp;quot;Wolverine&amp;quot;  &lt;br /&gt;
          Mode:Managed  Frequency:2.462 GHz  Access Point: 44:AD:D9:5F:87:00   &lt;br /&gt;
          Bit Rate=54 Mb/s   Tx-Power=200 dBm   &lt;br /&gt;
          Retry short limit:7   RTS thr:off   Fragment thr:off&lt;br /&gt;
          Encryption key:0123-4567-89&lt;br /&gt;
          Power Management:off&lt;br /&gt;
          Link Quality=50/70  Signal level=-60 dBm  &lt;br /&gt;
          Rx invalid nwid:0  Rx invalid crypt:0  Rx invalid frag:0&lt;br /&gt;
          Tx excessive retries:0  Invalid misc:0   Missed beacon:0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous changeons ensuite l'@ MAC:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@zebrasoma:/home/pifou# ip link set wlan5 address 00:1a:56:a4:4b:ff&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@zebrasoma:/home/pifou# ip a&lt;br /&gt;
3: wlan5: &amp;lt;NO-CARRIER,BROADCAST,MULTICAST,UP&amp;gt; mtu 1500 qdisc mq state DOWN group default qlen 1000&lt;br /&gt;
    link/ether 00:1a:56:a4:4b:ff brd ff:ff:ff:ff:ff:ff&lt;br /&gt;
    inet 172.26.79.21/20 brd 172.26.79.255 scope global wlan5&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Après le changement d'@ MAC, l'association est bien impossible:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@zebrasoma:/home/pifou# ifconfig wlan5 up&lt;br /&gt;
root@zebrasoma:/home/pifou# iwconfig        &lt;br /&gt;
wlan5     IEEE 802.11bgn  ESSID:&amp;quot;Wolverine&amp;quot;  &lt;br /&gt;
          Mode:Managed  Access Point: Not-Associated   Tx-Power=20 dBm   &lt;br /&gt;
          Retry short limit:7   RTS thr:off   Fragment thr:off&lt;br /&gt;
          Encryption key:0123-4567-89&lt;br /&gt;
          Power Management:off&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Crackage de la clef WEP ====&lt;br /&gt;
&lt;br /&gt;
Nous avons fait le crack de la clé WEP sur cracotte08.&lt;br /&gt;
Pour cracker la clef WEP, nous avons tout d'abord utiliser airmon-ng afin de voir le statut des interfaces réseau.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@zebrasoma:/home/pifou# airmon-ng&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Interface	Chipset		Driver&lt;br /&gt;
&lt;br /&gt;
mon0		Ralink RT2870/3070	rt2800usb - [phy1]&lt;br /&gt;
wlan0		Broadcom	wl - [phy0]&lt;br /&gt;
wlan5		Ralink RT2870/3070	rt2800usb - [phy1]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On entre ensuite en mode monitoring sur l'interface wlan5 :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@zebrasoma:/home/pifou# airmon-ng start wlan5&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Found 2 processes that could cause trouble.&lt;br /&gt;
If airodump-ng, aireplay-ng or airtun-ng stops working after&lt;br /&gt;
a short period of time, you may want to kill (some of) them!&lt;br /&gt;
&lt;br /&gt;
PID	Name&lt;br /&gt;
1986	avahi-daemon&lt;br /&gt;
1987	avahi-daemon&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Interface	Chipset		Driver&lt;br /&gt;
&lt;br /&gt;
mon0		Ralink RT2870/3070	rt2800usb - [phy1]&lt;br /&gt;
wlan0		Broadcom	wl - [phy0]&lt;br /&gt;
wlan5		Ralink RT2870/3070	rt2800usb - [phy1]&lt;br /&gt;
				(monitor mode enabled on mon1)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour continuer, nous capturons les paquets transitant afin de collecter les paquets nécessaires au décryptage de la clef WEP. L'option --encrypt wep permet de filtrer uniquement les points d'accès WEP.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@zebrasoma:/home/pifou# airodump-ng --encrypt wep wlan5&lt;br /&gt;
&lt;br /&gt;
 CH  5 ][ Elapsed: 0 s ][ 2016-03-31 18:36                                         &lt;br /&gt;
                                                                                                       &lt;br /&gt;
 BSSID              PWR  Beacons    #Data, #/s  CH  MB   ENC  CIPHER AUTH ESSID&lt;br /&gt;
                                                                                                       &lt;br /&gt;
 44:AD:D9:5F:87:00  -42        3        0    0   3  54e. WEP  WEP         Wolverine                    &lt;br /&gt;
 04:DA:D2:9C:50:50  -59        2       11    0   2  54e. WEP  WEP         cracotte01                   &lt;br /&gt;
 04:DA:D2:9C:50:56  -59        3       19    0   2  54e. WEP  WEP         cracotte07                   &lt;br /&gt;
 04:DA:D2:9C:50:59  -59        2        0    0   2  54e. WEP  WEP         cracotte10                   &lt;br /&gt;
 04:DA:D2:9C:50:57  -59        2       15    0   2  54e. WEP  WEP         cracotte08                   &lt;br /&gt;
 04:DA:D2:9C:50:52  -58        3       85   42   2  54e. WEP  WEP         cracotte03                   &lt;br /&gt;
 04:DA:D2:9C:50:54  -58        1       20    9   2  54e. WEP  WEP         cracotte05                    &lt;br /&gt;
 04:DA:D2:9C:50:55  -60        1        9    4   2  54e. WEP  WEP         cracotte06                    &lt;br /&gt;
 04:DA:D2:9C:50:51  -59        2      134   66   2  54e. WEP  WEP         cracotte02                   &lt;br /&gt;
 04:DA:D2:9C:50:53  -61        6       95   47   2  54e. WEP  WEP         cracotte04                   &lt;br /&gt;
                                                                                                       &lt;br /&gt;
 BSSID              STATION            PWR   Rate    Lost    Frames  Probe                              &lt;br /&gt;
                                                                                                        &lt;br /&gt;
 04:DA:D2:9C:50:50  00:0F:B5:92:23:75  -66   54e-48e    68       10                                     &lt;br /&gt;
 04:DA:D2:9C:50:56  00:0F:B5:92:23:71  -72   36e- 2e   133       19                                     &lt;br /&gt;
 04:DA:D2:9C:50:57  00:0F:B5:92:22:66  -66   54e-36e    89       15                                     &lt;br /&gt;
 04:DA:D2:9C:50:52  00:0F:B5:92:23:6A  -62   54e-48e    23       84                                     &lt;br /&gt;
 04:DA:D2:9C:50:54  00:0F:B5:92:23:74  -66   54e-36e   576       20                                     &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi de récuperer la clef WEP de cracotte03 (son BSSID est lié à une station)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@zebrasoma:/home/pifou# airodump-ng --essid cracotte03 --channel 2 -w crackWEP wlan5&lt;br /&gt;
&lt;br /&gt;
 CH  2 ][ Elapsed: 12 s ][ 2016-03-31 18:42                                         &lt;br /&gt;
                                                                                                       &lt;br /&gt;
 BSSID              PWR RXQ  Beacons    #Data, #/s  CH  MB   ENC  CIPHER AUTH ESSID&lt;br /&gt;
                                                                                                       &lt;br /&gt;
 04:DA:D2:9C:50:52  -57  35       43     1066   87   2  54e. WEP  WEP         cracotte03               &lt;br /&gt;
                                                                                                       &lt;br /&gt;
 BSSID              STATION            PWR   Rate    Lost    Frames  Probe                             &lt;br /&gt;
                                                                                                                                   &lt;br /&gt;
 04:DA:D2:9C:50:52  00:0F:B5:92:23:6A  -64   36e-48e  1232     1067                                     &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Enfin, nous lançons le crack de la clef à l'aide de aircrack-ng :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@zebrasoma:/home/pifou# aircrack-ng crackWEP-02.cap&lt;br /&gt;
                           Aircrack-ng 1.2 beta3&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                 [00:00:04] Tested 112801 keys (got 3050 IVs)&lt;br /&gt;
&lt;br /&gt;
   KB    depth   byte(vote)&lt;br /&gt;
    0    6/ 10   CD(5120) 15(4864) 6D(4864) 8C(4864) A7(4864) &lt;br /&gt;
    1   46/  1   E9(4352) 04(4096) 0E(4096) 0F(4096) 16(4096) &lt;br /&gt;
    2   14/ 42   C8(4864) 10(4608) 11(4608) 1D(4608) 58(4608) &lt;br /&gt;
    3   19/  3   CF(4864) 0A(4608) 5E(4608) 8E(4608) 90(4608) &lt;br /&gt;
    4    2/ 16   08(5632) 89(5376) 96(5376) B4(5376) F7(5376) &lt;br /&gt;
&lt;br /&gt;
Failed. Next try with 5000 IVs.&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Il est nécessaire d'être proche du point d’accès (sinon le débit est trop faible, ce qui rend l'opération longue), ainsi que de capturer un minimum de 10 000 paquets.&lt;br /&gt;
&lt;br /&gt;
Au final, nous arrivons bien à récupérer la clef WEP : &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
                               Aircrack-ng 1.2 beta3&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                 [00:04:10] Tested 799 keys (got 42913 IVs)&lt;br /&gt;
&lt;br /&gt;
   KB    depth   byte(vote)&lt;br /&gt;
    0    0/  1   EE(56320) B4(51712) 9D(50944) 4E(50688) 28(50432) &lt;br /&gt;
    1    1/  2   D9(55552) 3D(50176) 68(49664) 08(49408) 49(49152) &lt;br /&gt;
    2    1/  5   A2(53504) 5B(52480) 93(52480) 73(52224) 10(50432) &lt;br /&gt;
    3    1/  3   30(53248) 81(51456) 5B(49920) 6E(49920) 1E(49664) &lt;br /&gt;
    4    9/  4   9D(50176) 31(49408) 18(49152) 72(49152) E1(49152) &lt;br /&gt;
&lt;br /&gt;
             KEY FOUND! [ EE:EE:EE:EE:EE:EE:EE:EE:EE:EE:EE:E4:44 ] &lt;br /&gt;
	Decrypted correctly: 100%&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Cassage de mot de passe WPA-PSK par force brute ====&lt;br /&gt;
Nous refaisons les mêmes actions que pour le crackage de clef WEP.&lt;br /&gt;
Cette fois nous essayons de cracker la clef WPA sur cracotte03.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@zebrasoma:/home/pifou# airodump-ng --encrypt wpa wlan5&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@zebrasoma:/home/pifou# airodump-ng --essid cracotte03 --channel 13 -w crackWPA wlan5&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Une fois le handshake récupéré:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@zebrasoma:/home/pifou# aircrack-ng -w dico.txt crackWPA-01.cap&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Nous avons lancé ceci sur le eeePC qui a une vitesse de traitement 5 fois inférieure à celle d'une zabeth environ (environ 5h de traitement). Puis nous obtenons le résultat suivant:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
                                   Aircrack-ng 1.2 beta3&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                   [04:32:42] 12399908 keys tested (759.63 k/s)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                           KEY FOUND! [ 12399903 ]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
      Master Key     : 33 2B 69 DD 95 0A 5A E0 01 22 7E FF 98 DA 99 87 &lt;br /&gt;
                       40 7A CB CC 8A E5 32 9F FE 4E 5C 44 91 38 13 93 &lt;br /&gt;
&lt;br /&gt;
      Transient Key  : 70 EE 27 96 5B 34 B5 4F 06 A1 F2 B6 A7 16 1E 21 &lt;br /&gt;
                       7A 0B BD F4 13 67 5B 4C ED 30 A9 0D 91 E3 F9 7F &lt;br /&gt;
                       88 E6 12 68 9C 77 4B 48 EB 5E 6A 5A DD 1D D9 08 &lt;br /&gt;
                       36 40 94 7D B4 05 80 B2 60 FA 84 81 50 CE DC 87 &lt;br /&gt;
&lt;br /&gt;
      EAPOL HMAC     : 83 03 24 AC 39 AB 67 E7 7B C4 40 E8 6B 6D 7D 47 &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Réalisations ===&lt;br /&gt;
==== Sécurisation des données ====&lt;br /&gt;
&lt;br /&gt;
Nous créons d'abord 3 nouvelles partitions, que nous associons à notre VM en modifiant le fichier GreenArrow.cfg :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
lvcreate -L 1G -n /dev/virtual/GreenArrow-1 -v&lt;br /&gt;
lvcreate -L 1G -n /dev/virtual/GreenArrow-2 -v&lt;br /&gt;
lvcreate -L 1G -n /dev/virtual/GreenArrow-3 -v&lt;br /&gt;
&lt;br /&gt;
'phy:/dev/virtual/GreenArrow-1,xvdd,w',&lt;br /&gt;
'phy:/dev/virtual/GreenArrow-2,xvde,w',&lt;br /&gt;
'phy:/dev/virtual/GreenArrow-3,xvdf,w',&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Il faut ensuite installer mdadm :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt-get install mdadm&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous créons le volume /dev/md0 qui représente le RAID5 de partitions&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mdadm --create /dev/md0 --level=5 --assume-clean --raid-devices=3 /dev/xvdd /dev/xvde /dev/xvdf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour avoir le détail de la configuration actuelle:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@GreenArrow:~# mdadm --detail /dev/md0&lt;br /&gt;
/dev/md0:&lt;br /&gt;
        Version : 1.2&lt;br /&gt;
  Creation Time : Mon oct 13 11:34:23 2017&lt;br /&gt;
     Raid Level : raid5&lt;br /&gt;
     Array Size : 2095104 (2046.34 MiB 2145.39 MB)&lt;br /&gt;
  Used Dev Size : 1047552 (1023.17 MiB 1072.69 MB)&lt;br /&gt;
   Raid Devices : 3&lt;br /&gt;
  Total Devices : 3&lt;br /&gt;
    Persistence : Superblock is persistent&lt;br /&gt;
&lt;br /&gt;
    Update Time : Mon oct 13 11:34:23 2017&lt;br /&gt;
          State : clean &lt;br /&gt;
 Active Devices : 3&lt;br /&gt;
Working Devices : 3&lt;br /&gt;
 Failed Devices : 0&lt;br /&gt;
  Spare Devices : 0&lt;br /&gt;
&lt;br /&gt;
         Layout : left-symmetric&lt;br /&gt;
     Chunk Size : 512K&lt;br /&gt;
&lt;br /&gt;
           Name : IMA5-BANANE:0  (local to host GreenArrow)&lt;br /&gt;
           UUID : f70ca72e:e8adc585:ec023dca:21061341&lt;br /&gt;
         Events : 0&lt;br /&gt;
&lt;br /&gt;
    Number   Major   Minor   RaidDevice State&lt;br /&gt;
       0     202       48        0      active sync   /dev/xvdd&lt;br /&gt;
       1     202       64        1      active sync   /dev/xvde&lt;br /&gt;
       2     202       80        2      active sync   /dev/xvdf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Puis nous sauvons cette dernière afin de conserver md0:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mdadm --detail --scan &amp;gt;&amp;gt; /etc/mdadm/mdadm.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Puis:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkfs /dev/md0&lt;br /&gt;
mkdir /datamd0&lt;br /&gt;
mount /dev/md0 /datamd0/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ensuite il faut éditer le fichier /etc/fstab en rajoutant la ligne suivante à la fin du fichier afin d'être surs que la partition soit encore montée après le reboot:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/dev/md0 /datamd0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous créons un fichier texte sur le raid5:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
vim testraid5.txt&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous mettons en commentaire la 2ème partition dans le fichier de conf, puis redémarrons la machine:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mdadm --detail /dev/md0&lt;br /&gt;
/dev/md0:&lt;br /&gt;
        Version : 1.2&lt;br /&gt;
  Creation Time : Mon oct 13 11:34:23 2017&lt;br /&gt;
     Raid Level : raid5&lt;br /&gt;
     Array Size : 2095104 (2046.34 MiB 2145.39 MB)&lt;br /&gt;
  Used Dev Size : 1047552 (1023.17 MiB 1072.69 MB)&lt;br /&gt;
   Raid Devices : 3&lt;br /&gt;
  Total Devices : 2&lt;br /&gt;
    Persistence : Superblock is persistent&lt;br /&gt;
&lt;br /&gt;
    Update Time : Mon oct 13 11:45:01 2017&lt;br /&gt;
          State : clean, degraded &lt;br /&gt;
 Active Devices : 2&lt;br /&gt;
Working Devices : 2&lt;br /&gt;
 Failed Devices : 0&lt;br /&gt;
  Spare Devices : 0&lt;br /&gt;
&lt;br /&gt;
         Layout : left-symmetric&lt;br /&gt;
     Chunk Size : 512K&lt;br /&gt;
&lt;br /&gt;
           Name : GreenArrow:0  (local to host GreenArrow)&lt;br /&gt;
           UUID : f70ca72e:e8adc585:ec023dca:21061341&lt;br /&gt;
         Events : 4&lt;br /&gt;
&lt;br /&gt;
    Number   Major   Minor   RaidDevice State&lt;br /&gt;
       0     202       48        0      active sync   /dev/xvdd&lt;br /&gt;
       2       0        0        2      removed&lt;br /&gt;
       2     202       80        2      active sync   /dev/xvdf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On voit bien qu'une partition a été supprimée mais que le fichier créé auparavant est toujours présent:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ls /datamd0/&lt;br /&gt;
testraid5.txt&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour rajouter la partition, on la decommente dans le fichier de configuration et on procede au rajout de cette partition au raid de la facon suivante:&lt;br /&gt;
&lt;br /&gt;
 mdadm --add /dev/md0 /dev/xvde&lt;br /&gt;
&lt;br /&gt;
Pour le test de réparation, afin de bien voir l'avancement de la reconstruction, nous avons procédé comme dans l'exemple du cours:&lt;br /&gt;
Suppression de la partition xvdf:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@GreenArrow:~# mdadm --set-faulty /dev/md0 /dev/xvdf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@GreenArrow:~# mdadm --remove /dev/md0 /dev/xvdf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
La partition est bien supprimée:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Personalities : [raid6] [raid5] [raid4] &lt;br /&gt;
md0 : active raid5 xvdd[0] xvde[1]&lt;br /&gt;
      2095104 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/2] [UU_]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
On remet la partition:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@GreenArrow:~# mdadm --add /dev/md0 /dev/xvdf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
On peut ensuite constater l'avancement de la reconstruction en lançant la même commande assez régulièrement:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@GreenArrow:~# cat /proc/mdstat &lt;br /&gt;
Personalities : [raid6] [raid5] [raid4] &lt;br /&gt;
md0 : active raid5 xvdf[3] xvdd[0] xvde[1]&lt;br /&gt;
      2095104 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/2] [UU_]&lt;br /&gt;
      [===&amp;gt;.................]  recovery = 18.2% (191112/1047552) finish=0.4min speed=31852K/sec&lt;br /&gt;
      &lt;br /&gt;
unused devices: &amp;lt;none&amp;gt;&lt;br /&gt;
root@GreenArrow:~# cat /proc/mdstat &lt;br /&gt;
Personalities : [raid6] [raid5] [raid4] &lt;br /&gt;
md0 : active raid5 xvdf[3] xvdd[0] xvde[1]&lt;br /&gt;
      2095104 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/2] [UU_]&lt;br /&gt;
      [====&amp;gt;................]  recovery = 20.0% (210764/1047552) finish=0.4min speed=30109K/sec&lt;br /&gt;
      &lt;br /&gt;
unused devices: &amp;lt;none&amp;gt;&lt;br /&gt;
root@GreenArrow:~# cat /proc/mdstat &lt;br /&gt;
Personalities : [raid6] [raid5] [raid4] &lt;br /&gt;
md0 : active raid5 xvdf[3] xvdd[0] xvde[1]&lt;br /&gt;
      2095104 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/2] [UU_]&lt;br /&gt;
      [====&amp;gt;................]  recovery = 21.8% (229836/1047552) finish=0.4min speed=32833K/sec&lt;br /&gt;
      &lt;br /&gt;
unused devices: &amp;lt;none&amp;gt;&lt;br /&gt;
root@GreenArrow:~# cat /proc/mdstat &lt;br /&gt;
Personalities : [raid6] [raid5] [raid4] &lt;br /&gt;
md0 : active raid5 xvdf[3] xvdd[0] xvde[1]&lt;br /&gt;
      2095104 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/2] [UU_]&lt;br /&gt;
      [===========&amp;gt;.........]  recovery = 59.6% (626140/1047552) finish=0.2min speed=29816K/sec&lt;br /&gt;
      &lt;br /&gt;
unused devices: &amp;lt;none&amp;gt;&lt;br /&gt;
root@GreenArrow:~# cat /proc/mdstat &lt;br /&gt;
Personalities : [raid6] [raid5] [raid4] &lt;br /&gt;
md0 : active raid5 xvdf[3] xvdd[0] xvde[1]&lt;br /&gt;
      2095104 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/2] [UU_]&lt;br /&gt;
      [==================&amp;gt;..]  recovery = 94.3% (989688/1047552) finish=0.0min speed=30124K/sec&lt;br /&gt;
      &lt;br /&gt;
unused devices: &amp;lt;none&amp;gt;&lt;br /&gt;
root@GreenArrow:~# [  446.720069] md: md0: recovery done.&lt;br /&gt;
cat /proc/mdstat &lt;br /&gt;
Personalities : [raid6] [raid5] [raid4] &lt;br /&gt;
md0 : active raid5 xvdf[3] xvdd[0] xvde[1]&lt;br /&gt;
      2095104 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/3] [UUU]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Cryptage de données ====&lt;br /&gt;
&lt;br /&gt;
Tout d'abord, nous vérifions grâce à Gparted que la carte SD fournie comporte une seule partition.&lt;br /&gt;
Une fois ce test passé, nous regardons grâce à dmesg où est localisé la carte SD :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@zebrasoma:/# dmesg&lt;br /&gt;
[...]&lt;br /&gt;
[1126726.403767] mmcblk1: mmc1:59b4 NCard 14.7 GiB&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Notre carte SD se situe donc sur /dev/mmcblk1.&lt;br /&gt;
Nous faisons donc un chiffrage AES avec un hashage SHA256 de la carte SD :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@zebrasoma:/# cryptsetup luksFormat -c aes -h sha256 /dev/mmcblk1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous devons alors renseigner un mot de passe pour crypter la clef.&lt;br /&gt;
Ensuite, nous ouvrons la partition Luks, puis nous formatons la carte :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@zebrasoma:/# cryptsetup luksOpen /dev/sdb1 crypt_sd&lt;br /&gt;
root@zebrasoma:/# mkfs.ext4 /dev/mapper/crypt_sd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous montons la partition, puis créons un fichier sur la carte :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@zebrasoma:/# mount /dev/mapper/crypt_sd /mnt&lt;br /&gt;
root@zebrasoma:/# vi /mnt/test.txt #on marque un texte dans le fichier&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Enfin, nous démontons la carte SD et fermons la partition Luks :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@zebrasoma:/# umount /mnt&lt;br /&gt;
root@zebrasoma:/# cryptsetup luksClose crypt_sd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous essayons ensuite d'accéder à la carte SD. En renseignant un mauvais mot de passe, une erreur apparaît.&lt;br /&gt;
Cependant, une fois le bon mot de passe renseigné, tout re-devient possible.&lt;br /&gt;
&lt;br /&gt;
==== Sécurisation Wifi par WPA2-EAP ====&lt;br /&gt;
Tout d'abord, nous installons FreeRadius sur notre machine virtuelle.&amp;lt;br /&amp;gt;&lt;br /&gt;
Dans le fichier '''users''', nous renseignons le login et le mot de passe pour se connecter à la borne Wifi : &amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
GreenArrow Cleartext-Password:=&amp;quot;glopglop&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Dans le fichier '''clients.conf''', nous ajoutons la configuration de la borne E306 et E304 :&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
client E306 {&lt;br /&gt;
	ipaddr		= 10.60.1.2&lt;br /&gt;
	secret		= password&lt;br /&gt;
}&lt;br /&gt;
client E304 {&lt;br /&gt;
	ipaddr		= 10.60.1.4&lt;br /&gt;
	secret		= password&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ensuite, on passe à la configuration de la borne Wifi. On se connecte en telnet via '''telnet 10.60.1.2''', puis nous rentrons en mode configuration : &amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
aaa authentication login eap_greenarrow group radius_greenarrow&lt;br /&gt;
radius-server host 193.48.57.162 auth-port 1812 acct-port 1813 key glopglop&lt;br /&gt;
aaa group server radius radius_greenarrow&lt;br /&gt;
server 193.48.57.162 auth-port 1812 acct-port 1813&lt;br /&gt;
&lt;br /&gt;
dot11 ssid SSID_GREENARROW&lt;br /&gt;
vlan 3&lt;br /&gt;
authentication open eap eap_greenarrow&lt;br /&gt;
authentication network-eap eap_greenarrow&lt;br /&gt;
authentication key-management wpa&lt;br /&gt;
mbssid guest-mode&lt;br /&gt;
&lt;br /&gt;
exit&lt;br /&gt;
&lt;br /&gt;
interface Dot11Radio0&lt;br /&gt;
encryption vlan 3 mode ciphers aes-ccm tkip&lt;br /&gt;
ssid SSID_GREENARROW&lt;br /&gt;
&lt;br /&gt;
interface Dot11Radio0.3&lt;br /&gt;
encapsulation dot1Q 3&lt;br /&gt;
no ip route-cache&lt;br /&gt;
bridge-group 3&lt;br /&gt;
bridge-group 3 subscriber-loop-control&lt;br /&gt;
bridge-group 3 spanning-disabled&lt;br /&gt;
bridge-group 3 block-unknown-source&lt;br /&gt;
no bridge-group 3 source-learning&lt;br /&gt;
no bridge-group 3 unicast-flooding &lt;br /&gt;
&lt;br /&gt;
interface GigabitEthernet0.3&lt;br /&gt;
encapsulation dot1Q 3&lt;br /&gt;
bridge-group 3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Une fois ces modifications effectuées, nous configurons l'interface wlan0 de l'eeePC pour pouvoir se connecter au Wifi à l'aide de '''ifup wlan0''' : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
auto wlan0&lt;br /&gt;
iface wlan0 inet static&lt;br /&gt;
  address 10.60.3.2&lt;br /&gt;
  netmask 255.255.255.0&lt;br /&gt;
  gateway 10.60.3.1&lt;br /&gt;
  wpa-ssid SSID_GREENARROW&lt;br /&gt;
  wpa-key-mgmt WPA-EAP&lt;br /&gt;
  wpa-identity GreenArrow&lt;br /&gt;
  wpa-password glopglop&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On lance le serveur FreeRadius via freeradius -X (mode debug).&lt;br /&gt;
Sur smartphone, nous arrivons à détecter notre SSID (SSID_GREENARROW). Nous pouvons également ping notre eeePC depuis la machine virtuelle, tout comme nous arrivons à pinger des Vm d'autres groupes depuis notre eeePC.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@GreenArrow:/etc/freeradius# ping 10.60.3.2&lt;br /&gt;
PING 10.60.3.2 (10.60.3.2) 56(84) bytes of data.&lt;br /&gt;
64 bytes from 10.60.3.2: icmp_seq=1 ttl=255 time=1.30 ms&lt;br /&gt;
64 bytes from 10.60.3.2: icmp_seq=2 ttl=255 time=1.96 ms&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Serveur DCHP ====&lt;br /&gt;
&lt;br /&gt;
Pour cette partie, nous avons d'abord installer le paquet isc-dhcp-server.&lt;br /&gt;
Ensuite, nous avons modifier le fichier dhcpd.conf :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
option domain-name &amp;quot;jjlddelamuerto.space&amp;quot;;&lt;br /&gt;
option domain-name-servers 193.48.57.162;&lt;br /&gt;
&lt;br /&gt;
subnet 10.60.3.0 netmask 255.255.255.0 {&lt;br /&gt;
      range 10.60.3.10 10.60.3.40;&lt;br /&gt;
      option routers 10.60.3.1;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous modifions ensuite isc-dhcp-server pour rajouter l'interface wlan0 : &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
INTERFACES=&amp;quot;wlan0&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous pouvons maintenant nous connecter sur le reseau Wifi via smartphone, le serveur DHCP fonctionne correctement.&lt;br /&gt;
[[Fichier:Connexioniphone.JPG|thumb|center|Connexion via smartphone]]&lt;br /&gt;
&lt;br /&gt;
==== Configuration et utilisation du PCBX ====&lt;br /&gt;
&lt;br /&gt;
Nous avons modifiés le fichier sip.conf :&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;[general]&lt;br /&gt;
hasvoicemail=yes&lt;br /&gt;
hassip=yes&lt;br /&gt;
hasiax=yes&lt;br /&gt;
callwaiting=yes&lt;br /&gt;
threewaycalling=yes&lt;br /&gt;
callwaitingcallerid=yes&lt;br /&gt;
transfer=yes&lt;br /&gt;
canpark=yes&lt;br /&gt;
cancallforward=yes&lt;br /&gt;
callreturn=yes&lt;br /&gt;
callgroup=1&lt;br /&gt;
pickupgroup=1&lt;br /&gt;
nat=yes&lt;br /&gt;
&lt;br /&gt;
[6001]&lt;br /&gt;
type=friend&lt;br /&gt;
host=dynamic&lt;br /&gt;
dtmfmode=rfc2833&lt;br /&gt;
disallow=all&lt;br /&gt;
allow=ulaw&lt;br /&gt;
fullname=JulienJoignaux&lt;br /&gt;
username=jjoignaux&lt;br /&gt;
secret=secret&lt;br /&gt;
context=work&lt;br /&gt;
&lt;br /&gt;
[6002]&lt;br /&gt;
type=friend&lt;br /&gt;
host=dynamic&lt;br /&gt;
dtmfmode=rfc2833&lt;br /&gt;
disallow=all&lt;br /&gt;
allow=ulaw&lt;br /&gt;
fullname=LoicDelecroix&lt;br /&gt;
username=ldelecro&lt;br /&gt;
secret=secret&lt;br /&gt;
context=work&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Puis nous modifions le fichier extensions.conf&lt;br /&gt;
&amp;lt;pre&amp;gt;[work]&lt;br /&gt;
exten=&amp;gt;_6XXX,1,Dial(SIP/${EXTEN},20)&lt;br /&gt;
exten =&amp;gt; _6XXX,2,Hangup()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:voipjjld.jpg|thumb|center|Appel entre 2 smartphones]]&lt;br /&gt;
&lt;br /&gt;
== Références ==&lt;br /&gt;
&lt;br /&gt;
* Crackage de la clef WEP : [http://wiki.backtrack-fr.net/index.php/Casser_une_cl%C3%A9_wep/wpa_avec_la_suite_Aircrack-ng]&lt;br /&gt;
* Cassage de mot de passe WPA-PSK : [http://www.crack-wifi.com/tutoriel-crack-wpa.php]&lt;br /&gt;
* Cryptage de données : [https://doc.ubuntu-fr.org/cryptsetup]&lt;br /&gt;
* DHCP : [https://doc.ubuntu-fr.org/isc-dhcp-server]&lt;br /&gt;
* Asterisk : [http://denisrosenkranz.com/tuto-installer-et-configurer-asterisk-sous-debian-6-et-ubuntu/]&lt;/div&gt;</summary>
		<author><name>Hdelatte</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=Cahier_2016_groupe_n%C2%B02&amp;diff=46349</id>
		<title>Cahier 2016 groupe n°2</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=Cahier_2016_groupe_n%C2%B02&amp;diff=46349"/>
				<updated>2017-11-17T13:54:52Z</updated>
		
		<summary type="html">&lt;p&gt;Hdelatte : /* Sécurisation des données */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Tâche particulière ==&lt;br /&gt;
&lt;br /&gt;
Câblage de la fibre: &lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Prise de connaissance du sujet de PRA et le choix des tâches particulières. Nous avons également commencer à essayer d'identifier les câbles de fibres déjà existants.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Toujours sur la tâche particulière. Identification de tous les câbles déjà tirés. Test de link de chaque câble. Nous avons également commencé à passer les câbles restants.&lt;br /&gt;
Tous les câbles nécessaires ont été tirés entre les deux salles, tous les link sont up. Nous avons identifié chaque câble par un scotch de couleur différente. Nous avons également percé la gouttière de la E304 pour laisser passer un raccord de fibre proprement. &lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Nous avons pu identifier les câbles déjà présents. Il y a donc 2 câbles déjà tirés entre les 2 piles, 2 câbles qui partent de la E306 jusqu'au boîtier ainsi qu'un câble par salle quid descend dans le local technique. &lt;br /&gt;
* Nous allons donc prolonger les 2 câbles s'arrêtant dans le boîtier et tirer 2 nouveaux câbles entre les deux piles: nous aurons donc 6 fils au total. &lt;br /&gt;
* 2 Grands câbles de 30m ~ -&amp;gt; Estimation de 26m entre les 2 piles.&lt;br /&gt;
* 2 petits câbles de 15m ~ -&amp;gt; Estimation de 13m du boîtier à la pile&lt;br /&gt;
* Retirer le câble ethernet qui était tiré entre les 2 piles.&lt;br /&gt;
* 7 heures passées au total sur la tâche particulière&lt;br /&gt;
[[Fichier:im1.JPG|300px|thumb|left|Fibre passant entre les 2 salles]]&lt;br /&gt;
[[Fichier:im2.JPG|300px|thumb|right|Câbles dans le faux plafond]]&lt;br /&gt;
[[Fichier:im4.JPG|300px|thumb|left|Guide câbles pour le faux plafond]]&lt;br /&gt;
[[Fichier:im5.JPG|300px|thumb|right|Boîtiers contenant les raccords de fibres]]&lt;br /&gt;
[[Fichier:im6.JPG|300px|thumb|left|Les fibres en E304 disponibles]]&lt;br /&gt;
[[Fichier:im7.JPG|300px|thumb|right|Trou dans le cache laissant passer la fibre]] &amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Travail commun ==&lt;br /&gt;
&lt;br /&gt;
* Installation de la machine virtuelle XEN&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
xen-create-image --hostname=GreenArrow --ip=193.48.57.162 --netmask=255.255.255.240 --gateway=193.48.57.172&lt;br /&gt;
  --dir=/usr/local/xen --mirror=http://debian.polytech-lille.fr/debian/ --dist=jessie&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Modification du fichier de configuration de la machine virtuelle pour faire en sorte que les répertoires var et home de la machine virtuelle soient sur des partitions LVM de l'hôte:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
lvcreate -L 10G -n /dev/virtual/ima5-GreenArrow-home -v&lt;br /&gt;
lvcreate -L 10G -n /dev/virtual/ima5-GreenArrow-var -v&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
disk        = [&lt;br /&gt;
                  'file:/usr/local/xen/domains/GreenArrow/disk.img,xvda2,w',&lt;br /&gt;
                  'file:/usr/local/xen/domains/GreenArrow/swap.img,xvda1,w',&lt;br /&gt;
                  'phy:/dev/virtual/ima5-GreenArrow-home,xvdc,w',&lt;br /&gt;
                  'phy:/dev/virtual/ima5-GreenArrow-var,xvdb,w',&lt;br /&gt;
              ]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Commandes de base pour démarrer la VM proprement:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh root@cordouan.insecserv.deule.net&lt;br /&gt;
xl create /etc/xen/GreenArrow.cfg&lt;br /&gt;
ssh username@weppes&lt;br /&gt;
ssh root@193.48.57.162&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Achat du nom de domaine [http://jjlddelamuerto.space] sur Gandi pour 1.19€ TTC&lt;br /&gt;
&lt;br /&gt;
=== Services Internet ===&lt;br /&gt;
&lt;br /&gt;
==== Serveur SSH ====&lt;br /&gt;
&lt;br /&gt;
Sur notre machine virtuelle nous avons configuré le fichier sshd_config (changement de la ligne PubkeyAuthentication) :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@GreenArrow:~# vim /etc/ssh/sshd_config&lt;br /&gt;
&lt;br /&gt;
RSAAuthentication yes&lt;br /&gt;
PubkeyAuthentication yes&lt;br /&gt;
#AuthorizedKeysFile     %h/.ssh/authorized_keys&lt;br /&gt;
&lt;br /&gt;
root@GreenArrow:~# service ssh restart&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite réussi à nous connecter en SSH sur notre VM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
jjoignau@weppes:~$ ssh root@193.48.57.162&lt;br /&gt;
root@193.48.57.162's password: &lt;br /&gt;
&lt;br /&gt;
The programs included with the Debian GNU/Linux system are free software;&lt;br /&gt;
the exact distribution terms for each program are described in the&lt;br /&gt;
individual files in /usr/share/doc/*/copyright.&lt;br /&gt;
&lt;br /&gt;
Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent&lt;br /&gt;
permitted by applicable law.&lt;br /&gt;
Last login: Mon Nov  7 10:06:49 2016&lt;br /&gt;
root@GreenArrow:~# exit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Serveur DNS ====&lt;br /&gt;
&lt;br /&gt;
Tout d'abord, nous modifions le fichier '''named.conf.local''' pour créer les zones nécessaires :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@GreenArrow:/etc/bind# vim /etc/bind/named.conf.local&lt;br /&gt;
zone &amp;quot;jjlddelamuerto.space&amp;quot; IN {&lt;br /&gt;
             type master;&lt;br /&gt;
             file &amp;quot;/etc/bind/db.jjlddelamuerto.space&amp;quot;;&lt;br /&gt;
        };&lt;br /&gt;
&lt;br /&gt;
zone &amp;quot;57.48.193.in-addr.arpa&amp;quot; IN {&lt;br /&gt;
             type master;&lt;br /&gt;
             file &amp;quot;/etc/bind/db.57.48.193.in-addr.arpa&amp;quot;;&lt;br /&gt;
        };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous créons ensuite les fichiers '''db.jjlddelamuerto.space''' et '''db.57.48.193.in-addr.arpa''' :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$TTL    604800&lt;br /&gt;
@       IN      SOA     ns.jjlddelamuerto.space. root.jjlddelamuerto.space. (&lt;br /&gt;
                       2016113007       ; Serial&lt;br /&gt;
                         604800         ; Refresh&lt;br /&gt;
                          86400         ; Retry&lt;br /&gt;
                        2419200         ; Expire&lt;br /&gt;
                         604800 )       ; Negative Cache TTL&lt;br /&gt;
;&lt;br /&gt;
@       IN      NS      ns.jjlddelamuerto.space. &lt;br /&gt;
@       IN      NS      ns6.gandi.net.&lt;br /&gt;
ns      IN      A       193.48.57.162&lt;br /&gt;
www     IN      A       193.48.57.162&lt;br /&gt;
@       IN      A       193.48.57.162&lt;br /&gt;
ns      IN      AAAA       2001:660:4401:60ba:216:3eff:fe80:efa8&lt;br /&gt;
www     IN      AAAA       2001:660:4401:60ba:216:3eff:fe80:efa8&lt;br /&gt;
@       IN      AAAA       2001:660:4401:60ba:216:3eff:fe80:efa8&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$TTL    604800&lt;br /&gt;
@       IN      SOA     jjlddelamuerto.space. root.jjlddelamuerto.space. (&lt;br /&gt;
                        2016113007      ; Serial&lt;br /&gt;
                         604800         ; Refresh&lt;br /&gt;
                          86400         ; Retry&lt;br /&gt;
                        2419200         ; Expire&lt;br /&gt;
                         604800 )       ; Negative Cache TTL&lt;br /&gt;
;&lt;br /&gt;
57.48.193.in-addr.arpa.         IN      NS      ns.jjlddelamuerto.space.&lt;br /&gt;
57.48.193.in-addr.arpa.         IN      NS      ns2.gandi.net.&lt;br /&gt;
&lt;br /&gt;
162                             IN      PTR     jjlddelamuerto.space.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous modifions ensuite le fichier /etc/resolv.conf afin de passer par notre serveur :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@GreenArrow:/etc/bind# vim /etc/resolv.conf&lt;br /&gt;
search jjlddelamuerto.space&lt;br /&gt;
nameserver 193.48.57.162&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Enfin, nous vérifions notre configuration :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@GreenArrow:/etc/bind# host www.jjlddelamuerto.space&lt;br /&gt;
www.jjlddelamuerto.space has address 193.48.57.162&lt;br /&gt;
www.jjlddelamuerto.space has IPv6 address 2001:660:4401:60ba:216:3eff:fe80:efa8&lt;br /&gt;
&lt;br /&gt;
root@GreenArrow:/etc/bind# host -tany jjlddelamuerto.space&lt;br /&gt;
jjlddelamuerto.space has IPv6 address 2001:660:4401:60ba:216:3eff:fe80:efa8&lt;br /&gt;
jjlddelamuerto.space has address 193.48.57.162&lt;br /&gt;
jjlddelamuerto.space has SOA record ns.jjlddelamuerto.space. root.jjlddelamuerto.space. 2016113007 604800 86400 2419200 604800&lt;br /&gt;
jjlddelamuerto.space name server ns6.gandi.net.&lt;br /&gt;
jjlddelamuerto.space name server ns.jjlddelamuerto.space.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Sécurisation de site web par certificat ====&lt;br /&gt;
&lt;br /&gt;
Premièrement, sur Gandi nous lançons l'étape d'achat d'un certificat SSL.&lt;br /&gt;
Puis, sur la VM nous générons le CSR grâce à cette commande:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@GreenArrow:/etc/apache2/sites-available/clef# openssl req -nodes -newkey rsa:2048 -sha256 -keyout GreenArrow.key -out GreenArrow.csr&lt;br /&gt;
Generating a 2048 bit RSA private key&lt;br /&gt;
&lt;br /&gt;
If you enter '.', the field will be left blank.&lt;br /&gt;
-----&lt;br /&gt;
Country Name (2 letter code) [AU]:FR&lt;br /&gt;
State or Province Name (full name) [Some-State]:Nord&lt;br /&gt;
Locality Name (eg, city) []:Lille&lt;br /&gt;
Organization Name (eg, company) [Internet Widgits Pty Ltd]:PolytechLille&lt;br /&gt;
Organizational Unit Name (eg, section) []:IMA&lt;br /&gt;
Common Name (e.g. server FQDN or YOUR name) []:jjlddelamuerto.space&lt;br /&gt;
Email Address []:&lt;br /&gt;
A challenge password []:&lt;br /&gt;
An optional company name []:&lt;br /&gt;
&lt;br /&gt;
root@GreenArrow:/etc/apache2/sites-available/clef# ls&lt;br /&gt;
GreenArrow.csr	GreenArrow.key&lt;br /&gt;
&lt;br /&gt;
root@GreenArrow:/etc/apache2/sites-available/clef# cat GreenArrow.csr&lt;br /&gt;
&lt;br /&gt;
-----BEGIN CERTIFICATE REQUEST-----&lt;br /&gt;
&amp;lt;CSR à renseigner sur Gandi lors de l'achat du certificat&amp;gt;&lt;br /&gt;
-----END CERTIFICATE REQUEST-----&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous continuons donc la procédure pour obtenir le certificat, et attendons donc sa mise en place.&lt;br /&gt;
&lt;br /&gt;
Pour recevoir le mail contenant le lien pour activer le certificat, nous installons les packages suivants :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@GreenArrow:~# apt-get install postfix mailx&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Une fois le certificat récupéré, nous les copions tous dans le bon répertoire, puis nous hashons le tout :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@GreenArrow:/etc/bind# cp certificat.crt /etc/ssl/certs/jjlddelamuerto.space.crt&lt;br /&gt;
root@GreenArrow:/etc/bind# cp serveur.key /etc/ssl/private/jjlddelamuerto.space.key&lt;br /&gt;
root@GreenArrow:/etc/bind# cp GandiStandardSSLCA2.pem /etc/ssl/certs/GandiStandardSSLCA2.pem&lt;br /&gt;
root@GreenArrow:/etc/bind# c_rehash /etc/ssl/certs&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Enfin, la dernière étape consiste en la modification des fichiers 000-jjlddelamuerto.space-ssl.conf et ports.conf :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@GreenArrow:/etc/apache2/sites-available# cat 000-jjlddelamuerto.space-ssl.conf &lt;br /&gt;
     &amp;lt;VirtualHost *:443&amp;gt;&lt;br /&gt;
         ServerName www.jjlddelamuerto.space&lt;br /&gt;
         ServerAlias jjlddelamuerto.space&lt;br /&gt;
         DocumentRoot /var/www/&lt;br /&gt;
         CustomLog /var/log/apache2/secure_access.log combined&lt;br /&gt;
   &lt;br /&gt;
         SSLEngine on&lt;br /&gt;
         SSLCertificateFile /etc/ssl/certs/jjlddelamuerto.space.crt&lt;br /&gt;
         SSLCertificateKeyFile /etc/ssl/private/jjlddelamuerto.space.key&lt;br /&gt;
         SSLCertificateChainFile /etc/ssl/certs/GandiStandardSSLCA2.pem&lt;br /&gt;
         SSLVerifyClient None&lt;br /&gt;
     &amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&lt;br /&gt;
root@GreenArrow:/etc/apache2# cat ports.conf &lt;br /&gt;
Listen 80&lt;br /&gt;
&lt;br /&gt;
&amp;lt;IfModule ssl_module&amp;gt;&lt;br /&gt;
	Listen 443&lt;br /&gt;
&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;IfModule mod_gnutls.c&amp;gt;&lt;br /&gt;
	Listen 443&lt;br /&gt;
&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Un redémarrage du service apache2 est maintenant nécessaire :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@GreenArrow:/etc/apache2# service apache2 stop&lt;br /&gt;
root@GreenArrow:/etc/apache2# service apache2 start&lt;br /&gt;
root@GreenArrow:/etc/apache2# service apache2 reload&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous pouvons voir que notre  site [https://jjlddelamuerto.space] est maintenant sécurisé, un cadenas vert est bien présent.&lt;br /&gt;
&lt;br /&gt;
==== Sécurisation de serveur DNS par DNSSEC ====&lt;br /&gt;
&lt;br /&gt;
Génération des clefs asymétriques:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   dnssec-keygen -a RSASHA1 -b 2048 -r /dev/urandom -f KSK -n ZONE jjlddelamuerto.space&lt;br /&gt;
   dnssec-keygen -a RSASHA1 -b 1024 -r /dev/urandom -n ZONE jjlddelamuerto.space&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On modifie le nom des clefs:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@GreenArrow:/etc/bind/jjlddelamuerto.space.dnssec# ls&lt;br /&gt;
dsset-jjlddelamuerto.space.	  jjlddelamuerto.space-zsk.key&lt;br /&gt;
jjlddelamuerto.space-ksk.key	  jjlddelamuerto.space-zsk.private&lt;br /&gt;
jjlddelamuerto.space-ksk.private&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ensuite nous signons les zones:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@GreenArrow:/etc/bind/jjlddelamuerto.space.dnssec# dnssec-signzone -o jjlddelamuerto.space -k jjlddelamuerto.space-ksk &lt;br /&gt;
../db.jjlddelamuerto.space jjlddelamuerto.space-zsk&lt;br /&gt;
Verifying the zone using the following algorithms: RSASHA1.&lt;br /&gt;
Zone fully signed:&lt;br /&gt;
Algorithm: RSASHA1: KSKs: 1 active, 0 stand-by, 0 revoked&lt;br /&gt;
                    ZSKs: 1 active, 0 stand-by, 0 revoked&lt;br /&gt;
../db.jjlddelamuerto.space.signed&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour finir nous ajoutons la clef KSK sur Gandi avec l'algorithme RSA/SHA1.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:jjlddnssec.png]]&lt;br /&gt;
&lt;br /&gt;
=== Tests d'intrusion ===&lt;br /&gt;
&lt;br /&gt;
==== Intrusion par changement d'adresse MAC ====&lt;br /&gt;
&lt;br /&gt;
Tout d'abord nous modifions le fichier /etc/network/interfaces:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@zebrasoma:/home/pifou# vim /etc/network/interfaces&lt;br /&gt;
auto wlan5&lt;br /&gt;
iface wlan5 inet static&lt;br /&gt;
        address 172.26.79.21&lt;br /&gt;
        netmask 255.255.240.0&lt;br /&gt;
        gateway 172.26.79.254&lt;br /&gt;
        wireless mode-managed&lt;br /&gt;
        wireless-essid Wolverine&lt;br /&gt;
        wireless-key 0123456789&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous vérifions ensuite que nous sommes associés à Wolverine:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@zebrasoma:/home/pifou# iwconfig&lt;br /&gt;
wlan5     IEEE 802.11abg  ESSID:&amp;quot;Wolverine&amp;quot;  &lt;br /&gt;
          Mode:Managed  Frequency:2.462 GHz  Access Point: 44:AD:D9:5F:87:00   &lt;br /&gt;
          Bit Rate=54 Mb/s   Tx-Power=200 dBm   &lt;br /&gt;
          Retry short limit:7   RTS thr:off   Fragment thr:off&lt;br /&gt;
          Encryption key:0123-4567-89&lt;br /&gt;
          Power Management:off&lt;br /&gt;
          Link Quality=50/70  Signal level=-60 dBm  &lt;br /&gt;
          Rx invalid nwid:0  Rx invalid crypt:0  Rx invalid frag:0&lt;br /&gt;
          Tx excessive retries:0  Invalid misc:0   Missed beacon:0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous changeons ensuite l'@ MAC:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@zebrasoma:/home/pifou# ip link set wlan5 address 00:1a:56:a4:4b:ff&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@zebrasoma:/home/pifou# ip a&lt;br /&gt;
3: wlan5: &amp;lt;NO-CARRIER,BROADCAST,MULTICAST,UP&amp;gt; mtu 1500 qdisc mq state DOWN group default qlen 1000&lt;br /&gt;
    link/ether 00:1a:56:a4:4b:ff brd ff:ff:ff:ff:ff:ff&lt;br /&gt;
    inet 172.26.79.21/20 brd 172.26.79.255 scope global wlan5&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Après le changement d'@ MAC, l'association est bien impossible:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@zebrasoma:/home/pifou# ifconfig wlan5 up&lt;br /&gt;
root@zebrasoma:/home/pifou# iwconfig        &lt;br /&gt;
wlan5     IEEE 802.11bgn  ESSID:&amp;quot;Wolverine&amp;quot;  &lt;br /&gt;
          Mode:Managed  Access Point: Not-Associated   Tx-Power=20 dBm   &lt;br /&gt;
          Retry short limit:7   RTS thr:off   Fragment thr:off&lt;br /&gt;
          Encryption key:0123-4567-89&lt;br /&gt;
          Power Management:off&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Crackage de la clef WEP ====&lt;br /&gt;
&lt;br /&gt;
Nous avons fait le crack de la clé WEP sur cracotte08.&lt;br /&gt;
Pour cracker la clef WEP, nous avons tout d'abord utiliser airmon-ng afin de voir le statut des interfaces réseau.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@zebrasoma:/home/pifou# airmon-ng&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Interface	Chipset		Driver&lt;br /&gt;
&lt;br /&gt;
mon0		Ralink RT2870/3070	rt2800usb - [phy1]&lt;br /&gt;
wlan0		Broadcom	wl - [phy0]&lt;br /&gt;
wlan5		Ralink RT2870/3070	rt2800usb - [phy1]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On entre ensuite en mode monitoring sur l'interface wlan5 :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@zebrasoma:/home/pifou# airmon-ng start wlan5&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Found 2 processes that could cause trouble.&lt;br /&gt;
If airodump-ng, aireplay-ng or airtun-ng stops working after&lt;br /&gt;
a short period of time, you may want to kill (some of) them!&lt;br /&gt;
&lt;br /&gt;
PID	Name&lt;br /&gt;
1986	avahi-daemon&lt;br /&gt;
1987	avahi-daemon&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Interface	Chipset		Driver&lt;br /&gt;
&lt;br /&gt;
mon0		Ralink RT2870/3070	rt2800usb - [phy1]&lt;br /&gt;
wlan0		Broadcom	wl - [phy0]&lt;br /&gt;
wlan5		Ralink RT2870/3070	rt2800usb - [phy1]&lt;br /&gt;
				(monitor mode enabled on mon1)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour continuer, nous capturons les paquets transitant afin de collecter les paquets nécessaires au décryptage de la clef WEP. L'option --encrypt wep permet de filtrer uniquement les points d'accès WEP.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@zebrasoma:/home/pifou# airodump-ng --encrypt wep wlan5&lt;br /&gt;
&lt;br /&gt;
 CH  5 ][ Elapsed: 0 s ][ 2016-03-31 18:36                                         &lt;br /&gt;
                                                                                                       &lt;br /&gt;
 BSSID              PWR  Beacons    #Data, #/s  CH  MB   ENC  CIPHER AUTH ESSID&lt;br /&gt;
                                                                                                       &lt;br /&gt;
 44:AD:D9:5F:87:00  -42        3        0    0   3  54e. WEP  WEP         Wolverine                    &lt;br /&gt;
 04:DA:D2:9C:50:50  -59        2       11    0   2  54e. WEP  WEP         cracotte01                   &lt;br /&gt;
 04:DA:D2:9C:50:56  -59        3       19    0   2  54e. WEP  WEP         cracotte07                   &lt;br /&gt;
 04:DA:D2:9C:50:59  -59        2        0    0   2  54e. WEP  WEP         cracotte10                   &lt;br /&gt;
 04:DA:D2:9C:50:57  -59        2       15    0   2  54e. WEP  WEP         cracotte08                   &lt;br /&gt;
 04:DA:D2:9C:50:52  -58        3       85   42   2  54e. WEP  WEP         cracotte03                   &lt;br /&gt;
 04:DA:D2:9C:50:54  -58        1       20    9   2  54e. WEP  WEP         cracotte05                    &lt;br /&gt;
 04:DA:D2:9C:50:55  -60        1        9    4   2  54e. WEP  WEP         cracotte06                    &lt;br /&gt;
 04:DA:D2:9C:50:51  -59        2      134   66   2  54e. WEP  WEP         cracotte02                   &lt;br /&gt;
 04:DA:D2:9C:50:53  -61        6       95   47   2  54e. WEP  WEP         cracotte04                   &lt;br /&gt;
                                                                                                       &lt;br /&gt;
 BSSID              STATION            PWR   Rate    Lost    Frames  Probe                              &lt;br /&gt;
                                                                                                        &lt;br /&gt;
 04:DA:D2:9C:50:50  00:0F:B5:92:23:75  -66   54e-48e    68       10                                     &lt;br /&gt;
 04:DA:D2:9C:50:56  00:0F:B5:92:23:71  -72   36e- 2e   133       19                                     &lt;br /&gt;
 04:DA:D2:9C:50:57  00:0F:B5:92:22:66  -66   54e-36e    89       15                                     &lt;br /&gt;
 04:DA:D2:9C:50:52  00:0F:B5:92:23:6A  -62   54e-48e    23       84                                     &lt;br /&gt;
 04:DA:D2:9C:50:54  00:0F:B5:92:23:74  -66   54e-36e   576       20                                     &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi de récuperer la clef WEP de cracotte03 (son BSSID est lié à une station)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@zebrasoma:/home/pifou# airodump-ng --essid cracotte03 --channel 2 -w crackWEP wlan5&lt;br /&gt;
&lt;br /&gt;
 CH  2 ][ Elapsed: 12 s ][ 2016-03-31 18:42                                         &lt;br /&gt;
                                                                                                       &lt;br /&gt;
 BSSID              PWR RXQ  Beacons    #Data, #/s  CH  MB   ENC  CIPHER AUTH ESSID&lt;br /&gt;
                                                                                                       &lt;br /&gt;
 04:DA:D2:9C:50:52  -57  35       43     1066   87   2  54e. WEP  WEP         cracotte03               &lt;br /&gt;
                                                                                                       &lt;br /&gt;
 BSSID              STATION            PWR   Rate    Lost    Frames  Probe                             &lt;br /&gt;
                                                                                                                                   &lt;br /&gt;
 04:DA:D2:9C:50:52  00:0F:B5:92:23:6A  -64   36e-48e  1232     1067                                     &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Enfin, nous lançons le crack de la clef à l'aide de aircrack-ng :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@zebrasoma:/home/pifou# aircrack-ng crackWEP-02.cap&lt;br /&gt;
                           Aircrack-ng 1.2 beta3&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                 [00:00:04] Tested 112801 keys (got 3050 IVs)&lt;br /&gt;
&lt;br /&gt;
   KB    depth   byte(vote)&lt;br /&gt;
    0    6/ 10   CD(5120) 15(4864) 6D(4864) 8C(4864) A7(4864) &lt;br /&gt;
    1   46/  1   E9(4352) 04(4096) 0E(4096) 0F(4096) 16(4096) &lt;br /&gt;
    2   14/ 42   C8(4864) 10(4608) 11(4608) 1D(4608) 58(4608) &lt;br /&gt;
    3   19/  3   CF(4864) 0A(4608) 5E(4608) 8E(4608) 90(4608) &lt;br /&gt;
    4    2/ 16   08(5632) 89(5376) 96(5376) B4(5376) F7(5376) &lt;br /&gt;
&lt;br /&gt;
Failed. Next try with 5000 IVs.&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Il est nécessaire d'être proche du point d’accès (sinon le débit est trop faible, ce qui rend l'opération longue), ainsi que de capturer un minimum de 10 000 paquets.&lt;br /&gt;
&lt;br /&gt;
Au final, nous arrivons bien à récupérer la clef WEP : &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
                               Aircrack-ng 1.2 beta3&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                 [00:04:10] Tested 799 keys (got 42913 IVs)&lt;br /&gt;
&lt;br /&gt;
   KB    depth   byte(vote)&lt;br /&gt;
    0    0/  1   EE(56320) B4(51712) 9D(50944) 4E(50688) 28(50432) &lt;br /&gt;
    1    1/  2   D9(55552) 3D(50176) 68(49664) 08(49408) 49(49152) &lt;br /&gt;
    2    1/  5   A2(53504) 5B(52480) 93(52480) 73(52224) 10(50432) &lt;br /&gt;
    3    1/  3   30(53248) 81(51456) 5B(49920) 6E(49920) 1E(49664) &lt;br /&gt;
    4    9/  4   9D(50176) 31(49408) 18(49152) 72(49152) E1(49152) &lt;br /&gt;
&lt;br /&gt;
             KEY FOUND! [ EE:EE:EE:EE:EE:EE:EE:EE:EE:EE:EE:E4:44 ] &lt;br /&gt;
	Decrypted correctly: 100%&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Cassage de mot de passe WPA-PSK par force brute ====&lt;br /&gt;
Nous refaisons les mêmes actions que pour le crackage de clef WEP.&lt;br /&gt;
Cette fois nous essayons de cracker la clef WPA sur cracotte03.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@zebrasoma:/home/pifou# airodump-ng --encrypt wpa wlan5&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@zebrasoma:/home/pifou# airodump-ng --essid cracotte03 --channel 13 -w crackWPA wlan5&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Une fois le handshake récupéré:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@zebrasoma:/home/pifou# aircrack-ng -w dico.txt crackWPA-01.cap&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Nous avons lancé ceci sur le eeePC qui a une vitesse de traitement 5 fois inférieure à celle d'une zabeth environ (environ 5h de traitement). Puis nous obtenons le résultat suivant:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
                                   Aircrack-ng 1.2 beta3&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                   [04:32:42] 12399908 keys tested (759.63 k/s)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                           KEY FOUND! [ 12399903 ]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
      Master Key     : 33 2B 69 DD 95 0A 5A E0 01 22 7E FF 98 DA 99 87 &lt;br /&gt;
                       40 7A CB CC 8A E5 32 9F FE 4E 5C 44 91 38 13 93 &lt;br /&gt;
&lt;br /&gt;
      Transient Key  : 70 EE 27 96 5B 34 B5 4F 06 A1 F2 B6 A7 16 1E 21 &lt;br /&gt;
                       7A 0B BD F4 13 67 5B 4C ED 30 A9 0D 91 E3 F9 7F &lt;br /&gt;
                       88 E6 12 68 9C 77 4B 48 EB 5E 6A 5A DD 1D D9 08 &lt;br /&gt;
                       36 40 94 7D B4 05 80 B2 60 FA 84 81 50 CE DC 87 &lt;br /&gt;
&lt;br /&gt;
      EAPOL HMAC     : 83 03 24 AC 39 AB 67 E7 7B C4 40 E8 6B 6D 7D 47 &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Réalisations ===&lt;br /&gt;
==== Sécurisation des données ====&lt;br /&gt;
&lt;br /&gt;
Nous créons d'abord 3 nouvelles partitions, que nous associons à notre VM en modifiant le fichier GreenArrow.cfg :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
lvcreate -L 1G -n /dev/virtual/GreenArrow-1 -v&lt;br /&gt;
lvcreate -L 1G -n /dev/virtual/GreenArrow-2 -v&lt;br /&gt;
lvcreate -L 1G -n /dev/virtual/GreenArrow-3 -v&lt;br /&gt;
&lt;br /&gt;
'phy:/dev/virtual/GreenArrow-1,xvdd,w',&lt;br /&gt;
'phy:/dev/virtual/GreenArrow-2,xvde,w',&lt;br /&gt;
'phy:/dev/virtual/GreenArrow-3,xvdf,w',&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Il faut ensuite installer mdadm :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt-get install mdadm&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous créons le volume /dev/md0 qui représente le RAID5 de partitions&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mdadm --create /dev/md0 --level=5 --assume-clean --raid-devices=3 /dev/xvdd /dev/xvde /dev/xvdf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour avoir le détail de la configuration actuelle:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@GreenArrow:~# mdadm --detail /dev/md0&lt;br /&gt;
/dev/md0:&lt;br /&gt;
        Version : 1.2&lt;br /&gt;
  Creation Time : Mon oct 13 11:34:23 2017&lt;br /&gt;
     Raid Level : raid5&lt;br /&gt;
     Array Size : 2095104 (2046.34 MiB 2145.39 MB)&lt;br /&gt;
  Used Dev Size : 1047552 (1023.17 MiB 1072.69 MB)&lt;br /&gt;
   Raid Devices : 3&lt;br /&gt;
  Total Devices : 3&lt;br /&gt;
    Persistence : Superblock is persistent&lt;br /&gt;
&lt;br /&gt;
    Update Time : Mon oct 13 11:34:23 2017&lt;br /&gt;
          State : clean &lt;br /&gt;
 Active Devices : 3&lt;br /&gt;
Working Devices : 3&lt;br /&gt;
 Failed Devices : 0&lt;br /&gt;
  Spare Devices : 0&lt;br /&gt;
&lt;br /&gt;
         Layout : left-symmetric&lt;br /&gt;
     Chunk Size : 512K&lt;br /&gt;
&lt;br /&gt;
           Name : IMA5-BANANE:0  (local to host GreenArrow)&lt;br /&gt;
           UUID : f70ca72e:e8adc585:ec023dca:21061341&lt;br /&gt;
         Events : 0&lt;br /&gt;
&lt;br /&gt;
    Number   Major   Minor   RaidDevice State&lt;br /&gt;
       0     202       48        0      active sync   /dev/xvdd&lt;br /&gt;
       1     202       64        1      active sync   /dev/xvde&lt;br /&gt;
       2     202       80        2      active sync   /dev/xvdf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Puis nous sauvons cette dernière afin de conserver md0:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mdadm --detail --scan &amp;gt;&amp;gt; /etc/mdadm/mdadm.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Puis:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkfs /dev/md0&lt;br /&gt;
mkdir /datamd0&lt;br /&gt;
mount /dev/md0 /datamd0/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ensuite il faut éditer le fichier /etc/fstab en rajoutant la ligne suivante à la fin du fichier afin d'être surs que la partition soit encore montée après le reboot:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/dev/md0 /datamd0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous créons un fichier texte sur le raid5:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
vim testraid5.txt&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous mettons en commentaire la 2ème partition dans le fichier de conf, puis redémarrons la machine:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mdadm --detail /dev/md0&lt;br /&gt;
/dev/md0:&lt;br /&gt;
        Version : 1.2&lt;br /&gt;
  Creation Time : Mon oct 13 11:34:23 2017&lt;br /&gt;
     Raid Level : raid5&lt;br /&gt;
     Array Size : 2095104 (2046.34 MiB 2145.39 MB)&lt;br /&gt;
  Used Dev Size : 1047552 (1023.17 MiB 1072.69 MB)&lt;br /&gt;
   Raid Devices : 3&lt;br /&gt;
  Total Devices : 2&lt;br /&gt;
    Persistence : Superblock is persistent&lt;br /&gt;
&lt;br /&gt;
    Update Time : Mon oct 13 11:45:01 2017&lt;br /&gt;
          State : clean, degraded &lt;br /&gt;
 Active Devices : 2&lt;br /&gt;
Working Devices : 2&lt;br /&gt;
 Failed Devices : 0&lt;br /&gt;
  Spare Devices : 0&lt;br /&gt;
&lt;br /&gt;
         Layout : left-symmetric&lt;br /&gt;
     Chunk Size : 512K&lt;br /&gt;
&lt;br /&gt;
           Name : GreenArrow:0  (local to host GreenArrow)&lt;br /&gt;
           UUID : f70ca72e:e8adc585:ec023dca:21061341&lt;br /&gt;
         Events : 4&lt;br /&gt;
&lt;br /&gt;
    Number   Major   Minor   RaidDevice State&lt;br /&gt;
       0     202       48        0      active sync   /dev/xvdd&lt;br /&gt;
       2       0        0        2      removed&lt;br /&gt;
       2     202       80        2      active sync   /dev/xvdf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On voit bien qu'une partition a été supprimée mais que le fichier créé auparavant est toujours présent:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ls /datamd0/&lt;br /&gt;
testraid5.txt&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour rajouter la partition, on la decommente dans le fichier de configuration et on procede au rajout de cette partition au raid de la facon suivante:&lt;br /&gt;
&lt;br /&gt;
 mdadm --add /dev/md0 /dev/xvde&lt;br /&gt;
&lt;br /&gt;
Pour le test de réparation, afin de bien voir l'avancement de la reconstruction, nous avons procédé comme dans l'exemple du cours:&lt;br /&gt;
Suppression de la partition xvdf:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@IMA5-BANANE:~# mdadm --set-faulty /dev/md0 /dev/xvdf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@IMA5-BANANE:~# mdadm --remove /dev/md0 /dev/xvdf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
La partition est bien supprimée:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Personalities : [raid6] [raid5] [raid4] &lt;br /&gt;
md0 : active raid5 xvdd[0] xvde[1]&lt;br /&gt;
      2095104 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/2] [UU_]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
On remet la partition:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@IMA5-BANANE:~# mdadm --add /dev/md0 /dev/xvdf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
On peut ensuite constater l'avancement de la reconstruction en lançant la même commande assez régulièrement:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@IMA5-BANANE:~# cat /proc/mdstat &lt;br /&gt;
Personalities : [raid6] [raid5] [raid4] &lt;br /&gt;
md0 : active raid5 xvdf[3] xvdd[0] xvde[1]&lt;br /&gt;
      2095104 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/2] [UU_]&lt;br /&gt;
      [===&amp;gt;.................]  recovery = 18.2% (191112/1047552) finish=0.4min speed=31852K/sec&lt;br /&gt;
      &lt;br /&gt;
unused devices: &amp;lt;none&amp;gt;&lt;br /&gt;
root@IMA5-BANANE:~# cat /proc/mdstat &lt;br /&gt;
Personalities : [raid6] [raid5] [raid4] &lt;br /&gt;
md0 : active raid5 xvdf[3] xvdd[0] xvde[1]&lt;br /&gt;
      2095104 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/2] [UU_]&lt;br /&gt;
      [====&amp;gt;................]  recovery = 20.0% (210764/1047552) finish=0.4min speed=30109K/sec&lt;br /&gt;
      &lt;br /&gt;
unused devices: &amp;lt;none&amp;gt;&lt;br /&gt;
root@IMA5-BANANE:~# cat /proc/mdstat &lt;br /&gt;
Personalities : [raid6] [raid5] [raid4] &lt;br /&gt;
md0 : active raid5 xvdf[3] xvdd[0] xvde[1]&lt;br /&gt;
      2095104 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/2] [UU_]&lt;br /&gt;
      [====&amp;gt;................]  recovery = 21.8% (229836/1047552) finish=0.4min speed=32833K/sec&lt;br /&gt;
      &lt;br /&gt;
unused devices: &amp;lt;none&amp;gt;&lt;br /&gt;
root@IMA5-BANANE:~# cat /proc/mdstat &lt;br /&gt;
Personalities : [raid6] [raid5] [raid4] &lt;br /&gt;
md0 : active raid5 xvdf[3] xvdd[0] xvde[1]&lt;br /&gt;
      2095104 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/2] [UU_]&lt;br /&gt;
      [===========&amp;gt;.........]  recovery = 59.6% (626140/1047552) finish=0.2min speed=29816K/sec&lt;br /&gt;
      &lt;br /&gt;
unused devices: &amp;lt;none&amp;gt;&lt;br /&gt;
root@IMA5-BANANE:~# cat /proc/mdstat &lt;br /&gt;
Personalities : [raid6] [raid5] [raid4] &lt;br /&gt;
md0 : active raid5 xvdf[3] xvdd[0] xvde[1]&lt;br /&gt;
      2095104 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/2] [UU_]&lt;br /&gt;
      [==================&amp;gt;..]  recovery = 94.3% (989688/1047552) finish=0.0min speed=30124K/sec&lt;br /&gt;
      &lt;br /&gt;
unused devices: &amp;lt;none&amp;gt;&lt;br /&gt;
root@IMA5-BANANE:~# [  446.720069] md: md0: recovery done.&lt;br /&gt;
cat /proc/mdstat &lt;br /&gt;
Personalities : [raid6] [raid5] [raid4] &lt;br /&gt;
md0 : active raid5 xvdf[3] xvdd[0] xvde[1]&lt;br /&gt;
      2095104 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/3] [UUU]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Cryptage de données ====&lt;br /&gt;
&lt;br /&gt;
Tout d'abord, nous vérifions grâce à Gparted que la carte SD fournie comporte une seule partition.&lt;br /&gt;
Une fois ce test passé, nous regardons grâce à dmesg où est localisé la carte SD :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@zebrasoma:/# dmesg&lt;br /&gt;
[...]&lt;br /&gt;
[1126726.403767] mmcblk1: mmc1:59b4 NCard 14.7 GiB&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Notre carte SD se situe donc sur /dev/mmcblk1.&lt;br /&gt;
Nous faisons donc un chiffrage AES avec un hashage SHA256 de la carte SD :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@zebrasoma:/# cryptsetup luksFormat -c aes -h sha256 /dev/mmcblk1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous devons alors renseigner un mot de passe pour crypter la clef.&lt;br /&gt;
Ensuite, nous ouvrons la partition Luks, puis nous formatons la carte :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@zebrasoma:/# cryptsetup luksOpen /dev/sdb1 crypt_sd&lt;br /&gt;
root@zebrasoma:/# mkfs.ext4 /dev/mapper/crypt_sd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous montons la partition, puis créons un fichier sur la carte :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@zebrasoma:/# mount /dev/mapper/crypt_sd /mnt&lt;br /&gt;
root@zebrasoma:/# vi /mnt/test.txt #on marque un texte dans le fichier&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Enfin, nous démontons la carte SD et fermons la partition Luks :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@zebrasoma:/# umount /mnt&lt;br /&gt;
root@zebrasoma:/# cryptsetup luksClose crypt_sd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous essayons ensuite d'accéder à la carte SD. En renseignant un mauvais mot de passe, une erreur apparaît.&lt;br /&gt;
Cependant, une fois le bon mot de passe renseigné, tout re-devient possible.&lt;br /&gt;
&lt;br /&gt;
==== Sécurisation Wifi par WPA2-EAP ====&lt;br /&gt;
Tout d'abord, nous installons FreeRadius sur notre machine virtuelle.&amp;lt;br /&amp;gt;&lt;br /&gt;
Dans le fichier '''users''', nous renseignons le login et le mot de passe pour se connecter à la borne Wifi : &amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
GreenArrow Cleartext-Password:=&amp;quot;glopglop&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Dans le fichier '''clients.conf''', nous ajoutons la configuration de la borne E306 et E304 :&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
client E306 {&lt;br /&gt;
	ipaddr		= 10.60.1.2&lt;br /&gt;
	secret		= password&lt;br /&gt;
}&lt;br /&gt;
client E304 {&lt;br /&gt;
	ipaddr		= 10.60.1.4&lt;br /&gt;
	secret		= password&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ensuite, on passe à la configuration de la borne Wifi. On se connecte en telnet via '''telnet 10.60.1.2''', puis nous rentrons en mode configuration : &amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
aaa authentication login eap_greenarrow group radius_greenarrow&lt;br /&gt;
radius-server host 193.48.57.162 auth-port 1812 acct-port 1813 key glopglop&lt;br /&gt;
aaa group server radius radius_greenarrow&lt;br /&gt;
server 193.48.57.162 auth-port 1812 acct-port 1813&lt;br /&gt;
&lt;br /&gt;
dot11 ssid SSID_GREENARROW&lt;br /&gt;
vlan 3&lt;br /&gt;
authentication open eap eap_greenarrow&lt;br /&gt;
authentication network-eap eap_greenarrow&lt;br /&gt;
authentication key-management wpa&lt;br /&gt;
mbssid guest-mode&lt;br /&gt;
&lt;br /&gt;
exit&lt;br /&gt;
&lt;br /&gt;
interface Dot11Radio0&lt;br /&gt;
encryption vlan 3 mode ciphers aes-ccm tkip&lt;br /&gt;
ssid SSID_GREENARROW&lt;br /&gt;
&lt;br /&gt;
interface Dot11Radio0.3&lt;br /&gt;
encapsulation dot1Q 3&lt;br /&gt;
no ip route-cache&lt;br /&gt;
bridge-group 3&lt;br /&gt;
bridge-group 3 subscriber-loop-control&lt;br /&gt;
bridge-group 3 spanning-disabled&lt;br /&gt;
bridge-group 3 block-unknown-source&lt;br /&gt;
no bridge-group 3 source-learning&lt;br /&gt;
no bridge-group 3 unicast-flooding &lt;br /&gt;
&lt;br /&gt;
interface GigabitEthernet0.3&lt;br /&gt;
encapsulation dot1Q 3&lt;br /&gt;
bridge-group 3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Une fois ces modifications effectuées, nous configurons l'interface wlan0 de l'eeePC pour pouvoir se connecter au Wifi à l'aide de '''ifup wlan0''' : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
auto wlan0&lt;br /&gt;
iface wlan0 inet static&lt;br /&gt;
  address 10.60.3.2&lt;br /&gt;
  netmask 255.255.255.0&lt;br /&gt;
  gateway 10.60.3.1&lt;br /&gt;
  wpa-ssid SSID_GREENARROW&lt;br /&gt;
  wpa-key-mgmt WPA-EAP&lt;br /&gt;
  wpa-identity GreenArrow&lt;br /&gt;
  wpa-password glopglop&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On lance le serveur FreeRadius via freeradius -X (mode debug).&lt;br /&gt;
Sur smartphone, nous arrivons à détecter notre SSID (SSID_GREENARROW). Nous pouvons également ping notre eeePC depuis la machine virtuelle, tout comme nous arrivons à pinger des Vm d'autres groupes depuis notre eeePC.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@GreenArrow:/etc/freeradius# ping 10.60.3.2&lt;br /&gt;
PING 10.60.3.2 (10.60.3.2) 56(84) bytes of data.&lt;br /&gt;
64 bytes from 10.60.3.2: icmp_seq=1 ttl=255 time=1.30 ms&lt;br /&gt;
64 bytes from 10.60.3.2: icmp_seq=2 ttl=255 time=1.96 ms&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Serveur DCHP ====&lt;br /&gt;
&lt;br /&gt;
Pour cette partie, nous avons d'abord installer le paquet isc-dhcp-server.&lt;br /&gt;
Ensuite, nous avons modifier le fichier dhcpd.conf :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
option domain-name &amp;quot;jjlddelamuerto.space&amp;quot;;&lt;br /&gt;
option domain-name-servers 193.48.57.162;&lt;br /&gt;
&lt;br /&gt;
subnet 10.60.3.0 netmask 255.255.255.0 {&lt;br /&gt;
      range 10.60.3.10 10.60.3.40;&lt;br /&gt;
      option routers 10.60.3.1;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous modifions ensuite isc-dhcp-server pour rajouter l'interface wlan0 : &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
INTERFACES=&amp;quot;wlan0&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous pouvons maintenant nous connecter sur le reseau Wifi via smartphone, le serveur DHCP fonctionne correctement.&lt;br /&gt;
[[Fichier:Connexioniphone.JPG|thumb|center|Connexion via smartphone]]&lt;br /&gt;
&lt;br /&gt;
==== Configuration et utilisation du PCBX ====&lt;br /&gt;
&lt;br /&gt;
Nous avons modifiés le fichier sip.conf :&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;[general]&lt;br /&gt;
hasvoicemail=yes&lt;br /&gt;
hassip=yes&lt;br /&gt;
hasiax=yes&lt;br /&gt;
callwaiting=yes&lt;br /&gt;
threewaycalling=yes&lt;br /&gt;
callwaitingcallerid=yes&lt;br /&gt;
transfer=yes&lt;br /&gt;
canpark=yes&lt;br /&gt;
cancallforward=yes&lt;br /&gt;
callreturn=yes&lt;br /&gt;
callgroup=1&lt;br /&gt;
pickupgroup=1&lt;br /&gt;
nat=yes&lt;br /&gt;
&lt;br /&gt;
[6001]&lt;br /&gt;
type=friend&lt;br /&gt;
host=dynamic&lt;br /&gt;
dtmfmode=rfc2833&lt;br /&gt;
disallow=all&lt;br /&gt;
allow=ulaw&lt;br /&gt;
fullname=JulienJoignaux&lt;br /&gt;
username=jjoignaux&lt;br /&gt;
secret=secret&lt;br /&gt;
context=work&lt;br /&gt;
&lt;br /&gt;
[6002]&lt;br /&gt;
type=friend&lt;br /&gt;
host=dynamic&lt;br /&gt;
dtmfmode=rfc2833&lt;br /&gt;
disallow=all&lt;br /&gt;
allow=ulaw&lt;br /&gt;
fullname=LoicDelecroix&lt;br /&gt;
username=ldelecro&lt;br /&gt;
secret=secret&lt;br /&gt;
context=work&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Puis nous modifions le fichier extensions.conf&lt;br /&gt;
&amp;lt;pre&amp;gt;[work]&lt;br /&gt;
exten=&amp;gt;_6XXX,1,Dial(SIP/${EXTEN},20)&lt;br /&gt;
exten =&amp;gt; _6XXX,2,Hangup()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:voipjjld.jpg|thumb|center|Appel entre 2 smartphones]]&lt;br /&gt;
&lt;br /&gt;
== Références ==&lt;br /&gt;
&lt;br /&gt;
* Crackage de la clef WEP : [http://wiki.backtrack-fr.net/index.php/Casser_une_cl%C3%A9_wep/wpa_avec_la_suite_Aircrack-ng]&lt;br /&gt;
* Cassage de mot de passe WPA-PSK : [http://www.crack-wifi.com/tutoriel-crack-wpa.php]&lt;br /&gt;
* Cryptage de données : [https://doc.ubuntu-fr.org/cryptsetup]&lt;br /&gt;
* DHCP : [https://doc.ubuntu-fr.org/isc-dhcp-server]&lt;br /&gt;
* Asterisk : [http://denisrosenkranz.com/tuto-installer-et-configurer-asterisk-sous-debian-6-et-ubuntu/]&lt;/div&gt;</summary>
		<author><name>Hdelatte</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=Cahier_2016_groupe_n%C2%B02&amp;diff=46348</id>
		<title>Cahier 2016 groupe n°2</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=Cahier_2016_groupe_n%C2%B02&amp;diff=46348"/>
				<updated>2017-11-17T13:52:22Z</updated>
		
		<summary type="html">&lt;p&gt;Hdelatte : /* Sécurisation des données */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Tâche particulière ==&lt;br /&gt;
&lt;br /&gt;
Câblage de la fibre: &lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Prise de connaissance du sujet de PRA et le choix des tâches particulières. Nous avons également commencer à essayer d'identifier les câbles de fibres déjà existants.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Toujours sur la tâche particulière. Identification de tous les câbles déjà tirés. Test de link de chaque câble. Nous avons également commencé à passer les câbles restants.&lt;br /&gt;
Tous les câbles nécessaires ont été tirés entre les deux salles, tous les link sont up. Nous avons identifié chaque câble par un scotch de couleur différente. Nous avons également percé la gouttière de la E304 pour laisser passer un raccord de fibre proprement. &lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Nous avons pu identifier les câbles déjà présents. Il y a donc 2 câbles déjà tirés entre les 2 piles, 2 câbles qui partent de la E306 jusqu'au boîtier ainsi qu'un câble par salle quid descend dans le local technique. &lt;br /&gt;
* Nous allons donc prolonger les 2 câbles s'arrêtant dans le boîtier et tirer 2 nouveaux câbles entre les deux piles: nous aurons donc 6 fils au total. &lt;br /&gt;
* 2 Grands câbles de 30m ~ -&amp;gt; Estimation de 26m entre les 2 piles.&lt;br /&gt;
* 2 petits câbles de 15m ~ -&amp;gt; Estimation de 13m du boîtier à la pile&lt;br /&gt;
* Retirer le câble ethernet qui était tiré entre les 2 piles.&lt;br /&gt;
* 7 heures passées au total sur la tâche particulière&lt;br /&gt;
[[Fichier:im1.JPG|300px|thumb|left|Fibre passant entre les 2 salles]]&lt;br /&gt;
[[Fichier:im2.JPG|300px|thumb|right|Câbles dans le faux plafond]]&lt;br /&gt;
[[Fichier:im4.JPG|300px|thumb|left|Guide câbles pour le faux plafond]]&lt;br /&gt;
[[Fichier:im5.JPG|300px|thumb|right|Boîtiers contenant les raccords de fibres]]&lt;br /&gt;
[[Fichier:im6.JPG|300px|thumb|left|Les fibres en E304 disponibles]]&lt;br /&gt;
[[Fichier:im7.JPG|300px|thumb|right|Trou dans le cache laissant passer la fibre]] &amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Travail commun ==&lt;br /&gt;
&lt;br /&gt;
* Installation de la machine virtuelle XEN&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
xen-create-image --hostname=GreenArrow --ip=193.48.57.162 --netmask=255.255.255.240 --gateway=193.48.57.172&lt;br /&gt;
  --dir=/usr/local/xen --mirror=http://debian.polytech-lille.fr/debian/ --dist=jessie&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Modification du fichier de configuration de la machine virtuelle pour faire en sorte que les répertoires var et home de la machine virtuelle soient sur des partitions LVM de l'hôte:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
lvcreate -L 10G -n /dev/virtual/ima5-GreenArrow-home -v&lt;br /&gt;
lvcreate -L 10G -n /dev/virtual/ima5-GreenArrow-var -v&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
disk        = [&lt;br /&gt;
                  'file:/usr/local/xen/domains/GreenArrow/disk.img,xvda2,w',&lt;br /&gt;
                  'file:/usr/local/xen/domains/GreenArrow/swap.img,xvda1,w',&lt;br /&gt;
                  'phy:/dev/virtual/ima5-GreenArrow-home,xvdc,w',&lt;br /&gt;
                  'phy:/dev/virtual/ima5-GreenArrow-var,xvdb,w',&lt;br /&gt;
              ]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Commandes de base pour démarrer la VM proprement:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh root@cordouan.insecserv.deule.net&lt;br /&gt;
xl create /etc/xen/GreenArrow.cfg&lt;br /&gt;
ssh username@weppes&lt;br /&gt;
ssh root@193.48.57.162&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Achat du nom de domaine [http://jjlddelamuerto.space] sur Gandi pour 1.19€ TTC&lt;br /&gt;
&lt;br /&gt;
=== Services Internet ===&lt;br /&gt;
&lt;br /&gt;
==== Serveur SSH ====&lt;br /&gt;
&lt;br /&gt;
Sur notre machine virtuelle nous avons configuré le fichier sshd_config (changement de la ligne PubkeyAuthentication) :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@GreenArrow:~# vim /etc/ssh/sshd_config&lt;br /&gt;
&lt;br /&gt;
RSAAuthentication yes&lt;br /&gt;
PubkeyAuthentication yes&lt;br /&gt;
#AuthorizedKeysFile     %h/.ssh/authorized_keys&lt;br /&gt;
&lt;br /&gt;
root@GreenArrow:~# service ssh restart&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite réussi à nous connecter en SSH sur notre VM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
jjoignau@weppes:~$ ssh root@193.48.57.162&lt;br /&gt;
root@193.48.57.162's password: &lt;br /&gt;
&lt;br /&gt;
The programs included with the Debian GNU/Linux system are free software;&lt;br /&gt;
the exact distribution terms for each program are described in the&lt;br /&gt;
individual files in /usr/share/doc/*/copyright.&lt;br /&gt;
&lt;br /&gt;
Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent&lt;br /&gt;
permitted by applicable law.&lt;br /&gt;
Last login: Mon Nov  7 10:06:49 2016&lt;br /&gt;
root@GreenArrow:~# exit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Serveur DNS ====&lt;br /&gt;
&lt;br /&gt;
Tout d'abord, nous modifions le fichier '''named.conf.local''' pour créer les zones nécessaires :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@GreenArrow:/etc/bind# vim /etc/bind/named.conf.local&lt;br /&gt;
zone &amp;quot;jjlddelamuerto.space&amp;quot; IN {&lt;br /&gt;
             type master;&lt;br /&gt;
             file &amp;quot;/etc/bind/db.jjlddelamuerto.space&amp;quot;;&lt;br /&gt;
        };&lt;br /&gt;
&lt;br /&gt;
zone &amp;quot;57.48.193.in-addr.arpa&amp;quot; IN {&lt;br /&gt;
             type master;&lt;br /&gt;
             file &amp;quot;/etc/bind/db.57.48.193.in-addr.arpa&amp;quot;;&lt;br /&gt;
        };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous créons ensuite les fichiers '''db.jjlddelamuerto.space''' et '''db.57.48.193.in-addr.arpa''' :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$TTL    604800&lt;br /&gt;
@       IN      SOA     ns.jjlddelamuerto.space. root.jjlddelamuerto.space. (&lt;br /&gt;
                       2016113007       ; Serial&lt;br /&gt;
                         604800         ; Refresh&lt;br /&gt;
                          86400         ; Retry&lt;br /&gt;
                        2419200         ; Expire&lt;br /&gt;
                         604800 )       ; Negative Cache TTL&lt;br /&gt;
;&lt;br /&gt;
@       IN      NS      ns.jjlddelamuerto.space. &lt;br /&gt;
@       IN      NS      ns6.gandi.net.&lt;br /&gt;
ns      IN      A       193.48.57.162&lt;br /&gt;
www     IN      A       193.48.57.162&lt;br /&gt;
@       IN      A       193.48.57.162&lt;br /&gt;
ns      IN      AAAA       2001:660:4401:60ba:216:3eff:fe80:efa8&lt;br /&gt;
www     IN      AAAA       2001:660:4401:60ba:216:3eff:fe80:efa8&lt;br /&gt;
@       IN      AAAA       2001:660:4401:60ba:216:3eff:fe80:efa8&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$TTL    604800&lt;br /&gt;
@       IN      SOA     jjlddelamuerto.space. root.jjlddelamuerto.space. (&lt;br /&gt;
                        2016113007      ; Serial&lt;br /&gt;
                         604800         ; Refresh&lt;br /&gt;
                          86400         ; Retry&lt;br /&gt;
                        2419200         ; Expire&lt;br /&gt;
                         604800 )       ; Negative Cache TTL&lt;br /&gt;
;&lt;br /&gt;
57.48.193.in-addr.arpa.         IN      NS      ns.jjlddelamuerto.space.&lt;br /&gt;
57.48.193.in-addr.arpa.         IN      NS      ns2.gandi.net.&lt;br /&gt;
&lt;br /&gt;
162                             IN      PTR     jjlddelamuerto.space.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous modifions ensuite le fichier /etc/resolv.conf afin de passer par notre serveur :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@GreenArrow:/etc/bind# vim /etc/resolv.conf&lt;br /&gt;
search jjlddelamuerto.space&lt;br /&gt;
nameserver 193.48.57.162&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Enfin, nous vérifions notre configuration :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@GreenArrow:/etc/bind# host www.jjlddelamuerto.space&lt;br /&gt;
www.jjlddelamuerto.space has address 193.48.57.162&lt;br /&gt;
www.jjlddelamuerto.space has IPv6 address 2001:660:4401:60ba:216:3eff:fe80:efa8&lt;br /&gt;
&lt;br /&gt;
root@GreenArrow:/etc/bind# host -tany jjlddelamuerto.space&lt;br /&gt;
jjlddelamuerto.space has IPv6 address 2001:660:4401:60ba:216:3eff:fe80:efa8&lt;br /&gt;
jjlddelamuerto.space has address 193.48.57.162&lt;br /&gt;
jjlddelamuerto.space has SOA record ns.jjlddelamuerto.space. root.jjlddelamuerto.space. 2016113007 604800 86400 2419200 604800&lt;br /&gt;
jjlddelamuerto.space name server ns6.gandi.net.&lt;br /&gt;
jjlddelamuerto.space name server ns.jjlddelamuerto.space.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Sécurisation de site web par certificat ====&lt;br /&gt;
&lt;br /&gt;
Premièrement, sur Gandi nous lançons l'étape d'achat d'un certificat SSL.&lt;br /&gt;
Puis, sur la VM nous générons le CSR grâce à cette commande:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@GreenArrow:/etc/apache2/sites-available/clef# openssl req -nodes -newkey rsa:2048 -sha256 -keyout GreenArrow.key -out GreenArrow.csr&lt;br /&gt;
Generating a 2048 bit RSA private key&lt;br /&gt;
&lt;br /&gt;
If you enter '.', the field will be left blank.&lt;br /&gt;
-----&lt;br /&gt;
Country Name (2 letter code) [AU]:FR&lt;br /&gt;
State or Province Name (full name) [Some-State]:Nord&lt;br /&gt;
Locality Name (eg, city) []:Lille&lt;br /&gt;
Organization Name (eg, company) [Internet Widgits Pty Ltd]:PolytechLille&lt;br /&gt;
Organizational Unit Name (eg, section) []:IMA&lt;br /&gt;
Common Name (e.g. server FQDN or YOUR name) []:jjlddelamuerto.space&lt;br /&gt;
Email Address []:&lt;br /&gt;
A challenge password []:&lt;br /&gt;
An optional company name []:&lt;br /&gt;
&lt;br /&gt;
root@GreenArrow:/etc/apache2/sites-available/clef# ls&lt;br /&gt;
GreenArrow.csr	GreenArrow.key&lt;br /&gt;
&lt;br /&gt;
root@GreenArrow:/etc/apache2/sites-available/clef# cat GreenArrow.csr&lt;br /&gt;
&lt;br /&gt;
-----BEGIN CERTIFICATE REQUEST-----&lt;br /&gt;
&amp;lt;CSR à renseigner sur Gandi lors de l'achat du certificat&amp;gt;&lt;br /&gt;
-----END CERTIFICATE REQUEST-----&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous continuons donc la procédure pour obtenir le certificat, et attendons donc sa mise en place.&lt;br /&gt;
&lt;br /&gt;
Pour recevoir le mail contenant le lien pour activer le certificat, nous installons les packages suivants :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@GreenArrow:~# apt-get install postfix mailx&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Une fois le certificat récupéré, nous les copions tous dans le bon répertoire, puis nous hashons le tout :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@GreenArrow:/etc/bind# cp certificat.crt /etc/ssl/certs/jjlddelamuerto.space.crt&lt;br /&gt;
root@GreenArrow:/etc/bind# cp serveur.key /etc/ssl/private/jjlddelamuerto.space.key&lt;br /&gt;
root@GreenArrow:/etc/bind# cp GandiStandardSSLCA2.pem /etc/ssl/certs/GandiStandardSSLCA2.pem&lt;br /&gt;
root@GreenArrow:/etc/bind# c_rehash /etc/ssl/certs&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Enfin, la dernière étape consiste en la modification des fichiers 000-jjlddelamuerto.space-ssl.conf et ports.conf :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@GreenArrow:/etc/apache2/sites-available# cat 000-jjlddelamuerto.space-ssl.conf &lt;br /&gt;
     &amp;lt;VirtualHost *:443&amp;gt;&lt;br /&gt;
         ServerName www.jjlddelamuerto.space&lt;br /&gt;
         ServerAlias jjlddelamuerto.space&lt;br /&gt;
         DocumentRoot /var/www/&lt;br /&gt;
         CustomLog /var/log/apache2/secure_access.log combined&lt;br /&gt;
   &lt;br /&gt;
         SSLEngine on&lt;br /&gt;
         SSLCertificateFile /etc/ssl/certs/jjlddelamuerto.space.crt&lt;br /&gt;
         SSLCertificateKeyFile /etc/ssl/private/jjlddelamuerto.space.key&lt;br /&gt;
         SSLCertificateChainFile /etc/ssl/certs/GandiStandardSSLCA2.pem&lt;br /&gt;
         SSLVerifyClient None&lt;br /&gt;
     &amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&lt;br /&gt;
root@GreenArrow:/etc/apache2# cat ports.conf &lt;br /&gt;
Listen 80&lt;br /&gt;
&lt;br /&gt;
&amp;lt;IfModule ssl_module&amp;gt;&lt;br /&gt;
	Listen 443&lt;br /&gt;
&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;IfModule mod_gnutls.c&amp;gt;&lt;br /&gt;
	Listen 443&lt;br /&gt;
&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Un redémarrage du service apache2 est maintenant nécessaire :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@GreenArrow:/etc/apache2# service apache2 stop&lt;br /&gt;
root@GreenArrow:/etc/apache2# service apache2 start&lt;br /&gt;
root@GreenArrow:/etc/apache2# service apache2 reload&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous pouvons voir que notre  site [https://jjlddelamuerto.space] est maintenant sécurisé, un cadenas vert est bien présent.&lt;br /&gt;
&lt;br /&gt;
==== Sécurisation de serveur DNS par DNSSEC ====&lt;br /&gt;
&lt;br /&gt;
Génération des clefs asymétriques:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   dnssec-keygen -a RSASHA1 -b 2048 -r /dev/urandom -f KSK -n ZONE jjlddelamuerto.space&lt;br /&gt;
   dnssec-keygen -a RSASHA1 -b 1024 -r /dev/urandom -n ZONE jjlddelamuerto.space&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On modifie le nom des clefs:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@GreenArrow:/etc/bind/jjlddelamuerto.space.dnssec# ls&lt;br /&gt;
dsset-jjlddelamuerto.space.	  jjlddelamuerto.space-zsk.key&lt;br /&gt;
jjlddelamuerto.space-ksk.key	  jjlddelamuerto.space-zsk.private&lt;br /&gt;
jjlddelamuerto.space-ksk.private&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ensuite nous signons les zones:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@GreenArrow:/etc/bind/jjlddelamuerto.space.dnssec# dnssec-signzone -o jjlddelamuerto.space -k jjlddelamuerto.space-ksk &lt;br /&gt;
../db.jjlddelamuerto.space jjlddelamuerto.space-zsk&lt;br /&gt;
Verifying the zone using the following algorithms: RSASHA1.&lt;br /&gt;
Zone fully signed:&lt;br /&gt;
Algorithm: RSASHA1: KSKs: 1 active, 0 stand-by, 0 revoked&lt;br /&gt;
                    ZSKs: 1 active, 0 stand-by, 0 revoked&lt;br /&gt;
../db.jjlddelamuerto.space.signed&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour finir nous ajoutons la clef KSK sur Gandi avec l'algorithme RSA/SHA1.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:jjlddnssec.png]]&lt;br /&gt;
&lt;br /&gt;
=== Tests d'intrusion ===&lt;br /&gt;
&lt;br /&gt;
==== Intrusion par changement d'adresse MAC ====&lt;br /&gt;
&lt;br /&gt;
Tout d'abord nous modifions le fichier /etc/network/interfaces:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@zebrasoma:/home/pifou# vim /etc/network/interfaces&lt;br /&gt;
auto wlan5&lt;br /&gt;
iface wlan5 inet static&lt;br /&gt;
        address 172.26.79.21&lt;br /&gt;
        netmask 255.255.240.0&lt;br /&gt;
        gateway 172.26.79.254&lt;br /&gt;
        wireless mode-managed&lt;br /&gt;
        wireless-essid Wolverine&lt;br /&gt;
        wireless-key 0123456789&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous vérifions ensuite que nous sommes associés à Wolverine:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@zebrasoma:/home/pifou# iwconfig&lt;br /&gt;
wlan5     IEEE 802.11abg  ESSID:&amp;quot;Wolverine&amp;quot;  &lt;br /&gt;
          Mode:Managed  Frequency:2.462 GHz  Access Point: 44:AD:D9:5F:87:00   &lt;br /&gt;
          Bit Rate=54 Mb/s   Tx-Power=200 dBm   &lt;br /&gt;
          Retry short limit:7   RTS thr:off   Fragment thr:off&lt;br /&gt;
          Encryption key:0123-4567-89&lt;br /&gt;
          Power Management:off&lt;br /&gt;
          Link Quality=50/70  Signal level=-60 dBm  &lt;br /&gt;
          Rx invalid nwid:0  Rx invalid crypt:0  Rx invalid frag:0&lt;br /&gt;
          Tx excessive retries:0  Invalid misc:0   Missed beacon:0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous changeons ensuite l'@ MAC:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@zebrasoma:/home/pifou# ip link set wlan5 address 00:1a:56:a4:4b:ff&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@zebrasoma:/home/pifou# ip a&lt;br /&gt;
3: wlan5: &amp;lt;NO-CARRIER,BROADCAST,MULTICAST,UP&amp;gt; mtu 1500 qdisc mq state DOWN group default qlen 1000&lt;br /&gt;
    link/ether 00:1a:56:a4:4b:ff brd ff:ff:ff:ff:ff:ff&lt;br /&gt;
    inet 172.26.79.21/20 brd 172.26.79.255 scope global wlan5&lt;br /&gt;
       valid_lft forever preferred_lft forever&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Après le changement d'@ MAC, l'association est bien impossible:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@zebrasoma:/home/pifou# ifconfig wlan5 up&lt;br /&gt;
root@zebrasoma:/home/pifou# iwconfig        &lt;br /&gt;
wlan5     IEEE 802.11bgn  ESSID:&amp;quot;Wolverine&amp;quot;  &lt;br /&gt;
          Mode:Managed  Access Point: Not-Associated   Tx-Power=20 dBm   &lt;br /&gt;
          Retry short limit:7   RTS thr:off   Fragment thr:off&lt;br /&gt;
          Encryption key:0123-4567-89&lt;br /&gt;
          Power Management:off&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Crackage de la clef WEP ====&lt;br /&gt;
&lt;br /&gt;
Nous avons fait le crack de la clé WEP sur cracotte08.&lt;br /&gt;
Pour cracker la clef WEP, nous avons tout d'abord utiliser airmon-ng afin de voir le statut des interfaces réseau.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@zebrasoma:/home/pifou# airmon-ng&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Interface	Chipset		Driver&lt;br /&gt;
&lt;br /&gt;
mon0		Ralink RT2870/3070	rt2800usb - [phy1]&lt;br /&gt;
wlan0		Broadcom	wl - [phy0]&lt;br /&gt;
wlan5		Ralink RT2870/3070	rt2800usb - [phy1]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On entre ensuite en mode monitoring sur l'interface wlan5 :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@zebrasoma:/home/pifou# airmon-ng start wlan5&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Found 2 processes that could cause trouble.&lt;br /&gt;
If airodump-ng, aireplay-ng or airtun-ng stops working after&lt;br /&gt;
a short period of time, you may want to kill (some of) them!&lt;br /&gt;
&lt;br /&gt;
PID	Name&lt;br /&gt;
1986	avahi-daemon&lt;br /&gt;
1987	avahi-daemon&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Interface	Chipset		Driver&lt;br /&gt;
&lt;br /&gt;
mon0		Ralink RT2870/3070	rt2800usb - [phy1]&lt;br /&gt;
wlan0		Broadcom	wl - [phy0]&lt;br /&gt;
wlan5		Ralink RT2870/3070	rt2800usb - [phy1]&lt;br /&gt;
				(monitor mode enabled on mon1)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour continuer, nous capturons les paquets transitant afin de collecter les paquets nécessaires au décryptage de la clef WEP. L'option --encrypt wep permet de filtrer uniquement les points d'accès WEP.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@zebrasoma:/home/pifou# airodump-ng --encrypt wep wlan5&lt;br /&gt;
&lt;br /&gt;
 CH  5 ][ Elapsed: 0 s ][ 2016-03-31 18:36                                         &lt;br /&gt;
                                                                                                       &lt;br /&gt;
 BSSID              PWR  Beacons    #Data, #/s  CH  MB   ENC  CIPHER AUTH ESSID&lt;br /&gt;
                                                                                                       &lt;br /&gt;
 44:AD:D9:5F:87:00  -42        3        0    0   3  54e. WEP  WEP         Wolverine                    &lt;br /&gt;
 04:DA:D2:9C:50:50  -59        2       11    0   2  54e. WEP  WEP         cracotte01                   &lt;br /&gt;
 04:DA:D2:9C:50:56  -59        3       19    0   2  54e. WEP  WEP         cracotte07                   &lt;br /&gt;
 04:DA:D2:9C:50:59  -59        2        0    0   2  54e. WEP  WEP         cracotte10                   &lt;br /&gt;
 04:DA:D2:9C:50:57  -59        2       15    0   2  54e. WEP  WEP         cracotte08                   &lt;br /&gt;
 04:DA:D2:9C:50:52  -58        3       85   42   2  54e. WEP  WEP         cracotte03                   &lt;br /&gt;
 04:DA:D2:9C:50:54  -58        1       20    9   2  54e. WEP  WEP         cracotte05                    &lt;br /&gt;
 04:DA:D2:9C:50:55  -60        1        9    4   2  54e. WEP  WEP         cracotte06                    &lt;br /&gt;
 04:DA:D2:9C:50:51  -59        2      134   66   2  54e. WEP  WEP         cracotte02                   &lt;br /&gt;
 04:DA:D2:9C:50:53  -61        6       95   47   2  54e. WEP  WEP         cracotte04                   &lt;br /&gt;
                                                                                                       &lt;br /&gt;
 BSSID              STATION            PWR   Rate    Lost    Frames  Probe                              &lt;br /&gt;
                                                                                                        &lt;br /&gt;
 04:DA:D2:9C:50:50  00:0F:B5:92:23:75  -66   54e-48e    68       10                                     &lt;br /&gt;
 04:DA:D2:9C:50:56  00:0F:B5:92:23:71  -72   36e- 2e   133       19                                     &lt;br /&gt;
 04:DA:D2:9C:50:57  00:0F:B5:92:22:66  -66   54e-36e    89       15                                     &lt;br /&gt;
 04:DA:D2:9C:50:52  00:0F:B5:92:23:6A  -62   54e-48e    23       84                                     &lt;br /&gt;
 04:DA:D2:9C:50:54  00:0F:B5:92:23:74  -66   54e-36e   576       20                                     &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous avons choisi de récuperer la clef WEP de cracotte03 (son BSSID est lié à une station)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@zebrasoma:/home/pifou# airodump-ng --essid cracotte03 --channel 2 -w crackWEP wlan5&lt;br /&gt;
&lt;br /&gt;
 CH  2 ][ Elapsed: 12 s ][ 2016-03-31 18:42                                         &lt;br /&gt;
                                                                                                       &lt;br /&gt;
 BSSID              PWR RXQ  Beacons    #Data, #/s  CH  MB   ENC  CIPHER AUTH ESSID&lt;br /&gt;
                                                                                                       &lt;br /&gt;
 04:DA:D2:9C:50:52  -57  35       43     1066   87   2  54e. WEP  WEP         cracotte03               &lt;br /&gt;
                                                                                                       &lt;br /&gt;
 BSSID              STATION            PWR   Rate    Lost    Frames  Probe                             &lt;br /&gt;
                                                                                                                                   &lt;br /&gt;
 04:DA:D2:9C:50:52  00:0F:B5:92:23:6A  -64   36e-48e  1232     1067                                     &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Enfin, nous lançons le crack de la clef à l'aide de aircrack-ng :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@zebrasoma:/home/pifou# aircrack-ng crackWEP-02.cap&lt;br /&gt;
                           Aircrack-ng 1.2 beta3&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                 [00:00:04] Tested 112801 keys (got 3050 IVs)&lt;br /&gt;
&lt;br /&gt;
   KB    depth   byte(vote)&lt;br /&gt;
    0    6/ 10   CD(5120) 15(4864) 6D(4864) 8C(4864) A7(4864) &lt;br /&gt;
    1   46/  1   E9(4352) 04(4096) 0E(4096) 0F(4096) 16(4096) &lt;br /&gt;
    2   14/ 42   C8(4864) 10(4608) 11(4608) 1D(4608) 58(4608) &lt;br /&gt;
    3   19/  3   CF(4864) 0A(4608) 5E(4608) 8E(4608) 90(4608) &lt;br /&gt;
    4    2/ 16   08(5632) 89(5376) 96(5376) B4(5376) F7(5376) &lt;br /&gt;
&lt;br /&gt;
Failed. Next try with 5000 IVs.&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Il est nécessaire d'être proche du point d’accès (sinon le débit est trop faible, ce qui rend l'opération longue), ainsi que de capturer un minimum de 10 000 paquets.&lt;br /&gt;
&lt;br /&gt;
Au final, nous arrivons bien à récupérer la clef WEP : &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
                               Aircrack-ng 1.2 beta3&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                 [00:04:10] Tested 799 keys (got 42913 IVs)&lt;br /&gt;
&lt;br /&gt;
   KB    depth   byte(vote)&lt;br /&gt;
    0    0/  1   EE(56320) B4(51712) 9D(50944) 4E(50688) 28(50432) &lt;br /&gt;
    1    1/  2   D9(55552) 3D(50176) 68(49664) 08(49408) 49(49152) &lt;br /&gt;
    2    1/  5   A2(53504) 5B(52480) 93(52480) 73(52224) 10(50432) &lt;br /&gt;
    3    1/  3   30(53248) 81(51456) 5B(49920) 6E(49920) 1E(49664) &lt;br /&gt;
    4    9/  4   9D(50176) 31(49408) 18(49152) 72(49152) E1(49152) &lt;br /&gt;
&lt;br /&gt;
             KEY FOUND! [ EE:EE:EE:EE:EE:EE:EE:EE:EE:EE:EE:E4:44 ] &lt;br /&gt;
	Decrypted correctly: 100%&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Cassage de mot de passe WPA-PSK par force brute ====&lt;br /&gt;
Nous refaisons les mêmes actions que pour le crackage de clef WEP.&lt;br /&gt;
Cette fois nous essayons de cracker la clef WPA sur cracotte03.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@zebrasoma:/home/pifou# airodump-ng --encrypt wpa wlan5&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@zebrasoma:/home/pifou# airodump-ng --essid cracotte03 --channel 13 -w crackWPA wlan5&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Une fois le handshake récupéré:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@zebrasoma:/home/pifou# aircrack-ng -w dico.txt crackWPA-01.cap&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Nous avons lancé ceci sur le eeePC qui a une vitesse de traitement 5 fois inférieure à celle d'une zabeth environ (environ 5h de traitement). Puis nous obtenons le résultat suivant:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
                                   Aircrack-ng 1.2 beta3&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                   [04:32:42] 12399908 keys tested (759.63 k/s)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                           KEY FOUND! [ 12399903 ]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
      Master Key     : 33 2B 69 DD 95 0A 5A E0 01 22 7E FF 98 DA 99 87 &lt;br /&gt;
                       40 7A CB CC 8A E5 32 9F FE 4E 5C 44 91 38 13 93 &lt;br /&gt;
&lt;br /&gt;
      Transient Key  : 70 EE 27 96 5B 34 B5 4F 06 A1 F2 B6 A7 16 1E 21 &lt;br /&gt;
                       7A 0B BD F4 13 67 5B 4C ED 30 A9 0D 91 E3 F9 7F &lt;br /&gt;
                       88 E6 12 68 9C 77 4B 48 EB 5E 6A 5A DD 1D D9 08 &lt;br /&gt;
                       36 40 94 7D B4 05 80 B2 60 FA 84 81 50 CE DC 87 &lt;br /&gt;
&lt;br /&gt;
      EAPOL HMAC     : 83 03 24 AC 39 AB 67 E7 7B C4 40 E8 6B 6D 7D 47 &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Réalisations ===&lt;br /&gt;
==== Sécurisation des données ====&lt;br /&gt;
&lt;br /&gt;
Nous créons d'abord 3 nouvelles partitions, que nous associons à notre VM en modifiant le fichier GreenArrow.cfg :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
lvcreate -L 1G -n /dev/virtual/GreenArrow-1 -v&lt;br /&gt;
lvcreate -L 1G -n /dev/virtual/GreenArrow-2 -v&lt;br /&gt;
lvcreate -L 1G -n /dev/virtual/GreenArrow-3 -v&lt;br /&gt;
&lt;br /&gt;
'phy:/dev/virtual/GreenArrow-1,xvdd,w',&lt;br /&gt;
'phy:/dev/virtual/GreenArrow-2,xvde,w',&lt;br /&gt;
'phy:/dev/virtual/GreenArrow-3,xvdf,w',&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Il faut ensuite installer mdadm :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt-get install mdadm&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous créons le volume /dev/md0 qui représente le RAID5 de partitions&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mdadm --create /dev/md0 --level=5 --assume-clean --raid-devices=3 /dev/xvdd /dev/xvde /dev/xvdf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour avoir le détail de la configuration actuelle:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@GreenArrow:~# mdadm --detail /dev/md0&lt;br /&gt;
/dev/md0:&lt;br /&gt;
        Version : 1.2&lt;br /&gt;
  Creation Time : Mon oct 13 11:34:23 2017&lt;br /&gt;
     Raid Level : raid5&lt;br /&gt;
     Array Size : 2095104 (2046.34 MiB 2145.39 MB)&lt;br /&gt;
  Used Dev Size : 1047552 (1023.17 MiB 1072.69 MB)&lt;br /&gt;
   Raid Devices : 3&lt;br /&gt;
  Total Devices : 3&lt;br /&gt;
    Persistence : Superblock is persistent&lt;br /&gt;
&lt;br /&gt;
    Update Time : Mon oct 13 11:34:23 2017&lt;br /&gt;
          State : clean &lt;br /&gt;
 Active Devices : 3&lt;br /&gt;
Working Devices : 3&lt;br /&gt;
 Failed Devices : 0&lt;br /&gt;
  Spare Devices : 0&lt;br /&gt;
&lt;br /&gt;
         Layout : left-symmetric&lt;br /&gt;
     Chunk Size : 512K&lt;br /&gt;
&lt;br /&gt;
           Name : IMA5-BANANE:0  (local to host GreenArrow)&lt;br /&gt;
           UUID : f70ca72e:e8adc585:ec023dca:21061341&lt;br /&gt;
         Events : 0&lt;br /&gt;
&lt;br /&gt;
    Number   Major   Minor   RaidDevice State&lt;br /&gt;
       0     202       48        0      active sync   /dev/xvdd&lt;br /&gt;
       1     202       64        1      active sync   /dev/xvde&lt;br /&gt;
       2     202       80        2      active sync   /dev/xvdf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Puis nous sauvons cette dernière afin de conserver md0:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mdadm --detail --scan &amp;gt;&amp;gt; /etc/mdadm/mdadm.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Puis:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkfs /dev/md0&lt;br /&gt;
mkdir /datamd0&lt;br /&gt;
mount /dev/md0 /datamd0/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ensuite il faut éditer le fichier /etc/fstab en rajoutant la ligne suivante à la fin du fichier afin d'être surs que la partition soit encore montée après le reboot:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/dev/md0 /datamd0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous créons un fichier texte sur le raid5:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
vim testraid5.txt&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous mettons en commentaire la 2ème partition dans le fichier de conf, puis redémarrons la machine:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mdadm --detail /dev/md0&lt;br /&gt;
/dev/md0:&lt;br /&gt;
        Version : 1.2&lt;br /&gt;
  Creation Time : Mon oct 13 11:34:23 2017&lt;br /&gt;
     Raid Level : raid5&lt;br /&gt;
     Array Size : 2095104 (2046.34 MiB 2145.39 MB)&lt;br /&gt;
  Used Dev Size : 1047552 (1023.17 MiB 1072.69 MB)&lt;br /&gt;
   Raid Devices : 3&lt;br /&gt;
  Total Devices : 2&lt;br /&gt;
    Persistence : Superblock is persistent&lt;br /&gt;
&lt;br /&gt;
    Update Time : Mon oct 13 11:45:01 2017&lt;br /&gt;
          State : clean, degraded &lt;br /&gt;
 Active Devices : 2&lt;br /&gt;
Working Devices : 2&lt;br /&gt;
 Failed Devices : 0&lt;br /&gt;
  Spare Devices : 0&lt;br /&gt;
&lt;br /&gt;
         Layout : left-symmetric&lt;br /&gt;
     Chunk Size : 512K&lt;br /&gt;
&lt;br /&gt;
           Name : GreenArrow:0  (local to host GreenArrow)&lt;br /&gt;
           UUID : f70ca72e:e8adc585:ec023dca:21061341&lt;br /&gt;
         Events : 4&lt;br /&gt;
&lt;br /&gt;
    Number   Major   Minor   RaidDevice State&lt;br /&gt;
       0     202       48        0      active sync   /dev/xvdd&lt;br /&gt;
       2       0        0        2      removed&lt;br /&gt;
       2     202       80        2      active sync   /dev/xvdf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On voit bien qu'une partition a été supprimée mais que le fichier créé auparavant est toujours présent:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ls /datamd0/&lt;br /&gt;
testraid5.txt&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour rajouter la partition, on la decommente dans le fichier de configuration et on procede au rajout de cette partition au raid de la facon suivante:&lt;br /&gt;
&lt;br /&gt;
 mdadm --add /dev/md0 /dev/xvde&lt;br /&gt;
&lt;br /&gt;
Pour le test de réparation, afin de bien voir l'avancement de la reconstruction, nous avons procédé comme dans l'exemple du cours:&lt;br /&gt;
Suppression de la partition xvdf:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@GreenArrow:~# mdadm --set-faulty /dev/md0 /dev/xvdf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@GreenArrow:~# mdadm --remove /dev/md0 /dev/xvdf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
La partition est bien supprimée:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Personalities : [raid6] [raid5] [raid4] &lt;br /&gt;
md0 : active raid5 xvdd[0] xvde[1]&lt;br /&gt;
      2095104 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/2] [UU_]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
On remet la partition:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@GreenArrow:~# mdadm --add /dev/md0 /dev/xvdf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
On peut ensuite constater l'avancement de la reconstruction en lançant la même commande assez régulièrement:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@GreenArrow:~# cat /proc/mdstat &lt;br /&gt;
Personalities : [raid6] [raid5] [raid4] &lt;br /&gt;
md0 : active raid5 xvdf[3] xvdd[0] xvde[1]&lt;br /&gt;
      2095104 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/2] [UU_]&lt;br /&gt;
      [===&amp;gt;.................]  recovery = 18.2% (191112/1047552) finish=0.4min speed=31852K/sec&lt;br /&gt;
      &lt;br /&gt;
unused devices: &amp;lt;none&amp;gt;&lt;br /&gt;
root@GreenArrow:~# cat /proc/mdstat &lt;br /&gt;
Personalities : [raid6] [raid5] [raid4] &lt;br /&gt;
md0 : active raid5 xvdf[3] xvdd[0] xvde[1]&lt;br /&gt;
      2095104 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/2] [UU_]&lt;br /&gt;
      [====&amp;gt;................]  recovery = 20.0% (210764/1047552) finish=0.4min speed=30109K/sec&lt;br /&gt;
      &lt;br /&gt;
unused devices: &amp;lt;none&amp;gt;&lt;br /&gt;
root@GreenArrow:~# cat /proc/mdstat &lt;br /&gt;
Personalities : [raid6] [raid5] [raid4] &lt;br /&gt;
md0 : active raid5 xvdf[3] xvdd[0] xvde[1]&lt;br /&gt;
      2095104 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/2] [UU_]&lt;br /&gt;
      [====&amp;gt;................]  recovery = 21.8% (229836/1047552) finish=0.4min speed=32833K/sec&lt;br /&gt;
      &lt;br /&gt;
unused devices: &amp;lt;none&amp;gt;&lt;br /&gt;
root@GreenArrow:~# cat /proc/mdstat &lt;br /&gt;
Personalities : [raid6] [raid5] [raid4] &lt;br /&gt;
md0 : active raid5 xvdf[3] xvdd[0] xvde[1]&lt;br /&gt;
      2095104 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/2] [UU_]&lt;br /&gt;
      [===========&amp;gt;.........]  recovery = 59.6% (626140/1047552) finish=0.2min speed=29816K/sec&lt;br /&gt;
      &lt;br /&gt;
unused devices: &amp;lt;none&amp;gt;&lt;br /&gt;
root@GreenArrow:~# cat /proc/mdstat &lt;br /&gt;
Personalities : [raid6] [raid5] [raid4] &lt;br /&gt;
md0 : active raid5 xvdf[3] xvdd[0] xvde[1]&lt;br /&gt;
      2095104 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/2] [UU_]&lt;br /&gt;
      [==================&amp;gt;..]  recovery = 94.3% (989688/1047552) finish=0.0min speed=30124K/sec&lt;br /&gt;
      &lt;br /&gt;
unused devices: &amp;lt;none&amp;gt;&lt;br /&gt;
root@GreenArrow:~# [  446.720069] md: md0: recovery done.&lt;br /&gt;
cat /proc/mdstat &lt;br /&gt;
Personalities : [raid6] [raid5] [raid4] &lt;br /&gt;
md0 : active raid5 xvdf[3] xvdd[0] xvde[1]&lt;br /&gt;
      2095104 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/3] [UUU]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Cryptage de données ====&lt;br /&gt;
&lt;br /&gt;
Tout d'abord, nous vérifions grâce à Gparted que la carte SD fournie comporte une seule partition.&lt;br /&gt;
Une fois ce test passé, nous regardons grâce à dmesg où est localisé la carte SD :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@zebrasoma:/# dmesg&lt;br /&gt;
[...]&lt;br /&gt;
[1126726.403767] mmcblk1: mmc1:59b4 NCard 14.7 GiB&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Notre carte SD se situe donc sur /dev/mmcblk1.&lt;br /&gt;
Nous faisons donc un chiffrage AES avec un hashage SHA256 de la carte SD :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@zebrasoma:/# cryptsetup luksFormat -c aes -h sha256 /dev/mmcblk1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous devons alors renseigner un mot de passe pour crypter la clef.&lt;br /&gt;
Ensuite, nous ouvrons la partition Luks, puis nous formatons la carte :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@zebrasoma:/# cryptsetup luksOpen /dev/sdb1 crypt_sd&lt;br /&gt;
root@zebrasoma:/# mkfs.ext4 /dev/mapper/crypt_sd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous montons la partition, puis créons un fichier sur la carte :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@zebrasoma:/# mount /dev/mapper/crypt_sd /mnt&lt;br /&gt;
root@zebrasoma:/# vi /mnt/test.txt #on marque un texte dans le fichier&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Enfin, nous démontons la carte SD et fermons la partition Luks :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@zebrasoma:/# umount /mnt&lt;br /&gt;
root@zebrasoma:/# cryptsetup luksClose crypt_sd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous essayons ensuite d'accéder à la carte SD. En renseignant un mauvais mot de passe, une erreur apparaît.&lt;br /&gt;
Cependant, une fois le bon mot de passe renseigné, tout re-devient possible.&lt;br /&gt;
&lt;br /&gt;
==== Sécurisation Wifi par WPA2-EAP ====&lt;br /&gt;
Tout d'abord, nous installons FreeRadius sur notre machine virtuelle.&amp;lt;br /&amp;gt;&lt;br /&gt;
Dans le fichier '''users''', nous renseignons le login et le mot de passe pour se connecter à la borne Wifi : &amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
GreenArrow Cleartext-Password:=&amp;quot;glopglop&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Dans le fichier '''clients.conf''', nous ajoutons la configuration de la borne E306 et E304 :&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
client E306 {&lt;br /&gt;
	ipaddr		= 10.60.1.2&lt;br /&gt;
	secret		= password&lt;br /&gt;
}&lt;br /&gt;
client E304 {&lt;br /&gt;
	ipaddr		= 10.60.1.4&lt;br /&gt;
	secret		= password&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ensuite, on passe à la configuration de la borne Wifi. On se connecte en telnet via '''telnet 10.60.1.2''', puis nous rentrons en mode configuration : &amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
aaa authentication login eap_greenarrow group radius_greenarrow&lt;br /&gt;
radius-server host 193.48.57.162 auth-port 1812 acct-port 1813 key glopglop&lt;br /&gt;
aaa group server radius radius_greenarrow&lt;br /&gt;
server 193.48.57.162 auth-port 1812 acct-port 1813&lt;br /&gt;
&lt;br /&gt;
dot11 ssid SSID_GREENARROW&lt;br /&gt;
vlan 3&lt;br /&gt;
authentication open eap eap_greenarrow&lt;br /&gt;
authentication network-eap eap_greenarrow&lt;br /&gt;
authentication key-management wpa&lt;br /&gt;
mbssid guest-mode&lt;br /&gt;
&lt;br /&gt;
exit&lt;br /&gt;
&lt;br /&gt;
interface Dot11Radio0&lt;br /&gt;
encryption vlan 3 mode ciphers aes-ccm tkip&lt;br /&gt;
ssid SSID_GREENARROW&lt;br /&gt;
&lt;br /&gt;
interface Dot11Radio0.3&lt;br /&gt;
encapsulation dot1Q 3&lt;br /&gt;
no ip route-cache&lt;br /&gt;
bridge-group 3&lt;br /&gt;
bridge-group 3 subscriber-loop-control&lt;br /&gt;
bridge-group 3 spanning-disabled&lt;br /&gt;
bridge-group 3 block-unknown-source&lt;br /&gt;
no bridge-group 3 source-learning&lt;br /&gt;
no bridge-group 3 unicast-flooding &lt;br /&gt;
&lt;br /&gt;
interface GigabitEthernet0.3&lt;br /&gt;
encapsulation dot1Q 3&lt;br /&gt;
bridge-group 3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Une fois ces modifications effectuées, nous configurons l'interface wlan0 de l'eeePC pour pouvoir se connecter au Wifi à l'aide de '''ifup wlan0''' : &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
auto wlan0&lt;br /&gt;
iface wlan0 inet static&lt;br /&gt;
  address 10.60.3.2&lt;br /&gt;
  netmask 255.255.255.0&lt;br /&gt;
  gateway 10.60.3.1&lt;br /&gt;
  wpa-ssid SSID_GREENARROW&lt;br /&gt;
  wpa-key-mgmt WPA-EAP&lt;br /&gt;
  wpa-identity GreenArrow&lt;br /&gt;
  wpa-password glopglop&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On lance le serveur FreeRadius via freeradius -X (mode debug).&lt;br /&gt;
Sur smartphone, nous arrivons à détecter notre SSID (SSID_GREENARROW). Nous pouvons également ping notre eeePC depuis la machine virtuelle, tout comme nous arrivons à pinger des Vm d'autres groupes depuis notre eeePC.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@GreenArrow:/etc/freeradius# ping 10.60.3.2&lt;br /&gt;
PING 10.60.3.2 (10.60.3.2) 56(84) bytes of data.&lt;br /&gt;
64 bytes from 10.60.3.2: icmp_seq=1 ttl=255 time=1.30 ms&lt;br /&gt;
64 bytes from 10.60.3.2: icmp_seq=2 ttl=255 time=1.96 ms&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Serveur DCHP ====&lt;br /&gt;
&lt;br /&gt;
Pour cette partie, nous avons d'abord installer le paquet isc-dhcp-server.&lt;br /&gt;
Ensuite, nous avons modifier le fichier dhcpd.conf :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
option domain-name &amp;quot;jjlddelamuerto.space&amp;quot;;&lt;br /&gt;
option domain-name-servers 193.48.57.162;&lt;br /&gt;
&lt;br /&gt;
subnet 10.60.3.0 netmask 255.255.255.0 {&lt;br /&gt;
      range 10.60.3.10 10.60.3.40;&lt;br /&gt;
      option routers 10.60.3.1;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous modifions ensuite isc-dhcp-server pour rajouter l'interface wlan0 : &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
INTERFACES=&amp;quot;wlan0&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous pouvons maintenant nous connecter sur le reseau Wifi via smartphone, le serveur DHCP fonctionne correctement.&lt;br /&gt;
[[Fichier:Connexioniphone.JPG|thumb|center|Connexion via smartphone]]&lt;br /&gt;
&lt;br /&gt;
==== Configuration et utilisation du PCBX ====&lt;br /&gt;
&lt;br /&gt;
Nous avons modifiés le fichier sip.conf :&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;[general]&lt;br /&gt;
hasvoicemail=yes&lt;br /&gt;
hassip=yes&lt;br /&gt;
hasiax=yes&lt;br /&gt;
callwaiting=yes&lt;br /&gt;
threewaycalling=yes&lt;br /&gt;
callwaitingcallerid=yes&lt;br /&gt;
transfer=yes&lt;br /&gt;
canpark=yes&lt;br /&gt;
cancallforward=yes&lt;br /&gt;
callreturn=yes&lt;br /&gt;
callgroup=1&lt;br /&gt;
pickupgroup=1&lt;br /&gt;
nat=yes&lt;br /&gt;
&lt;br /&gt;
[6001]&lt;br /&gt;
type=friend&lt;br /&gt;
host=dynamic&lt;br /&gt;
dtmfmode=rfc2833&lt;br /&gt;
disallow=all&lt;br /&gt;
allow=ulaw&lt;br /&gt;
fullname=JulienJoignaux&lt;br /&gt;
username=jjoignaux&lt;br /&gt;
secret=secret&lt;br /&gt;
context=work&lt;br /&gt;
&lt;br /&gt;
[6002]&lt;br /&gt;
type=friend&lt;br /&gt;
host=dynamic&lt;br /&gt;
dtmfmode=rfc2833&lt;br /&gt;
disallow=all&lt;br /&gt;
allow=ulaw&lt;br /&gt;
fullname=LoicDelecroix&lt;br /&gt;
username=ldelecro&lt;br /&gt;
secret=secret&lt;br /&gt;
context=work&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Puis nous modifions le fichier extensions.conf&lt;br /&gt;
&amp;lt;pre&amp;gt;[work]&lt;br /&gt;
exten=&amp;gt;_6XXX,1,Dial(SIP/${EXTEN},20)&lt;br /&gt;
exten =&amp;gt; _6XXX,2,Hangup()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fichier:voipjjld.jpg|thumb|center|Appel entre 2 smartphones]]&lt;br /&gt;
&lt;br /&gt;
== Références ==&lt;br /&gt;
&lt;br /&gt;
* Crackage de la clef WEP : [http://wiki.backtrack-fr.net/index.php/Casser_une_cl%C3%A9_wep/wpa_avec_la_suite_Aircrack-ng]&lt;br /&gt;
* Cassage de mot de passe WPA-PSK : [http://www.crack-wifi.com/tutoriel-crack-wpa.php]&lt;br /&gt;
* Cryptage de données : [https://doc.ubuntu-fr.org/cryptsetup]&lt;br /&gt;
* DHCP : [https://doc.ubuntu-fr.org/isc-dhcp-server]&lt;br /&gt;
* Asterisk : [http://denisrosenkranz.com/tuto-installer-et-configurer-asterisk-sous-debian-6-et-ubuntu/]&lt;/div&gt;</summary>
		<author><name>Hdelatte</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=Cahier_2017_groupe_n%C2%B05&amp;diff=46346</id>
		<title>Cahier 2017 groupe n°5</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=Cahier_2017_groupe_n%C2%B05&amp;diff=46346"/>
				<updated>2017-11-17T13:42:22Z</updated>
		
		<summary type="html">&lt;p&gt;Hdelatte : /* Sécurisation des données */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Présentation générale'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;Mise en contexte&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
Le projet de Réseau Avancé est composé d'une partie commune et d'une tâche particulière par binôme. Ce projet consiste en la configuration d'une architecture réseau avec différentes parties, en plus du câblage et de la configuration des routeurs et commutateurs.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
La partie commune consiste en la création et la mise en réseau d'une machine virtuelle; ainsi que la création d'un site sécurisé avec la configuration du serveur SSH, DNS sécurisé et du certificat SSL. La virtualisation permet de faire fonctionner sur une même machine plusieurs OS isolés ou des logiciels grâce aux machines virtuelles. Au-delà de la réduction des coûts, la virtualisation permet aussi de manipuler et gérer plus facilement des OS. Cependant, on s'oriente de plus en plus vers l'isolation par des conteneurs car ils permettent au sein d'un même OS, d'isoler les ressources matérielles et d'éviter des surcharges.&lt;br /&gt;
&lt;br /&gt;
Notre tâche particulière est donc de réaliser la gestion des conteneurs au sein d'une machine virtuelle configurée en réseau.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;Tâches à effectuer&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
* Création d'une machine virtuelle sur le serveur de virtualisation Cordouan&lt;br /&gt;
* Mettre la machine virtuelle en réseau&lt;br /&gt;
* Configuration des services Internet (Serveur SSH, DNS, DNSSEC, Certificat SSL)&lt;br /&gt;
* Crackage de clé Wi-Fi&lt;br /&gt;
* Créer les différents conteneurs et configurer leur accès au réseau (tâche particulière)&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Travail effectué'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
                     &lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;Création d'une machine virtuelle Xen sur Cordouan&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
On commence par créer une machine virtuelle Xen sur le serveur de virtualisation cordouan.insecserv.deule.net. On se connecte tout d'abord en SSH sur le serveur cordouan.&lt;br /&gt;
&lt;br /&gt;
    1) ssh root@cordouan.insecserv.deule.net&lt;br /&gt;
       Mot de passe: mot de passe root habituel&lt;br /&gt;
&lt;br /&gt;
On précise:&lt;br /&gt;
&lt;br /&gt;
* le nom de machine virtuelle: IMA5-BANANE&lt;br /&gt;
* son adresse IP sur le réseau: 193.48.57.179/28&lt;br /&gt;
* le répertoire où créer les disques virtuels: /usr/local/xen&lt;br /&gt;
* le miroir Debian: http://debian.polytech-lille.fr/debian&lt;br /&gt;
* la distribution: jessie (qui est la distribution stable courante)&lt;br /&gt;
&lt;br /&gt;
    2) xen-create-image --hostname=&amp;lt;IMA5-BANANE&amp;gt; --ip 193.48.57.179/28 --dir /usr/local/xen --netmask=255.255.255.240 --gateway=193.48.57.177 --mirror=http://debian.polytech-lille.fr/debian/ --dist=jessie&lt;br /&gt;
&lt;br /&gt;
On modifie le fichier de configuration de la machine virtuelle pour faire en sorte que les répertoires var et home de la machine virtuelle soient sur des partitions LVM de l'hôte. Installez les paquetages nécessaires pour SSH, le serveur Web apache2 et le serveur DNS bind (voir la partie services).&lt;br /&gt;
&lt;br /&gt;
    3) xl create /etc/xen/IMA5-BANANE.cfg&lt;br /&gt;
       vi /etc/xen/IMA5-BANANE.cfg&lt;br /&gt;
       lvcreate -L 10G -n /dev/virtual/IMA5-BANANE-home -v&lt;br /&gt;
       lvcreate -L 10G -n /dev/virtual/IMA5-BANANE-var -v&lt;br /&gt;
&lt;br /&gt;
       root@cordouan:~# cat /etc/xen/IMA5-BANANE.cfg&lt;br /&gt;
       #&lt;br /&gt;
       # Configuration file for the Xen instance IMA5-BANANE, created&lt;br /&gt;
       # by xen-tools 4.5 on Mon Sep 11 19:01:21 2017.&lt;br /&gt;
       #&lt;br /&gt;
       #&lt;br /&gt;
       #  Kernel + memory size&lt;br /&gt;
       #&lt;br /&gt;
       kernel      = '/boot/vmlinuz-3.16.0-4-amd64'&lt;br /&gt;
       extra       = 'elevator=noop'&lt;br /&gt;
       ramdisk     = '/boot/initrd.img-3.16.0-4-amd64'&lt;br /&gt;
       vcpus       = '1'&lt;br /&gt;
       memory      = '512'&lt;br /&gt;
       #&lt;br /&gt;
       #  Disk device(s).&lt;br /&gt;
       #&lt;br /&gt;
       root        = '/dev/xvda2 ro'&lt;br /&gt;
       disk        = [&lt;br /&gt;
                  'file:/usr/local/xen/domains/IMA5-BANANE/disk.img,xvda2,w',&lt;br /&gt;
                  'file:/usr/local/xen/domains/IMA5-BANANE/swap.img,xvda1,w',&lt;br /&gt;
                  'phy:/dev/virtual/IMA5-BANANE-home,xvdb1,w',&lt;br /&gt;
  		  'phy:/dev/virtual/IMA5-BANANE-var,xvdc1,w',		 &lt;br /&gt;
       #&lt;br /&gt;
       #  Physical volumes&lt;br /&gt;
       #&lt;br /&gt;
       #&lt;br /&gt;
       #  Hostname&lt;br /&gt;
       #&lt;br /&gt;
       name        = 'IMA5-BANANE'  &lt;br /&gt;
       #&lt;br /&gt;
       #  Networking&lt;br /&gt;
       #&lt;br /&gt;
       vif         = [ 'ip=193.48.57.179/28 ,mac=00:16:3E:56:71:47,bridge=IMA5sc' ]       &lt;br /&gt;
       #&lt;br /&gt;
       #  Behaviour&lt;br /&gt;
       on_poweroff = 'destroy'&lt;br /&gt;
       on_reboot   = 'restart'&lt;br /&gt;
       on_crash    = 'restart'&lt;br /&gt;
&lt;br /&gt;
On modifie le fichier de configuration en faisant en sorte que les répertoires var et home de la machine virtuelle soient sur des partitions LVM de l'hôte:&lt;br /&gt;
&lt;br /&gt;
* la mémoire attribuée: 512 Mo&lt;br /&gt;
* l'adresse ip de la MV: 193.48.57.179/28&lt;br /&gt;
* bridge: IMA5sc&lt;br /&gt;
&lt;br /&gt;
    4) xl list&lt;br /&gt;
&lt;br /&gt;
       root@cordouan:~# xl list&lt;br /&gt;
       Name                                        ID   Mem VCPUs	State	Time(s)&lt;br /&gt;
       Domain-0                                     0  1993     8     r-----   52219.3&lt;br /&gt;
       karmeliett                                   1   128     1     -b----    2483.6&lt;br /&gt;
       duvel                                        2   512     1     -b----    4225.6&lt;br /&gt;
       deus                                         3   512     1     -b----    4226.4&lt;br /&gt;
       trappe                                       4   512     1     -b----    4082.4&lt;br /&gt;
       Rincecochon                                  6   512     1     -b----    3788.2&lt;br /&gt;
       IMA5-Durian                                 62   512     1     -b----    3237.7&lt;br /&gt;
       IMA5-BANANE                                 84   512     1     -b----     152.9&lt;br /&gt;
       IMA5-Papaye                                 89   512     1     -b----      35.4&lt;br /&gt;
       IMA5-Ananas                                 91   512     1     -b----      27.0&lt;br /&gt;
&lt;br /&gt;
On vérifie que la MV IMA5-BANANE a bien été créée.&lt;br /&gt;
&lt;br /&gt;
    5) xl console IMA5-BANANE&lt;br /&gt;
&lt;br /&gt;
On lance IMA5-BANANE en utilisant le log root et le mot de passe configuré.&lt;br /&gt;
&lt;br /&gt;
Commandes de base pour démarrer la VM proprement: &lt;br /&gt;
&lt;br /&gt;
 ssh root@cordouan.insecserv.deule.net&lt;br /&gt;
 xl create /etc/xen/IMA5-BANANE.cfg&lt;br /&gt;
 ssh username@weppes&lt;br /&gt;
 ssh root@193.48.57.179&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;Services Internet (SSH, DNS sécurisé et certificat SSL)&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
On configure à présent les services Internet après avoir acheté un nom de domaine (https://www.banane.space) sur gandi.net pour créer notre site Web sécurisé.&lt;br /&gt;
&lt;br /&gt;
=====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;''Serveur SSH''&amp;lt;/span&amp;gt;=====&lt;br /&gt;
&lt;br /&gt;
Sur notre machine virtuelle, nous avons configuré le fichier sshd_config (PubkeyAuthentication ) :&lt;br /&gt;
&lt;br /&gt;
       root@IMA5-BANANE:~# vim /etc/ssh/sshd_config&lt;br /&gt;
       &lt;br /&gt;
       RSAAuthentication yes&lt;br /&gt;
       PubkeyAuthentication yes&lt;br /&gt;
       #AuthorizedKeysFile     %h/.ssh/authorized_keys&lt;br /&gt;
       PermitRootLogin yes&lt;br /&gt;
       &lt;br /&gt;
       root@IMA5-BANANE:~# service ssh restart&lt;br /&gt;
&lt;br /&gt;
=====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;''Certification SSL''&amp;lt;/span&amp;gt;=====&lt;br /&gt;
Nous commencons par acheter un certificat SSL. Puis, sur la VM nous générons le CSR grâce à cette commande:&lt;br /&gt;
&lt;br /&gt;
 root@IMA5-BANANE:/etc/apache2/sites-available/clef# openssl req -nodes -newkey rsa:2048 -sha256 -keyout banane.key -out banane.csr&lt;br /&gt;
 Generating a 2048 bit RSA private key&lt;br /&gt;
 If you enter '.', the field will be left blank.&lt;br /&gt;
 -----&lt;br /&gt;
 Country Name (2 letter code) [AU]:FR&lt;br /&gt;
 State or Province Name (full name) [Some-State]:Nord&lt;br /&gt;
 Locality Name (eg, city) []:Lille&lt;br /&gt;
 Organization Name (eg, company) [Internet Widgits Pty Ltd]:PolytechLille&lt;br /&gt;
 Organizational Unit Name (eg, section) []:IMA&lt;br /&gt;
 Common Name (e.g. server FQDN or YOUR name) []:banane.space&lt;br /&gt;
 Email Address []:&lt;br /&gt;
 A challenge password []:&lt;br /&gt;
 An optional company name []:&lt;br /&gt;
 root@IMA5-BANANE:/etc/apache2/sites-available/clef# ls banane.csr banane.key&lt;br /&gt;
 root@IMA5-BANANE:/etc/apache2/sites-available/clef# cat banane.csr&lt;br /&gt;
 -----BEGIN CERTIFICATE REQUEST-----&lt;br /&gt;
 &amp;lt;CSR à renseigner sur Gandi lors de l'achat du certificat&amp;gt;&lt;br /&gt;
 -----END CERTIFICATE REQUEST-----&lt;br /&gt;
&lt;br /&gt;
Pour recevoir le mail contenant le lien pour activer le certificat, nous installons les packages suivants :&lt;br /&gt;
&lt;br /&gt;
 root@IMA5-BANANE:~# apt-get install postfix mailx&lt;br /&gt;
&lt;br /&gt;
Une fois le certificat récupéré, nous les copions tous dans le bon répertoire, puis nous hashons le tout :&lt;br /&gt;
&lt;br /&gt;
 root@IMA5-BANANE:/etc/bind# cp certificat.crt /etc/ssl/certs/banane.space.crt&lt;br /&gt;
 root@IMA5-BANANE:/etc/bind# cp serveur.key /etc/ssl/private/banane.space.key&lt;br /&gt;
 root@IMA5-BANANE:/etc/bind# cp GandiStandardSSLCA2.pem /etc/ssl/certs/GandiStandardSSLCA2.pem&lt;br /&gt;
 root@IMA5-BANANE:/etc/bind# c_rehash /etc/ssl/certs&lt;br /&gt;
&lt;br /&gt;
Enfin, la dernière étape consiste en la modification des fichiers 000-banane.space-ssl.conf et ports.conf :&lt;br /&gt;
&lt;br /&gt;
 root@IMA5-BANANE:/etc/apache2/sites-available# cat 000-banane.space-ssl.conf &lt;br /&gt;
     &amp;lt;VirtualHost *:443&amp;gt;&lt;br /&gt;
         ServerName www.banane.space&lt;br /&gt;
         ServerAlias banane.space&lt;br /&gt;
         DocumentRoot /var/www/&lt;br /&gt;
         CustomLog /var/log/apache2/secure_access.log combined&lt;br /&gt;
         SSLEngine on&lt;br /&gt;
         SSLCertificateFile /etc/ssl/certs/banane.space.crt&lt;br /&gt;
         SSLCertificateKeyFile /etc/ssl/private/banane.space.key&lt;br /&gt;
         SSLCertificateChainFile /etc/ssl/certs/GandiStandardSSLCA2.pem&lt;br /&gt;
         SSLVerifyClient None&lt;br /&gt;
     &amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 root@IMA5-BANANE:/etc/apache2# cat ports.conf &lt;br /&gt;
 Listen 80&lt;br /&gt;
 &amp;lt;IfModule ssl_module&amp;gt;&lt;br /&gt;
 Listen 443&lt;br /&gt;
 &amp;lt;/IfModule&amp;gt;&lt;br /&gt;
 &amp;lt;IfModule mod_gnutls.c&amp;gt;&lt;br /&gt;
 Listen 443&lt;br /&gt;
 &amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Un redémarrage du service apache2 est maintenant nécessaire :&lt;br /&gt;
&lt;br /&gt;
 root@IMA5-BANANE:/etc/apache2# service apache2 stop&lt;br /&gt;
 root@IMA5-BANANE:/etc/apache2# service apache2 start&lt;br /&gt;
 root@IMA5-BANANE:/etc/apache2# service apache2 reload&lt;br /&gt;
&lt;br /&gt;
Nous pouvons voir que notre site est maintenant sécurisé, un cadenas vert est bien présent.&lt;br /&gt;
&lt;br /&gt;
=====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;''Serveur DNS''&amp;lt;/span&amp;gt;=====&lt;br /&gt;
&lt;br /&gt;
On commence par modifier les informations de notre nom de domaine sur le site de Gandi. Ensuite, dans ''&amp;quot;Gérer les Glue Records&amp;quot;'', nous modifions les informations concernant notre nom de domaine.&lt;br /&gt;
&lt;br /&gt;
* nom du serveur: ns.banane.space&lt;br /&gt;
* adresse IP: 193.48.57.179&lt;br /&gt;
* serveurs de nom:&lt;br /&gt;
** DNS1: ns.banane.space&lt;br /&gt;
** DNS2: ns6.gandi.net (serveur secondaire de Gandi)&lt;br /&gt;
&lt;br /&gt;
Une fois ces étapes effectuées, nous pouvons passer à la configuration du DNS avec bind. On se place alors dans le dossier /etc/bind de notre machine virtuelle.&lt;br /&gt;
Nous modifions dans un premier temps le fichier named.conf.local afin d'y créer nos zones :&lt;br /&gt;
&lt;br /&gt;
 root@IMA5-BANANE:/etc/bind# vim /etc/bind/named.conf.local&lt;br /&gt;
 zone &amp;quot;banane.space&amp;quot; IN {&lt;br /&gt;
             type master;&lt;br /&gt;
             file &amp;quot;/etc/bind/db.banane.space&amp;quot;;&lt;br /&gt;
        };&lt;br /&gt;
&lt;br /&gt;
On créée ensuite le fichier db.banane.space:&lt;br /&gt;
&lt;br /&gt;
 $TTL    604800&lt;br /&gt;
 @       IN      SOA     ns.banane.space. root.banane.space. (&lt;br /&gt;
                       2016113007       ; Serial&lt;br /&gt;
                         604800         ; Refresh&lt;br /&gt;
                          86400         ; Retry&lt;br /&gt;
                        2419200         ; Expire&lt;br /&gt;
                         604800 )       ; Negative Cache TTL&lt;br /&gt;
 ;&lt;br /&gt;
 @       IN      NS      ns.banane.space. &lt;br /&gt;
 @       IN      NS      ns6.gandi.net.&lt;br /&gt;
 ns      IN      A       193.48.57.179&lt;br /&gt;
 www     IN      A       193.48.57.179&lt;br /&gt;
 @       IN      A       193.48.57.179&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
 root@IMA5-BANANE:/etc/bind# vim /etc/resolv.conf&lt;br /&gt;
 search banane.space&lt;br /&gt;
 nameserver 193.48.57.179&lt;br /&gt;
&lt;br /&gt;
=====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;''DNS SEC''&amp;lt;/span&amp;gt;=====&lt;br /&gt;
&lt;br /&gt;
Génération des clefs asymétriques: &lt;br /&gt;
&lt;br /&gt;
 dnssec-keygen -a RSASHA1 -b 2048 -r /dev/urandom -f KSK -n ZONE banane.space&lt;br /&gt;
 dnssec-keygen -a RSASHA1 -b 1024 -r /dev/urandom -n ZONE banane.space&lt;br /&gt;
&lt;br /&gt;
On modifie le nom des clefs: &lt;br /&gt;
&lt;br /&gt;
 /etc/bind/banane.space.dnssec# ls&lt;br /&gt;
 ????&lt;br /&gt;
&lt;br /&gt;
Nous signons ensuite les zones:&lt;br /&gt;
&lt;br /&gt;
 dnssec-signzone -o banane.space -k banane.space-ksk &lt;br /&gt;
 ../db.banane.space banane.space-zsk&lt;br /&gt;
&lt;br /&gt;
Pour finir nous ajoutons la clef KSK sur Gandi avec l'algorithme RSA/SHA1.&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;Sécurisation des données&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
Nous créons trois nouvelles partitions qui vont représenter nos disques.&lt;br /&gt;
&lt;br /&gt;
    1) vi /etc/xen/IMA5-BANANE.cfg&lt;br /&gt;
       lvcreate -L 10G -n /dev/virtual/banane-1 -v&lt;br /&gt;
       lvcreate -L 10G -n /dev/virtual/banane-2 -v&lt;br /&gt;
       lvcreate -L 10G -n /dev/virtual/banane-3 -v&lt;br /&gt;
&lt;br /&gt;
Nous ajoutons ces partitions dans la machine virtuelle via le fichier IMA5-BANANe.conf&lt;br /&gt;
&lt;br /&gt;
       root@cordouan:~# cat /etc/xen/IMA5-BANANE.cfg&lt;br /&gt;
       #&lt;br /&gt;
       # Configuration file for the Xen instance IMA5-BANANE, created&lt;br /&gt;
       # by xen-tools 4.5 on Mon Sep 11 19:01:21 2017.&lt;br /&gt;
       #&lt;br /&gt;
       #&lt;br /&gt;
       #  Kernel + memory size&lt;br /&gt;
       #&lt;br /&gt;
       kernel      = '/boot/vmlinuz-3.16.0-4-amd64'&lt;br /&gt;
       extra       = 'elevator=noop'&lt;br /&gt;
       ramdisk     = '/boot/initrd.img-3.16.0-4-amd64'&lt;br /&gt;
       vcpus       = '1'&lt;br /&gt;
       memory      = '512'&lt;br /&gt;
       #&lt;br /&gt;
       #  Disk device(s).&lt;br /&gt;
       #&lt;br /&gt;
       root        = '/dev/xvda2 ro'&lt;br /&gt;
       disk        = [&lt;br /&gt;
                  'file:/usr/local/xen/domains/IMA5-BANANE/disk.img,xvda2,w',&lt;br /&gt;
                  'file:/usr/local/xen/domains/IMA5-BANANE/swap.img,xvda1,w',&lt;br /&gt;
                  'phy:/dev/virtual/IMA5-BANANE-home,xvdb1,w',&lt;br /&gt;
  		  'phy:/dev/virtual/IMA5-BANANE-var,xvdc1,w',&lt;br /&gt;
                  'phy:/dev/virtual/banane-1,xvdd,w',&lt;br /&gt;
                  'phy:/dev/virtual/banane-2,xvde,w',&lt;br /&gt;
                  'phy:/dev/virtual/banane-3,xvdf,w',		 &lt;br /&gt;
       #&lt;br /&gt;
       #  Physical volumes&lt;br /&gt;
       #&lt;br /&gt;
       #&lt;br /&gt;
       #  Hostname&lt;br /&gt;
       #&lt;br /&gt;
       name        = 'IMA5-BANANE'  &lt;br /&gt;
       #&lt;br /&gt;
       #  Networking&lt;br /&gt;
       #&lt;br /&gt;
       vif         = [ 'ip=193.48.57.179/28 ,mac=00:16:3E:56:71:47,bridge=IMA5sc' ]       &lt;br /&gt;
       #&lt;br /&gt;
       #  Behaviour&lt;br /&gt;
       on_poweroff = 'destroy'&lt;br /&gt;
       on_reboot   = 'restart'&lt;br /&gt;
       on_crash    = 'restart'&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    2) xl console IMA5-BANANE&lt;br /&gt;
&lt;br /&gt;
On relance la MV IMA5-BANANE.&lt;br /&gt;
&lt;br /&gt;
    3) apt-get install mdadm&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite installé l paquetage mdadm puis rebooté la MV.&lt;br /&gt;
&lt;br /&gt;
    4) mdadm --create /dev/md0 --level=5 --assume-clean --raid-devices=3 /dev/xvdd /dev/xvde /dev/xvdf&lt;br /&gt;
&lt;br /&gt;
Nous créons le volume /dev/md0 pour créer un RAID5 logiciel avec les trois partitions obtenues. On sauvegarde ensuite la configuration actelle.&lt;br /&gt;
 root@IMA5-BANANE:~# mdadm --detail --scan &amp;gt;&amp;gt; /etc/mdadm/mdadm.conf&lt;br /&gt;
 root@IMA5-BANANE:~# mkfs /dev/md0&lt;br /&gt;
 root@IMA5-BANANE:~# mkdir /datamd0&lt;br /&gt;
 root@IMA5-BANANE:/datamd0# mount /dev/md0 /datamd0/&lt;br /&gt;
&lt;br /&gt;
Ensuite il faut éditer le fichier /etc/fstab en rajoutant la ligne suivante à la fin du fichier afin d'être sûr que la partition soit encore montée après le reboot:&lt;br /&gt;
 /dev/md0 /datamd0&lt;br /&gt;
&lt;br /&gt;
Nous créons un fichier texte sur le raid5:&lt;br /&gt;
 root@IMA5-BANANE:/datamd0# vim raid5test.txt&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour avoir le détail de la configuration actuelle:&lt;br /&gt;
&lt;br /&gt;
    5) root@IMA5-BANANE:~# mdadm --detail /dev/md0&lt;br /&gt;
 /dev/md0:&lt;br /&gt;
        Version : 1.2&lt;br /&gt;
  Creation Time : Wed Oct 25 18:27:13 2017&lt;br /&gt;
     Raid Level : raid5&lt;br /&gt;
     Array Size : 2095104 (2046.34 MiB 2145.39 MB)&lt;br /&gt;
  Used Dev Size : 1047552 (1023.17 MiB 1072.69 MB)&lt;br /&gt;
   Raid Devices : 3&lt;br /&gt;
  Total Devices : 3&lt;br /&gt;
    Persistence : Superblock is persistent&lt;br /&gt;
    Update Time : Wed Oct 25 17:03:20 2017&lt;br /&gt;
          State : clean &lt;br /&gt;
 Active Devices : 3&lt;br /&gt;
 Working Devices : 3&lt;br /&gt;
 Failed Devices : 0&lt;br /&gt;
  Spare Devices : 0&lt;br /&gt;
         Layout : left-symmetric&lt;br /&gt;
     Chunk Size : 512K&lt;br /&gt;
           Name : IMA5-BANANE:0  (local to host IMA5-BANANE)&lt;br /&gt;
           UUID : b70ad336:fb198d84:a5909f1c:f4b33229&lt;br /&gt;
         Events : 2&lt;br /&gt;
    Number   Major   Minor   RaidDevice State&lt;br /&gt;
       0     202       48        0      active sync   /dev/xvdd&lt;br /&gt;
       1     202       64        1      active sync   /dev/xvde&lt;br /&gt;
       2     202       80        2      active sync   /dev/xvdf&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    6) root@IMA5-BANANE:~# mdadm --detail /dev/md0&lt;br /&gt;
 /dev/md0:&lt;br /&gt;
        Version : 1.2&lt;br /&gt;
  Creation Time : Wed Oct 25 18:27:13 2017&lt;br /&gt;
     Raid Level : raid5&lt;br /&gt;
     Array Size : 2095104 (2046.34 MiB 2145.39 MB)&lt;br /&gt;
  Used Dev Size : 1047552 (1023.17 MiB 1072.69 MB)&lt;br /&gt;
   Raid Devices : 3&lt;br /&gt;
  Total Devices : 2&lt;br /&gt;
    Persistence : Superblock is persistent&lt;br /&gt;
    Update Time : Wed Oct 25 18:51:56 2017&lt;br /&gt;
          State : clean, degraded &lt;br /&gt;
 Active Devices : 2&lt;br /&gt;
 Working Devices : 2&lt;br /&gt;
 Failed Devices : 0&lt;br /&gt;
  Spare Devices : 0&lt;br /&gt;
         Layout : left-symmetric&lt;br /&gt;
     Chunk Size : 512K&lt;br /&gt;
           Name : IMA5-BANANE:0  (local to host IMA5-BANANE)&lt;br /&gt;
           UUID : b70ad336:fb198d84:a5909f1c:f4b33229&lt;br /&gt;
         Events : 12&lt;br /&gt;
    Number   Major   Minor   RaidDevice State&lt;br /&gt;
       0       0        0        0      removed&lt;br /&gt;
       1     202       64        1      active sync   /dev/xvde&lt;br /&gt;
       2     202       80        2      active sync   /dev/xvdf&lt;br /&gt;
&lt;br /&gt;
Nous arrêtons la MV, mettons en commentaire la 1ère partition dans le fichier de configuration, puis redémarrons la machine.&lt;br /&gt;
&lt;br /&gt;
On voit bien qu'une partition a été supprimée mais que le fichier créé auparavant est toujours présent:&lt;br /&gt;
&lt;br /&gt;
 root@IMA5-BANANE:~# ls /datamd0/&lt;br /&gt;
 raid5test.txt&lt;br /&gt;
&lt;br /&gt;
Pour le test de réparation, afin de bien voir l'avancement de la reconstruction, nous avons procédé comme dans l'exemple du cours: Suppression de la partition xvdd:&lt;br /&gt;
&lt;br /&gt;
 root@IMA5-BANANE:~# mdadm --set-faulty /dev/md0 /dev/xvdd&lt;br /&gt;
 root@IMA5-BANANE:~# mdadm --remove /dev/md0 /dev/xvdd&lt;br /&gt;
 La partition est bien supprimée:&lt;br /&gt;
 Personalities : [raid6] [raid5] [raid4] &lt;br /&gt;
 md0 : active raid5 xvde[1] xvdf[2]&lt;br /&gt;
      2095104 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/2] [UU_]&lt;br /&gt;
&lt;br /&gt;
On remet à présent la partition supprimée:&lt;br /&gt;
 root@IMA5-BANANE:~# mdadm --add /dev/md0 /dev/xvdd&lt;br /&gt;
&lt;br /&gt;
On essaie ensuite de remonter le RAID5 et on peut constater l'avancement de la reconstruction en lançant la même commande assez régulièrement:&lt;br /&gt;
&lt;br /&gt;
    7) root@IMA5-BANANE:~# cat /proc/mdstat&lt;br /&gt;
 Personalities : [raid6] [raid5] [raid4] &lt;br /&gt;
 md0 : active raid5 xvdd[3] xvde[1] xvdf[2]&lt;br /&gt;
      2095104 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/2] [_UU]&lt;br /&gt;
      [===========&amp;gt;.........]  recovery = 59.7% (627140/1047552) finish=0.2min speed=28506K/sec&lt;br /&gt;
 unused devices: &amp;lt;none&amp;gt;&lt;br /&gt;
 root@IMA5-BANANE:~# cat /proc/mdstat&lt;br /&gt;
 Personalities : [raid6] [raid5] [raid4] &lt;br /&gt;
 md0 : active raid5 xvdd[3] xvde[1] xvdf[2]&lt;br /&gt;
      2095104 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/2] [_UU]&lt;br /&gt;
      [============&amp;gt;........]  recovery = 64.5% (676392/1047552) finish=0.2min speed=29408K/sec     &lt;br /&gt;
 unused devices: &amp;lt;none&amp;gt;&lt;br /&gt;
 root@IMA5-BANANE:~# cat /proc/mdstat&lt;br /&gt;
 Personalities : [raid6] [raid5] [raid4] &lt;br /&gt;
 md0 : active raid5 xvdd[3] xvde[1] xvdf[2]&lt;br /&gt;
      2095104 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/2] [_UU]&lt;br /&gt;
      [=============&amp;gt;.......]  recovery = 66.2% (695080/1047552) finish=0.2min speed=28961K/sec     &lt;br /&gt;
 unused devices: &amp;lt;none&amp;gt;&lt;br /&gt;
 root@IMA5-BANANE:~# cat /proc/mdstat&lt;br /&gt;
 Personalities : [raid6] [raid5] [raid4] &lt;br /&gt;
 md0 : active raid5 xvdd[3] xvde[1] xvdf[2]&lt;br /&gt;
      2095104 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/2] [_UU]&lt;br /&gt;
      [=============&amp;gt;.......]  recovery = 68.1% (714664/1047552) finish=0.1min speed=28586K/sec&lt;br /&gt;
 unused devices: &amp;lt;none&amp;gt;&lt;br /&gt;
 root@IMA5-BANANE:~# cat /proc/mdstat&lt;br /&gt;
 Personalities : [raid6] [raid5] [raid4] &lt;br /&gt;
 md0 : active raid5 xvdd[3] xvde[1] xvdf[2]&lt;br /&gt;
      2095104 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/2] [_UU]&lt;br /&gt;
      [==================&amp;gt;..]  recovery = 94.6% (991996/1047552) finish=0.0min speed=29206K/sec   &lt;br /&gt;
 unused devices: &amp;lt;none&amp;gt;&lt;br /&gt;
 root@IMA5-BANANE:~# cat /proc/mdstat&lt;br /&gt;
 Personalities : [raid6] [raid5] [raid4] &lt;br /&gt;
 md0 : active raid5 xvdd[3] xvde[1] xvdf[2]&lt;br /&gt;
      2095104 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/3] [UUU]     &lt;br /&gt;
 unused devices: &amp;lt;none&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;Cryptage des données&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
 cryptsetup luksFormat -c aes -h sha256 /dev/mmcblk1&lt;br /&gt;
 cryptsetup luksOpen /dev/sdb1 crypt_sd&lt;br /&gt;
 mkfs.ext4 /dev/mapper/crypt_sd&lt;br /&gt;
 mount /dev/mapper/crypt_sd /mnt&lt;br /&gt;
 vi /mnt/test.txt #on marque un texte dans le fichier&lt;br /&gt;
 umount /mnt&lt;br /&gt;
 cryptsetup luksClose crypt_sd&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;Mise en réseau de la MV Xen IMA5-BANANE&amp;lt;/span&amp;gt;====&lt;/div&gt;</summary>
		<author><name>Hdelatte</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=Cahier_2017_groupe_n%C2%B05&amp;diff=46345</id>
		<title>Cahier 2017 groupe n°5</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=Cahier_2017_groupe_n%C2%B05&amp;diff=46345"/>
				<updated>2017-11-17T13:41:42Z</updated>
		
		<summary type="html">&lt;p&gt;Hdelatte : /* Sécurisation des données */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Présentation générale'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;Mise en contexte&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
Le projet de Réseau Avancé est composé d'une partie commune et d'une tâche particulière par binôme. Ce projet consiste en la configuration d'une architecture réseau avec différentes parties, en plus du câblage et de la configuration des routeurs et commutateurs.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
La partie commune consiste en la création et la mise en réseau d'une machine virtuelle; ainsi que la création d'un site sécurisé avec la configuration du serveur SSH, DNS sécurisé et du certificat SSL. La virtualisation permet de faire fonctionner sur une même machine plusieurs OS isolés ou des logiciels grâce aux machines virtuelles. Au-delà de la réduction des coûts, la virtualisation permet aussi de manipuler et gérer plus facilement des OS. Cependant, on s'oriente de plus en plus vers l'isolation par des conteneurs car ils permettent au sein d'un même OS, d'isoler les ressources matérielles et d'éviter des surcharges.&lt;br /&gt;
&lt;br /&gt;
Notre tâche particulière est donc de réaliser la gestion des conteneurs au sein d'une machine virtuelle configurée en réseau.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;Tâches à effectuer&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
* Création d'une machine virtuelle sur le serveur de virtualisation Cordouan&lt;br /&gt;
* Mettre la machine virtuelle en réseau&lt;br /&gt;
* Configuration des services Internet (Serveur SSH, DNS, DNSSEC, Certificat SSL)&lt;br /&gt;
* Crackage de clé Wi-Fi&lt;br /&gt;
* Créer les différents conteneurs et configurer leur accès au réseau (tâche particulière)&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Travail effectué'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
                     &lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;Création d'une machine virtuelle Xen sur Cordouan&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
On commence par créer une machine virtuelle Xen sur le serveur de virtualisation cordouan.insecserv.deule.net. On se connecte tout d'abord en SSH sur le serveur cordouan.&lt;br /&gt;
&lt;br /&gt;
    1) ssh root@cordouan.insecserv.deule.net&lt;br /&gt;
       Mot de passe: mot de passe root habituel&lt;br /&gt;
&lt;br /&gt;
On précise:&lt;br /&gt;
&lt;br /&gt;
* le nom de machine virtuelle: IMA5-BANANE&lt;br /&gt;
* son adresse IP sur le réseau: 193.48.57.179/28&lt;br /&gt;
* le répertoire où créer les disques virtuels: /usr/local/xen&lt;br /&gt;
* le miroir Debian: http://debian.polytech-lille.fr/debian&lt;br /&gt;
* la distribution: jessie (qui est la distribution stable courante)&lt;br /&gt;
&lt;br /&gt;
    2) xen-create-image --hostname=&amp;lt;IMA5-BANANE&amp;gt; --ip 193.48.57.179/28 --dir /usr/local/xen --netmask=255.255.255.240 --gateway=193.48.57.177 --mirror=http://debian.polytech-lille.fr/debian/ --dist=jessie&lt;br /&gt;
&lt;br /&gt;
On modifie le fichier de configuration de la machine virtuelle pour faire en sorte que les répertoires var et home de la machine virtuelle soient sur des partitions LVM de l'hôte. Installez les paquetages nécessaires pour SSH, le serveur Web apache2 et le serveur DNS bind (voir la partie services).&lt;br /&gt;
&lt;br /&gt;
    3) xl create /etc/xen/IMA5-BANANE.cfg&lt;br /&gt;
       vi /etc/xen/IMA5-BANANE.cfg&lt;br /&gt;
       lvcreate -L 10G -n /dev/virtual/IMA5-BANANE-home -v&lt;br /&gt;
       lvcreate -L 10G -n /dev/virtual/IMA5-BANANE-var -v&lt;br /&gt;
&lt;br /&gt;
       root@cordouan:~# cat /etc/xen/IMA5-BANANE.cfg&lt;br /&gt;
       #&lt;br /&gt;
       # Configuration file for the Xen instance IMA5-BANANE, created&lt;br /&gt;
       # by xen-tools 4.5 on Mon Sep 11 19:01:21 2017.&lt;br /&gt;
       #&lt;br /&gt;
       #&lt;br /&gt;
       #  Kernel + memory size&lt;br /&gt;
       #&lt;br /&gt;
       kernel      = '/boot/vmlinuz-3.16.0-4-amd64'&lt;br /&gt;
       extra       = 'elevator=noop'&lt;br /&gt;
       ramdisk     = '/boot/initrd.img-3.16.0-4-amd64'&lt;br /&gt;
       vcpus       = '1'&lt;br /&gt;
       memory      = '512'&lt;br /&gt;
       #&lt;br /&gt;
       #  Disk device(s).&lt;br /&gt;
       #&lt;br /&gt;
       root        = '/dev/xvda2 ro'&lt;br /&gt;
       disk        = [&lt;br /&gt;
                  'file:/usr/local/xen/domains/IMA5-BANANE/disk.img,xvda2,w',&lt;br /&gt;
                  'file:/usr/local/xen/domains/IMA5-BANANE/swap.img,xvda1,w',&lt;br /&gt;
                  'phy:/dev/virtual/IMA5-BANANE-home,xvdb1,w',&lt;br /&gt;
  		  'phy:/dev/virtual/IMA5-BANANE-var,xvdc1,w',		 &lt;br /&gt;
       #&lt;br /&gt;
       #  Physical volumes&lt;br /&gt;
       #&lt;br /&gt;
       #&lt;br /&gt;
       #  Hostname&lt;br /&gt;
       #&lt;br /&gt;
       name        = 'IMA5-BANANE'  &lt;br /&gt;
       #&lt;br /&gt;
       #  Networking&lt;br /&gt;
       #&lt;br /&gt;
       vif         = [ 'ip=193.48.57.179/28 ,mac=00:16:3E:56:71:47,bridge=IMA5sc' ]       &lt;br /&gt;
       #&lt;br /&gt;
       #  Behaviour&lt;br /&gt;
       on_poweroff = 'destroy'&lt;br /&gt;
       on_reboot   = 'restart'&lt;br /&gt;
       on_crash    = 'restart'&lt;br /&gt;
&lt;br /&gt;
On modifie le fichier de configuration en faisant en sorte que les répertoires var et home de la machine virtuelle soient sur des partitions LVM de l'hôte:&lt;br /&gt;
&lt;br /&gt;
* la mémoire attribuée: 512 Mo&lt;br /&gt;
* l'adresse ip de la MV: 193.48.57.179/28&lt;br /&gt;
* bridge: IMA5sc&lt;br /&gt;
&lt;br /&gt;
    4) xl list&lt;br /&gt;
&lt;br /&gt;
       root@cordouan:~# xl list&lt;br /&gt;
       Name                                        ID   Mem VCPUs	State	Time(s)&lt;br /&gt;
       Domain-0                                     0  1993     8     r-----   52219.3&lt;br /&gt;
       karmeliett                                   1   128     1     -b----    2483.6&lt;br /&gt;
       duvel                                        2   512     1     -b----    4225.6&lt;br /&gt;
       deus                                         3   512     1     -b----    4226.4&lt;br /&gt;
       trappe                                       4   512     1     -b----    4082.4&lt;br /&gt;
       Rincecochon                                  6   512     1     -b----    3788.2&lt;br /&gt;
       IMA5-Durian                                 62   512     1     -b----    3237.7&lt;br /&gt;
       IMA5-BANANE                                 84   512     1     -b----     152.9&lt;br /&gt;
       IMA5-Papaye                                 89   512     1     -b----      35.4&lt;br /&gt;
       IMA5-Ananas                                 91   512     1     -b----      27.0&lt;br /&gt;
&lt;br /&gt;
On vérifie que la MV IMA5-BANANE a bien été créée.&lt;br /&gt;
&lt;br /&gt;
    5) xl console IMA5-BANANE&lt;br /&gt;
&lt;br /&gt;
On lance IMA5-BANANE en utilisant le log root et le mot de passe configuré.&lt;br /&gt;
&lt;br /&gt;
Commandes de base pour démarrer la VM proprement: &lt;br /&gt;
&lt;br /&gt;
 ssh root@cordouan.insecserv.deule.net&lt;br /&gt;
 xl create /etc/xen/IMA5-BANANE.cfg&lt;br /&gt;
 ssh username@weppes&lt;br /&gt;
 ssh root@193.48.57.179&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;Services Internet (SSH, DNS sécurisé et certificat SSL)&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
On configure à présent les services Internet après avoir acheté un nom de domaine (https://www.banane.space) sur gandi.net pour créer notre site Web sécurisé.&lt;br /&gt;
&lt;br /&gt;
=====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;''Serveur SSH''&amp;lt;/span&amp;gt;=====&lt;br /&gt;
&lt;br /&gt;
Sur notre machine virtuelle, nous avons configuré le fichier sshd_config (PubkeyAuthentication ) :&lt;br /&gt;
&lt;br /&gt;
       root@IMA5-BANANE:~# vim /etc/ssh/sshd_config&lt;br /&gt;
       &lt;br /&gt;
       RSAAuthentication yes&lt;br /&gt;
       PubkeyAuthentication yes&lt;br /&gt;
       #AuthorizedKeysFile     %h/.ssh/authorized_keys&lt;br /&gt;
       PermitRootLogin yes&lt;br /&gt;
       &lt;br /&gt;
       root@IMA5-BANANE:~# service ssh restart&lt;br /&gt;
&lt;br /&gt;
=====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;''Certification SSL''&amp;lt;/span&amp;gt;=====&lt;br /&gt;
Nous commencons par acheter un certificat SSL. Puis, sur la VM nous générons le CSR grâce à cette commande:&lt;br /&gt;
&lt;br /&gt;
 root@IMA5-BANANE:/etc/apache2/sites-available/clef# openssl req -nodes -newkey rsa:2048 -sha256 -keyout banane.key -out banane.csr&lt;br /&gt;
 Generating a 2048 bit RSA private key&lt;br /&gt;
 If you enter '.', the field will be left blank.&lt;br /&gt;
 -----&lt;br /&gt;
 Country Name (2 letter code) [AU]:FR&lt;br /&gt;
 State or Province Name (full name) [Some-State]:Nord&lt;br /&gt;
 Locality Name (eg, city) []:Lille&lt;br /&gt;
 Organization Name (eg, company) [Internet Widgits Pty Ltd]:PolytechLille&lt;br /&gt;
 Organizational Unit Name (eg, section) []:IMA&lt;br /&gt;
 Common Name (e.g. server FQDN or YOUR name) []:banane.space&lt;br /&gt;
 Email Address []:&lt;br /&gt;
 A challenge password []:&lt;br /&gt;
 An optional company name []:&lt;br /&gt;
 root@IMA5-BANANE:/etc/apache2/sites-available/clef# ls banane.csr banane.key&lt;br /&gt;
 root@IMA5-BANANE:/etc/apache2/sites-available/clef# cat banane.csr&lt;br /&gt;
 -----BEGIN CERTIFICATE REQUEST-----&lt;br /&gt;
 &amp;lt;CSR à renseigner sur Gandi lors de l'achat du certificat&amp;gt;&lt;br /&gt;
 -----END CERTIFICATE REQUEST-----&lt;br /&gt;
&lt;br /&gt;
Pour recevoir le mail contenant le lien pour activer le certificat, nous installons les packages suivants :&lt;br /&gt;
&lt;br /&gt;
 root@IMA5-BANANE:~# apt-get install postfix mailx&lt;br /&gt;
&lt;br /&gt;
Une fois le certificat récupéré, nous les copions tous dans le bon répertoire, puis nous hashons le tout :&lt;br /&gt;
&lt;br /&gt;
 root@IMA5-BANANE:/etc/bind# cp certificat.crt /etc/ssl/certs/banane.space.crt&lt;br /&gt;
 root@IMA5-BANANE:/etc/bind# cp serveur.key /etc/ssl/private/banane.space.key&lt;br /&gt;
 root@IMA5-BANANE:/etc/bind# cp GandiStandardSSLCA2.pem /etc/ssl/certs/GandiStandardSSLCA2.pem&lt;br /&gt;
 root@IMA5-BANANE:/etc/bind# c_rehash /etc/ssl/certs&lt;br /&gt;
&lt;br /&gt;
Enfin, la dernière étape consiste en la modification des fichiers 000-banane.space-ssl.conf et ports.conf :&lt;br /&gt;
&lt;br /&gt;
 root@IMA5-BANANE:/etc/apache2/sites-available# cat 000-banane.space-ssl.conf &lt;br /&gt;
     &amp;lt;VirtualHost *:443&amp;gt;&lt;br /&gt;
         ServerName www.banane.space&lt;br /&gt;
         ServerAlias banane.space&lt;br /&gt;
         DocumentRoot /var/www/&lt;br /&gt;
         CustomLog /var/log/apache2/secure_access.log combined&lt;br /&gt;
         SSLEngine on&lt;br /&gt;
         SSLCertificateFile /etc/ssl/certs/banane.space.crt&lt;br /&gt;
         SSLCertificateKeyFile /etc/ssl/private/banane.space.key&lt;br /&gt;
         SSLCertificateChainFile /etc/ssl/certs/GandiStandardSSLCA2.pem&lt;br /&gt;
         SSLVerifyClient None&lt;br /&gt;
     &amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 root@IMA5-BANANE:/etc/apache2# cat ports.conf &lt;br /&gt;
 Listen 80&lt;br /&gt;
 &amp;lt;IfModule ssl_module&amp;gt;&lt;br /&gt;
 Listen 443&lt;br /&gt;
 &amp;lt;/IfModule&amp;gt;&lt;br /&gt;
 &amp;lt;IfModule mod_gnutls.c&amp;gt;&lt;br /&gt;
 Listen 443&lt;br /&gt;
 &amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Un redémarrage du service apache2 est maintenant nécessaire :&lt;br /&gt;
&lt;br /&gt;
 root@IMA5-BANANE:/etc/apache2# service apache2 stop&lt;br /&gt;
 root@IMA5-BANANE:/etc/apache2# service apache2 start&lt;br /&gt;
 root@IMA5-BANANE:/etc/apache2# service apache2 reload&lt;br /&gt;
&lt;br /&gt;
Nous pouvons voir que notre site est maintenant sécurisé, un cadenas vert est bien présent.&lt;br /&gt;
&lt;br /&gt;
=====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;''Serveur DNS''&amp;lt;/span&amp;gt;=====&lt;br /&gt;
&lt;br /&gt;
On commence par modifier les informations de notre nom de domaine sur le site de Gandi. Ensuite, dans ''&amp;quot;Gérer les Glue Records&amp;quot;'', nous modifions les informations concernant notre nom de domaine.&lt;br /&gt;
&lt;br /&gt;
* nom du serveur: ns.banane.space&lt;br /&gt;
* adresse IP: 193.48.57.179&lt;br /&gt;
* serveurs de nom:&lt;br /&gt;
** DNS1: ns.banane.space&lt;br /&gt;
** DNS2: ns6.gandi.net (serveur secondaire de Gandi)&lt;br /&gt;
&lt;br /&gt;
Une fois ces étapes effectuées, nous pouvons passer à la configuration du DNS avec bind. On se place alors dans le dossier /etc/bind de notre machine virtuelle.&lt;br /&gt;
Nous modifions dans un premier temps le fichier named.conf.local afin d'y créer nos zones :&lt;br /&gt;
&lt;br /&gt;
 root@IMA5-BANANE:/etc/bind# vim /etc/bind/named.conf.local&lt;br /&gt;
 zone &amp;quot;banane.space&amp;quot; IN {&lt;br /&gt;
             type master;&lt;br /&gt;
             file &amp;quot;/etc/bind/db.banane.space&amp;quot;;&lt;br /&gt;
        };&lt;br /&gt;
&lt;br /&gt;
On créée ensuite le fichier db.banane.space:&lt;br /&gt;
&lt;br /&gt;
 $TTL    604800&lt;br /&gt;
 @       IN      SOA     ns.banane.space. root.banane.space. (&lt;br /&gt;
                       2016113007       ; Serial&lt;br /&gt;
                         604800         ; Refresh&lt;br /&gt;
                          86400         ; Retry&lt;br /&gt;
                        2419200         ; Expire&lt;br /&gt;
                         604800 )       ; Negative Cache TTL&lt;br /&gt;
 ;&lt;br /&gt;
 @       IN      NS      ns.banane.space. &lt;br /&gt;
 @       IN      NS      ns6.gandi.net.&lt;br /&gt;
 ns      IN      A       193.48.57.179&lt;br /&gt;
 www     IN      A       193.48.57.179&lt;br /&gt;
 @       IN      A       193.48.57.179&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
 root@IMA5-BANANE:/etc/bind# vim /etc/resolv.conf&lt;br /&gt;
 search banane.space&lt;br /&gt;
 nameserver 193.48.57.179&lt;br /&gt;
&lt;br /&gt;
=====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;''DNS SEC''&amp;lt;/span&amp;gt;=====&lt;br /&gt;
&lt;br /&gt;
Génération des clefs asymétriques: &lt;br /&gt;
&lt;br /&gt;
 dnssec-keygen -a RSASHA1 -b 2048 -r /dev/urandom -f KSK -n ZONE banane.space&lt;br /&gt;
 dnssec-keygen -a RSASHA1 -b 1024 -r /dev/urandom -n ZONE banane.space&lt;br /&gt;
&lt;br /&gt;
On modifie le nom des clefs: &lt;br /&gt;
&lt;br /&gt;
 /etc/bind/banane.space.dnssec# ls&lt;br /&gt;
 ????&lt;br /&gt;
&lt;br /&gt;
Nous signons ensuite les zones:&lt;br /&gt;
&lt;br /&gt;
 dnssec-signzone -o banane.space -k banane.space-ksk &lt;br /&gt;
 ../db.banane.space banane.space-zsk&lt;br /&gt;
&lt;br /&gt;
Pour finir nous ajoutons la clef KSK sur Gandi avec l'algorithme RSA/SHA1.&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;Sécurisation des données&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
Nous créons trois nouvelles partitions qui vont représenter nos disques.&lt;br /&gt;
&lt;br /&gt;
    1) vi /etc/xen/IMA5-BANANE.cfg&lt;br /&gt;
       lvcreate -L 10G -n /dev/virtual/banane-1 -v&lt;br /&gt;
       lvcreate -L 10G -n /dev/virtual/banane-2 -v&lt;br /&gt;
       lvcreate -L 10G -n /dev/virtual/banane-3 -v&lt;br /&gt;
&lt;br /&gt;
Nous ajoutons ces partitions dans la machine virtuelle via le fichier IMA5-BANANe.conf&lt;br /&gt;
&lt;br /&gt;
       root@cordouan:~# cat /etc/xen/IMA5-BANANE.cfg&lt;br /&gt;
       #&lt;br /&gt;
       # Configuration file for the Xen instance IMA5-BANANE, created&lt;br /&gt;
       # by xen-tools 4.5 on Mon Sep 11 19:01:21 2017.&lt;br /&gt;
       #&lt;br /&gt;
       #&lt;br /&gt;
       #  Kernel + memory size&lt;br /&gt;
       #&lt;br /&gt;
       kernel      = '/boot/vmlinuz-3.16.0-4-amd64'&lt;br /&gt;
       extra       = 'elevator=noop'&lt;br /&gt;
       ramdisk     = '/boot/initrd.img-3.16.0-4-amd64'&lt;br /&gt;
       vcpus       = '1'&lt;br /&gt;
       memory      = '512'&lt;br /&gt;
       #&lt;br /&gt;
       #  Disk device(s).&lt;br /&gt;
       #&lt;br /&gt;
       root        = '/dev/xvda2 ro'&lt;br /&gt;
       disk        = [&lt;br /&gt;
                  'file:/usr/local/xen/domains/IMA5-BANANE/disk.img,xvda2,w',&lt;br /&gt;
                  'file:/usr/local/xen/domains/IMA5-BANANE/swap.img,xvda1,w',&lt;br /&gt;
                  'phy:/dev/virtual/IMA5-BANANE-home,xvdb1,w',&lt;br /&gt;
  		  'phy:/dev/virtual/IMA5-BANANE-var,xvdc1,w',&lt;br /&gt;
                  'phy:/dev/virtual/banane-1,xvdd,w',&lt;br /&gt;
                  'phy:/dev/virtual/banane-2,xvde,w',&lt;br /&gt;
                  'phy:/dev/virtual/banane-3,xvdf,w',		 &lt;br /&gt;
       #&lt;br /&gt;
       #  Physical volumes&lt;br /&gt;
       #&lt;br /&gt;
       #&lt;br /&gt;
       #  Hostname&lt;br /&gt;
       #&lt;br /&gt;
       name        = 'IMA5-BANANE'  &lt;br /&gt;
       #&lt;br /&gt;
       #  Networking&lt;br /&gt;
       #&lt;br /&gt;
       vif         = [ 'ip=193.48.57.179/28 ,mac=00:16:3E:56:71:47,bridge=IMA5sc' ]       &lt;br /&gt;
       #&lt;br /&gt;
       #  Behaviour&lt;br /&gt;
       on_poweroff = 'destroy'&lt;br /&gt;
       on_reboot   = 'restart'&lt;br /&gt;
       on_crash    = 'restart'&lt;br /&gt;
&lt;br /&gt;
On reconfigure le fichier IMA5-BANANE.cfg en créant 3 nouvelles partitions LVM banane-X de 1 Go associées à notre VM.&lt;br /&gt;
&lt;br /&gt;
    2) xl console IMA5-BANANE&lt;br /&gt;
&lt;br /&gt;
On relance la MV IMA5-BANANE.&lt;br /&gt;
&lt;br /&gt;
    3) apt-get install mdadm&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite installé l paquetage mdadm puis rebooté la MV.&lt;br /&gt;
&lt;br /&gt;
    4) mdadm --create /dev/md0 --level=5 --assume-clean --raid-devices=3 /dev/xvdd /dev/xvde /dev/xvdf&lt;br /&gt;
&lt;br /&gt;
Nous créons le volume /dev/md0 pour créer un RAID5 logiciel avec les trois partitions obtenues. On sauvegarde ensuite la configuration actelle.&lt;br /&gt;
 root@IMA5-BANANE:~# mdadm --detail --scan &amp;gt;&amp;gt; /etc/mdadm/mdadm.conf&lt;br /&gt;
 root@IMA5-BANANE:~# mkfs /dev/md0&lt;br /&gt;
 root@IMA5-BANANE:~# mkdir /datamd0&lt;br /&gt;
 root@IMA5-BANANE:/datamd0# mount /dev/md0 /datamd0/&lt;br /&gt;
&lt;br /&gt;
Ensuite il faut éditer le fichier /etc/fstab en rajoutant la ligne suivante à la fin du fichier afin d'être sûr que la partition soit encore montée après le reboot:&lt;br /&gt;
 /dev/md0 /datamd0&lt;br /&gt;
&lt;br /&gt;
Nous créons un fichier texte sur le raid5:&lt;br /&gt;
 root@IMA5-BANANE:/datamd0# vim raid5test.txt&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour avoir le détail de la configuration actuelle:&lt;br /&gt;
&lt;br /&gt;
    5) root@IMA5-BANANE:~# mdadm --detail /dev/md0&lt;br /&gt;
 /dev/md0:&lt;br /&gt;
        Version : 1.2&lt;br /&gt;
  Creation Time : Wed Oct 25 18:27:13 2017&lt;br /&gt;
     Raid Level : raid5&lt;br /&gt;
     Array Size : 2095104 (2046.34 MiB 2145.39 MB)&lt;br /&gt;
  Used Dev Size : 1047552 (1023.17 MiB 1072.69 MB)&lt;br /&gt;
   Raid Devices : 3&lt;br /&gt;
  Total Devices : 3&lt;br /&gt;
    Persistence : Superblock is persistent&lt;br /&gt;
    Update Time : Wed Oct 25 17:03:20 2017&lt;br /&gt;
          State : clean &lt;br /&gt;
 Active Devices : 3&lt;br /&gt;
 Working Devices : 3&lt;br /&gt;
 Failed Devices : 0&lt;br /&gt;
  Spare Devices : 0&lt;br /&gt;
         Layout : left-symmetric&lt;br /&gt;
     Chunk Size : 512K&lt;br /&gt;
           Name : IMA5-BANANE:0  (local to host IMA5-BANANE)&lt;br /&gt;
           UUID : b70ad336:fb198d84:a5909f1c:f4b33229&lt;br /&gt;
         Events : 2&lt;br /&gt;
    Number   Major   Minor   RaidDevice State&lt;br /&gt;
       0     202       48        0      active sync   /dev/xvdd&lt;br /&gt;
       1     202       64        1      active sync   /dev/xvde&lt;br /&gt;
       2     202       80        2      active sync   /dev/xvdf&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    6) root@IMA5-BANANE:~# mdadm --detail /dev/md0&lt;br /&gt;
 /dev/md0:&lt;br /&gt;
        Version : 1.2&lt;br /&gt;
  Creation Time : Wed Oct 25 18:27:13 2017&lt;br /&gt;
     Raid Level : raid5&lt;br /&gt;
     Array Size : 2095104 (2046.34 MiB 2145.39 MB)&lt;br /&gt;
  Used Dev Size : 1047552 (1023.17 MiB 1072.69 MB)&lt;br /&gt;
   Raid Devices : 3&lt;br /&gt;
  Total Devices : 2&lt;br /&gt;
    Persistence : Superblock is persistent&lt;br /&gt;
    Update Time : Wed Oct 25 18:51:56 2017&lt;br /&gt;
          State : clean, degraded &lt;br /&gt;
 Active Devices : 2&lt;br /&gt;
 Working Devices : 2&lt;br /&gt;
 Failed Devices : 0&lt;br /&gt;
  Spare Devices : 0&lt;br /&gt;
         Layout : left-symmetric&lt;br /&gt;
     Chunk Size : 512K&lt;br /&gt;
           Name : IMA5-BANANE:0  (local to host IMA5-BANANE)&lt;br /&gt;
           UUID : b70ad336:fb198d84:a5909f1c:f4b33229&lt;br /&gt;
         Events : 12&lt;br /&gt;
    Number   Major   Minor   RaidDevice State&lt;br /&gt;
       0       0        0        0      removed&lt;br /&gt;
       1     202       64        1      active sync   /dev/xvde&lt;br /&gt;
       2     202       80        2      active sync   /dev/xvdf&lt;br /&gt;
&lt;br /&gt;
Nous arrêtons la MV, mettons en commentaire la 1ère partition dans le fichier de configuration, puis redémarrons la machine.&lt;br /&gt;
&lt;br /&gt;
On voit bien qu'une partition a été supprimée mais que le fichier créé auparavant est toujours présent:&lt;br /&gt;
&lt;br /&gt;
 root@IMA5-BANANE:~# ls /datamd0/&lt;br /&gt;
 raid5test.txt&lt;br /&gt;
&lt;br /&gt;
Pour le test de réparation, afin de bien voir l'avancement de la reconstruction, nous avons procédé comme dans l'exemple du cours: Suppression de la partition xvdd:&lt;br /&gt;
&lt;br /&gt;
 root@IMA5-BANANE:~# mdadm --set-faulty /dev/md0 /dev/xvdd&lt;br /&gt;
 root@IMA5-BANANE:~# mdadm --remove /dev/md0 /dev/xvdd&lt;br /&gt;
 La partition est bien supprimée:&lt;br /&gt;
 Personalities : [raid6] [raid5] [raid4] &lt;br /&gt;
 md0 : active raid5 xvde[1] xvdf[2]&lt;br /&gt;
      2095104 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/2] [UU_]&lt;br /&gt;
&lt;br /&gt;
On remet à présent la partition supprimée:&lt;br /&gt;
 root@IMA5-BANANE:~# mdadm --add /dev/md0 /dev/xvdd&lt;br /&gt;
&lt;br /&gt;
On essaie ensuite de remonter le RAID5 et on peut constater l'avancement de la reconstruction en lançant la même commande assez régulièrement:&lt;br /&gt;
&lt;br /&gt;
    7) root@IMA5-BANANE:~# cat /proc/mdstat&lt;br /&gt;
 Personalities : [raid6] [raid5] [raid4] &lt;br /&gt;
 md0 : active raid5 xvdd[3] xvde[1] xvdf[2]&lt;br /&gt;
      2095104 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/2] [_UU]&lt;br /&gt;
      [===========&amp;gt;.........]  recovery = 59.7% (627140/1047552) finish=0.2min speed=28506K/sec&lt;br /&gt;
 unused devices: &amp;lt;none&amp;gt;&lt;br /&gt;
 root@IMA5-BANANE:~# cat /proc/mdstat&lt;br /&gt;
 Personalities : [raid6] [raid5] [raid4] &lt;br /&gt;
 md0 : active raid5 xvdd[3] xvde[1] xvdf[2]&lt;br /&gt;
      2095104 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/2] [_UU]&lt;br /&gt;
      [============&amp;gt;........]  recovery = 64.5% (676392/1047552) finish=0.2min speed=29408K/sec     &lt;br /&gt;
 unused devices: &amp;lt;none&amp;gt;&lt;br /&gt;
 root@IMA5-BANANE:~# cat /proc/mdstat&lt;br /&gt;
 Personalities : [raid6] [raid5] [raid4] &lt;br /&gt;
 md0 : active raid5 xvdd[3] xvde[1] xvdf[2]&lt;br /&gt;
      2095104 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/2] [_UU]&lt;br /&gt;
      [=============&amp;gt;.......]  recovery = 66.2% (695080/1047552) finish=0.2min speed=28961K/sec     &lt;br /&gt;
 unused devices: &amp;lt;none&amp;gt;&lt;br /&gt;
 root@IMA5-BANANE:~# cat /proc/mdstat&lt;br /&gt;
 Personalities : [raid6] [raid5] [raid4] &lt;br /&gt;
 md0 : active raid5 xvdd[3] xvde[1] xvdf[2]&lt;br /&gt;
      2095104 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/2] [_UU]&lt;br /&gt;
      [=============&amp;gt;.......]  recovery = 68.1% (714664/1047552) finish=0.1min speed=28586K/sec&lt;br /&gt;
 unused devices: &amp;lt;none&amp;gt;&lt;br /&gt;
 root@IMA5-BANANE:~# cat /proc/mdstat&lt;br /&gt;
 Personalities : [raid6] [raid5] [raid4] &lt;br /&gt;
 md0 : active raid5 xvdd[3] xvde[1] xvdf[2]&lt;br /&gt;
      2095104 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/2] [_UU]&lt;br /&gt;
      [==================&amp;gt;..]  recovery = 94.6% (991996/1047552) finish=0.0min speed=29206K/sec   &lt;br /&gt;
 unused devices: &amp;lt;none&amp;gt;&lt;br /&gt;
 root@IMA5-BANANE:~# cat /proc/mdstat&lt;br /&gt;
 Personalities : [raid6] [raid5] [raid4] &lt;br /&gt;
 md0 : active raid5 xvdd[3] xvde[1] xvdf[2]&lt;br /&gt;
      2095104 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/3] [UUU]     &lt;br /&gt;
 unused devices: &amp;lt;none&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;Cryptage des données&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
 cryptsetup luksFormat -c aes -h sha256 /dev/mmcblk1&lt;br /&gt;
 cryptsetup luksOpen /dev/sdb1 crypt_sd&lt;br /&gt;
 mkfs.ext4 /dev/mapper/crypt_sd&lt;br /&gt;
 mount /dev/mapper/crypt_sd /mnt&lt;br /&gt;
 vi /mnt/test.txt #on marque un texte dans le fichier&lt;br /&gt;
 umount /mnt&lt;br /&gt;
 cryptsetup luksClose crypt_sd&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;Mise en réseau de la MV Xen IMA5-BANANE&amp;lt;/span&amp;gt;====&lt;/div&gt;</summary>
		<author><name>Hdelatte</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=Cahier_2017_groupe_n%C2%B05&amp;diff=46344</id>
		<title>Cahier 2017 groupe n°5</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=Cahier_2017_groupe_n%C2%B05&amp;diff=46344"/>
				<updated>2017-11-17T13:39:11Z</updated>
		
		<summary type="html">&lt;p&gt;Hdelatte : /* DNS SEC */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Présentation générale'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;Mise en contexte&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
Le projet de Réseau Avancé est composé d'une partie commune et d'une tâche particulière par binôme. Ce projet consiste en la configuration d'une architecture réseau avec différentes parties, en plus du câblage et de la configuration des routeurs et commutateurs.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
La partie commune consiste en la création et la mise en réseau d'une machine virtuelle; ainsi que la création d'un site sécurisé avec la configuration du serveur SSH, DNS sécurisé et du certificat SSL. La virtualisation permet de faire fonctionner sur une même machine plusieurs OS isolés ou des logiciels grâce aux machines virtuelles. Au-delà de la réduction des coûts, la virtualisation permet aussi de manipuler et gérer plus facilement des OS. Cependant, on s'oriente de plus en plus vers l'isolation par des conteneurs car ils permettent au sein d'un même OS, d'isoler les ressources matérielles et d'éviter des surcharges.&lt;br /&gt;
&lt;br /&gt;
Notre tâche particulière est donc de réaliser la gestion des conteneurs au sein d'une machine virtuelle configurée en réseau.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;Tâches à effectuer&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
* Création d'une machine virtuelle sur le serveur de virtualisation Cordouan&lt;br /&gt;
* Mettre la machine virtuelle en réseau&lt;br /&gt;
* Configuration des services Internet (Serveur SSH, DNS, DNSSEC, Certificat SSL)&lt;br /&gt;
* Crackage de clé Wi-Fi&lt;br /&gt;
* Créer les différents conteneurs et configurer leur accès au réseau (tâche particulière)&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Travail effectué'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
                     &lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;Création d'une machine virtuelle Xen sur Cordouan&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
On commence par créer une machine virtuelle Xen sur le serveur de virtualisation cordouan.insecserv.deule.net. On se connecte tout d'abord en SSH sur le serveur cordouan.&lt;br /&gt;
&lt;br /&gt;
    1) ssh root@cordouan.insecserv.deule.net&lt;br /&gt;
       Mot de passe: mot de passe root habituel&lt;br /&gt;
&lt;br /&gt;
On précise:&lt;br /&gt;
&lt;br /&gt;
* le nom de machine virtuelle: IMA5-BANANE&lt;br /&gt;
* son adresse IP sur le réseau: 193.48.57.179/28&lt;br /&gt;
* le répertoire où créer les disques virtuels: /usr/local/xen&lt;br /&gt;
* le miroir Debian: http://debian.polytech-lille.fr/debian&lt;br /&gt;
* la distribution: jessie (qui est la distribution stable courante)&lt;br /&gt;
&lt;br /&gt;
    2) xen-create-image --hostname=&amp;lt;IMA5-BANANE&amp;gt; --ip 193.48.57.179/28 --dir /usr/local/xen --netmask=255.255.255.240 --gateway=193.48.57.177 --mirror=http://debian.polytech-lille.fr/debian/ --dist=jessie&lt;br /&gt;
&lt;br /&gt;
On modifie le fichier de configuration de la machine virtuelle pour faire en sorte que les répertoires var et home de la machine virtuelle soient sur des partitions LVM de l'hôte. Installez les paquetages nécessaires pour SSH, le serveur Web apache2 et le serveur DNS bind (voir la partie services).&lt;br /&gt;
&lt;br /&gt;
    3) xl create /etc/xen/IMA5-BANANE.cfg&lt;br /&gt;
       vi /etc/xen/IMA5-BANANE.cfg&lt;br /&gt;
       lvcreate -L 10G -n /dev/virtual/IMA5-BANANE-home -v&lt;br /&gt;
       lvcreate -L 10G -n /dev/virtual/IMA5-BANANE-var -v&lt;br /&gt;
&lt;br /&gt;
       root@cordouan:~# cat /etc/xen/IMA5-BANANE.cfg&lt;br /&gt;
       #&lt;br /&gt;
       # Configuration file for the Xen instance IMA5-BANANE, created&lt;br /&gt;
       # by xen-tools 4.5 on Mon Sep 11 19:01:21 2017.&lt;br /&gt;
       #&lt;br /&gt;
       #&lt;br /&gt;
       #  Kernel + memory size&lt;br /&gt;
       #&lt;br /&gt;
       kernel      = '/boot/vmlinuz-3.16.0-4-amd64'&lt;br /&gt;
       extra       = 'elevator=noop'&lt;br /&gt;
       ramdisk     = '/boot/initrd.img-3.16.0-4-amd64'&lt;br /&gt;
       vcpus       = '1'&lt;br /&gt;
       memory      = '512'&lt;br /&gt;
       #&lt;br /&gt;
       #  Disk device(s).&lt;br /&gt;
       #&lt;br /&gt;
       root        = '/dev/xvda2 ro'&lt;br /&gt;
       disk        = [&lt;br /&gt;
                  'file:/usr/local/xen/domains/IMA5-BANANE/disk.img,xvda2,w',&lt;br /&gt;
                  'file:/usr/local/xen/domains/IMA5-BANANE/swap.img,xvda1,w',&lt;br /&gt;
                  'phy:/dev/virtual/IMA5-BANANE-home,xvdb1,w',&lt;br /&gt;
  		  'phy:/dev/virtual/IMA5-BANANE-var,xvdc1,w',		 &lt;br /&gt;
       #&lt;br /&gt;
       #  Physical volumes&lt;br /&gt;
       #&lt;br /&gt;
       #&lt;br /&gt;
       #  Hostname&lt;br /&gt;
       #&lt;br /&gt;
       name        = 'IMA5-BANANE'  &lt;br /&gt;
       #&lt;br /&gt;
       #  Networking&lt;br /&gt;
       #&lt;br /&gt;
       vif         = [ 'ip=193.48.57.179/28 ,mac=00:16:3E:56:71:47,bridge=IMA5sc' ]       &lt;br /&gt;
       #&lt;br /&gt;
       #  Behaviour&lt;br /&gt;
       on_poweroff = 'destroy'&lt;br /&gt;
       on_reboot   = 'restart'&lt;br /&gt;
       on_crash    = 'restart'&lt;br /&gt;
&lt;br /&gt;
On modifie le fichier de configuration en faisant en sorte que les répertoires var et home de la machine virtuelle soient sur des partitions LVM de l'hôte:&lt;br /&gt;
&lt;br /&gt;
* la mémoire attribuée: 512 Mo&lt;br /&gt;
* l'adresse ip de la MV: 193.48.57.179/28&lt;br /&gt;
* bridge: IMA5sc&lt;br /&gt;
&lt;br /&gt;
    4) xl list&lt;br /&gt;
&lt;br /&gt;
       root@cordouan:~# xl list&lt;br /&gt;
       Name                                        ID   Mem VCPUs	State	Time(s)&lt;br /&gt;
       Domain-0                                     0  1993     8     r-----   52219.3&lt;br /&gt;
       karmeliett                                   1   128     1     -b----    2483.6&lt;br /&gt;
       duvel                                        2   512     1     -b----    4225.6&lt;br /&gt;
       deus                                         3   512     1     -b----    4226.4&lt;br /&gt;
       trappe                                       4   512     1     -b----    4082.4&lt;br /&gt;
       Rincecochon                                  6   512     1     -b----    3788.2&lt;br /&gt;
       IMA5-Durian                                 62   512     1     -b----    3237.7&lt;br /&gt;
       IMA5-BANANE                                 84   512     1     -b----     152.9&lt;br /&gt;
       IMA5-Papaye                                 89   512     1     -b----      35.4&lt;br /&gt;
       IMA5-Ananas                                 91   512     1     -b----      27.0&lt;br /&gt;
&lt;br /&gt;
On vérifie que la MV IMA5-BANANE a bien été créée.&lt;br /&gt;
&lt;br /&gt;
    5) xl console IMA5-BANANE&lt;br /&gt;
&lt;br /&gt;
On lance IMA5-BANANE en utilisant le log root et le mot de passe configuré.&lt;br /&gt;
&lt;br /&gt;
Commandes de base pour démarrer la VM proprement: &lt;br /&gt;
&lt;br /&gt;
 ssh root@cordouan.insecserv.deule.net&lt;br /&gt;
 xl create /etc/xen/IMA5-BANANE.cfg&lt;br /&gt;
 ssh username@weppes&lt;br /&gt;
 ssh root@193.48.57.179&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;Services Internet (SSH, DNS sécurisé et certificat SSL)&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
On configure à présent les services Internet après avoir acheté un nom de domaine (https://www.banane.space) sur gandi.net pour créer notre site Web sécurisé.&lt;br /&gt;
&lt;br /&gt;
=====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;''Serveur SSH''&amp;lt;/span&amp;gt;=====&lt;br /&gt;
&lt;br /&gt;
Sur notre machine virtuelle, nous avons configuré le fichier sshd_config (PubkeyAuthentication ) :&lt;br /&gt;
&lt;br /&gt;
       root@IMA5-BANANE:~# vim /etc/ssh/sshd_config&lt;br /&gt;
       &lt;br /&gt;
       RSAAuthentication yes&lt;br /&gt;
       PubkeyAuthentication yes&lt;br /&gt;
       #AuthorizedKeysFile     %h/.ssh/authorized_keys&lt;br /&gt;
       PermitRootLogin yes&lt;br /&gt;
       &lt;br /&gt;
       root@IMA5-BANANE:~# service ssh restart&lt;br /&gt;
&lt;br /&gt;
=====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;''Certification SSL''&amp;lt;/span&amp;gt;=====&lt;br /&gt;
Nous commencons par acheter un certificat SSL. Puis, sur la VM nous générons le CSR grâce à cette commande:&lt;br /&gt;
&lt;br /&gt;
 root@IMA5-BANANE:/etc/apache2/sites-available/clef# openssl req -nodes -newkey rsa:2048 -sha256 -keyout banane.key -out banane.csr&lt;br /&gt;
 Generating a 2048 bit RSA private key&lt;br /&gt;
 If you enter '.', the field will be left blank.&lt;br /&gt;
 -----&lt;br /&gt;
 Country Name (2 letter code) [AU]:FR&lt;br /&gt;
 State or Province Name (full name) [Some-State]:Nord&lt;br /&gt;
 Locality Name (eg, city) []:Lille&lt;br /&gt;
 Organization Name (eg, company) [Internet Widgits Pty Ltd]:PolytechLille&lt;br /&gt;
 Organizational Unit Name (eg, section) []:IMA&lt;br /&gt;
 Common Name (e.g. server FQDN or YOUR name) []:banane.space&lt;br /&gt;
 Email Address []:&lt;br /&gt;
 A challenge password []:&lt;br /&gt;
 An optional company name []:&lt;br /&gt;
 root@IMA5-BANANE:/etc/apache2/sites-available/clef# ls banane.csr banane.key&lt;br /&gt;
 root@IMA5-BANANE:/etc/apache2/sites-available/clef# cat banane.csr&lt;br /&gt;
 -----BEGIN CERTIFICATE REQUEST-----&lt;br /&gt;
 &amp;lt;CSR à renseigner sur Gandi lors de l'achat du certificat&amp;gt;&lt;br /&gt;
 -----END CERTIFICATE REQUEST-----&lt;br /&gt;
&lt;br /&gt;
Pour recevoir le mail contenant le lien pour activer le certificat, nous installons les packages suivants :&lt;br /&gt;
&lt;br /&gt;
 root@IMA5-BANANE:~# apt-get install postfix mailx&lt;br /&gt;
&lt;br /&gt;
Une fois le certificat récupéré, nous les copions tous dans le bon répertoire, puis nous hashons le tout :&lt;br /&gt;
&lt;br /&gt;
 root@IMA5-BANANE:/etc/bind# cp certificat.crt /etc/ssl/certs/banane.space.crt&lt;br /&gt;
 root@IMA5-BANANE:/etc/bind# cp serveur.key /etc/ssl/private/banane.space.key&lt;br /&gt;
 root@IMA5-BANANE:/etc/bind# cp GandiStandardSSLCA2.pem /etc/ssl/certs/GandiStandardSSLCA2.pem&lt;br /&gt;
 root@IMA5-BANANE:/etc/bind# c_rehash /etc/ssl/certs&lt;br /&gt;
&lt;br /&gt;
Enfin, la dernière étape consiste en la modification des fichiers 000-banane.space-ssl.conf et ports.conf :&lt;br /&gt;
&lt;br /&gt;
 root@IMA5-BANANE:/etc/apache2/sites-available# cat 000-banane.space-ssl.conf &lt;br /&gt;
     &amp;lt;VirtualHost *:443&amp;gt;&lt;br /&gt;
         ServerName www.banane.space&lt;br /&gt;
         ServerAlias banane.space&lt;br /&gt;
         DocumentRoot /var/www/&lt;br /&gt;
         CustomLog /var/log/apache2/secure_access.log combined&lt;br /&gt;
         SSLEngine on&lt;br /&gt;
         SSLCertificateFile /etc/ssl/certs/banane.space.crt&lt;br /&gt;
         SSLCertificateKeyFile /etc/ssl/private/banane.space.key&lt;br /&gt;
         SSLCertificateChainFile /etc/ssl/certs/GandiStandardSSLCA2.pem&lt;br /&gt;
         SSLVerifyClient None&lt;br /&gt;
     &amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 root@IMA5-BANANE:/etc/apache2# cat ports.conf &lt;br /&gt;
 Listen 80&lt;br /&gt;
 &amp;lt;IfModule ssl_module&amp;gt;&lt;br /&gt;
 Listen 443&lt;br /&gt;
 &amp;lt;/IfModule&amp;gt;&lt;br /&gt;
 &amp;lt;IfModule mod_gnutls.c&amp;gt;&lt;br /&gt;
 Listen 443&lt;br /&gt;
 &amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Un redémarrage du service apache2 est maintenant nécessaire :&lt;br /&gt;
&lt;br /&gt;
 root@IMA5-BANANE:/etc/apache2# service apache2 stop&lt;br /&gt;
 root@IMA5-BANANE:/etc/apache2# service apache2 start&lt;br /&gt;
 root@IMA5-BANANE:/etc/apache2# service apache2 reload&lt;br /&gt;
&lt;br /&gt;
Nous pouvons voir que notre site est maintenant sécurisé, un cadenas vert est bien présent.&lt;br /&gt;
&lt;br /&gt;
=====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;''Serveur DNS''&amp;lt;/span&amp;gt;=====&lt;br /&gt;
&lt;br /&gt;
On commence par modifier les informations de notre nom de domaine sur le site de Gandi. Ensuite, dans ''&amp;quot;Gérer les Glue Records&amp;quot;'', nous modifions les informations concernant notre nom de domaine.&lt;br /&gt;
&lt;br /&gt;
* nom du serveur: ns.banane.space&lt;br /&gt;
* adresse IP: 193.48.57.179&lt;br /&gt;
* serveurs de nom:&lt;br /&gt;
** DNS1: ns.banane.space&lt;br /&gt;
** DNS2: ns6.gandi.net (serveur secondaire de Gandi)&lt;br /&gt;
&lt;br /&gt;
Une fois ces étapes effectuées, nous pouvons passer à la configuration du DNS avec bind. On se place alors dans le dossier /etc/bind de notre machine virtuelle.&lt;br /&gt;
Nous modifions dans un premier temps le fichier named.conf.local afin d'y créer nos zones :&lt;br /&gt;
&lt;br /&gt;
 root@IMA5-BANANE:/etc/bind# vim /etc/bind/named.conf.local&lt;br /&gt;
 zone &amp;quot;banane.space&amp;quot; IN {&lt;br /&gt;
             type master;&lt;br /&gt;
             file &amp;quot;/etc/bind/db.banane.space&amp;quot;;&lt;br /&gt;
        };&lt;br /&gt;
&lt;br /&gt;
On créée ensuite le fichier db.banane.space:&lt;br /&gt;
&lt;br /&gt;
 $TTL    604800&lt;br /&gt;
 @       IN      SOA     ns.banane.space. root.banane.space. (&lt;br /&gt;
                       2016113007       ; Serial&lt;br /&gt;
                         604800         ; Refresh&lt;br /&gt;
                          86400         ; Retry&lt;br /&gt;
                        2419200         ; Expire&lt;br /&gt;
                         604800 )       ; Negative Cache TTL&lt;br /&gt;
 ;&lt;br /&gt;
 @       IN      NS      ns.banane.space. &lt;br /&gt;
 @       IN      NS      ns6.gandi.net.&lt;br /&gt;
 ns      IN      A       193.48.57.179&lt;br /&gt;
 www     IN      A       193.48.57.179&lt;br /&gt;
 @       IN      A       193.48.57.179&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
 root@IMA5-BANANE:/etc/bind# vim /etc/resolv.conf&lt;br /&gt;
 search banane.space&lt;br /&gt;
 nameserver 193.48.57.179&lt;br /&gt;
&lt;br /&gt;
=====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;''DNS SEC''&amp;lt;/span&amp;gt;=====&lt;br /&gt;
&lt;br /&gt;
Génération des clefs asymétriques: &lt;br /&gt;
&lt;br /&gt;
 dnssec-keygen -a RSASHA1 -b 2048 -r /dev/urandom -f KSK -n ZONE banane.space&lt;br /&gt;
 dnssec-keygen -a RSASHA1 -b 1024 -r /dev/urandom -n ZONE banane.space&lt;br /&gt;
&lt;br /&gt;
On modifie le nom des clefs: &lt;br /&gt;
&lt;br /&gt;
 /etc/bind/banane.space.dnssec# ls&lt;br /&gt;
 ????&lt;br /&gt;
&lt;br /&gt;
Nous signons ensuite les zones:&lt;br /&gt;
&lt;br /&gt;
 dnssec-signzone -o banane.space -k banane.space-ksk &lt;br /&gt;
 ../db.banane.space banane.space-zsk&lt;br /&gt;
&lt;br /&gt;
Pour finir nous ajoutons la clef KSK sur Gandi avec l'algorithme RSA/SHA1.&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;Sécurisation des données&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    1) vi /etc/xen/IMA5-BANANE.cfg&lt;br /&gt;
       lvcreate -L 10G -n /dev/virtual/banane-1 -v&lt;br /&gt;
       lvcreate -L 10G -n /dev/virtual/banane-2 -v&lt;br /&gt;
       lvcreate -L 10G -n /dev/virtual/banane-3 -v&lt;br /&gt;
&lt;br /&gt;
       root@cordouan:~# cat /etc/xen/IMA5-BANANE.cfg&lt;br /&gt;
       #&lt;br /&gt;
       # Configuration file for the Xen instance IMA5-BANANE, created&lt;br /&gt;
       # by xen-tools 4.5 on Mon Sep 11 19:01:21 2017.&lt;br /&gt;
       #&lt;br /&gt;
       #&lt;br /&gt;
       #  Kernel + memory size&lt;br /&gt;
       #&lt;br /&gt;
       kernel      = '/boot/vmlinuz-3.16.0-4-amd64'&lt;br /&gt;
       extra       = 'elevator=noop'&lt;br /&gt;
       ramdisk     = '/boot/initrd.img-3.16.0-4-amd64'&lt;br /&gt;
       vcpus       = '1'&lt;br /&gt;
       memory      = '512'&lt;br /&gt;
       #&lt;br /&gt;
       #  Disk device(s).&lt;br /&gt;
       #&lt;br /&gt;
       root        = '/dev/xvda2 ro'&lt;br /&gt;
       disk        = [&lt;br /&gt;
                  'file:/usr/local/xen/domains/IMA5-BANANE/disk.img,xvda2,w',&lt;br /&gt;
                  'file:/usr/local/xen/domains/IMA5-BANANE/swap.img,xvda1,w',&lt;br /&gt;
                  'phy:/dev/virtual/IMA5-BANANE-home,xvdb1,w',&lt;br /&gt;
  		  'phy:/dev/virtual/IMA5-BANANE-var,xvdc1,w',&lt;br /&gt;
                  'phy:/dev/virtual/banane-1,xvdd,w',&lt;br /&gt;
                  'phy:/dev/virtual/banane-2,xvde,w',&lt;br /&gt;
                  'phy:/dev/virtual/banane-3,xvdf,w',		 &lt;br /&gt;
       #&lt;br /&gt;
       #  Physical volumes&lt;br /&gt;
       #&lt;br /&gt;
       #&lt;br /&gt;
       #  Hostname&lt;br /&gt;
       #&lt;br /&gt;
       name        = 'IMA5-BANANE'  &lt;br /&gt;
       #&lt;br /&gt;
       #  Networking&lt;br /&gt;
       #&lt;br /&gt;
       vif         = [ 'ip=193.48.57.179/28 ,mac=00:16:3E:56:71:47,bridge=IMA5sc' ]       &lt;br /&gt;
       #&lt;br /&gt;
       #  Behaviour&lt;br /&gt;
       on_poweroff = 'destroy'&lt;br /&gt;
       on_reboot   = 'restart'&lt;br /&gt;
       on_crash    = 'restart'&lt;br /&gt;
&lt;br /&gt;
On reconfigure le fichier IMA5-BANANE.cfg en créant 3 nouvelles partitions LVM banane-X de 1 Go associées à notre VM.&lt;br /&gt;
&lt;br /&gt;
    2) xl console IMA5-BANANE&lt;br /&gt;
&lt;br /&gt;
On relance la MV IMA5-BANANE.&lt;br /&gt;
&lt;br /&gt;
    3) apt-get install mdadm&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite installé l paquetage mdadm puis rebooté la MV.&lt;br /&gt;
&lt;br /&gt;
    4) mdadm --create /dev/md0 --level=5 --assume-clean --raid-devices=3 /dev/xvdd /dev/xvde /dev/xvdf&lt;br /&gt;
&lt;br /&gt;
Nous créons le volume /dev/md0 pour créer un RAID5 logiciel avec les trois partitions obtenues. On sauvegarde ensuite la configuration actelle.&lt;br /&gt;
 root@IMA5-BANANE:~# mdadm --detail --scan &amp;gt;&amp;gt; /etc/mdadm/mdadm.conf&lt;br /&gt;
 root@IMA5-BANANE:~# mkfs /dev/md0&lt;br /&gt;
 root@IMA5-BANANE:~# mkdir /datamd0&lt;br /&gt;
 root@IMA5-BANANE:/datamd0# mount /dev/md0 /datamd0/&lt;br /&gt;
&lt;br /&gt;
Ensuite il faut éditer le fichier /etc/fstab en rajoutant la ligne suivante à la fin du fichier afin d'être sûr que la partition soit encore montée après le reboot:&lt;br /&gt;
 /dev/md0 /datamd0&lt;br /&gt;
&lt;br /&gt;
Nous créons un fichier texte sur le raid5:&lt;br /&gt;
 root@IMA5-BANANE:/datamd0# vim raid5test.txt&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour avoir le détail de la configuration actuelle:&lt;br /&gt;
&lt;br /&gt;
    5) root@IMA5-BANANE:~# mdadm --detail /dev/md0&lt;br /&gt;
 /dev/md0:&lt;br /&gt;
        Version : 1.2&lt;br /&gt;
  Creation Time : Wed Oct 25 18:27:13 2017&lt;br /&gt;
     Raid Level : raid5&lt;br /&gt;
     Array Size : 2095104 (2046.34 MiB 2145.39 MB)&lt;br /&gt;
  Used Dev Size : 1047552 (1023.17 MiB 1072.69 MB)&lt;br /&gt;
   Raid Devices : 3&lt;br /&gt;
  Total Devices : 3&lt;br /&gt;
    Persistence : Superblock is persistent&lt;br /&gt;
    Update Time : Wed Oct 25 17:03:20 2017&lt;br /&gt;
          State : clean &lt;br /&gt;
 Active Devices : 3&lt;br /&gt;
 Working Devices : 3&lt;br /&gt;
 Failed Devices : 0&lt;br /&gt;
  Spare Devices : 0&lt;br /&gt;
         Layout : left-symmetric&lt;br /&gt;
     Chunk Size : 512K&lt;br /&gt;
           Name : IMA5-BANANE:0  (local to host IMA5-BANANE)&lt;br /&gt;
           UUID : b70ad336:fb198d84:a5909f1c:f4b33229&lt;br /&gt;
         Events : 2&lt;br /&gt;
    Number   Major   Minor   RaidDevice State&lt;br /&gt;
       0     202       48        0      active sync   /dev/xvdd&lt;br /&gt;
       1     202       64        1      active sync   /dev/xvde&lt;br /&gt;
       2     202       80        2      active sync   /dev/xvdf&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    6) root@IMA5-BANANE:~# mdadm --detail /dev/md0&lt;br /&gt;
 /dev/md0:&lt;br /&gt;
        Version : 1.2&lt;br /&gt;
  Creation Time : Wed Oct 25 18:27:13 2017&lt;br /&gt;
     Raid Level : raid5&lt;br /&gt;
     Array Size : 2095104 (2046.34 MiB 2145.39 MB)&lt;br /&gt;
  Used Dev Size : 1047552 (1023.17 MiB 1072.69 MB)&lt;br /&gt;
   Raid Devices : 3&lt;br /&gt;
  Total Devices : 2&lt;br /&gt;
    Persistence : Superblock is persistent&lt;br /&gt;
    Update Time : Wed Oct 25 18:51:56 2017&lt;br /&gt;
          State : clean, degraded &lt;br /&gt;
 Active Devices : 2&lt;br /&gt;
 Working Devices : 2&lt;br /&gt;
 Failed Devices : 0&lt;br /&gt;
  Spare Devices : 0&lt;br /&gt;
         Layout : left-symmetric&lt;br /&gt;
     Chunk Size : 512K&lt;br /&gt;
           Name : IMA5-BANANE:0  (local to host IMA5-BANANE)&lt;br /&gt;
           UUID : b70ad336:fb198d84:a5909f1c:f4b33229&lt;br /&gt;
         Events : 12&lt;br /&gt;
    Number   Major   Minor   RaidDevice State&lt;br /&gt;
       0       0        0        0      removed&lt;br /&gt;
       1     202       64        1      active sync   /dev/xvde&lt;br /&gt;
       2     202       80        2      active sync   /dev/xvdf&lt;br /&gt;
&lt;br /&gt;
Nous arrêtons la MV, mettons en commentaire la 1ère partition dans le fichier de configuration, puis redémarrons la machine.&lt;br /&gt;
&lt;br /&gt;
On voit bien qu'une partition a été supprimée mais que le fichier créé auparavant est toujours présent:&lt;br /&gt;
&lt;br /&gt;
 root@IMA5-BANANE:~# ls /datamd0/&lt;br /&gt;
 raid5test.txt&lt;br /&gt;
&lt;br /&gt;
Pour le test de réparation, afin de bien voir l'avancement de la reconstruction, nous avons procédé comme dans l'exemple du cours: Suppression de la partition xvdd:&lt;br /&gt;
&lt;br /&gt;
 root@IMA5-BANANE:~# mdadm --set-faulty /dev/md0 /dev/xvdd&lt;br /&gt;
 root@IMA5-BANANE:~# mdadm --remove /dev/md0 /dev/xvdd&lt;br /&gt;
 La partition est bien supprimée:&lt;br /&gt;
 Personalities : [raid6] [raid5] [raid4] &lt;br /&gt;
 md0 : active raid5 xvde[1] xvdf[2]&lt;br /&gt;
      2095104 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/2] [UU_]&lt;br /&gt;
&lt;br /&gt;
On remet à présent la partition supprimée:&lt;br /&gt;
 root@IMA5-BANANE:~# mdadm --add /dev/md0 /dev/xvdd&lt;br /&gt;
&lt;br /&gt;
On essaie ensuite de remonter le RAID5 et on peut constater l'avancement de la reconstruction en lançant la même commande assez régulièrement:&lt;br /&gt;
&lt;br /&gt;
    7) root@IMA5-BANANE:~# cat /proc/mdstat&lt;br /&gt;
 Personalities : [raid6] [raid5] [raid4] &lt;br /&gt;
 md0 : active raid5 xvdd[3] xvde[1] xvdf[2]&lt;br /&gt;
      2095104 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/2] [_UU]&lt;br /&gt;
      [===========&amp;gt;.........]  recovery = 59.7% (627140/1047552) finish=0.2min speed=28506K/sec&lt;br /&gt;
 unused devices: &amp;lt;none&amp;gt;&lt;br /&gt;
 root@IMA5-BANANE:~# cat /proc/mdstat&lt;br /&gt;
 Personalities : [raid6] [raid5] [raid4] &lt;br /&gt;
 md0 : active raid5 xvdd[3] xvde[1] xvdf[2]&lt;br /&gt;
      2095104 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/2] [_UU]&lt;br /&gt;
      [============&amp;gt;........]  recovery = 64.5% (676392/1047552) finish=0.2min speed=29408K/sec     &lt;br /&gt;
 unused devices: &amp;lt;none&amp;gt;&lt;br /&gt;
 root@IMA5-BANANE:~# cat /proc/mdstat&lt;br /&gt;
 Personalities : [raid6] [raid5] [raid4] &lt;br /&gt;
 md0 : active raid5 xvdd[3] xvde[1] xvdf[2]&lt;br /&gt;
      2095104 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/2] [_UU]&lt;br /&gt;
      [=============&amp;gt;.......]  recovery = 66.2% (695080/1047552) finish=0.2min speed=28961K/sec     &lt;br /&gt;
 unused devices: &amp;lt;none&amp;gt;&lt;br /&gt;
 root@IMA5-BANANE:~# cat /proc/mdstat&lt;br /&gt;
 Personalities : [raid6] [raid5] [raid4] &lt;br /&gt;
 md0 : active raid5 xvdd[3] xvde[1] xvdf[2]&lt;br /&gt;
      2095104 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/2] [_UU]&lt;br /&gt;
      [=============&amp;gt;.......]  recovery = 68.1% (714664/1047552) finish=0.1min speed=28586K/sec&lt;br /&gt;
 unused devices: &amp;lt;none&amp;gt;&lt;br /&gt;
 root@IMA5-BANANE:~# cat /proc/mdstat&lt;br /&gt;
 Personalities : [raid6] [raid5] [raid4] &lt;br /&gt;
 md0 : active raid5 xvdd[3] xvde[1] xvdf[2]&lt;br /&gt;
      2095104 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/2] [_UU]&lt;br /&gt;
      [==================&amp;gt;..]  recovery = 94.6% (991996/1047552) finish=0.0min speed=29206K/sec   &lt;br /&gt;
 unused devices: &amp;lt;none&amp;gt;&lt;br /&gt;
 root@IMA5-BANANE:~# cat /proc/mdstat&lt;br /&gt;
 Personalities : [raid6] [raid5] [raid4] &lt;br /&gt;
 md0 : active raid5 xvdd[3] xvde[1] xvdf[2]&lt;br /&gt;
      2095104 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/3] [UUU]     &lt;br /&gt;
 unused devices: &amp;lt;none&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;Cryptage des données&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
 cryptsetup luksFormat -c aes -h sha256 /dev/mmcblk1&lt;br /&gt;
 cryptsetup luksOpen /dev/sdb1 crypt_sd&lt;br /&gt;
 mkfs.ext4 /dev/mapper/crypt_sd&lt;br /&gt;
 mount /dev/mapper/crypt_sd /mnt&lt;br /&gt;
 vi /mnt/test.txt #on marque un texte dans le fichier&lt;br /&gt;
 umount /mnt&lt;br /&gt;
 cryptsetup luksClose crypt_sd&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;Mise en réseau de la MV Xen IMA5-BANANE&amp;lt;/span&amp;gt;====&lt;/div&gt;</summary>
		<author><name>Hdelatte</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=Cahier_2017_groupe_n%C2%B05&amp;diff=46343</id>
		<title>Cahier 2017 groupe n°5</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=Cahier_2017_groupe_n%C2%B05&amp;diff=46343"/>
				<updated>2017-11-17T13:38:20Z</updated>
		
		<summary type="html">&lt;p&gt;Hdelatte : /* Serveur DNS */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Présentation générale'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;Mise en contexte&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
Le projet de Réseau Avancé est composé d'une partie commune et d'une tâche particulière par binôme. Ce projet consiste en la configuration d'une architecture réseau avec différentes parties, en plus du câblage et de la configuration des routeurs et commutateurs.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
La partie commune consiste en la création et la mise en réseau d'une machine virtuelle; ainsi que la création d'un site sécurisé avec la configuration du serveur SSH, DNS sécurisé et du certificat SSL. La virtualisation permet de faire fonctionner sur une même machine plusieurs OS isolés ou des logiciels grâce aux machines virtuelles. Au-delà de la réduction des coûts, la virtualisation permet aussi de manipuler et gérer plus facilement des OS. Cependant, on s'oriente de plus en plus vers l'isolation par des conteneurs car ils permettent au sein d'un même OS, d'isoler les ressources matérielles et d'éviter des surcharges.&lt;br /&gt;
&lt;br /&gt;
Notre tâche particulière est donc de réaliser la gestion des conteneurs au sein d'une machine virtuelle configurée en réseau.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;Tâches à effectuer&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
* Création d'une machine virtuelle sur le serveur de virtualisation Cordouan&lt;br /&gt;
* Mettre la machine virtuelle en réseau&lt;br /&gt;
* Configuration des services Internet (Serveur SSH, DNS, DNSSEC, Certificat SSL)&lt;br /&gt;
* Crackage de clé Wi-Fi&lt;br /&gt;
* Créer les différents conteneurs et configurer leur accès au réseau (tâche particulière)&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Travail effectué'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
                     &lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;Création d'une machine virtuelle Xen sur Cordouan&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
On commence par créer une machine virtuelle Xen sur le serveur de virtualisation cordouan.insecserv.deule.net. On se connecte tout d'abord en SSH sur le serveur cordouan.&lt;br /&gt;
&lt;br /&gt;
    1) ssh root@cordouan.insecserv.deule.net&lt;br /&gt;
       Mot de passe: mot de passe root habituel&lt;br /&gt;
&lt;br /&gt;
On précise:&lt;br /&gt;
&lt;br /&gt;
* le nom de machine virtuelle: IMA5-BANANE&lt;br /&gt;
* son adresse IP sur le réseau: 193.48.57.179/28&lt;br /&gt;
* le répertoire où créer les disques virtuels: /usr/local/xen&lt;br /&gt;
* le miroir Debian: http://debian.polytech-lille.fr/debian&lt;br /&gt;
* la distribution: jessie (qui est la distribution stable courante)&lt;br /&gt;
&lt;br /&gt;
    2) xen-create-image --hostname=&amp;lt;IMA5-BANANE&amp;gt; --ip 193.48.57.179/28 --dir /usr/local/xen --netmask=255.255.255.240 --gateway=193.48.57.177 --mirror=http://debian.polytech-lille.fr/debian/ --dist=jessie&lt;br /&gt;
&lt;br /&gt;
On modifie le fichier de configuration de la machine virtuelle pour faire en sorte que les répertoires var et home de la machine virtuelle soient sur des partitions LVM de l'hôte. Installez les paquetages nécessaires pour SSH, le serveur Web apache2 et le serveur DNS bind (voir la partie services).&lt;br /&gt;
&lt;br /&gt;
    3) xl create /etc/xen/IMA5-BANANE.cfg&lt;br /&gt;
       vi /etc/xen/IMA5-BANANE.cfg&lt;br /&gt;
       lvcreate -L 10G -n /dev/virtual/IMA5-BANANE-home -v&lt;br /&gt;
       lvcreate -L 10G -n /dev/virtual/IMA5-BANANE-var -v&lt;br /&gt;
&lt;br /&gt;
       root@cordouan:~# cat /etc/xen/IMA5-BANANE.cfg&lt;br /&gt;
       #&lt;br /&gt;
       # Configuration file for the Xen instance IMA5-BANANE, created&lt;br /&gt;
       # by xen-tools 4.5 on Mon Sep 11 19:01:21 2017.&lt;br /&gt;
       #&lt;br /&gt;
       #&lt;br /&gt;
       #  Kernel + memory size&lt;br /&gt;
       #&lt;br /&gt;
       kernel      = '/boot/vmlinuz-3.16.0-4-amd64'&lt;br /&gt;
       extra       = 'elevator=noop'&lt;br /&gt;
       ramdisk     = '/boot/initrd.img-3.16.0-4-amd64'&lt;br /&gt;
       vcpus       = '1'&lt;br /&gt;
       memory      = '512'&lt;br /&gt;
       #&lt;br /&gt;
       #  Disk device(s).&lt;br /&gt;
       #&lt;br /&gt;
       root        = '/dev/xvda2 ro'&lt;br /&gt;
       disk        = [&lt;br /&gt;
                  'file:/usr/local/xen/domains/IMA5-BANANE/disk.img,xvda2,w',&lt;br /&gt;
                  'file:/usr/local/xen/domains/IMA5-BANANE/swap.img,xvda1,w',&lt;br /&gt;
                  'phy:/dev/virtual/IMA5-BANANE-home,xvdb1,w',&lt;br /&gt;
  		  'phy:/dev/virtual/IMA5-BANANE-var,xvdc1,w',		 &lt;br /&gt;
       #&lt;br /&gt;
       #  Physical volumes&lt;br /&gt;
       #&lt;br /&gt;
       #&lt;br /&gt;
       #  Hostname&lt;br /&gt;
       #&lt;br /&gt;
       name        = 'IMA5-BANANE'  &lt;br /&gt;
       #&lt;br /&gt;
       #  Networking&lt;br /&gt;
       #&lt;br /&gt;
       vif         = [ 'ip=193.48.57.179/28 ,mac=00:16:3E:56:71:47,bridge=IMA5sc' ]       &lt;br /&gt;
       #&lt;br /&gt;
       #  Behaviour&lt;br /&gt;
       on_poweroff = 'destroy'&lt;br /&gt;
       on_reboot   = 'restart'&lt;br /&gt;
       on_crash    = 'restart'&lt;br /&gt;
&lt;br /&gt;
On modifie le fichier de configuration en faisant en sorte que les répertoires var et home de la machine virtuelle soient sur des partitions LVM de l'hôte:&lt;br /&gt;
&lt;br /&gt;
* la mémoire attribuée: 512 Mo&lt;br /&gt;
* l'adresse ip de la MV: 193.48.57.179/28&lt;br /&gt;
* bridge: IMA5sc&lt;br /&gt;
&lt;br /&gt;
    4) xl list&lt;br /&gt;
&lt;br /&gt;
       root@cordouan:~# xl list&lt;br /&gt;
       Name                                        ID   Mem VCPUs	State	Time(s)&lt;br /&gt;
       Domain-0                                     0  1993     8     r-----   52219.3&lt;br /&gt;
       karmeliett                                   1   128     1     -b----    2483.6&lt;br /&gt;
       duvel                                        2   512     1     -b----    4225.6&lt;br /&gt;
       deus                                         3   512     1     -b----    4226.4&lt;br /&gt;
       trappe                                       4   512     1     -b----    4082.4&lt;br /&gt;
       Rincecochon                                  6   512     1     -b----    3788.2&lt;br /&gt;
       IMA5-Durian                                 62   512     1     -b----    3237.7&lt;br /&gt;
       IMA5-BANANE                                 84   512     1     -b----     152.9&lt;br /&gt;
       IMA5-Papaye                                 89   512     1     -b----      35.4&lt;br /&gt;
       IMA5-Ananas                                 91   512     1     -b----      27.0&lt;br /&gt;
&lt;br /&gt;
On vérifie que la MV IMA5-BANANE a bien été créée.&lt;br /&gt;
&lt;br /&gt;
    5) xl console IMA5-BANANE&lt;br /&gt;
&lt;br /&gt;
On lance IMA5-BANANE en utilisant le log root et le mot de passe configuré.&lt;br /&gt;
&lt;br /&gt;
Commandes de base pour démarrer la VM proprement: &lt;br /&gt;
&lt;br /&gt;
 ssh root@cordouan.insecserv.deule.net&lt;br /&gt;
 xl create /etc/xen/IMA5-BANANE.cfg&lt;br /&gt;
 ssh username@weppes&lt;br /&gt;
 ssh root@193.48.57.179&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;Services Internet (SSH, DNS sécurisé et certificat SSL)&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
On configure à présent les services Internet après avoir acheté un nom de domaine (https://www.banane.space) sur gandi.net pour créer notre site Web sécurisé.&lt;br /&gt;
&lt;br /&gt;
=====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;''Serveur SSH''&amp;lt;/span&amp;gt;=====&lt;br /&gt;
&lt;br /&gt;
Sur notre machine virtuelle, nous avons configuré le fichier sshd_config (PubkeyAuthentication ) :&lt;br /&gt;
&lt;br /&gt;
       root@IMA5-BANANE:~# vim /etc/ssh/sshd_config&lt;br /&gt;
       &lt;br /&gt;
       RSAAuthentication yes&lt;br /&gt;
       PubkeyAuthentication yes&lt;br /&gt;
       #AuthorizedKeysFile     %h/.ssh/authorized_keys&lt;br /&gt;
       PermitRootLogin yes&lt;br /&gt;
       &lt;br /&gt;
       root@IMA5-BANANE:~# service ssh restart&lt;br /&gt;
&lt;br /&gt;
=====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;''Certification SSL''&amp;lt;/span&amp;gt;=====&lt;br /&gt;
Nous commencons par acheter un certificat SSL. Puis, sur la VM nous générons le CSR grâce à cette commande:&lt;br /&gt;
&lt;br /&gt;
 root@IMA5-BANANE:/etc/apache2/sites-available/clef# openssl req -nodes -newkey rsa:2048 -sha256 -keyout banane.key -out banane.csr&lt;br /&gt;
 Generating a 2048 bit RSA private key&lt;br /&gt;
 If you enter '.', the field will be left blank.&lt;br /&gt;
 -----&lt;br /&gt;
 Country Name (2 letter code) [AU]:FR&lt;br /&gt;
 State or Province Name (full name) [Some-State]:Nord&lt;br /&gt;
 Locality Name (eg, city) []:Lille&lt;br /&gt;
 Organization Name (eg, company) [Internet Widgits Pty Ltd]:PolytechLille&lt;br /&gt;
 Organizational Unit Name (eg, section) []:IMA&lt;br /&gt;
 Common Name (e.g. server FQDN or YOUR name) []:banane.space&lt;br /&gt;
 Email Address []:&lt;br /&gt;
 A challenge password []:&lt;br /&gt;
 An optional company name []:&lt;br /&gt;
 root@IMA5-BANANE:/etc/apache2/sites-available/clef# ls banane.csr banane.key&lt;br /&gt;
 root@IMA5-BANANE:/etc/apache2/sites-available/clef# cat banane.csr&lt;br /&gt;
 -----BEGIN CERTIFICATE REQUEST-----&lt;br /&gt;
 &amp;lt;CSR à renseigner sur Gandi lors de l'achat du certificat&amp;gt;&lt;br /&gt;
 -----END CERTIFICATE REQUEST-----&lt;br /&gt;
&lt;br /&gt;
Pour recevoir le mail contenant le lien pour activer le certificat, nous installons les packages suivants :&lt;br /&gt;
&lt;br /&gt;
 root@IMA5-BANANE:~# apt-get install postfix mailx&lt;br /&gt;
&lt;br /&gt;
Une fois le certificat récupéré, nous les copions tous dans le bon répertoire, puis nous hashons le tout :&lt;br /&gt;
&lt;br /&gt;
 root@IMA5-BANANE:/etc/bind# cp certificat.crt /etc/ssl/certs/banane.space.crt&lt;br /&gt;
 root@IMA5-BANANE:/etc/bind# cp serveur.key /etc/ssl/private/banane.space.key&lt;br /&gt;
 root@IMA5-BANANE:/etc/bind# cp GandiStandardSSLCA2.pem /etc/ssl/certs/GandiStandardSSLCA2.pem&lt;br /&gt;
 root@IMA5-BANANE:/etc/bind# c_rehash /etc/ssl/certs&lt;br /&gt;
&lt;br /&gt;
Enfin, la dernière étape consiste en la modification des fichiers 000-banane.space-ssl.conf et ports.conf :&lt;br /&gt;
&lt;br /&gt;
 root@IMA5-BANANE:/etc/apache2/sites-available# cat 000-banane.space-ssl.conf &lt;br /&gt;
     &amp;lt;VirtualHost *:443&amp;gt;&lt;br /&gt;
         ServerName www.banane.space&lt;br /&gt;
         ServerAlias banane.space&lt;br /&gt;
         DocumentRoot /var/www/&lt;br /&gt;
         CustomLog /var/log/apache2/secure_access.log combined&lt;br /&gt;
         SSLEngine on&lt;br /&gt;
         SSLCertificateFile /etc/ssl/certs/banane.space.crt&lt;br /&gt;
         SSLCertificateKeyFile /etc/ssl/private/banane.space.key&lt;br /&gt;
         SSLCertificateChainFile /etc/ssl/certs/GandiStandardSSLCA2.pem&lt;br /&gt;
         SSLVerifyClient None&lt;br /&gt;
     &amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 root@IMA5-BANANE:/etc/apache2# cat ports.conf &lt;br /&gt;
 Listen 80&lt;br /&gt;
 &amp;lt;IfModule ssl_module&amp;gt;&lt;br /&gt;
 Listen 443&lt;br /&gt;
 &amp;lt;/IfModule&amp;gt;&lt;br /&gt;
 &amp;lt;IfModule mod_gnutls.c&amp;gt;&lt;br /&gt;
 Listen 443&lt;br /&gt;
 &amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Un redémarrage du service apache2 est maintenant nécessaire :&lt;br /&gt;
&lt;br /&gt;
 root@IMA5-BANANE:/etc/apache2# service apache2 stop&lt;br /&gt;
 root@IMA5-BANANE:/etc/apache2# service apache2 start&lt;br /&gt;
 root@IMA5-BANANE:/etc/apache2# service apache2 reload&lt;br /&gt;
&lt;br /&gt;
Nous pouvons voir que notre site est maintenant sécurisé, un cadenas vert est bien présent.&lt;br /&gt;
&lt;br /&gt;
=====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;''Serveur DNS''&amp;lt;/span&amp;gt;=====&lt;br /&gt;
&lt;br /&gt;
On commence par modifier les informations de notre nom de domaine sur le site de Gandi. Ensuite, dans ''&amp;quot;Gérer les Glue Records&amp;quot;'', nous modifions les informations concernant notre nom de domaine.&lt;br /&gt;
&lt;br /&gt;
* nom du serveur: ns.banane.space&lt;br /&gt;
* adresse IP: 193.48.57.179&lt;br /&gt;
* serveurs de nom:&lt;br /&gt;
** DNS1: ns.banane.space&lt;br /&gt;
** DNS2: ns6.gandi.net (serveur secondaire de Gandi)&lt;br /&gt;
&lt;br /&gt;
Une fois ces étapes effectuées, nous pouvons passer à la configuration du DNS avec bind. On se place alors dans le dossier /etc/bind de notre machine virtuelle.&lt;br /&gt;
Nous modifions dans un premier temps le fichier named.conf.local afin d'y créer nos zones :&lt;br /&gt;
&lt;br /&gt;
 root@IMA5-BANANE:/etc/bind# vim /etc/bind/named.conf.local&lt;br /&gt;
 zone &amp;quot;banane.space&amp;quot; IN {&lt;br /&gt;
             type master;&lt;br /&gt;
             file &amp;quot;/etc/bind/db.banane.space&amp;quot;;&lt;br /&gt;
        };&lt;br /&gt;
&lt;br /&gt;
On créée ensuite le fichier db.banane.space:&lt;br /&gt;
&lt;br /&gt;
 $TTL    604800&lt;br /&gt;
 @       IN      SOA     ns.banane.space. root.banane.space. (&lt;br /&gt;
                       2016113007       ; Serial&lt;br /&gt;
                         604800         ; Refresh&lt;br /&gt;
                          86400         ; Retry&lt;br /&gt;
                        2419200         ; Expire&lt;br /&gt;
                         604800 )       ; Negative Cache TTL&lt;br /&gt;
 ;&lt;br /&gt;
 @       IN      NS      ns.banane.space. &lt;br /&gt;
 @       IN      NS      ns6.gandi.net.&lt;br /&gt;
 ns      IN      A       193.48.57.179&lt;br /&gt;
 www     IN      A       193.48.57.179&lt;br /&gt;
 @       IN      A       193.48.57.179&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
 root@IMA5-BANANE:/etc/bind# vim /etc/resolv.conf&lt;br /&gt;
 search banane.space&lt;br /&gt;
 nameserver 193.48.57.179&lt;br /&gt;
&lt;br /&gt;
=====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;''DNS SEC''&amp;lt;/span&amp;gt;=====&lt;br /&gt;
&lt;br /&gt;
Génération des clefs asymétriques: &lt;br /&gt;
&lt;br /&gt;
 dnssec-keygen -a RSASHA1 -b 2048 -r /dev/urandom -f KSK -n ZONE banane.space&lt;br /&gt;
 dnssec-keygen -a RSASHA1 -b 1024 -r /dev/urandom -n ZONE banane.space&lt;br /&gt;
&lt;br /&gt;
On modifie le nom des clefs: &lt;br /&gt;
&lt;br /&gt;
 /etc/bind/banane.space.dnssec# ls&lt;br /&gt;
 ????&lt;br /&gt;
&lt;br /&gt;
Nous signons ensuite les zones:&lt;br /&gt;
&lt;br /&gt;
dnssec-signzone -o banane.space -k banane.space-ksk &lt;br /&gt;
../db.banane.space banane.space-zsk&lt;br /&gt;
&lt;br /&gt;
Pour finir nous ajoutons la clef KSK sur Gandi avec l'algorithme RSA/SHA1.&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;Sécurisation des données&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    1) vi /etc/xen/IMA5-BANANE.cfg&lt;br /&gt;
       lvcreate -L 10G -n /dev/virtual/banane-1 -v&lt;br /&gt;
       lvcreate -L 10G -n /dev/virtual/banane-2 -v&lt;br /&gt;
       lvcreate -L 10G -n /dev/virtual/banane-3 -v&lt;br /&gt;
&lt;br /&gt;
       root@cordouan:~# cat /etc/xen/IMA5-BANANE.cfg&lt;br /&gt;
       #&lt;br /&gt;
       # Configuration file for the Xen instance IMA5-BANANE, created&lt;br /&gt;
       # by xen-tools 4.5 on Mon Sep 11 19:01:21 2017.&lt;br /&gt;
       #&lt;br /&gt;
       #&lt;br /&gt;
       #  Kernel + memory size&lt;br /&gt;
       #&lt;br /&gt;
       kernel      = '/boot/vmlinuz-3.16.0-4-amd64'&lt;br /&gt;
       extra       = 'elevator=noop'&lt;br /&gt;
       ramdisk     = '/boot/initrd.img-3.16.0-4-amd64'&lt;br /&gt;
       vcpus       = '1'&lt;br /&gt;
       memory      = '512'&lt;br /&gt;
       #&lt;br /&gt;
       #  Disk device(s).&lt;br /&gt;
       #&lt;br /&gt;
       root        = '/dev/xvda2 ro'&lt;br /&gt;
       disk        = [&lt;br /&gt;
                  'file:/usr/local/xen/domains/IMA5-BANANE/disk.img,xvda2,w',&lt;br /&gt;
                  'file:/usr/local/xen/domains/IMA5-BANANE/swap.img,xvda1,w',&lt;br /&gt;
                  'phy:/dev/virtual/IMA5-BANANE-home,xvdb1,w',&lt;br /&gt;
  		  'phy:/dev/virtual/IMA5-BANANE-var,xvdc1,w',&lt;br /&gt;
                  'phy:/dev/virtual/banane-1,xvdd,w',&lt;br /&gt;
                  'phy:/dev/virtual/banane-2,xvde,w',&lt;br /&gt;
                  'phy:/dev/virtual/banane-3,xvdf,w',		 &lt;br /&gt;
       #&lt;br /&gt;
       #  Physical volumes&lt;br /&gt;
       #&lt;br /&gt;
       #&lt;br /&gt;
       #  Hostname&lt;br /&gt;
       #&lt;br /&gt;
       name        = 'IMA5-BANANE'  &lt;br /&gt;
       #&lt;br /&gt;
       #  Networking&lt;br /&gt;
       #&lt;br /&gt;
       vif         = [ 'ip=193.48.57.179/28 ,mac=00:16:3E:56:71:47,bridge=IMA5sc' ]       &lt;br /&gt;
       #&lt;br /&gt;
       #  Behaviour&lt;br /&gt;
       on_poweroff = 'destroy'&lt;br /&gt;
       on_reboot   = 'restart'&lt;br /&gt;
       on_crash    = 'restart'&lt;br /&gt;
&lt;br /&gt;
On reconfigure le fichier IMA5-BANANE.cfg en créant 3 nouvelles partitions LVM banane-X de 1 Go associées à notre VM.&lt;br /&gt;
&lt;br /&gt;
    2) xl console IMA5-BANANE&lt;br /&gt;
&lt;br /&gt;
On relance la MV IMA5-BANANE.&lt;br /&gt;
&lt;br /&gt;
    3) apt-get install mdadm&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite installé l paquetage mdadm puis rebooté la MV.&lt;br /&gt;
&lt;br /&gt;
    4) mdadm --create /dev/md0 --level=5 --assume-clean --raid-devices=3 /dev/xvdd /dev/xvde /dev/xvdf&lt;br /&gt;
&lt;br /&gt;
Nous créons le volume /dev/md0 pour créer un RAID5 logiciel avec les trois partitions obtenues. On sauvegarde ensuite la configuration actelle.&lt;br /&gt;
 root@IMA5-BANANE:~# mdadm --detail --scan &amp;gt;&amp;gt; /etc/mdadm/mdadm.conf&lt;br /&gt;
 root@IMA5-BANANE:~# mkfs /dev/md0&lt;br /&gt;
 root@IMA5-BANANE:~# mkdir /datamd0&lt;br /&gt;
 root@IMA5-BANANE:/datamd0# mount /dev/md0 /datamd0/&lt;br /&gt;
&lt;br /&gt;
Ensuite il faut éditer le fichier /etc/fstab en rajoutant la ligne suivante à la fin du fichier afin d'être sûr que la partition soit encore montée après le reboot:&lt;br /&gt;
 /dev/md0 /datamd0&lt;br /&gt;
&lt;br /&gt;
Nous créons un fichier texte sur le raid5:&lt;br /&gt;
 root@IMA5-BANANE:/datamd0# vim raid5test.txt&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour avoir le détail de la configuration actuelle:&lt;br /&gt;
&lt;br /&gt;
    5) root@IMA5-BANANE:~# mdadm --detail /dev/md0&lt;br /&gt;
 /dev/md0:&lt;br /&gt;
        Version : 1.2&lt;br /&gt;
  Creation Time : Wed Oct 25 18:27:13 2017&lt;br /&gt;
     Raid Level : raid5&lt;br /&gt;
     Array Size : 2095104 (2046.34 MiB 2145.39 MB)&lt;br /&gt;
  Used Dev Size : 1047552 (1023.17 MiB 1072.69 MB)&lt;br /&gt;
   Raid Devices : 3&lt;br /&gt;
  Total Devices : 3&lt;br /&gt;
    Persistence : Superblock is persistent&lt;br /&gt;
    Update Time : Wed Oct 25 17:03:20 2017&lt;br /&gt;
          State : clean &lt;br /&gt;
 Active Devices : 3&lt;br /&gt;
 Working Devices : 3&lt;br /&gt;
 Failed Devices : 0&lt;br /&gt;
  Spare Devices : 0&lt;br /&gt;
         Layout : left-symmetric&lt;br /&gt;
     Chunk Size : 512K&lt;br /&gt;
           Name : IMA5-BANANE:0  (local to host IMA5-BANANE)&lt;br /&gt;
           UUID : b70ad336:fb198d84:a5909f1c:f4b33229&lt;br /&gt;
         Events : 2&lt;br /&gt;
    Number   Major   Minor   RaidDevice State&lt;br /&gt;
       0     202       48        0      active sync   /dev/xvdd&lt;br /&gt;
       1     202       64        1      active sync   /dev/xvde&lt;br /&gt;
       2     202       80        2      active sync   /dev/xvdf&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    6) root@IMA5-BANANE:~# mdadm --detail /dev/md0&lt;br /&gt;
 /dev/md0:&lt;br /&gt;
        Version : 1.2&lt;br /&gt;
  Creation Time : Wed Oct 25 18:27:13 2017&lt;br /&gt;
     Raid Level : raid5&lt;br /&gt;
     Array Size : 2095104 (2046.34 MiB 2145.39 MB)&lt;br /&gt;
  Used Dev Size : 1047552 (1023.17 MiB 1072.69 MB)&lt;br /&gt;
   Raid Devices : 3&lt;br /&gt;
  Total Devices : 2&lt;br /&gt;
    Persistence : Superblock is persistent&lt;br /&gt;
    Update Time : Wed Oct 25 18:51:56 2017&lt;br /&gt;
          State : clean, degraded &lt;br /&gt;
 Active Devices : 2&lt;br /&gt;
 Working Devices : 2&lt;br /&gt;
 Failed Devices : 0&lt;br /&gt;
  Spare Devices : 0&lt;br /&gt;
         Layout : left-symmetric&lt;br /&gt;
     Chunk Size : 512K&lt;br /&gt;
           Name : IMA5-BANANE:0  (local to host IMA5-BANANE)&lt;br /&gt;
           UUID : b70ad336:fb198d84:a5909f1c:f4b33229&lt;br /&gt;
         Events : 12&lt;br /&gt;
    Number   Major   Minor   RaidDevice State&lt;br /&gt;
       0       0        0        0      removed&lt;br /&gt;
       1     202       64        1      active sync   /dev/xvde&lt;br /&gt;
       2     202       80        2      active sync   /dev/xvdf&lt;br /&gt;
&lt;br /&gt;
Nous arrêtons la MV, mettons en commentaire la 1ère partition dans le fichier de configuration, puis redémarrons la machine.&lt;br /&gt;
&lt;br /&gt;
On voit bien qu'une partition a été supprimée mais que le fichier créé auparavant est toujours présent:&lt;br /&gt;
&lt;br /&gt;
 root@IMA5-BANANE:~# ls /datamd0/&lt;br /&gt;
 raid5test.txt&lt;br /&gt;
&lt;br /&gt;
Pour le test de réparation, afin de bien voir l'avancement de la reconstruction, nous avons procédé comme dans l'exemple du cours: Suppression de la partition xvdd:&lt;br /&gt;
&lt;br /&gt;
 root@IMA5-BANANE:~# mdadm --set-faulty /dev/md0 /dev/xvdd&lt;br /&gt;
 root@IMA5-BANANE:~# mdadm --remove /dev/md0 /dev/xvdd&lt;br /&gt;
 La partition est bien supprimée:&lt;br /&gt;
 Personalities : [raid6] [raid5] [raid4] &lt;br /&gt;
 md0 : active raid5 xvde[1] xvdf[2]&lt;br /&gt;
      2095104 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/2] [UU_]&lt;br /&gt;
&lt;br /&gt;
On remet à présent la partition supprimée:&lt;br /&gt;
 root@IMA5-BANANE:~# mdadm --add /dev/md0 /dev/xvdd&lt;br /&gt;
&lt;br /&gt;
On essaie ensuite de remonter le RAID5 et on peut constater l'avancement de la reconstruction en lançant la même commande assez régulièrement:&lt;br /&gt;
&lt;br /&gt;
    7) root@IMA5-BANANE:~# cat /proc/mdstat&lt;br /&gt;
 Personalities : [raid6] [raid5] [raid4] &lt;br /&gt;
 md0 : active raid5 xvdd[3] xvde[1] xvdf[2]&lt;br /&gt;
      2095104 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/2] [_UU]&lt;br /&gt;
      [===========&amp;gt;.........]  recovery = 59.7% (627140/1047552) finish=0.2min speed=28506K/sec&lt;br /&gt;
 unused devices: &amp;lt;none&amp;gt;&lt;br /&gt;
 root@IMA5-BANANE:~# cat /proc/mdstat&lt;br /&gt;
 Personalities : [raid6] [raid5] [raid4] &lt;br /&gt;
 md0 : active raid5 xvdd[3] xvde[1] xvdf[2]&lt;br /&gt;
      2095104 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/2] [_UU]&lt;br /&gt;
      [============&amp;gt;........]  recovery = 64.5% (676392/1047552) finish=0.2min speed=29408K/sec     &lt;br /&gt;
 unused devices: &amp;lt;none&amp;gt;&lt;br /&gt;
 root@IMA5-BANANE:~# cat /proc/mdstat&lt;br /&gt;
 Personalities : [raid6] [raid5] [raid4] &lt;br /&gt;
 md0 : active raid5 xvdd[3] xvde[1] xvdf[2]&lt;br /&gt;
      2095104 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/2] [_UU]&lt;br /&gt;
      [=============&amp;gt;.......]  recovery = 66.2% (695080/1047552) finish=0.2min speed=28961K/sec     &lt;br /&gt;
 unused devices: &amp;lt;none&amp;gt;&lt;br /&gt;
 root@IMA5-BANANE:~# cat /proc/mdstat&lt;br /&gt;
 Personalities : [raid6] [raid5] [raid4] &lt;br /&gt;
 md0 : active raid5 xvdd[3] xvde[1] xvdf[2]&lt;br /&gt;
      2095104 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/2] [_UU]&lt;br /&gt;
      [=============&amp;gt;.......]  recovery = 68.1% (714664/1047552) finish=0.1min speed=28586K/sec&lt;br /&gt;
 unused devices: &amp;lt;none&amp;gt;&lt;br /&gt;
 root@IMA5-BANANE:~# cat /proc/mdstat&lt;br /&gt;
 Personalities : [raid6] [raid5] [raid4] &lt;br /&gt;
 md0 : active raid5 xvdd[3] xvde[1] xvdf[2]&lt;br /&gt;
      2095104 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/2] [_UU]&lt;br /&gt;
      [==================&amp;gt;..]  recovery = 94.6% (991996/1047552) finish=0.0min speed=29206K/sec   &lt;br /&gt;
 unused devices: &amp;lt;none&amp;gt;&lt;br /&gt;
 root@IMA5-BANANE:~# cat /proc/mdstat&lt;br /&gt;
 Personalities : [raid6] [raid5] [raid4] &lt;br /&gt;
 md0 : active raid5 xvdd[3] xvde[1] xvdf[2]&lt;br /&gt;
      2095104 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/3] [UUU]     &lt;br /&gt;
 unused devices: &amp;lt;none&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;Cryptage des données&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
 cryptsetup luksFormat -c aes -h sha256 /dev/mmcblk1&lt;br /&gt;
 cryptsetup luksOpen /dev/sdb1 crypt_sd&lt;br /&gt;
 mkfs.ext4 /dev/mapper/crypt_sd&lt;br /&gt;
 mount /dev/mapper/crypt_sd /mnt&lt;br /&gt;
 vi /mnt/test.txt #on marque un texte dans le fichier&lt;br /&gt;
 umount /mnt&lt;br /&gt;
 cryptsetup luksClose crypt_sd&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;Mise en réseau de la MV Xen IMA5-BANANE&amp;lt;/span&amp;gt;====&lt;/div&gt;</summary>
		<author><name>Hdelatte</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=Cahier_2017_groupe_n%C2%B05&amp;diff=46342</id>
		<title>Cahier 2017 groupe n°5</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=Cahier_2017_groupe_n%C2%B05&amp;diff=46342"/>
				<updated>2017-11-17T13:37:56Z</updated>
		
		<summary type="html">&lt;p&gt;Hdelatte : /* Serveur DNS */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Présentation générale'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;Mise en contexte&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
Le projet de Réseau Avancé est composé d'une partie commune et d'une tâche particulière par binôme. Ce projet consiste en la configuration d'une architecture réseau avec différentes parties, en plus du câblage et de la configuration des routeurs et commutateurs.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
La partie commune consiste en la création et la mise en réseau d'une machine virtuelle; ainsi que la création d'un site sécurisé avec la configuration du serveur SSH, DNS sécurisé et du certificat SSL. La virtualisation permet de faire fonctionner sur une même machine plusieurs OS isolés ou des logiciels grâce aux machines virtuelles. Au-delà de la réduction des coûts, la virtualisation permet aussi de manipuler et gérer plus facilement des OS. Cependant, on s'oriente de plus en plus vers l'isolation par des conteneurs car ils permettent au sein d'un même OS, d'isoler les ressources matérielles et d'éviter des surcharges.&lt;br /&gt;
&lt;br /&gt;
Notre tâche particulière est donc de réaliser la gestion des conteneurs au sein d'une machine virtuelle configurée en réseau.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;Tâches à effectuer&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
* Création d'une machine virtuelle sur le serveur de virtualisation Cordouan&lt;br /&gt;
* Mettre la machine virtuelle en réseau&lt;br /&gt;
* Configuration des services Internet (Serveur SSH, DNS, DNSSEC, Certificat SSL)&lt;br /&gt;
* Crackage de clé Wi-Fi&lt;br /&gt;
* Créer les différents conteneurs et configurer leur accès au réseau (tâche particulière)&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Travail effectué'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
                     &lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;Création d'une machine virtuelle Xen sur Cordouan&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
On commence par créer une machine virtuelle Xen sur le serveur de virtualisation cordouan.insecserv.deule.net. On se connecte tout d'abord en SSH sur le serveur cordouan.&lt;br /&gt;
&lt;br /&gt;
    1) ssh root@cordouan.insecserv.deule.net&lt;br /&gt;
       Mot de passe: mot de passe root habituel&lt;br /&gt;
&lt;br /&gt;
On précise:&lt;br /&gt;
&lt;br /&gt;
* le nom de machine virtuelle: IMA5-BANANE&lt;br /&gt;
* son adresse IP sur le réseau: 193.48.57.179/28&lt;br /&gt;
* le répertoire où créer les disques virtuels: /usr/local/xen&lt;br /&gt;
* le miroir Debian: http://debian.polytech-lille.fr/debian&lt;br /&gt;
* la distribution: jessie (qui est la distribution stable courante)&lt;br /&gt;
&lt;br /&gt;
    2) xen-create-image --hostname=&amp;lt;IMA5-BANANE&amp;gt; --ip 193.48.57.179/28 --dir /usr/local/xen --netmask=255.255.255.240 --gateway=193.48.57.177 --mirror=http://debian.polytech-lille.fr/debian/ --dist=jessie&lt;br /&gt;
&lt;br /&gt;
On modifie le fichier de configuration de la machine virtuelle pour faire en sorte que les répertoires var et home de la machine virtuelle soient sur des partitions LVM de l'hôte. Installez les paquetages nécessaires pour SSH, le serveur Web apache2 et le serveur DNS bind (voir la partie services).&lt;br /&gt;
&lt;br /&gt;
    3) xl create /etc/xen/IMA5-BANANE.cfg&lt;br /&gt;
       vi /etc/xen/IMA5-BANANE.cfg&lt;br /&gt;
       lvcreate -L 10G -n /dev/virtual/IMA5-BANANE-home -v&lt;br /&gt;
       lvcreate -L 10G -n /dev/virtual/IMA5-BANANE-var -v&lt;br /&gt;
&lt;br /&gt;
       root@cordouan:~# cat /etc/xen/IMA5-BANANE.cfg&lt;br /&gt;
       #&lt;br /&gt;
       # Configuration file for the Xen instance IMA5-BANANE, created&lt;br /&gt;
       # by xen-tools 4.5 on Mon Sep 11 19:01:21 2017.&lt;br /&gt;
       #&lt;br /&gt;
       #&lt;br /&gt;
       #  Kernel + memory size&lt;br /&gt;
       #&lt;br /&gt;
       kernel      = '/boot/vmlinuz-3.16.0-4-amd64'&lt;br /&gt;
       extra       = 'elevator=noop'&lt;br /&gt;
       ramdisk     = '/boot/initrd.img-3.16.0-4-amd64'&lt;br /&gt;
       vcpus       = '1'&lt;br /&gt;
       memory      = '512'&lt;br /&gt;
       #&lt;br /&gt;
       #  Disk device(s).&lt;br /&gt;
       #&lt;br /&gt;
       root        = '/dev/xvda2 ro'&lt;br /&gt;
       disk        = [&lt;br /&gt;
                  'file:/usr/local/xen/domains/IMA5-BANANE/disk.img,xvda2,w',&lt;br /&gt;
                  'file:/usr/local/xen/domains/IMA5-BANANE/swap.img,xvda1,w',&lt;br /&gt;
                  'phy:/dev/virtual/IMA5-BANANE-home,xvdb1,w',&lt;br /&gt;
  		  'phy:/dev/virtual/IMA5-BANANE-var,xvdc1,w',		 &lt;br /&gt;
       #&lt;br /&gt;
       #  Physical volumes&lt;br /&gt;
       #&lt;br /&gt;
       #&lt;br /&gt;
       #  Hostname&lt;br /&gt;
       #&lt;br /&gt;
       name        = 'IMA5-BANANE'  &lt;br /&gt;
       #&lt;br /&gt;
       #  Networking&lt;br /&gt;
       #&lt;br /&gt;
       vif         = [ 'ip=193.48.57.179/28 ,mac=00:16:3E:56:71:47,bridge=IMA5sc' ]       &lt;br /&gt;
       #&lt;br /&gt;
       #  Behaviour&lt;br /&gt;
       on_poweroff = 'destroy'&lt;br /&gt;
       on_reboot   = 'restart'&lt;br /&gt;
       on_crash    = 'restart'&lt;br /&gt;
&lt;br /&gt;
On modifie le fichier de configuration en faisant en sorte que les répertoires var et home de la machine virtuelle soient sur des partitions LVM de l'hôte:&lt;br /&gt;
&lt;br /&gt;
* la mémoire attribuée: 512 Mo&lt;br /&gt;
* l'adresse ip de la MV: 193.48.57.179/28&lt;br /&gt;
* bridge: IMA5sc&lt;br /&gt;
&lt;br /&gt;
    4) xl list&lt;br /&gt;
&lt;br /&gt;
       root@cordouan:~# xl list&lt;br /&gt;
       Name                                        ID   Mem VCPUs	State	Time(s)&lt;br /&gt;
       Domain-0                                     0  1993     8     r-----   52219.3&lt;br /&gt;
       karmeliett                                   1   128     1     -b----    2483.6&lt;br /&gt;
       duvel                                        2   512     1     -b----    4225.6&lt;br /&gt;
       deus                                         3   512     1     -b----    4226.4&lt;br /&gt;
       trappe                                       4   512     1     -b----    4082.4&lt;br /&gt;
       Rincecochon                                  6   512     1     -b----    3788.2&lt;br /&gt;
       IMA5-Durian                                 62   512     1     -b----    3237.7&lt;br /&gt;
       IMA5-BANANE                                 84   512     1     -b----     152.9&lt;br /&gt;
       IMA5-Papaye                                 89   512     1     -b----      35.4&lt;br /&gt;
       IMA5-Ananas                                 91   512     1     -b----      27.0&lt;br /&gt;
&lt;br /&gt;
On vérifie que la MV IMA5-BANANE a bien été créée.&lt;br /&gt;
&lt;br /&gt;
    5) xl console IMA5-BANANE&lt;br /&gt;
&lt;br /&gt;
On lance IMA5-BANANE en utilisant le log root et le mot de passe configuré.&lt;br /&gt;
&lt;br /&gt;
Commandes de base pour démarrer la VM proprement: &lt;br /&gt;
&lt;br /&gt;
 ssh root@cordouan.insecserv.deule.net&lt;br /&gt;
 xl create /etc/xen/IMA5-BANANE.cfg&lt;br /&gt;
 ssh username@weppes&lt;br /&gt;
 ssh root@193.48.57.179&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;Services Internet (SSH, DNS sécurisé et certificat SSL)&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
On configure à présent les services Internet après avoir acheté un nom de domaine (https://www.banane.space) sur gandi.net pour créer notre site Web sécurisé.&lt;br /&gt;
&lt;br /&gt;
=====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;''Serveur SSH''&amp;lt;/span&amp;gt;=====&lt;br /&gt;
&lt;br /&gt;
Sur notre machine virtuelle, nous avons configuré le fichier sshd_config (PubkeyAuthentication ) :&lt;br /&gt;
&lt;br /&gt;
       root@IMA5-BANANE:~# vim /etc/ssh/sshd_config&lt;br /&gt;
       &lt;br /&gt;
       RSAAuthentication yes&lt;br /&gt;
       PubkeyAuthentication yes&lt;br /&gt;
       #AuthorizedKeysFile     %h/.ssh/authorized_keys&lt;br /&gt;
       PermitRootLogin yes&lt;br /&gt;
       &lt;br /&gt;
       root@IMA5-BANANE:~# service ssh restart&lt;br /&gt;
&lt;br /&gt;
=====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;''Certification SSL''&amp;lt;/span&amp;gt;=====&lt;br /&gt;
Nous commencons par acheter un certificat SSL. Puis, sur la VM nous générons le CSR grâce à cette commande:&lt;br /&gt;
&lt;br /&gt;
 root@IMA5-BANANE:/etc/apache2/sites-available/clef# openssl req -nodes -newkey rsa:2048 -sha256 -keyout banane.key -out banane.csr&lt;br /&gt;
 Generating a 2048 bit RSA private key&lt;br /&gt;
 If you enter '.', the field will be left blank.&lt;br /&gt;
 -----&lt;br /&gt;
 Country Name (2 letter code) [AU]:FR&lt;br /&gt;
 State or Province Name (full name) [Some-State]:Nord&lt;br /&gt;
 Locality Name (eg, city) []:Lille&lt;br /&gt;
 Organization Name (eg, company) [Internet Widgits Pty Ltd]:PolytechLille&lt;br /&gt;
 Organizational Unit Name (eg, section) []:IMA&lt;br /&gt;
 Common Name (e.g. server FQDN or YOUR name) []:banane.space&lt;br /&gt;
 Email Address []:&lt;br /&gt;
 A challenge password []:&lt;br /&gt;
 An optional company name []:&lt;br /&gt;
 root@IMA5-BANANE:/etc/apache2/sites-available/clef# ls banane.csr banane.key&lt;br /&gt;
 root@IMA5-BANANE:/etc/apache2/sites-available/clef# cat banane.csr&lt;br /&gt;
 -----BEGIN CERTIFICATE REQUEST-----&lt;br /&gt;
 &amp;lt;CSR à renseigner sur Gandi lors de l'achat du certificat&amp;gt;&lt;br /&gt;
 -----END CERTIFICATE REQUEST-----&lt;br /&gt;
&lt;br /&gt;
Pour recevoir le mail contenant le lien pour activer le certificat, nous installons les packages suivants :&lt;br /&gt;
&lt;br /&gt;
 root@IMA5-BANANE:~# apt-get install postfix mailx&lt;br /&gt;
&lt;br /&gt;
Une fois le certificat récupéré, nous les copions tous dans le bon répertoire, puis nous hashons le tout :&lt;br /&gt;
&lt;br /&gt;
 root@IMA5-BANANE:/etc/bind# cp certificat.crt /etc/ssl/certs/banane.space.crt&lt;br /&gt;
 root@IMA5-BANANE:/etc/bind# cp serveur.key /etc/ssl/private/banane.space.key&lt;br /&gt;
 root@IMA5-BANANE:/etc/bind# cp GandiStandardSSLCA2.pem /etc/ssl/certs/GandiStandardSSLCA2.pem&lt;br /&gt;
 root@IMA5-BANANE:/etc/bind# c_rehash /etc/ssl/certs&lt;br /&gt;
&lt;br /&gt;
Enfin, la dernière étape consiste en la modification des fichiers 000-banane.space-ssl.conf et ports.conf :&lt;br /&gt;
&lt;br /&gt;
 root@IMA5-BANANE:/etc/apache2/sites-available# cat 000-banane.space-ssl.conf &lt;br /&gt;
     &amp;lt;VirtualHost *:443&amp;gt;&lt;br /&gt;
         ServerName www.banane.space&lt;br /&gt;
         ServerAlias banane.space&lt;br /&gt;
         DocumentRoot /var/www/&lt;br /&gt;
         CustomLog /var/log/apache2/secure_access.log combined&lt;br /&gt;
         SSLEngine on&lt;br /&gt;
         SSLCertificateFile /etc/ssl/certs/banane.space.crt&lt;br /&gt;
         SSLCertificateKeyFile /etc/ssl/private/banane.space.key&lt;br /&gt;
         SSLCertificateChainFile /etc/ssl/certs/GandiStandardSSLCA2.pem&lt;br /&gt;
         SSLVerifyClient None&lt;br /&gt;
     &amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 root@IMA5-BANANE:/etc/apache2# cat ports.conf &lt;br /&gt;
 Listen 80&lt;br /&gt;
 &amp;lt;IfModule ssl_module&amp;gt;&lt;br /&gt;
 Listen 443&lt;br /&gt;
 &amp;lt;/IfModule&amp;gt;&lt;br /&gt;
 &amp;lt;IfModule mod_gnutls.c&amp;gt;&lt;br /&gt;
 Listen 443&lt;br /&gt;
 &amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Un redémarrage du service apache2 est maintenant nécessaire :&lt;br /&gt;
&lt;br /&gt;
 root@IMA5-BANANE:/etc/apache2# service apache2 stop&lt;br /&gt;
 root@IMA5-BANANE:/etc/apache2# service apache2 start&lt;br /&gt;
 root@IMA5-BANANE:/etc/apache2# service apache2 reload&lt;br /&gt;
&lt;br /&gt;
Nous pouvons voir que notre site est maintenant sécurisé, un cadenas vert est bien présent.&lt;br /&gt;
&lt;br /&gt;
=====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;''Serveur DNS''&amp;lt;/span&amp;gt;=====&lt;br /&gt;
&lt;br /&gt;
On commence par modifier les informations de notre nom de domaine sur le site de Gandi. Ensuite, dans ''&amp;quot;Gérer les Glue Records&amp;quot;'', nous modifions les informations concernant notre nom de domaine.&lt;br /&gt;
&lt;br /&gt;
* nom du serveur: ns.banane.space&lt;br /&gt;
* adresse IP: 193.48.57.179&lt;br /&gt;
* serveurs de nom:&lt;br /&gt;
** DNS1: ns.banane.space&lt;br /&gt;
** DNS2: ns6.gandi.net (serveur secondaire de Gandi)&lt;br /&gt;
&lt;br /&gt;
Une fois ces étapes effectuées, nous pouvons passer à la configuration du DNS avec bind. On se place alors dans le dossier /etc/bind de notre machine virtuelle.&lt;br /&gt;
Nous modifions dans un premier temps le fichier named.conf.local afin d'y créer nos zones :&lt;br /&gt;
&lt;br /&gt;
 root@IMA5-BANANE:/etc/bind# vim /etc/bind/named.conf.local&lt;br /&gt;
 zone &amp;quot;banane.space&amp;quot; IN {&lt;br /&gt;
             type master;&lt;br /&gt;
             file &amp;quot;/etc/bind/db.banane.space&amp;quot;;&lt;br /&gt;
        };&lt;br /&gt;
&lt;br /&gt;
On créée ensuite le fichier db.banane.space:&lt;br /&gt;
&lt;br /&gt;
 $TTL    604800&lt;br /&gt;
 @       IN      SOA     ns.banane.space. root.banane.space. (&lt;br /&gt;
                       2016113007       ; Serial&lt;br /&gt;
                         604800         ; Refresh&lt;br /&gt;
                          86400         ; Retry&lt;br /&gt;
                        2419200         ; Expire&lt;br /&gt;
                         604800 )       ; Negative Cache TTL&lt;br /&gt;
 ;&lt;br /&gt;
 @       IN      NS      ns.banane.space. &lt;br /&gt;
 @       IN      NS      ns6.gandi.net.&lt;br /&gt;
 ns      IN      A       193.48.57.162&lt;br /&gt;
 www     IN      A       193.48.57.162&lt;br /&gt;
 @       IN      A       193.48.57.162&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
 root@IMA5-BANANE:/etc/bind# vim /etc/resolv.conf&lt;br /&gt;
 search banane.space&lt;br /&gt;
 nameserver 193.48.57.179&lt;br /&gt;
&lt;br /&gt;
=====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;''DNS SEC''&amp;lt;/span&amp;gt;=====&lt;br /&gt;
&lt;br /&gt;
Génération des clefs asymétriques: &lt;br /&gt;
&lt;br /&gt;
 dnssec-keygen -a RSASHA1 -b 2048 -r /dev/urandom -f KSK -n ZONE banane.space&lt;br /&gt;
 dnssec-keygen -a RSASHA1 -b 1024 -r /dev/urandom -n ZONE banane.space&lt;br /&gt;
&lt;br /&gt;
On modifie le nom des clefs: &lt;br /&gt;
&lt;br /&gt;
 /etc/bind/banane.space.dnssec# ls&lt;br /&gt;
 ????&lt;br /&gt;
&lt;br /&gt;
Nous signons ensuite les zones:&lt;br /&gt;
&lt;br /&gt;
dnssec-signzone -o banane.space -k banane.space-ksk &lt;br /&gt;
../db.banane.space banane.space-zsk&lt;br /&gt;
&lt;br /&gt;
Pour finir nous ajoutons la clef KSK sur Gandi avec l'algorithme RSA/SHA1.&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;Sécurisation des données&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    1) vi /etc/xen/IMA5-BANANE.cfg&lt;br /&gt;
       lvcreate -L 10G -n /dev/virtual/banane-1 -v&lt;br /&gt;
       lvcreate -L 10G -n /dev/virtual/banane-2 -v&lt;br /&gt;
       lvcreate -L 10G -n /dev/virtual/banane-3 -v&lt;br /&gt;
&lt;br /&gt;
       root@cordouan:~# cat /etc/xen/IMA5-BANANE.cfg&lt;br /&gt;
       #&lt;br /&gt;
       # Configuration file for the Xen instance IMA5-BANANE, created&lt;br /&gt;
       # by xen-tools 4.5 on Mon Sep 11 19:01:21 2017.&lt;br /&gt;
       #&lt;br /&gt;
       #&lt;br /&gt;
       #  Kernel + memory size&lt;br /&gt;
       #&lt;br /&gt;
       kernel      = '/boot/vmlinuz-3.16.0-4-amd64'&lt;br /&gt;
       extra       = 'elevator=noop'&lt;br /&gt;
       ramdisk     = '/boot/initrd.img-3.16.0-4-amd64'&lt;br /&gt;
       vcpus       = '1'&lt;br /&gt;
       memory      = '512'&lt;br /&gt;
       #&lt;br /&gt;
       #  Disk device(s).&lt;br /&gt;
       #&lt;br /&gt;
       root        = '/dev/xvda2 ro'&lt;br /&gt;
       disk        = [&lt;br /&gt;
                  'file:/usr/local/xen/domains/IMA5-BANANE/disk.img,xvda2,w',&lt;br /&gt;
                  'file:/usr/local/xen/domains/IMA5-BANANE/swap.img,xvda1,w',&lt;br /&gt;
                  'phy:/dev/virtual/IMA5-BANANE-home,xvdb1,w',&lt;br /&gt;
  		  'phy:/dev/virtual/IMA5-BANANE-var,xvdc1,w',&lt;br /&gt;
                  'phy:/dev/virtual/banane-1,xvdd,w',&lt;br /&gt;
                  'phy:/dev/virtual/banane-2,xvde,w',&lt;br /&gt;
                  'phy:/dev/virtual/banane-3,xvdf,w',		 &lt;br /&gt;
       #&lt;br /&gt;
       #  Physical volumes&lt;br /&gt;
       #&lt;br /&gt;
       #&lt;br /&gt;
       #  Hostname&lt;br /&gt;
       #&lt;br /&gt;
       name        = 'IMA5-BANANE'  &lt;br /&gt;
       #&lt;br /&gt;
       #  Networking&lt;br /&gt;
       #&lt;br /&gt;
       vif         = [ 'ip=193.48.57.179/28 ,mac=00:16:3E:56:71:47,bridge=IMA5sc' ]       &lt;br /&gt;
       #&lt;br /&gt;
       #  Behaviour&lt;br /&gt;
       on_poweroff = 'destroy'&lt;br /&gt;
       on_reboot   = 'restart'&lt;br /&gt;
       on_crash    = 'restart'&lt;br /&gt;
&lt;br /&gt;
On reconfigure le fichier IMA5-BANANE.cfg en créant 3 nouvelles partitions LVM banane-X de 1 Go associées à notre VM.&lt;br /&gt;
&lt;br /&gt;
    2) xl console IMA5-BANANE&lt;br /&gt;
&lt;br /&gt;
On relance la MV IMA5-BANANE.&lt;br /&gt;
&lt;br /&gt;
    3) apt-get install mdadm&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite installé l paquetage mdadm puis rebooté la MV.&lt;br /&gt;
&lt;br /&gt;
    4) mdadm --create /dev/md0 --level=5 --assume-clean --raid-devices=3 /dev/xvdd /dev/xvde /dev/xvdf&lt;br /&gt;
&lt;br /&gt;
Nous créons le volume /dev/md0 pour créer un RAID5 logiciel avec les trois partitions obtenues. On sauvegarde ensuite la configuration actelle.&lt;br /&gt;
 root@IMA5-BANANE:~# mdadm --detail --scan &amp;gt;&amp;gt; /etc/mdadm/mdadm.conf&lt;br /&gt;
 root@IMA5-BANANE:~# mkfs /dev/md0&lt;br /&gt;
 root@IMA5-BANANE:~# mkdir /datamd0&lt;br /&gt;
 root@IMA5-BANANE:/datamd0# mount /dev/md0 /datamd0/&lt;br /&gt;
&lt;br /&gt;
Ensuite il faut éditer le fichier /etc/fstab en rajoutant la ligne suivante à la fin du fichier afin d'être sûr que la partition soit encore montée après le reboot:&lt;br /&gt;
 /dev/md0 /datamd0&lt;br /&gt;
&lt;br /&gt;
Nous créons un fichier texte sur le raid5:&lt;br /&gt;
 root@IMA5-BANANE:/datamd0# vim raid5test.txt&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour avoir le détail de la configuration actuelle:&lt;br /&gt;
&lt;br /&gt;
    5) root@IMA5-BANANE:~# mdadm --detail /dev/md0&lt;br /&gt;
 /dev/md0:&lt;br /&gt;
        Version : 1.2&lt;br /&gt;
  Creation Time : Wed Oct 25 18:27:13 2017&lt;br /&gt;
     Raid Level : raid5&lt;br /&gt;
     Array Size : 2095104 (2046.34 MiB 2145.39 MB)&lt;br /&gt;
  Used Dev Size : 1047552 (1023.17 MiB 1072.69 MB)&lt;br /&gt;
   Raid Devices : 3&lt;br /&gt;
  Total Devices : 3&lt;br /&gt;
    Persistence : Superblock is persistent&lt;br /&gt;
    Update Time : Wed Oct 25 17:03:20 2017&lt;br /&gt;
          State : clean &lt;br /&gt;
 Active Devices : 3&lt;br /&gt;
 Working Devices : 3&lt;br /&gt;
 Failed Devices : 0&lt;br /&gt;
  Spare Devices : 0&lt;br /&gt;
         Layout : left-symmetric&lt;br /&gt;
     Chunk Size : 512K&lt;br /&gt;
           Name : IMA5-BANANE:0  (local to host IMA5-BANANE)&lt;br /&gt;
           UUID : b70ad336:fb198d84:a5909f1c:f4b33229&lt;br /&gt;
         Events : 2&lt;br /&gt;
    Number   Major   Minor   RaidDevice State&lt;br /&gt;
       0     202       48        0      active sync   /dev/xvdd&lt;br /&gt;
       1     202       64        1      active sync   /dev/xvde&lt;br /&gt;
       2     202       80        2      active sync   /dev/xvdf&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    6) root@IMA5-BANANE:~# mdadm --detail /dev/md0&lt;br /&gt;
 /dev/md0:&lt;br /&gt;
        Version : 1.2&lt;br /&gt;
  Creation Time : Wed Oct 25 18:27:13 2017&lt;br /&gt;
     Raid Level : raid5&lt;br /&gt;
     Array Size : 2095104 (2046.34 MiB 2145.39 MB)&lt;br /&gt;
  Used Dev Size : 1047552 (1023.17 MiB 1072.69 MB)&lt;br /&gt;
   Raid Devices : 3&lt;br /&gt;
  Total Devices : 2&lt;br /&gt;
    Persistence : Superblock is persistent&lt;br /&gt;
    Update Time : Wed Oct 25 18:51:56 2017&lt;br /&gt;
          State : clean, degraded &lt;br /&gt;
 Active Devices : 2&lt;br /&gt;
 Working Devices : 2&lt;br /&gt;
 Failed Devices : 0&lt;br /&gt;
  Spare Devices : 0&lt;br /&gt;
         Layout : left-symmetric&lt;br /&gt;
     Chunk Size : 512K&lt;br /&gt;
           Name : IMA5-BANANE:0  (local to host IMA5-BANANE)&lt;br /&gt;
           UUID : b70ad336:fb198d84:a5909f1c:f4b33229&lt;br /&gt;
         Events : 12&lt;br /&gt;
    Number   Major   Minor   RaidDevice State&lt;br /&gt;
       0       0        0        0      removed&lt;br /&gt;
       1     202       64        1      active sync   /dev/xvde&lt;br /&gt;
       2     202       80        2      active sync   /dev/xvdf&lt;br /&gt;
&lt;br /&gt;
Nous arrêtons la MV, mettons en commentaire la 1ère partition dans le fichier de configuration, puis redémarrons la machine.&lt;br /&gt;
&lt;br /&gt;
On voit bien qu'une partition a été supprimée mais que le fichier créé auparavant est toujours présent:&lt;br /&gt;
&lt;br /&gt;
 root@IMA5-BANANE:~# ls /datamd0/&lt;br /&gt;
 raid5test.txt&lt;br /&gt;
&lt;br /&gt;
Pour le test de réparation, afin de bien voir l'avancement de la reconstruction, nous avons procédé comme dans l'exemple du cours: Suppression de la partition xvdd:&lt;br /&gt;
&lt;br /&gt;
 root@IMA5-BANANE:~# mdadm --set-faulty /dev/md0 /dev/xvdd&lt;br /&gt;
 root@IMA5-BANANE:~# mdadm --remove /dev/md0 /dev/xvdd&lt;br /&gt;
 La partition est bien supprimée:&lt;br /&gt;
 Personalities : [raid6] [raid5] [raid4] &lt;br /&gt;
 md0 : active raid5 xvde[1] xvdf[2]&lt;br /&gt;
      2095104 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/2] [UU_]&lt;br /&gt;
&lt;br /&gt;
On remet à présent la partition supprimée:&lt;br /&gt;
 root@IMA5-BANANE:~# mdadm --add /dev/md0 /dev/xvdd&lt;br /&gt;
&lt;br /&gt;
On essaie ensuite de remonter le RAID5 et on peut constater l'avancement de la reconstruction en lançant la même commande assez régulièrement:&lt;br /&gt;
&lt;br /&gt;
    7) root@IMA5-BANANE:~# cat /proc/mdstat&lt;br /&gt;
 Personalities : [raid6] [raid5] [raid4] &lt;br /&gt;
 md0 : active raid5 xvdd[3] xvde[1] xvdf[2]&lt;br /&gt;
      2095104 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/2] [_UU]&lt;br /&gt;
      [===========&amp;gt;.........]  recovery = 59.7% (627140/1047552) finish=0.2min speed=28506K/sec&lt;br /&gt;
 unused devices: &amp;lt;none&amp;gt;&lt;br /&gt;
 root@IMA5-BANANE:~# cat /proc/mdstat&lt;br /&gt;
 Personalities : [raid6] [raid5] [raid4] &lt;br /&gt;
 md0 : active raid5 xvdd[3] xvde[1] xvdf[2]&lt;br /&gt;
      2095104 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/2] [_UU]&lt;br /&gt;
      [============&amp;gt;........]  recovery = 64.5% (676392/1047552) finish=0.2min speed=29408K/sec     &lt;br /&gt;
 unused devices: &amp;lt;none&amp;gt;&lt;br /&gt;
 root@IMA5-BANANE:~# cat /proc/mdstat&lt;br /&gt;
 Personalities : [raid6] [raid5] [raid4] &lt;br /&gt;
 md0 : active raid5 xvdd[3] xvde[1] xvdf[2]&lt;br /&gt;
      2095104 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/2] [_UU]&lt;br /&gt;
      [=============&amp;gt;.......]  recovery = 66.2% (695080/1047552) finish=0.2min speed=28961K/sec     &lt;br /&gt;
 unused devices: &amp;lt;none&amp;gt;&lt;br /&gt;
 root@IMA5-BANANE:~# cat /proc/mdstat&lt;br /&gt;
 Personalities : [raid6] [raid5] [raid4] &lt;br /&gt;
 md0 : active raid5 xvdd[3] xvde[1] xvdf[2]&lt;br /&gt;
      2095104 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/2] [_UU]&lt;br /&gt;
      [=============&amp;gt;.......]  recovery = 68.1% (714664/1047552) finish=0.1min speed=28586K/sec&lt;br /&gt;
 unused devices: &amp;lt;none&amp;gt;&lt;br /&gt;
 root@IMA5-BANANE:~# cat /proc/mdstat&lt;br /&gt;
 Personalities : [raid6] [raid5] [raid4] &lt;br /&gt;
 md0 : active raid5 xvdd[3] xvde[1] xvdf[2]&lt;br /&gt;
      2095104 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/2] [_UU]&lt;br /&gt;
      [==================&amp;gt;..]  recovery = 94.6% (991996/1047552) finish=0.0min speed=29206K/sec   &lt;br /&gt;
 unused devices: &amp;lt;none&amp;gt;&lt;br /&gt;
 root@IMA5-BANANE:~# cat /proc/mdstat&lt;br /&gt;
 Personalities : [raid6] [raid5] [raid4] &lt;br /&gt;
 md0 : active raid5 xvdd[3] xvde[1] xvdf[2]&lt;br /&gt;
      2095104 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/3] [UUU]     &lt;br /&gt;
 unused devices: &amp;lt;none&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;Cryptage des données&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
 cryptsetup luksFormat -c aes -h sha256 /dev/mmcblk1&lt;br /&gt;
 cryptsetup luksOpen /dev/sdb1 crypt_sd&lt;br /&gt;
 mkfs.ext4 /dev/mapper/crypt_sd&lt;br /&gt;
 mount /dev/mapper/crypt_sd /mnt&lt;br /&gt;
 vi /mnt/test.txt #on marque un texte dans le fichier&lt;br /&gt;
 umount /mnt&lt;br /&gt;
 cryptsetup luksClose crypt_sd&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;Mise en réseau de la MV Xen IMA5-BANANE&amp;lt;/span&amp;gt;====&lt;/div&gt;</summary>
		<author><name>Hdelatte</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=Cahier_2017_groupe_n%C2%B05&amp;diff=46341</id>
		<title>Cahier 2017 groupe n°5</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=Cahier_2017_groupe_n%C2%B05&amp;diff=46341"/>
				<updated>2017-11-17T13:35:39Z</updated>
		
		<summary type="html">&lt;p&gt;Hdelatte : /* Certification SSL */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Présentation générale'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;Mise en contexte&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
Le projet de Réseau Avancé est composé d'une partie commune et d'une tâche particulière par binôme. Ce projet consiste en la configuration d'une architecture réseau avec différentes parties, en plus du câblage et de la configuration des routeurs et commutateurs.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
La partie commune consiste en la création et la mise en réseau d'une machine virtuelle; ainsi que la création d'un site sécurisé avec la configuration du serveur SSH, DNS sécurisé et du certificat SSL. La virtualisation permet de faire fonctionner sur une même machine plusieurs OS isolés ou des logiciels grâce aux machines virtuelles. Au-delà de la réduction des coûts, la virtualisation permet aussi de manipuler et gérer plus facilement des OS. Cependant, on s'oriente de plus en plus vers l'isolation par des conteneurs car ils permettent au sein d'un même OS, d'isoler les ressources matérielles et d'éviter des surcharges.&lt;br /&gt;
&lt;br /&gt;
Notre tâche particulière est donc de réaliser la gestion des conteneurs au sein d'une machine virtuelle configurée en réseau.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;Tâches à effectuer&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
* Création d'une machine virtuelle sur le serveur de virtualisation Cordouan&lt;br /&gt;
* Mettre la machine virtuelle en réseau&lt;br /&gt;
* Configuration des services Internet (Serveur SSH, DNS, DNSSEC, Certificat SSL)&lt;br /&gt;
* Crackage de clé Wi-Fi&lt;br /&gt;
* Créer les différents conteneurs et configurer leur accès au réseau (tâche particulière)&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Travail effectué'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
                     &lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;Création d'une machine virtuelle Xen sur Cordouan&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
On commence par créer une machine virtuelle Xen sur le serveur de virtualisation cordouan.insecserv.deule.net. On se connecte tout d'abord en SSH sur le serveur cordouan.&lt;br /&gt;
&lt;br /&gt;
    1) ssh root@cordouan.insecserv.deule.net&lt;br /&gt;
       Mot de passe: mot de passe root habituel&lt;br /&gt;
&lt;br /&gt;
On précise:&lt;br /&gt;
&lt;br /&gt;
* le nom de machine virtuelle: IMA5-BANANE&lt;br /&gt;
* son adresse IP sur le réseau: 193.48.57.179/28&lt;br /&gt;
* le répertoire où créer les disques virtuels: /usr/local/xen&lt;br /&gt;
* le miroir Debian: http://debian.polytech-lille.fr/debian&lt;br /&gt;
* la distribution: jessie (qui est la distribution stable courante)&lt;br /&gt;
&lt;br /&gt;
    2) xen-create-image --hostname=&amp;lt;IMA5-BANANE&amp;gt; --ip 193.48.57.179/28 --dir /usr/local/xen --netmask=255.255.255.240 --gateway=193.48.57.177 --mirror=http://debian.polytech-lille.fr/debian/ --dist=jessie&lt;br /&gt;
&lt;br /&gt;
On modifie le fichier de configuration de la machine virtuelle pour faire en sorte que les répertoires var et home de la machine virtuelle soient sur des partitions LVM de l'hôte. Installez les paquetages nécessaires pour SSH, le serveur Web apache2 et le serveur DNS bind (voir la partie services).&lt;br /&gt;
&lt;br /&gt;
    3) xl create /etc/xen/IMA5-BANANE.cfg&lt;br /&gt;
       vi /etc/xen/IMA5-BANANE.cfg&lt;br /&gt;
       lvcreate -L 10G -n /dev/virtual/IMA5-BANANE-home -v&lt;br /&gt;
       lvcreate -L 10G -n /dev/virtual/IMA5-BANANE-var -v&lt;br /&gt;
&lt;br /&gt;
       root@cordouan:~# cat /etc/xen/IMA5-BANANE.cfg&lt;br /&gt;
       #&lt;br /&gt;
       # Configuration file for the Xen instance IMA5-BANANE, created&lt;br /&gt;
       # by xen-tools 4.5 on Mon Sep 11 19:01:21 2017.&lt;br /&gt;
       #&lt;br /&gt;
       #&lt;br /&gt;
       #  Kernel + memory size&lt;br /&gt;
       #&lt;br /&gt;
       kernel      = '/boot/vmlinuz-3.16.0-4-amd64'&lt;br /&gt;
       extra       = 'elevator=noop'&lt;br /&gt;
       ramdisk     = '/boot/initrd.img-3.16.0-4-amd64'&lt;br /&gt;
       vcpus       = '1'&lt;br /&gt;
       memory      = '512'&lt;br /&gt;
       #&lt;br /&gt;
       #  Disk device(s).&lt;br /&gt;
       #&lt;br /&gt;
       root        = '/dev/xvda2 ro'&lt;br /&gt;
       disk        = [&lt;br /&gt;
                  'file:/usr/local/xen/domains/IMA5-BANANE/disk.img,xvda2,w',&lt;br /&gt;
                  'file:/usr/local/xen/domains/IMA5-BANANE/swap.img,xvda1,w',&lt;br /&gt;
                  'phy:/dev/virtual/IMA5-BANANE-home,xvdb1,w',&lt;br /&gt;
  		  'phy:/dev/virtual/IMA5-BANANE-var,xvdc1,w',		 &lt;br /&gt;
       #&lt;br /&gt;
       #  Physical volumes&lt;br /&gt;
       #&lt;br /&gt;
       #&lt;br /&gt;
       #  Hostname&lt;br /&gt;
       #&lt;br /&gt;
       name        = 'IMA5-BANANE'  &lt;br /&gt;
       #&lt;br /&gt;
       #  Networking&lt;br /&gt;
       #&lt;br /&gt;
       vif         = [ 'ip=193.48.57.179/28 ,mac=00:16:3E:56:71:47,bridge=IMA5sc' ]       &lt;br /&gt;
       #&lt;br /&gt;
       #  Behaviour&lt;br /&gt;
       on_poweroff = 'destroy'&lt;br /&gt;
       on_reboot   = 'restart'&lt;br /&gt;
       on_crash    = 'restart'&lt;br /&gt;
&lt;br /&gt;
On modifie le fichier de configuration en faisant en sorte que les répertoires var et home de la machine virtuelle soient sur des partitions LVM de l'hôte:&lt;br /&gt;
&lt;br /&gt;
* la mémoire attribuée: 512 Mo&lt;br /&gt;
* l'adresse ip de la MV: 193.48.57.179/28&lt;br /&gt;
* bridge: IMA5sc&lt;br /&gt;
&lt;br /&gt;
    4) xl list&lt;br /&gt;
&lt;br /&gt;
       root@cordouan:~# xl list&lt;br /&gt;
       Name                                        ID   Mem VCPUs	State	Time(s)&lt;br /&gt;
       Domain-0                                     0  1993     8     r-----   52219.3&lt;br /&gt;
       karmeliett                                   1   128     1     -b----    2483.6&lt;br /&gt;
       duvel                                        2   512     1     -b----    4225.6&lt;br /&gt;
       deus                                         3   512     1     -b----    4226.4&lt;br /&gt;
       trappe                                       4   512     1     -b----    4082.4&lt;br /&gt;
       Rincecochon                                  6   512     1     -b----    3788.2&lt;br /&gt;
       IMA5-Durian                                 62   512     1     -b----    3237.7&lt;br /&gt;
       IMA5-BANANE                                 84   512     1     -b----     152.9&lt;br /&gt;
       IMA5-Papaye                                 89   512     1     -b----      35.4&lt;br /&gt;
       IMA5-Ananas                                 91   512     1     -b----      27.0&lt;br /&gt;
&lt;br /&gt;
On vérifie que la MV IMA5-BANANE a bien été créée.&lt;br /&gt;
&lt;br /&gt;
    5) xl console IMA5-BANANE&lt;br /&gt;
&lt;br /&gt;
On lance IMA5-BANANE en utilisant le log root et le mot de passe configuré.&lt;br /&gt;
&lt;br /&gt;
Commandes de base pour démarrer la VM proprement: &lt;br /&gt;
&lt;br /&gt;
 ssh root@cordouan.insecserv.deule.net&lt;br /&gt;
 xl create /etc/xen/IMA5-BANANE.cfg&lt;br /&gt;
 ssh username@weppes&lt;br /&gt;
 ssh root@193.48.57.179&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;Services Internet (SSH, DNS sécurisé et certificat SSL)&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
On configure à présent les services Internet après avoir acheté un nom de domaine (https://www.banane.space) sur gandi.net pour créer notre site Web sécurisé.&lt;br /&gt;
&lt;br /&gt;
=====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;''Serveur SSH''&amp;lt;/span&amp;gt;=====&lt;br /&gt;
&lt;br /&gt;
Sur notre machine virtuelle, nous avons configuré le fichier sshd_config (PubkeyAuthentication ) :&lt;br /&gt;
&lt;br /&gt;
       root@IMA5-BANANE:~# vim /etc/ssh/sshd_config&lt;br /&gt;
       &lt;br /&gt;
       RSAAuthentication yes&lt;br /&gt;
       PubkeyAuthentication yes&lt;br /&gt;
       #AuthorizedKeysFile     %h/.ssh/authorized_keys&lt;br /&gt;
       PermitRootLogin yes&lt;br /&gt;
       &lt;br /&gt;
       root@IMA5-BANANE:~# service ssh restart&lt;br /&gt;
&lt;br /&gt;
=====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;''Certification SSL''&amp;lt;/span&amp;gt;=====&lt;br /&gt;
Nous commencons par acheter un certificat SSL. Puis, sur la VM nous générons le CSR grâce à cette commande:&lt;br /&gt;
&lt;br /&gt;
 root@IMA5-BANANE:/etc/apache2/sites-available/clef# openssl req -nodes -newkey rsa:2048 -sha256 -keyout banane.key -out banane.csr&lt;br /&gt;
 Generating a 2048 bit RSA private key&lt;br /&gt;
 If you enter '.', the field will be left blank.&lt;br /&gt;
 -----&lt;br /&gt;
 Country Name (2 letter code) [AU]:FR&lt;br /&gt;
 State or Province Name (full name) [Some-State]:Nord&lt;br /&gt;
 Locality Name (eg, city) []:Lille&lt;br /&gt;
 Organization Name (eg, company) [Internet Widgits Pty Ltd]:PolytechLille&lt;br /&gt;
 Organizational Unit Name (eg, section) []:IMA&lt;br /&gt;
 Common Name (e.g. server FQDN or YOUR name) []:banane.space&lt;br /&gt;
 Email Address []:&lt;br /&gt;
 A challenge password []:&lt;br /&gt;
 An optional company name []:&lt;br /&gt;
 root@IMA5-BANANE:/etc/apache2/sites-available/clef# ls banane.csr banane.key&lt;br /&gt;
 root@IMA5-BANANE:/etc/apache2/sites-available/clef# cat banane.csr&lt;br /&gt;
 -----BEGIN CERTIFICATE REQUEST-----&lt;br /&gt;
 &amp;lt;CSR à renseigner sur Gandi lors de l'achat du certificat&amp;gt;&lt;br /&gt;
 -----END CERTIFICATE REQUEST-----&lt;br /&gt;
&lt;br /&gt;
Pour recevoir le mail contenant le lien pour activer le certificat, nous installons les packages suivants :&lt;br /&gt;
&lt;br /&gt;
 root@IMA5-BANANE:~# apt-get install postfix mailx&lt;br /&gt;
&lt;br /&gt;
Une fois le certificat récupéré, nous les copions tous dans le bon répertoire, puis nous hashons le tout :&lt;br /&gt;
&lt;br /&gt;
 root@IMA5-BANANE:/etc/bind# cp certificat.crt /etc/ssl/certs/banane.space.crt&lt;br /&gt;
 root@IMA5-BANANE:/etc/bind# cp serveur.key /etc/ssl/private/banane.space.key&lt;br /&gt;
 root@IMA5-BANANE:/etc/bind# cp GandiStandardSSLCA2.pem /etc/ssl/certs/GandiStandardSSLCA2.pem&lt;br /&gt;
 root@IMA5-BANANE:/etc/bind# c_rehash /etc/ssl/certs&lt;br /&gt;
&lt;br /&gt;
Enfin, la dernière étape consiste en la modification des fichiers 000-banane.space-ssl.conf et ports.conf :&lt;br /&gt;
&lt;br /&gt;
 root@IMA5-BANANE:/etc/apache2/sites-available# cat 000-banane.space-ssl.conf &lt;br /&gt;
     &amp;lt;VirtualHost *:443&amp;gt;&lt;br /&gt;
         ServerName www.banane.space&lt;br /&gt;
         ServerAlias banane.space&lt;br /&gt;
         DocumentRoot /var/www/&lt;br /&gt;
         CustomLog /var/log/apache2/secure_access.log combined&lt;br /&gt;
         SSLEngine on&lt;br /&gt;
         SSLCertificateFile /etc/ssl/certs/banane.space.crt&lt;br /&gt;
         SSLCertificateKeyFile /etc/ssl/private/banane.space.key&lt;br /&gt;
         SSLCertificateChainFile /etc/ssl/certs/GandiStandardSSLCA2.pem&lt;br /&gt;
         SSLVerifyClient None&lt;br /&gt;
     &amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 root@IMA5-BANANE:/etc/apache2# cat ports.conf &lt;br /&gt;
 Listen 80&lt;br /&gt;
 &amp;lt;IfModule ssl_module&amp;gt;&lt;br /&gt;
 Listen 443&lt;br /&gt;
 &amp;lt;/IfModule&amp;gt;&lt;br /&gt;
 &amp;lt;IfModule mod_gnutls.c&amp;gt;&lt;br /&gt;
 Listen 443&lt;br /&gt;
 &amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Un redémarrage du service apache2 est maintenant nécessaire :&lt;br /&gt;
&lt;br /&gt;
 root@IMA5-BANANE:/etc/apache2# service apache2 stop&lt;br /&gt;
 root@IMA5-BANANE:/etc/apache2# service apache2 start&lt;br /&gt;
 root@IMA5-BANANE:/etc/apache2# service apache2 reload&lt;br /&gt;
&lt;br /&gt;
Nous pouvons voir que notre site est maintenant sécurisé, un cadenas vert est bien présent.&lt;br /&gt;
&lt;br /&gt;
=====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;''Serveur DNS''&amp;lt;/span&amp;gt;=====&lt;br /&gt;
&lt;br /&gt;
On commence par modifier les informations de notre nom de domaine sur le site de Gandi. Ensuite, dans ''&amp;quot;Gérer les Glue Records&amp;quot;'', nous modifions les informations concernant notre nom de domaine.&lt;br /&gt;
&lt;br /&gt;
* nom du serveur: ns.banane.space&lt;br /&gt;
* adresse IP: 193.48.57.179&lt;br /&gt;
* serveurs de nom:&lt;br /&gt;
** DNS1: ns.banane.space&lt;br /&gt;
** DNS2: ns6.gandi.net (serveur secondaire de Gandi)&lt;br /&gt;
&lt;br /&gt;
Une fois ces étapes effectuées, nous pouvons passer à la configuration du DNS avec bind. On se place alors dans le dossier /etc/bind de notre machine virtuelle.&lt;br /&gt;
Nous modifions dans un premier temps le fichier named.conf.local afin d'y créer nos zones :&lt;br /&gt;
&lt;br /&gt;
 root@IMA5-BANANE:/etc/bind# vim /etc/bind/named.conf.local&lt;br /&gt;
 zone &amp;quot;banane.space&amp;quot; IN {&lt;br /&gt;
             type master;&lt;br /&gt;
             file &amp;quot;/etc/bind/db.banane.space&amp;quot;;&lt;br /&gt;
        };&lt;br /&gt;
&lt;br /&gt;
On créée ensuite le fichier db.banane.space:&lt;br /&gt;
&lt;br /&gt;
 $TTL    604800&lt;br /&gt;
 @       IN      SOA     ns.banane.space. root.banane.space. (&lt;br /&gt;
                       2016113007       ; Serial&lt;br /&gt;
                         604800         ; Refresh&lt;br /&gt;
                          86400         ; Retry&lt;br /&gt;
                        2419200         ; Expire&lt;br /&gt;
                         604800 )       ; Negative Cache TTL&lt;br /&gt;
 ;&lt;br /&gt;
 @       IN      NS      ns.banane.space. &lt;br /&gt;
 @       IN      NS      ns6.gandi.net.&lt;br /&gt;
 ns      IN      A       193.48.57.162&lt;br /&gt;
 www     IN      A       193.48.57.162&lt;br /&gt;
 @       IN      A       193.48.57.162&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
 root@IMA5-BANANE:/etc/bind# vim /etc/resolv.conf&lt;br /&gt;
 search banane.space&lt;br /&gt;
 nameserver 193.48.57.162????&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;''DNS SEC''&amp;lt;/span&amp;gt;=====&lt;br /&gt;
&lt;br /&gt;
Génération des clefs asymétriques: &lt;br /&gt;
&lt;br /&gt;
 dnssec-keygen -a RSASHA1 -b 2048 -r /dev/urandom -f KSK -n ZONE banane.space&lt;br /&gt;
 dnssec-keygen -a RSASHA1 -b 1024 -r /dev/urandom -n ZONE banane.space&lt;br /&gt;
&lt;br /&gt;
On modifie le nom des clefs: &lt;br /&gt;
&lt;br /&gt;
 /etc/bind/banane.space.dnssec# ls&lt;br /&gt;
 ????&lt;br /&gt;
&lt;br /&gt;
Nous signons ensuite les zones:&lt;br /&gt;
&lt;br /&gt;
dnssec-signzone -o banane.space -k banane.space-ksk &lt;br /&gt;
../db.banane.space banane.space-zsk&lt;br /&gt;
&lt;br /&gt;
Pour finir nous ajoutons la clef KSK sur Gandi avec l'algorithme RSA/SHA1.&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;Sécurisation des données&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    1) vi /etc/xen/IMA5-BANANE.cfg&lt;br /&gt;
       lvcreate -L 10G -n /dev/virtual/banane-1 -v&lt;br /&gt;
       lvcreate -L 10G -n /dev/virtual/banane-2 -v&lt;br /&gt;
       lvcreate -L 10G -n /dev/virtual/banane-3 -v&lt;br /&gt;
&lt;br /&gt;
       root@cordouan:~# cat /etc/xen/IMA5-BANANE.cfg&lt;br /&gt;
       #&lt;br /&gt;
       # Configuration file for the Xen instance IMA5-BANANE, created&lt;br /&gt;
       # by xen-tools 4.5 on Mon Sep 11 19:01:21 2017.&lt;br /&gt;
       #&lt;br /&gt;
       #&lt;br /&gt;
       #  Kernel + memory size&lt;br /&gt;
       #&lt;br /&gt;
       kernel      = '/boot/vmlinuz-3.16.0-4-amd64'&lt;br /&gt;
       extra       = 'elevator=noop'&lt;br /&gt;
       ramdisk     = '/boot/initrd.img-3.16.0-4-amd64'&lt;br /&gt;
       vcpus       = '1'&lt;br /&gt;
       memory      = '512'&lt;br /&gt;
       #&lt;br /&gt;
       #  Disk device(s).&lt;br /&gt;
       #&lt;br /&gt;
       root        = '/dev/xvda2 ro'&lt;br /&gt;
       disk        = [&lt;br /&gt;
                  'file:/usr/local/xen/domains/IMA5-BANANE/disk.img,xvda2,w',&lt;br /&gt;
                  'file:/usr/local/xen/domains/IMA5-BANANE/swap.img,xvda1,w',&lt;br /&gt;
                  'phy:/dev/virtual/IMA5-BANANE-home,xvdb1,w',&lt;br /&gt;
  		  'phy:/dev/virtual/IMA5-BANANE-var,xvdc1,w',&lt;br /&gt;
                  'phy:/dev/virtual/banane-1,xvdd,w',&lt;br /&gt;
                  'phy:/dev/virtual/banane-2,xvde,w',&lt;br /&gt;
                  'phy:/dev/virtual/banane-3,xvdf,w',		 &lt;br /&gt;
       #&lt;br /&gt;
       #  Physical volumes&lt;br /&gt;
       #&lt;br /&gt;
       #&lt;br /&gt;
       #  Hostname&lt;br /&gt;
       #&lt;br /&gt;
       name        = 'IMA5-BANANE'  &lt;br /&gt;
       #&lt;br /&gt;
       #  Networking&lt;br /&gt;
       #&lt;br /&gt;
       vif         = [ 'ip=193.48.57.179/28 ,mac=00:16:3E:56:71:47,bridge=IMA5sc' ]       &lt;br /&gt;
       #&lt;br /&gt;
       #  Behaviour&lt;br /&gt;
       on_poweroff = 'destroy'&lt;br /&gt;
       on_reboot   = 'restart'&lt;br /&gt;
       on_crash    = 'restart'&lt;br /&gt;
&lt;br /&gt;
On reconfigure le fichier IMA5-BANANE.cfg en créant 3 nouvelles partitions LVM banane-X de 1 Go associées à notre VM.&lt;br /&gt;
&lt;br /&gt;
    2) xl console IMA5-BANANE&lt;br /&gt;
&lt;br /&gt;
On relance la MV IMA5-BANANE.&lt;br /&gt;
&lt;br /&gt;
    3) apt-get install mdadm&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite installé l paquetage mdadm puis rebooté la MV.&lt;br /&gt;
&lt;br /&gt;
    4) mdadm --create /dev/md0 --level=5 --assume-clean --raid-devices=3 /dev/xvdd /dev/xvde /dev/xvdf&lt;br /&gt;
&lt;br /&gt;
Nous créons le volume /dev/md0 pour créer un RAID5 logiciel avec les trois partitions obtenues. On sauvegarde ensuite la configuration actelle.&lt;br /&gt;
 root@IMA5-BANANE:~# mdadm --detail --scan &amp;gt;&amp;gt; /etc/mdadm/mdadm.conf&lt;br /&gt;
 root@IMA5-BANANE:~# mkfs /dev/md0&lt;br /&gt;
 root@IMA5-BANANE:~# mkdir /datamd0&lt;br /&gt;
 root@IMA5-BANANE:/datamd0# mount /dev/md0 /datamd0/&lt;br /&gt;
&lt;br /&gt;
Ensuite il faut éditer le fichier /etc/fstab en rajoutant la ligne suivante à la fin du fichier afin d'être sûr que la partition soit encore montée après le reboot:&lt;br /&gt;
 /dev/md0 /datamd0&lt;br /&gt;
&lt;br /&gt;
Nous créons un fichier texte sur le raid5:&lt;br /&gt;
 root@IMA5-BANANE:/datamd0# vim raid5test.txt&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour avoir le détail de la configuration actuelle:&lt;br /&gt;
&lt;br /&gt;
    5) root@IMA5-BANANE:~# mdadm --detail /dev/md0&lt;br /&gt;
 /dev/md0:&lt;br /&gt;
        Version : 1.2&lt;br /&gt;
  Creation Time : Wed Oct 25 18:27:13 2017&lt;br /&gt;
     Raid Level : raid5&lt;br /&gt;
     Array Size : 2095104 (2046.34 MiB 2145.39 MB)&lt;br /&gt;
  Used Dev Size : 1047552 (1023.17 MiB 1072.69 MB)&lt;br /&gt;
   Raid Devices : 3&lt;br /&gt;
  Total Devices : 3&lt;br /&gt;
    Persistence : Superblock is persistent&lt;br /&gt;
    Update Time : Wed Oct 25 17:03:20 2017&lt;br /&gt;
          State : clean &lt;br /&gt;
 Active Devices : 3&lt;br /&gt;
 Working Devices : 3&lt;br /&gt;
 Failed Devices : 0&lt;br /&gt;
  Spare Devices : 0&lt;br /&gt;
         Layout : left-symmetric&lt;br /&gt;
     Chunk Size : 512K&lt;br /&gt;
           Name : IMA5-BANANE:0  (local to host IMA5-BANANE)&lt;br /&gt;
           UUID : b70ad336:fb198d84:a5909f1c:f4b33229&lt;br /&gt;
         Events : 2&lt;br /&gt;
    Number   Major   Minor   RaidDevice State&lt;br /&gt;
       0     202       48        0      active sync   /dev/xvdd&lt;br /&gt;
       1     202       64        1      active sync   /dev/xvde&lt;br /&gt;
       2     202       80        2      active sync   /dev/xvdf&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    6) root@IMA5-BANANE:~# mdadm --detail /dev/md0&lt;br /&gt;
 /dev/md0:&lt;br /&gt;
        Version : 1.2&lt;br /&gt;
  Creation Time : Wed Oct 25 18:27:13 2017&lt;br /&gt;
     Raid Level : raid5&lt;br /&gt;
     Array Size : 2095104 (2046.34 MiB 2145.39 MB)&lt;br /&gt;
  Used Dev Size : 1047552 (1023.17 MiB 1072.69 MB)&lt;br /&gt;
   Raid Devices : 3&lt;br /&gt;
  Total Devices : 2&lt;br /&gt;
    Persistence : Superblock is persistent&lt;br /&gt;
    Update Time : Wed Oct 25 18:51:56 2017&lt;br /&gt;
          State : clean, degraded &lt;br /&gt;
 Active Devices : 2&lt;br /&gt;
 Working Devices : 2&lt;br /&gt;
 Failed Devices : 0&lt;br /&gt;
  Spare Devices : 0&lt;br /&gt;
         Layout : left-symmetric&lt;br /&gt;
     Chunk Size : 512K&lt;br /&gt;
           Name : IMA5-BANANE:0  (local to host IMA5-BANANE)&lt;br /&gt;
           UUID : b70ad336:fb198d84:a5909f1c:f4b33229&lt;br /&gt;
         Events : 12&lt;br /&gt;
    Number   Major   Minor   RaidDevice State&lt;br /&gt;
       0       0        0        0      removed&lt;br /&gt;
       1     202       64        1      active sync   /dev/xvde&lt;br /&gt;
       2     202       80        2      active sync   /dev/xvdf&lt;br /&gt;
&lt;br /&gt;
Nous arrêtons la MV, mettons en commentaire la 1ère partition dans le fichier de configuration, puis redémarrons la machine.&lt;br /&gt;
&lt;br /&gt;
On voit bien qu'une partition a été supprimée mais que le fichier créé auparavant est toujours présent:&lt;br /&gt;
&lt;br /&gt;
 root@IMA5-BANANE:~# ls /datamd0/&lt;br /&gt;
 raid5test.txt&lt;br /&gt;
&lt;br /&gt;
Pour le test de réparation, afin de bien voir l'avancement de la reconstruction, nous avons procédé comme dans l'exemple du cours: Suppression de la partition xvdd:&lt;br /&gt;
&lt;br /&gt;
 root@IMA5-BANANE:~# mdadm --set-faulty /dev/md0 /dev/xvdd&lt;br /&gt;
 root@IMA5-BANANE:~# mdadm --remove /dev/md0 /dev/xvdd&lt;br /&gt;
 La partition est bien supprimée:&lt;br /&gt;
 Personalities : [raid6] [raid5] [raid4] &lt;br /&gt;
 md0 : active raid5 xvde[1] xvdf[2]&lt;br /&gt;
      2095104 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/2] [UU_]&lt;br /&gt;
&lt;br /&gt;
On remet à présent la partition supprimée:&lt;br /&gt;
 root@IMA5-BANANE:~# mdadm --add /dev/md0 /dev/xvdd&lt;br /&gt;
&lt;br /&gt;
On essaie ensuite de remonter le RAID5 et on peut constater l'avancement de la reconstruction en lançant la même commande assez régulièrement:&lt;br /&gt;
&lt;br /&gt;
    7) root@IMA5-BANANE:~# cat /proc/mdstat&lt;br /&gt;
 Personalities : [raid6] [raid5] [raid4] &lt;br /&gt;
 md0 : active raid5 xvdd[3] xvde[1] xvdf[2]&lt;br /&gt;
      2095104 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/2] [_UU]&lt;br /&gt;
      [===========&amp;gt;.........]  recovery = 59.7% (627140/1047552) finish=0.2min speed=28506K/sec&lt;br /&gt;
 unused devices: &amp;lt;none&amp;gt;&lt;br /&gt;
 root@IMA5-BANANE:~# cat /proc/mdstat&lt;br /&gt;
 Personalities : [raid6] [raid5] [raid4] &lt;br /&gt;
 md0 : active raid5 xvdd[3] xvde[1] xvdf[2]&lt;br /&gt;
      2095104 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/2] [_UU]&lt;br /&gt;
      [============&amp;gt;........]  recovery = 64.5% (676392/1047552) finish=0.2min speed=29408K/sec     &lt;br /&gt;
 unused devices: &amp;lt;none&amp;gt;&lt;br /&gt;
 root@IMA5-BANANE:~# cat /proc/mdstat&lt;br /&gt;
 Personalities : [raid6] [raid5] [raid4] &lt;br /&gt;
 md0 : active raid5 xvdd[3] xvde[1] xvdf[2]&lt;br /&gt;
      2095104 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/2] [_UU]&lt;br /&gt;
      [=============&amp;gt;.......]  recovery = 66.2% (695080/1047552) finish=0.2min speed=28961K/sec     &lt;br /&gt;
 unused devices: &amp;lt;none&amp;gt;&lt;br /&gt;
 root@IMA5-BANANE:~# cat /proc/mdstat&lt;br /&gt;
 Personalities : [raid6] [raid5] [raid4] &lt;br /&gt;
 md0 : active raid5 xvdd[3] xvde[1] xvdf[2]&lt;br /&gt;
      2095104 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/2] [_UU]&lt;br /&gt;
      [=============&amp;gt;.......]  recovery = 68.1% (714664/1047552) finish=0.1min speed=28586K/sec&lt;br /&gt;
 unused devices: &amp;lt;none&amp;gt;&lt;br /&gt;
 root@IMA5-BANANE:~# cat /proc/mdstat&lt;br /&gt;
 Personalities : [raid6] [raid5] [raid4] &lt;br /&gt;
 md0 : active raid5 xvdd[3] xvde[1] xvdf[2]&lt;br /&gt;
      2095104 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/2] [_UU]&lt;br /&gt;
      [==================&amp;gt;..]  recovery = 94.6% (991996/1047552) finish=0.0min speed=29206K/sec   &lt;br /&gt;
 unused devices: &amp;lt;none&amp;gt;&lt;br /&gt;
 root@IMA5-BANANE:~# cat /proc/mdstat&lt;br /&gt;
 Personalities : [raid6] [raid5] [raid4] &lt;br /&gt;
 md0 : active raid5 xvdd[3] xvde[1] xvdf[2]&lt;br /&gt;
      2095104 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/3] [UUU]     &lt;br /&gt;
 unused devices: &amp;lt;none&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;Cryptage des données&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
 cryptsetup luksFormat -c aes -h sha256 /dev/mmcblk1&lt;br /&gt;
 cryptsetup luksOpen /dev/sdb1 crypt_sd&lt;br /&gt;
 mkfs.ext4 /dev/mapper/crypt_sd&lt;br /&gt;
 mount /dev/mapper/crypt_sd /mnt&lt;br /&gt;
 vi /mnt/test.txt #on marque un texte dans le fichier&lt;br /&gt;
 umount /mnt&lt;br /&gt;
 cryptsetup luksClose crypt_sd&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;Mise en réseau de la MV Xen IMA5-BANANE&amp;lt;/span&amp;gt;====&lt;/div&gt;</summary>
		<author><name>Hdelatte</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=Cahier_2017_groupe_n%C2%B05&amp;diff=46290</id>
		<title>Cahier 2017 groupe n°5</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=Cahier_2017_groupe_n%C2%B05&amp;diff=46290"/>
				<updated>2017-11-17T09:02:23Z</updated>
		
		<summary type="html">&lt;p&gt;Hdelatte : /* Création d'une machine virtuelle Xen sur Cordouan */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Présentation générale'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;Mise en contexte&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
Le projet de Réseau Avancé est composé d'une partie commune et d'une tâche particulière par binôme. Ce projet consiste en la configuration d'une architecture réseau avec différentes parties, en plus du câblage et de la configuration des routeurs et commutateurs.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
La partie commune consiste en la création et la mise en réseau d'une machine virtuelle; ainsi que la création d'un site sécurisé avec la configuration du serveur SSH, DNS sécurisé et du certificat SSL. La virtualisation permet de faire fonctionner sur une même machine plusieurs OS isolés ou des logiciels grâce aux machines virtuelles. Au-delà de la réduction des coûts, la virtualisation permet aussi de manipuler et gérer plus facilement des OS. Cependant, on s'oriente de plus en plus vers l'isolation par des conteneurs car ils permettent au sein d'un même OS, d'isoler les ressources matérielles et d'éviter des surcharges.&lt;br /&gt;
&lt;br /&gt;
Notre tâche particulière est donc de réaliser la gestion des conteneurs au sein d'une machine virtuelle configurée en réseau.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;Tâches à effectuer&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
* Création d'une machine virtuelle sur le serveur de virtualisation Cordouan&lt;br /&gt;
* Mettre la machine virtuelle en réseau&lt;br /&gt;
* Configuration des services Internet (Serveur SSH, DNS, DNSSEC, Certificat SSL)&lt;br /&gt;
* Crackage de clé Wi-Fi&lt;br /&gt;
* Créer les différents conteneurs et configurer leur accès au réseau (tâche particulière)&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Travail effectué'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
                     &lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;Création d'une machine virtuelle Xen sur Cordouan&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
On commence par créer une machine virtuelle Xen sur le serveur de virtualisation cordouan.insecserv.deule.net. On se connecte tout d'abord en SSH sur le serveur cordouan.&lt;br /&gt;
&lt;br /&gt;
    1) ssh root@cordouan.insecserv.deule.net&lt;br /&gt;
       Mot de passe: mot de passe root habituel&lt;br /&gt;
&lt;br /&gt;
On précise:&lt;br /&gt;
&lt;br /&gt;
* le nom de machine virtuelle: IMA5-BANANE&lt;br /&gt;
* son adresse IP sur le réseau: 193.48.57.179/28&lt;br /&gt;
* le répertoire où créer les disques virtuels: /usr/local/xen&lt;br /&gt;
* le miroir Debian: http://debian.polytech-lille.fr/debian&lt;br /&gt;
* la distribution: jessie (qui est la distribution stable courante)&lt;br /&gt;
&lt;br /&gt;
    2) xen-create-image --hostname=&amp;lt;IMA5-BANANE&amp;gt; --ip 193.48.57.179/28 --dir /usr/local/xen --netmask=255.255.255.240 --gateway=193.48.57.177 --mirror=http://debian.polytech-lille.fr/debian/ --dist=jessie&lt;br /&gt;
&lt;br /&gt;
On modifie le fichier de configuration de la machine virtuelle pour faire en sorte que les répertoires var et home de la machine virtuelle soient sur des partitions LVM de l'hôte. Installez les paquetages nécessaires pour SSH, le serveur Web apache2 et le serveur DNS bind (voir la partie services).&lt;br /&gt;
&lt;br /&gt;
    3) xl create /etc/xen/IMA5-BANANE.cfg&lt;br /&gt;
       vi /etc/xen/IMA5-BANANE.cfg&lt;br /&gt;
       lvcreate -L 10G -n /dev/virtual/IMA5-BANANE-home -v&lt;br /&gt;
       lvcreate -L 10G -n /dev/virtual/IMA5-BANANE-var -v&lt;br /&gt;
&lt;br /&gt;
       root@cordouan:~# cat /etc/xen/IMA5-BANANE.cfg&lt;br /&gt;
       #&lt;br /&gt;
       # Configuration file for the Xen instance IMA5-BANANE, created&lt;br /&gt;
       # by xen-tools 4.5 on Mon Sep 11 19:01:21 2017.&lt;br /&gt;
       #&lt;br /&gt;
       #&lt;br /&gt;
       #  Kernel + memory size&lt;br /&gt;
       #&lt;br /&gt;
       kernel      = '/boot/vmlinuz-3.16.0-4-amd64'&lt;br /&gt;
       extra       = 'elevator=noop'&lt;br /&gt;
       ramdisk     = '/boot/initrd.img-3.16.0-4-amd64'&lt;br /&gt;
       vcpus       = '1'&lt;br /&gt;
       memory      = '512'&lt;br /&gt;
       #&lt;br /&gt;
       #  Disk device(s).&lt;br /&gt;
       #&lt;br /&gt;
       root        = '/dev/xvda2 ro'&lt;br /&gt;
       disk        = [&lt;br /&gt;
                  'file:/usr/local/xen/domains/IMA5-BANANE/disk.img,xvda2,w',&lt;br /&gt;
                  'file:/usr/local/xen/domains/IMA5-BANANE/swap.img,xvda1,w',&lt;br /&gt;
                  'phy:/dev/virtual/IMA5-BANANE-home,xvdb1,w',&lt;br /&gt;
  		  'phy:/dev/virtual/IMA5-BANANE-var,xvdc1,w',		 &lt;br /&gt;
       #&lt;br /&gt;
       #  Physical volumes&lt;br /&gt;
       #&lt;br /&gt;
       #&lt;br /&gt;
       #  Hostname&lt;br /&gt;
       #&lt;br /&gt;
       name        = 'IMA5-BANANE'  &lt;br /&gt;
       #&lt;br /&gt;
       #  Networking&lt;br /&gt;
       #&lt;br /&gt;
       vif         = [ 'ip=193.48.57.179/28 ,mac=00:16:3E:56:71:47,bridge=IMA5sc' ]       &lt;br /&gt;
       #&lt;br /&gt;
       #  Behaviour&lt;br /&gt;
       on_poweroff = 'destroy'&lt;br /&gt;
       on_reboot   = 'restart'&lt;br /&gt;
       on_crash    = 'restart'&lt;br /&gt;
&lt;br /&gt;
On modifie le fichier de configuration en faisant en sorte que les répertoires var et home de la machine virtuelle soient sur des partitions LVM de l'hôte:&lt;br /&gt;
&lt;br /&gt;
* la mémoire attribuée: 512 Mo&lt;br /&gt;
* l'adresse ip de la MV: 193.48.57.179/28&lt;br /&gt;
* bridge: IMA5sc&lt;br /&gt;
&lt;br /&gt;
    4) xl list&lt;br /&gt;
&lt;br /&gt;
       root@cordouan:~# xl list&lt;br /&gt;
       Name                                        ID   Mem VCPUs	State	Time(s)&lt;br /&gt;
       Domain-0                                     0  1993     8     r-----   52219.3&lt;br /&gt;
       karmeliett                                   1   128     1     -b----    2483.6&lt;br /&gt;
       duvel                                        2   512     1     -b----    4225.6&lt;br /&gt;
       deus                                         3   512     1     -b----    4226.4&lt;br /&gt;
       trappe                                       4   512     1     -b----    4082.4&lt;br /&gt;
       Rincecochon                                  6   512     1     -b----    3788.2&lt;br /&gt;
       IMA5-Durian                                 62   512     1     -b----    3237.7&lt;br /&gt;
       IMA5-BANANE                                 84   512     1     -b----     152.9&lt;br /&gt;
       IMA5-Papaye                                 89   512     1     -b----      35.4&lt;br /&gt;
       IMA5-Ananas                                 91   512     1     -b----      27.0&lt;br /&gt;
&lt;br /&gt;
On vérifie que la MV IMA5-BANANE a bien été créée.&lt;br /&gt;
&lt;br /&gt;
    5) xl console IMA5-BANANE&lt;br /&gt;
&lt;br /&gt;
On lance IMA5-BANANE en utilisant le log root et le mot de passe configuré.&lt;br /&gt;
&lt;br /&gt;
Commandes de base pour démarrer la VM proprement: &lt;br /&gt;
&lt;br /&gt;
 ssh root@cordouan.insecserv.deule.net&lt;br /&gt;
 xl create /etc/xen/IMA5-BANANE.cfg&lt;br /&gt;
 ssh username@weppes&lt;br /&gt;
 ssh root@193.48.57.179&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;Services Internet (SSH, DNS sécurisé et certificat SSL)&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
On configure à présent les services Internet après avoir acheté un nom de domaine (https://www.banane.space) sur gandi.net pour créer notre site Web sécurisé.&lt;br /&gt;
&lt;br /&gt;
=====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;''Serveur SSH''&amp;lt;/span&amp;gt;=====&lt;br /&gt;
&lt;br /&gt;
Sur notre machine virtuelle, nous avons configuré le fichier sshd_config (PubkeyAuthentication ) :&lt;br /&gt;
&lt;br /&gt;
       root@IMA5-BANANE:~# vim /etc/ssh/sshd_config&lt;br /&gt;
       &lt;br /&gt;
       RSAAuthentication yes&lt;br /&gt;
       PubkeyAuthentication yes&lt;br /&gt;
       #AuthorizedKeysFile     %h/.ssh/authorized_keys&lt;br /&gt;
       PermitRootLogin yes&lt;br /&gt;
       &lt;br /&gt;
       root@IMA5-BANANE:~# service ssh restart&lt;br /&gt;
&lt;br /&gt;
=====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;''Certification SSL''&amp;lt;/span&amp;gt;=====&lt;br /&gt;
&lt;br /&gt;
Premièrement, sur Gandi nous lançons l'étape d'achat d'un certificat SSL. Puis, sur la VM nous générons le CSR grâce à cette commande:&lt;br /&gt;
&lt;br /&gt;
 root@IMA5-BANANE:/etc/apache2/sites-available/clef# openssl req -nodes -newkey rsa:2048 -sha256 -keyout banane.key -out banane.csr&lt;br /&gt;
 Generating a 2048 bit RSA private key&lt;br /&gt;
 If you enter '.', the field will be left blank.&lt;br /&gt;
 -----&lt;br /&gt;
 Country Name (2 letter code) [AU]:FR&lt;br /&gt;
 State or Province Name (full name) [Some-State]:Nord&lt;br /&gt;
 Locality Name (eg, city) []:Lille&lt;br /&gt;
 Organization Name (eg, company) [Internet Widgits Pty Ltd]:PolytechLille&lt;br /&gt;
 Organizational Unit Name (eg, section) []:IMA&lt;br /&gt;
 Common Name (e.g. server FQDN or YOUR name) []:banane.space&lt;br /&gt;
 Email Address []:&lt;br /&gt;
 A challenge password []:&lt;br /&gt;
 An optional company name []:&lt;br /&gt;
&lt;br /&gt;
 root@IMA5-BANANE:/etc/apache2/sites-available/clef# ls banane.csr banane.key&lt;br /&gt;
 root@IMA5-BANANE:/etc/apache2/sites-available/clef# cat banane.csr&lt;br /&gt;
 -----BEGIN CERTIFICATE REQUEST-----&lt;br /&gt;
 &amp;lt;CSR à renseigner sur Gandi lors de l'achat du certificat&amp;gt;&lt;br /&gt;
 -----END CERTIFICATE REQUEST-----&lt;br /&gt;
&lt;br /&gt;
Nous continuons donc la procédure pour obtenir le certificat, et attendons donc sa mise en place.&lt;br /&gt;
Pour recevoir le mail contenant le lien pour activer le certificat, nous installons les packages suivants :&lt;br /&gt;
&lt;br /&gt;
 root@IMA5-BANANE:~# apt-get install postfix mailx&lt;br /&gt;
&lt;br /&gt;
Une fois le certificat récupéré, nous les copions tous dans le bon répertoire, puis nous hashons le tout :&lt;br /&gt;
&lt;br /&gt;
 root@IMA5-BANANE:/etc/bind# cp certificat.crt /etc/ssl/certs/banane.space.crt&lt;br /&gt;
 root@IMA5-BANANE:/etc/bind# cp serveur.key /etc/ssl/private/banane.space.key&lt;br /&gt;
 root@IMA5-BANANE:/etc/bind# cp GandiStandardSSLCA2.pem /etc/ssl/certs/GandiStandardSSLCA2.pem&lt;br /&gt;
 root@IMA5-BANANE:/etc/bind# c_rehash /etc/ssl/certs&lt;br /&gt;
&lt;br /&gt;
Enfin, la dernière étape consiste en la modification des fichiers 000-banane.space-ssl.conf et ports.conf :&lt;br /&gt;
&lt;br /&gt;
 root@IMA5-BANANE:/etc/apache2/sites-available# cat 000-banane.space-ssl.conf &lt;br /&gt;
     &amp;lt;VirtualHost *:443&amp;gt;&lt;br /&gt;
         ServerName www.banane.space&lt;br /&gt;
         ServerAlias banane.space&lt;br /&gt;
         DocumentRoot /var/www/&lt;br /&gt;
         CustomLog /var/log/apache2/secure_access.log combined&lt;br /&gt;
         SSLEngine on&lt;br /&gt;
         SSLCertificateFile /etc/ssl/certs/banane.space.crt&lt;br /&gt;
         SSLCertificateKeyFile /etc/ssl/private/banane.space.key&lt;br /&gt;
         SSLCertificateChainFile /etc/ssl/certs/GandiStandardSSLCA2.pem&lt;br /&gt;
         SSLVerifyClient None&lt;br /&gt;
     &amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 root@IMA5-BANANE:/etc/apache2# cat ports.conf &lt;br /&gt;
 Listen 80&lt;br /&gt;
 &amp;lt;IfModule ssl_module&amp;gt;&lt;br /&gt;
 Listen 443&lt;br /&gt;
 &amp;lt;/IfModule&amp;gt;&lt;br /&gt;
 &amp;lt;IfModule mod_gnutls.c&amp;gt;&lt;br /&gt;
 Listen 443&lt;br /&gt;
 &amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Un redémarrage du service apache2 est maintenant nécessaire :&lt;br /&gt;
&lt;br /&gt;
 root@IMA5-BANANE:/etc/apache2# service apache2 stop&lt;br /&gt;
 root@IMA5-BANANE:/etc/apache2# service apache2 start&lt;br /&gt;
 root@IMA5-BANANE:/etc/apache2# service apache2 reload&lt;br /&gt;
&lt;br /&gt;
Nous pouvons voir que notre site est maintenant sécurisé, un cadenas vert est bien présent.&lt;br /&gt;
&lt;br /&gt;
=====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;''Serveur DNS''&amp;lt;/span&amp;gt;=====&lt;br /&gt;
&lt;br /&gt;
On commence par modifier les informations de notre nom de domaine sur le site de Gandi. Ensuite, dans ''&amp;quot;Gérer les Glue Records&amp;quot;'', nous modifions les informations concernant notre nom de domaine.&lt;br /&gt;
&lt;br /&gt;
* nom du serveur: ns.banane.space&lt;br /&gt;
* adresse IP: 193.48.57.179&lt;br /&gt;
* serveurs de nom:&lt;br /&gt;
** DNS1: ns.banane.space&lt;br /&gt;
** DNS2: ns6.gandi.net (serveur secondaire de Gandi)&lt;br /&gt;
&lt;br /&gt;
Une fois ces étapes effectuées, nous pouvons passer à la configuration du DNS avec bind. On se place alors dans le dossier /etc/bind de notre machine virtuelle.&lt;br /&gt;
Nous modifions dans un premier temps le fichier named.conf.local afin d'y créer nos zones :&lt;br /&gt;
&lt;br /&gt;
 root@IMA5-BANANE:/etc/bind# vim /etc/bind/named.conf.local&lt;br /&gt;
 zone &amp;quot;banane.space&amp;quot; IN {&lt;br /&gt;
             type master;&lt;br /&gt;
             file &amp;quot;/etc/bind/db.banane.space&amp;quot;;&lt;br /&gt;
        };&lt;br /&gt;
&lt;br /&gt;
On créée ensuite le fichier db.banane.space:&lt;br /&gt;
&lt;br /&gt;
 $TTL    604800&lt;br /&gt;
 @       IN      SOA     ns.banane.space. root.banane.space. (&lt;br /&gt;
                       2016113007       ; Serial&lt;br /&gt;
                         604800         ; Refresh&lt;br /&gt;
                          86400         ; Retry&lt;br /&gt;
                        2419200         ; Expire&lt;br /&gt;
                         604800 )       ; Negative Cache TTL&lt;br /&gt;
 ;&lt;br /&gt;
 @       IN      NS      ns.banane.space. &lt;br /&gt;
 @       IN      NS      ns6.gandi.net.&lt;br /&gt;
 ns      IN      A       193.48.57.162&lt;br /&gt;
 www     IN      A       193.48.57.162&lt;br /&gt;
 @       IN      A       193.48.57.162&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
 root@IMA5-BANANE:/etc/bind# vim /etc/resolv.conf&lt;br /&gt;
 search banane.space&lt;br /&gt;
 nameserver 193.48.57.162????&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;''DNS SEC''&amp;lt;/span&amp;gt;=====&lt;br /&gt;
&lt;br /&gt;
Génération des clefs asymétriques: &lt;br /&gt;
&lt;br /&gt;
 dnssec-keygen -a RSASHA1 -b 2048 -r /dev/urandom -f KSK -n ZONE banane.space&lt;br /&gt;
 dnssec-keygen -a RSASHA1 -b 1024 -r /dev/urandom -n ZONE banane.space&lt;br /&gt;
&lt;br /&gt;
On modifie le nom des clefs: &lt;br /&gt;
&lt;br /&gt;
 /etc/bind/banane.space.dnssec# ls&lt;br /&gt;
 ????&lt;br /&gt;
&lt;br /&gt;
Nous signons ensuite les zones:&lt;br /&gt;
&lt;br /&gt;
dnssec-signzone -o banane.space -k banane.space-ksk &lt;br /&gt;
../db.banane.space banane.space-zsk&lt;br /&gt;
&lt;br /&gt;
Pour finir nous ajoutons la clef KSK sur Gandi avec l'algorithme RSA/SHA1.&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;Sécurisation des données&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    1) vi /etc/xen/IMA5-BANANE.cfg&lt;br /&gt;
       lvcreate -L 10G -n /dev/virtual/banane-1 -v&lt;br /&gt;
       lvcreate -L 10G -n /dev/virtual/banane-2 -v&lt;br /&gt;
       lvcreate -L 10G -n /dev/virtual/banane-3 -v&lt;br /&gt;
&lt;br /&gt;
       root@cordouan:~# cat /etc/xen/IMA5-BANANE.cfg&lt;br /&gt;
       #&lt;br /&gt;
       # Configuration file for the Xen instance IMA5-BANANE, created&lt;br /&gt;
       # by xen-tools 4.5 on Mon Sep 11 19:01:21 2017.&lt;br /&gt;
       #&lt;br /&gt;
       #&lt;br /&gt;
       #  Kernel + memory size&lt;br /&gt;
       #&lt;br /&gt;
       kernel      = '/boot/vmlinuz-3.16.0-4-amd64'&lt;br /&gt;
       extra       = 'elevator=noop'&lt;br /&gt;
       ramdisk     = '/boot/initrd.img-3.16.0-4-amd64'&lt;br /&gt;
       vcpus       = '1'&lt;br /&gt;
       memory      = '512'&lt;br /&gt;
       #&lt;br /&gt;
       #  Disk device(s).&lt;br /&gt;
       #&lt;br /&gt;
       root        = '/dev/xvda2 ro'&lt;br /&gt;
       disk        = [&lt;br /&gt;
                  'file:/usr/local/xen/domains/IMA5-BANANE/disk.img,xvda2,w',&lt;br /&gt;
                  'file:/usr/local/xen/domains/IMA5-BANANE/swap.img,xvda1,w',&lt;br /&gt;
                  'phy:/dev/virtual/IMA5-BANANE-home,xvdb1,w',&lt;br /&gt;
  		  'phy:/dev/virtual/IMA5-BANANE-var,xvdc1,w',&lt;br /&gt;
                  'phy:/dev/virtual/banane-1,xvdd,w',&lt;br /&gt;
                  'phy:/dev/virtual/banane-2,xvde,w',&lt;br /&gt;
                  'phy:/dev/virtual/banane-3,xvdf,w',		 &lt;br /&gt;
       #&lt;br /&gt;
       #  Physical volumes&lt;br /&gt;
       #&lt;br /&gt;
       #&lt;br /&gt;
       #  Hostname&lt;br /&gt;
       #&lt;br /&gt;
       name        = 'IMA5-BANANE'  &lt;br /&gt;
       #&lt;br /&gt;
       #  Networking&lt;br /&gt;
       #&lt;br /&gt;
       vif         = [ 'ip=193.48.57.179/28 ,mac=00:16:3E:56:71:47,bridge=IMA5sc' ]       &lt;br /&gt;
       #&lt;br /&gt;
       #  Behaviour&lt;br /&gt;
       on_poweroff = 'destroy'&lt;br /&gt;
       on_reboot   = 'restart'&lt;br /&gt;
       on_crash    = 'restart'&lt;br /&gt;
&lt;br /&gt;
On reconfigure le fichier IMA5-BANANE.cfg en créant 3 nouvelles partitions LVM banane-X de 1 Go associées à notre VM.&lt;br /&gt;
&lt;br /&gt;
    2) xl console IMA5-BANANE&lt;br /&gt;
&lt;br /&gt;
On relance la MV IMA5-BANANE.&lt;br /&gt;
&lt;br /&gt;
    3) apt-get install mdadm&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite installé l paquetage mdadm puis rebooté la MV.&lt;br /&gt;
&lt;br /&gt;
    4) mdadm --create /dev/md0 --level=5 --assume-clean --raid-devices=3 /dev/xvdd /dev/xvde /dev/xvdf&lt;br /&gt;
&lt;br /&gt;
Nous créons le volume /dev/md0 pour créer un RAID5 logiciel avec les trois partitions obtenues. On sauvegarde ensuite la configuration actelle.&lt;br /&gt;
 root@IMA5-BANANE:~# mdadm --detail --scan &amp;gt;&amp;gt; /etc/mdadm/mdadm.conf&lt;br /&gt;
 root@IMA5-BANANE:~# mkfs /dev/md0&lt;br /&gt;
 root@IMA5-BANANE:~# mkdir /datamd0&lt;br /&gt;
 root@IMA5-BANANE:/datamd0# mount /dev/md0 /datamd0/&lt;br /&gt;
&lt;br /&gt;
Ensuite il faut éditer le fichier /etc/fstab en rajoutant la ligne suivante à la fin du fichier afin d'être sûr que la partition soit encore montée après le reboot:&lt;br /&gt;
 /dev/md0 /datamd0&lt;br /&gt;
&lt;br /&gt;
Nous créons un fichier texte sur le raid5:&lt;br /&gt;
 root@IMA5-BANANE:/datamd0# vim raid5test.txt&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour avoir le détail de la configuration actuelle:&lt;br /&gt;
&lt;br /&gt;
    5) root@IMA5-BANANE:~# mdadm --detail /dev/md0&lt;br /&gt;
 /dev/md0:&lt;br /&gt;
        Version : 1.2&lt;br /&gt;
  Creation Time : Wed Oct 25 18:27:13 2017&lt;br /&gt;
     Raid Level : raid5&lt;br /&gt;
     Array Size : 2095104 (2046.34 MiB 2145.39 MB)&lt;br /&gt;
  Used Dev Size : 1047552 (1023.17 MiB 1072.69 MB)&lt;br /&gt;
   Raid Devices : 3&lt;br /&gt;
  Total Devices : 3&lt;br /&gt;
    Persistence : Superblock is persistent&lt;br /&gt;
    Update Time : Wed Oct 25 17:03:20 2017&lt;br /&gt;
          State : clean &lt;br /&gt;
 Active Devices : 3&lt;br /&gt;
 Working Devices : 3&lt;br /&gt;
 Failed Devices : 0&lt;br /&gt;
  Spare Devices : 0&lt;br /&gt;
         Layout : left-symmetric&lt;br /&gt;
     Chunk Size : 512K&lt;br /&gt;
           Name : IMA5-BANANE:0  (local to host IMA5-BANANE)&lt;br /&gt;
           UUID : b70ad336:fb198d84:a5909f1c:f4b33229&lt;br /&gt;
         Events : 2&lt;br /&gt;
    Number   Major   Minor   RaidDevice State&lt;br /&gt;
       0     202       48        0      active sync   /dev/xvdd&lt;br /&gt;
       1     202       64        1      active sync   /dev/xvde&lt;br /&gt;
       2     202       80        2      active sync   /dev/xvdf&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    6) root@IMA5-BANANE:~# mdadm --detail /dev/md0&lt;br /&gt;
 /dev/md0:&lt;br /&gt;
        Version : 1.2&lt;br /&gt;
  Creation Time : Wed Oct 25 18:27:13 2017&lt;br /&gt;
     Raid Level : raid5&lt;br /&gt;
     Array Size : 2095104 (2046.34 MiB 2145.39 MB)&lt;br /&gt;
  Used Dev Size : 1047552 (1023.17 MiB 1072.69 MB)&lt;br /&gt;
   Raid Devices : 3&lt;br /&gt;
  Total Devices : 2&lt;br /&gt;
    Persistence : Superblock is persistent&lt;br /&gt;
    Update Time : Wed Oct 25 18:51:56 2017&lt;br /&gt;
          State : clean, degraded &lt;br /&gt;
 Active Devices : 2&lt;br /&gt;
 Working Devices : 2&lt;br /&gt;
 Failed Devices : 0&lt;br /&gt;
  Spare Devices : 0&lt;br /&gt;
         Layout : left-symmetric&lt;br /&gt;
     Chunk Size : 512K&lt;br /&gt;
           Name : IMA5-BANANE:0  (local to host IMA5-BANANE)&lt;br /&gt;
           UUID : b70ad336:fb198d84:a5909f1c:f4b33229&lt;br /&gt;
         Events : 12&lt;br /&gt;
    Number   Major   Minor   RaidDevice State&lt;br /&gt;
       0       0        0        0      removed&lt;br /&gt;
       1     202       64        1      active sync   /dev/xvde&lt;br /&gt;
       2     202       80        2      active sync   /dev/xvdf&lt;br /&gt;
&lt;br /&gt;
Nous arrêtons la MV, mettons en commentaire la 1ère partition dans le fichier de configuration, puis redémarrons la machine.&lt;br /&gt;
&lt;br /&gt;
On voit bien qu'une partition a été supprimée mais que le fichier créé auparavant est toujours présent:&lt;br /&gt;
&lt;br /&gt;
 root@IMA5-BANANE:~# ls /datamd0/&lt;br /&gt;
 raid5test.txt&lt;br /&gt;
&lt;br /&gt;
Pour le test de réparation, afin de bien voir l'avancement de la reconstruction, nous avons procédé comme dans l'exemple du cours: Suppression de la partition xvdd:&lt;br /&gt;
&lt;br /&gt;
 root@IMA5-BANANE:~# mdadm --set-faulty /dev/md0 /dev/xvdd&lt;br /&gt;
 root@IMA5-BANANE:~# mdadm --remove /dev/md0 /dev/xvdd&lt;br /&gt;
 La partition est bien supprimée:&lt;br /&gt;
 Personalities : [raid6] [raid5] [raid4] &lt;br /&gt;
 md0 : active raid5 xvde[1] xvdf[2]&lt;br /&gt;
      2095104 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/2] [UU_]&lt;br /&gt;
&lt;br /&gt;
On remet à présent la partition supprimée:&lt;br /&gt;
 root@IMA5-BANANE:~# mdadm --add /dev/md0 /dev/xvdd&lt;br /&gt;
&lt;br /&gt;
On essaie ensuite de remonter le RAID5 et on peut constater l'avancement de la reconstruction en lançant la même commande assez régulièrement:&lt;br /&gt;
&lt;br /&gt;
    7) root@IMA5-BANANE:~# cat /proc/mdstat&lt;br /&gt;
 Personalities : [raid6] [raid5] [raid4] &lt;br /&gt;
 md0 : active raid5 xvdd[3] xvde[1] xvdf[2]&lt;br /&gt;
      2095104 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/2] [_UU]&lt;br /&gt;
      [===========&amp;gt;.........]  recovery = 59.7% (627140/1047552) finish=0.2min speed=28506K/sec&lt;br /&gt;
 unused devices: &amp;lt;none&amp;gt;&lt;br /&gt;
 root@IMA5-BANANE:~# cat /proc/mdstat&lt;br /&gt;
 Personalities : [raid6] [raid5] [raid4] &lt;br /&gt;
 md0 : active raid5 xvdd[3] xvde[1] xvdf[2]&lt;br /&gt;
      2095104 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/2] [_UU]&lt;br /&gt;
      [============&amp;gt;........]  recovery = 64.5% (676392/1047552) finish=0.2min speed=29408K/sec     &lt;br /&gt;
 unused devices: &amp;lt;none&amp;gt;&lt;br /&gt;
 root@IMA5-BANANE:~# cat /proc/mdstat&lt;br /&gt;
 Personalities : [raid6] [raid5] [raid4] &lt;br /&gt;
 md0 : active raid5 xvdd[3] xvde[1] xvdf[2]&lt;br /&gt;
      2095104 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/2] [_UU]&lt;br /&gt;
      [=============&amp;gt;.......]  recovery = 66.2% (695080/1047552) finish=0.2min speed=28961K/sec     &lt;br /&gt;
 unused devices: &amp;lt;none&amp;gt;&lt;br /&gt;
 root@IMA5-BANANE:~# cat /proc/mdstat&lt;br /&gt;
 Personalities : [raid6] [raid5] [raid4] &lt;br /&gt;
 md0 : active raid5 xvdd[3] xvde[1] xvdf[2]&lt;br /&gt;
      2095104 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/2] [_UU]&lt;br /&gt;
      [=============&amp;gt;.......]  recovery = 68.1% (714664/1047552) finish=0.1min speed=28586K/sec&lt;br /&gt;
 unused devices: &amp;lt;none&amp;gt;&lt;br /&gt;
 root@IMA5-BANANE:~# cat /proc/mdstat&lt;br /&gt;
 Personalities : [raid6] [raid5] [raid4] &lt;br /&gt;
 md0 : active raid5 xvdd[3] xvde[1] xvdf[2]&lt;br /&gt;
      2095104 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/2] [_UU]&lt;br /&gt;
      [==================&amp;gt;..]  recovery = 94.6% (991996/1047552) finish=0.0min speed=29206K/sec   &lt;br /&gt;
 unused devices: &amp;lt;none&amp;gt;&lt;br /&gt;
 root@IMA5-BANANE:~# cat /proc/mdstat&lt;br /&gt;
 Personalities : [raid6] [raid5] [raid4] &lt;br /&gt;
 md0 : active raid5 xvdd[3] xvde[1] xvdf[2]&lt;br /&gt;
      2095104 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/3] [UUU]     &lt;br /&gt;
 unused devices: &amp;lt;none&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;Cryptage des données&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
 cryptsetup luksFormat -c aes -h sha256 /dev/mmcblk1&lt;br /&gt;
 cryptsetup luksOpen /dev/sdb1 crypt_sd&lt;br /&gt;
 mkfs.ext4 /dev/mapper/crypt_sd&lt;br /&gt;
 mount /dev/mapper/crypt_sd /mnt&lt;br /&gt;
 vi /mnt/test.txt #on marque un texte dans le fichier&lt;br /&gt;
 umount /mnt&lt;br /&gt;
 cryptsetup luksClose crypt_sd&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;Mise en réseau de la MV Xen IMA5-BANANE&amp;lt;/span&amp;gt;====&lt;/div&gt;</summary>
		<author><name>Hdelatte</name></author>	</entry>

	<entry>
		<id>https://projets-ima.plil.fr/mediawiki/index.php?title=Cahier_2017_groupe_n%C2%B05&amp;diff=46288</id>
		<title>Cahier 2017 groupe n°5</title>
		<link rel="alternate" type="text/html" href="https://projets-ima.plil.fr/mediawiki/index.php?title=Cahier_2017_groupe_n%C2%B05&amp;diff=46288"/>
				<updated>2017-11-17T09:00:08Z</updated>
		
		<summary type="html">&lt;p&gt;Hdelatte : /* Création d'une machine virtuelle Xen sur Cordouan */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Présentation générale'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;Mise en contexte&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
Le projet de Réseau Avancé est composé d'une partie commune et d'une tâche particulière par binôme. Ce projet consiste en la configuration d'une architecture réseau avec différentes parties, en plus du câblage et de la configuration des routeurs et commutateurs.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
La partie commune consiste en la création et la mise en réseau d'une machine virtuelle; ainsi que la création d'un site sécurisé avec la configuration du serveur SSH, DNS sécurisé et du certificat SSL. La virtualisation permet de faire fonctionner sur une même machine plusieurs OS isolés ou des logiciels grâce aux machines virtuelles. Au-delà de la réduction des coûts, la virtualisation permet aussi de manipuler et gérer plus facilement des OS. Cependant, on s'oriente de plus en plus vers l'isolation par des conteneurs car ils permettent au sein d'un même OS, d'isoler les ressources matérielles et d'éviter des surcharges.&lt;br /&gt;
&lt;br /&gt;
Notre tâche particulière est donc de réaliser la gestion des conteneurs au sein d'une machine virtuelle configurée en réseau.&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;Tâches à effectuer&amp;lt;/span&amp;gt;===&lt;br /&gt;
&lt;br /&gt;
* Création d'une machine virtuelle sur le serveur de virtualisation Cordouan&lt;br /&gt;
* Mettre la machine virtuelle en réseau&lt;br /&gt;
* Configuration des services Internet (Serveur SSH, DNS, DNSSEC, Certificat SSL)&lt;br /&gt;
* Crackage de clé Wi-Fi&lt;br /&gt;
* Créer les différents conteneurs et configurer leur accès au réseau (tâche particulière)&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span style=&amp;quot;color:#000080&amp;quot;&amp;gt;'''Travail effectué'''&amp;lt;/span&amp;gt;==&lt;br /&gt;
                     &lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;Création d'une machine virtuelle Xen sur Cordouan&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
On commence par créer une machine virtuelle Xen sur le serveur de virtualisation cordouan.insecserv.deule.net. On se connecte tout d'abord en SSH sur le serveur cordouan.&lt;br /&gt;
&lt;br /&gt;
    1) ssh root@cordouan.insecserv.deule.net&lt;br /&gt;
       Mot de passe: mot de passe root habituel&lt;br /&gt;
&lt;br /&gt;
On précise:&lt;br /&gt;
&lt;br /&gt;
* le nom de machine virtuelle: IMA5-BANANE&lt;br /&gt;
* son adresse IP sur le réseau: 193.48.57.179/28&lt;br /&gt;
* le répertoire où créer les disques virtuels: /usr/local/xen&lt;br /&gt;
* le miroir Debian: http://debian.polytech-lille.fr/debian&lt;br /&gt;
* la distribution: jessie (qui est la distribution stable courante)&lt;br /&gt;
&lt;br /&gt;
    2) xen-create-image --hostname=&amp;lt;IMA5-BANANE&amp;gt; --ip 193.48.57.179/28 --dir /usr/local/xen --netmask=255.255.255.240 --gateway=193.48.57.177 --mirror=http://debian.polytech-lille.fr/debian/ --dist=jessie&lt;br /&gt;
&lt;br /&gt;
On modifie le fichier de configuration de la machine virtuelle pour faire en sorte que les répertoires var et home de la machine virtuelle soient sur des partitions LVM de l'hôte. Installez les paquetages nécessaires pour SSH, le serveur Web apache2 et le serveur DNS bind (voir la partie services).&lt;br /&gt;
&lt;br /&gt;
    3) xl create /etc/xen/IMA5-BANANE.cfg&lt;br /&gt;
       vi /etc/xen/IMA5-BANANE.cfg&lt;br /&gt;
       lvcreate -L 10G -n /dev/virtual/IMA5-BANANE-home -v&lt;br /&gt;
       lvcreate -L 10G -n /dev/virtual/IMA5-BANANE-var -v&lt;br /&gt;
&lt;br /&gt;
       root@cordouan:~# cat /etc/xen/IMA5-BANANE.cfg&lt;br /&gt;
       #&lt;br /&gt;
       # Configuration file for the Xen instance IMA5-BANANE, created&lt;br /&gt;
       # by xen-tools 4.5 on Mon Sep 11 19:01:21 2017.&lt;br /&gt;
       #&lt;br /&gt;
       #&lt;br /&gt;
       #  Kernel + memory size&lt;br /&gt;
       #&lt;br /&gt;
       kernel      = '/boot/vmlinuz-3.16.0-4-amd64'&lt;br /&gt;
       extra       = 'elevator=noop'&lt;br /&gt;
       ramdisk     = '/boot/initrd.img-3.16.0-4-amd64'&lt;br /&gt;
       vcpus       = '1'&lt;br /&gt;
       memory      = '512'&lt;br /&gt;
       #&lt;br /&gt;
       #  Disk device(s).&lt;br /&gt;
       #&lt;br /&gt;
       root        = '/dev/xvda2 ro'&lt;br /&gt;
       disk        = [&lt;br /&gt;
                  'file:/usr/local/xen/domains/IMA5-BANANE/disk.img,xvda2,w',&lt;br /&gt;
                  'file:/usr/local/xen/domains/IMA5-BANANE/swap.img,xvda1,w',&lt;br /&gt;
                  'phy:/dev/virtual/IMA5-BANANE-home,xvdb1,w',&lt;br /&gt;
  		  'phy:/dev/virtual/IMA5-BANANE-var,xvdc1,w',		 &lt;br /&gt;
       #&lt;br /&gt;
       #  Physical volumes&lt;br /&gt;
       #&lt;br /&gt;
       #&lt;br /&gt;
       #  Hostname&lt;br /&gt;
       #&lt;br /&gt;
       name        = 'IMA5-BANANE'  &lt;br /&gt;
       #&lt;br /&gt;
       #  Networking&lt;br /&gt;
       #&lt;br /&gt;
       vif         = [ 'ip=193.48.57.179/28 ,mac=00:16:3E:56:71:47,bridge=IMA5sc' ]       &lt;br /&gt;
       #&lt;br /&gt;
       #  Behaviour&lt;br /&gt;
       on_poweroff = 'destroy'&lt;br /&gt;
       on_reboot   = 'restart'&lt;br /&gt;
       on_crash    = 'restart'&lt;br /&gt;
&lt;br /&gt;
On modifie le fichier de configuration en faisant en sorte que les répertoires var et home de la machine virtuelle soient sur des partitions LVM de l'hôte:&lt;br /&gt;
&lt;br /&gt;
* la mémoire attribuée: 512 Mo&lt;br /&gt;
* l'adresse ip de la MV: 193.48.57.179/28&lt;br /&gt;
* bridge: IMA5sc&lt;br /&gt;
&lt;br /&gt;
    4) xl list&lt;br /&gt;
&lt;br /&gt;
       root@cordouan:~# xl list&lt;br /&gt;
       Name                                        ID   Mem VCPUs	State	Time(s)&lt;br /&gt;
       Domain-0                                     0  1993     8     r-----   52219.3&lt;br /&gt;
       karmeliett                                   1   128     1     -b----    2483.6&lt;br /&gt;
       duvel                                        2   512     1     -b----    4225.6&lt;br /&gt;
       deus                                         3   512     1     -b----    4226.4&lt;br /&gt;
       trappe                                       4   512     1     -b----    4082.4&lt;br /&gt;
       Rincecochon                                  6   512     1     -b----    3788.2&lt;br /&gt;
       IMA5-Durian                                 62   512     1     -b----    3237.7&lt;br /&gt;
       IMA5-BANANE                                 84   512     1     -b----     152.9&lt;br /&gt;
       IMA5-Papaye                                 89   512     1     -b----      35.4&lt;br /&gt;
       IMA5-Ananas                                 91   512     1     -b----      27.0&lt;br /&gt;
&lt;br /&gt;
On vérifie que la MV IMA5-BANANE a bien été créée.&lt;br /&gt;
&lt;br /&gt;
    5) xl console IMA5-BANANE&lt;br /&gt;
&lt;br /&gt;
On lance IMA5-BANANE en utilisant le log root et le mot de passe configuré.&lt;br /&gt;
&lt;br /&gt;
Commandes de base pour démarrer la VM proprement: &lt;br /&gt;
&lt;br /&gt;
 ssh root@cordouan.insecserv.deule.net&lt;br /&gt;
 xl create /etc/xen/GreenArrow.cfg&lt;br /&gt;
 ssh username@weppes&lt;br /&gt;
 ssh root@193.48.57.162&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;Services Internet (SSH, DNS sécurisé et certificat SSL)&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
On configure à présent les services Internet après avoir acheté un nom de domaine (https://www.banane.space) sur gandi.net pour créer notre site Web sécurisé.&lt;br /&gt;
&lt;br /&gt;
=====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;''Serveur SSH''&amp;lt;/span&amp;gt;=====&lt;br /&gt;
&lt;br /&gt;
Sur notre machine virtuelle, nous avons configuré le fichier sshd_config (PubkeyAuthentication ) :&lt;br /&gt;
&lt;br /&gt;
       root@IMA5-BANANE:~# vim /etc/ssh/sshd_config&lt;br /&gt;
       &lt;br /&gt;
       RSAAuthentication yes&lt;br /&gt;
       PubkeyAuthentication yes&lt;br /&gt;
       #AuthorizedKeysFile     %h/.ssh/authorized_keys&lt;br /&gt;
       PermitRootLogin yes&lt;br /&gt;
       &lt;br /&gt;
       root@IMA5-BANANE:~# service ssh restart&lt;br /&gt;
&lt;br /&gt;
=====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;''Certification SSL''&amp;lt;/span&amp;gt;=====&lt;br /&gt;
&lt;br /&gt;
Premièrement, sur Gandi nous lançons l'étape d'achat d'un certificat SSL. Puis, sur la VM nous générons le CSR grâce à cette commande:&lt;br /&gt;
&lt;br /&gt;
 root@IMA5-BANANE:/etc/apache2/sites-available/clef# openssl req -nodes -newkey rsa:2048 -sha256 -keyout banane.key -out banane.csr&lt;br /&gt;
 Generating a 2048 bit RSA private key&lt;br /&gt;
 If you enter '.', the field will be left blank.&lt;br /&gt;
 -----&lt;br /&gt;
 Country Name (2 letter code) [AU]:FR&lt;br /&gt;
 State or Province Name (full name) [Some-State]:Nord&lt;br /&gt;
 Locality Name (eg, city) []:Lille&lt;br /&gt;
 Organization Name (eg, company) [Internet Widgits Pty Ltd]:PolytechLille&lt;br /&gt;
 Organizational Unit Name (eg, section) []:IMA&lt;br /&gt;
 Common Name (e.g. server FQDN or YOUR name) []:banane.space&lt;br /&gt;
 Email Address []:&lt;br /&gt;
 A challenge password []:&lt;br /&gt;
 An optional company name []:&lt;br /&gt;
&lt;br /&gt;
 root@IMA5-BANANE:/etc/apache2/sites-available/clef# ls banane.csr banane.key&lt;br /&gt;
 root@IMA5-BANANE:/etc/apache2/sites-available/clef# cat banane.csr&lt;br /&gt;
 -----BEGIN CERTIFICATE REQUEST-----&lt;br /&gt;
 &amp;lt;CSR à renseigner sur Gandi lors de l'achat du certificat&amp;gt;&lt;br /&gt;
 -----END CERTIFICATE REQUEST-----&lt;br /&gt;
&lt;br /&gt;
Nous continuons donc la procédure pour obtenir le certificat, et attendons donc sa mise en place.&lt;br /&gt;
Pour recevoir le mail contenant le lien pour activer le certificat, nous installons les packages suivants :&lt;br /&gt;
&lt;br /&gt;
 root@IMA5-BANANE:~# apt-get install postfix mailx&lt;br /&gt;
&lt;br /&gt;
Une fois le certificat récupéré, nous les copions tous dans le bon répertoire, puis nous hashons le tout :&lt;br /&gt;
&lt;br /&gt;
 root@IMA5-BANANE:/etc/bind# cp certificat.crt /etc/ssl/certs/banane.space.crt&lt;br /&gt;
 root@IMA5-BANANE:/etc/bind# cp serveur.key /etc/ssl/private/banane.space.key&lt;br /&gt;
 root@IMA5-BANANE:/etc/bind# cp GandiStandardSSLCA2.pem /etc/ssl/certs/GandiStandardSSLCA2.pem&lt;br /&gt;
 root@IMA5-BANANE:/etc/bind# c_rehash /etc/ssl/certs&lt;br /&gt;
&lt;br /&gt;
Enfin, la dernière étape consiste en la modification des fichiers 000-banane.space-ssl.conf et ports.conf :&lt;br /&gt;
&lt;br /&gt;
 root@IMA5-BANANE:/etc/apache2/sites-available# cat 000-banane.space-ssl.conf &lt;br /&gt;
     &amp;lt;VirtualHost *:443&amp;gt;&lt;br /&gt;
         ServerName www.banane.space&lt;br /&gt;
         ServerAlias banane.space&lt;br /&gt;
         DocumentRoot /var/www/&lt;br /&gt;
         CustomLog /var/log/apache2/secure_access.log combined&lt;br /&gt;
         SSLEngine on&lt;br /&gt;
         SSLCertificateFile /etc/ssl/certs/banane.space.crt&lt;br /&gt;
         SSLCertificateKeyFile /etc/ssl/private/banane.space.key&lt;br /&gt;
         SSLCertificateChainFile /etc/ssl/certs/GandiStandardSSLCA2.pem&lt;br /&gt;
         SSLVerifyClient None&lt;br /&gt;
     &amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 root@IMA5-BANANE:/etc/apache2# cat ports.conf &lt;br /&gt;
 Listen 80&lt;br /&gt;
 &amp;lt;IfModule ssl_module&amp;gt;&lt;br /&gt;
 Listen 443&lt;br /&gt;
 &amp;lt;/IfModule&amp;gt;&lt;br /&gt;
 &amp;lt;IfModule mod_gnutls.c&amp;gt;&lt;br /&gt;
 Listen 443&lt;br /&gt;
 &amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Un redémarrage du service apache2 est maintenant nécessaire :&lt;br /&gt;
&lt;br /&gt;
 root@IMA5-BANANE:/etc/apache2# service apache2 stop&lt;br /&gt;
 root@IMA5-BANANE:/etc/apache2# service apache2 start&lt;br /&gt;
 root@IMA5-BANANE:/etc/apache2# service apache2 reload&lt;br /&gt;
&lt;br /&gt;
Nous pouvons voir que notre site est maintenant sécurisé, un cadenas vert est bien présent.&lt;br /&gt;
&lt;br /&gt;
=====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;''Serveur DNS''&amp;lt;/span&amp;gt;=====&lt;br /&gt;
&lt;br /&gt;
On commence par modifier les informations de notre nom de domaine sur le site de Gandi. Ensuite, dans ''&amp;quot;Gérer les Glue Records&amp;quot;'', nous modifions les informations concernant notre nom de domaine.&lt;br /&gt;
&lt;br /&gt;
* nom du serveur: ns.banane.space&lt;br /&gt;
* adresse IP: 193.48.57.179&lt;br /&gt;
* serveurs de nom:&lt;br /&gt;
** DNS1: ns.banane.space&lt;br /&gt;
** DNS2: ns6.gandi.net (serveur secondaire de Gandi)&lt;br /&gt;
&lt;br /&gt;
Une fois ces étapes effectuées, nous pouvons passer à la configuration du DNS avec bind. On se place alors dans le dossier /etc/bind de notre machine virtuelle.&lt;br /&gt;
Nous modifions dans un premier temps le fichier named.conf.local afin d'y créer nos zones :&lt;br /&gt;
&lt;br /&gt;
 root@IMA5-BANANE:/etc/bind# vim /etc/bind/named.conf.local&lt;br /&gt;
 zone &amp;quot;banane.space&amp;quot; IN {&lt;br /&gt;
             type master;&lt;br /&gt;
             file &amp;quot;/etc/bind/db.banane.space&amp;quot;;&lt;br /&gt;
        };&lt;br /&gt;
&lt;br /&gt;
On créée ensuite le fichier db.banane.space:&lt;br /&gt;
&lt;br /&gt;
 $TTL    604800&lt;br /&gt;
 @       IN      SOA     ns.banane.space. root.banane.space. (&lt;br /&gt;
                       2016113007       ; Serial&lt;br /&gt;
                         604800         ; Refresh&lt;br /&gt;
                          86400         ; Retry&lt;br /&gt;
                        2419200         ; Expire&lt;br /&gt;
                         604800 )       ; Negative Cache TTL&lt;br /&gt;
 ;&lt;br /&gt;
 @       IN      NS      ns.banane.space. &lt;br /&gt;
 @       IN      NS      ns6.gandi.net.&lt;br /&gt;
 ns      IN      A       193.48.57.162&lt;br /&gt;
 www     IN      A       193.48.57.162&lt;br /&gt;
 @       IN      A       193.48.57.162&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
 root@IMA5-BANANE:/etc/bind# vim /etc/resolv.conf&lt;br /&gt;
 search banane.space&lt;br /&gt;
 nameserver 193.48.57.162????&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====&amp;lt;span style=&amp;quot;color:#6B8E23&amp;quot;&amp;gt;''DNS SEC''&amp;lt;/span&amp;gt;=====&lt;br /&gt;
&lt;br /&gt;
Génération des clefs asymétriques: &lt;br /&gt;
&lt;br /&gt;
 dnssec-keygen -a RSASHA1 -b 2048 -r /dev/urandom -f KSK -n ZONE banane.space&lt;br /&gt;
 dnssec-keygen -a RSASHA1 -b 1024 -r /dev/urandom -n ZONE banane.space&lt;br /&gt;
&lt;br /&gt;
On modifie le nom des clefs: &lt;br /&gt;
&lt;br /&gt;
 /etc/bind/banane.space.dnssec# ls&lt;br /&gt;
 ????&lt;br /&gt;
&lt;br /&gt;
Nous signons ensuite les zones:&lt;br /&gt;
&lt;br /&gt;
dnssec-signzone -o banane.space -k banane.space-ksk &lt;br /&gt;
../db.banane.space banane.space-zsk&lt;br /&gt;
&lt;br /&gt;
Pour finir nous ajoutons la clef KSK sur Gandi avec l'algorithme RSA/SHA1.&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;Sécurisation des données&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    1) vi /etc/xen/IMA5-BANANE.cfg&lt;br /&gt;
       lvcreate -L 10G -n /dev/virtual/banane-1 -v&lt;br /&gt;
       lvcreate -L 10G -n /dev/virtual/banane-2 -v&lt;br /&gt;
       lvcreate -L 10G -n /dev/virtual/banane-3 -v&lt;br /&gt;
&lt;br /&gt;
       root@cordouan:~# cat /etc/xen/IMA5-BANANE.cfg&lt;br /&gt;
       #&lt;br /&gt;
       # Configuration file for the Xen instance IMA5-BANANE, created&lt;br /&gt;
       # by xen-tools 4.5 on Mon Sep 11 19:01:21 2017.&lt;br /&gt;
       #&lt;br /&gt;
       #&lt;br /&gt;
       #  Kernel + memory size&lt;br /&gt;
       #&lt;br /&gt;
       kernel      = '/boot/vmlinuz-3.16.0-4-amd64'&lt;br /&gt;
       extra       = 'elevator=noop'&lt;br /&gt;
       ramdisk     = '/boot/initrd.img-3.16.0-4-amd64'&lt;br /&gt;
       vcpus       = '1'&lt;br /&gt;
       memory      = '512'&lt;br /&gt;
       #&lt;br /&gt;
       #  Disk device(s).&lt;br /&gt;
       #&lt;br /&gt;
       root        = '/dev/xvda2 ro'&lt;br /&gt;
       disk        = [&lt;br /&gt;
                  'file:/usr/local/xen/domains/IMA5-BANANE/disk.img,xvda2,w',&lt;br /&gt;
                  'file:/usr/local/xen/domains/IMA5-BANANE/swap.img,xvda1,w',&lt;br /&gt;
                  'phy:/dev/virtual/IMA5-BANANE-home,xvdb1,w',&lt;br /&gt;
  		  'phy:/dev/virtual/IMA5-BANANE-var,xvdc1,w',&lt;br /&gt;
                  'phy:/dev/virtual/banane-1,xvdd,w',&lt;br /&gt;
                  'phy:/dev/virtual/banane-2,xvde,w',&lt;br /&gt;
                  'phy:/dev/virtual/banane-3,xvdf,w',		 &lt;br /&gt;
       #&lt;br /&gt;
       #  Physical volumes&lt;br /&gt;
       #&lt;br /&gt;
       #&lt;br /&gt;
       #  Hostname&lt;br /&gt;
       #&lt;br /&gt;
       name        = 'IMA5-BANANE'  &lt;br /&gt;
       #&lt;br /&gt;
       #  Networking&lt;br /&gt;
       #&lt;br /&gt;
       vif         = [ 'ip=193.48.57.179/28 ,mac=00:16:3E:56:71:47,bridge=IMA5sc' ]       &lt;br /&gt;
       #&lt;br /&gt;
       #  Behaviour&lt;br /&gt;
       on_poweroff = 'destroy'&lt;br /&gt;
       on_reboot   = 'restart'&lt;br /&gt;
       on_crash    = 'restart'&lt;br /&gt;
&lt;br /&gt;
On reconfigure le fichier IMA5-BANANE.cfg en créant 3 nouvelles partitions LVM banane-X de 1 Go associées à notre VM.&lt;br /&gt;
&lt;br /&gt;
    2) xl console IMA5-BANANE&lt;br /&gt;
&lt;br /&gt;
On relance la MV IMA5-BANANE.&lt;br /&gt;
&lt;br /&gt;
    3) apt-get install mdadm&lt;br /&gt;
&lt;br /&gt;
Nous avons ensuite installé l paquetage mdadm puis rebooté la MV.&lt;br /&gt;
&lt;br /&gt;
    4) mdadm --create /dev/md0 --level=5 --assume-clean --raid-devices=3 /dev/xvdd /dev/xvde /dev/xvdf&lt;br /&gt;
&lt;br /&gt;
Nous créons le volume /dev/md0 pour créer un RAID5 logiciel avec les trois partitions obtenues. On sauvegarde ensuite la configuration actelle.&lt;br /&gt;
 root@IMA5-BANANE:~# mdadm --detail --scan &amp;gt;&amp;gt; /etc/mdadm/mdadm.conf&lt;br /&gt;
 root@IMA5-BANANE:~# mkfs /dev/md0&lt;br /&gt;
 root@IMA5-BANANE:~# mkdir /datamd0&lt;br /&gt;
 root@IMA5-BANANE:/datamd0# mount /dev/md0 /datamd0/&lt;br /&gt;
&lt;br /&gt;
Ensuite il faut éditer le fichier /etc/fstab en rajoutant la ligne suivante à la fin du fichier afin d'être sûr que la partition soit encore montée après le reboot:&lt;br /&gt;
 /dev/md0 /datamd0&lt;br /&gt;
&lt;br /&gt;
Nous créons un fichier texte sur le raid5:&lt;br /&gt;
 root@IMA5-BANANE:/datamd0# vim raid5test.txt&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour avoir le détail de la configuration actuelle:&lt;br /&gt;
&lt;br /&gt;
    5) root@IMA5-BANANE:~# mdadm --detail /dev/md0&lt;br /&gt;
 /dev/md0:&lt;br /&gt;
        Version : 1.2&lt;br /&gt;
  Creation Time : Wed Oct 25 18:27:13 2017&lt;br /&gt;
     Raid Level : raid5&lt;br /&gt;
     Array Size : 2095104 (2046.34 MiB 2145.39 MB)&lt;br /&gt;
  Used Dev Size : 1047552 (1023.17 MiB 1072.69 MB)&lt;br /&gt;
   Raid Devices : 3&lt;br /&gt;
  Total Devices : 3&lt;br /&gt;
    Persistence : Superblock is persistent&lt;br /&gt;
    Update Time : Wed Oct 25 17:03:20 2017&lt;br /&gt;
          State : clean &lt;br /&gt;
 Active Devices : 3&lt;br /&gt;
 Working Devices : 3&lt;br /&gt;
 Failed Devices : 0&lt;br /&gt;
  Spare Devices : 0&lt;br /&gt;
         Layout : left-symmetric&lt;br /&gt;
     Chunk Size : 512K&lt;br /&gt;
           Name : IMA5-BANANE:0  (local to host IMA5-BANANE)&lt;br /&gt;
           UUID : b70ad336:fb198d84:a5909f1c:f4b33229&lt;br /&gt;
         Events : 2&lt;br /&gt;
    Number   Major   Minor   RaidDevice State&lt;br /&gt;
       0     202       48        0      active sync   /dev/xvdd&lt;br /&gt;
       1     202       64        1      active sync   /dev/xvde&lt;br /&gt;
       2     202       80        2      active sync   /dev/xvdf&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    6) root@IMA5-BANANE:~# mdadm --detail /dev/md0&lt;br /&gt;
 /dev/md0:&lt;br /&gt;
        Version : 1.2&lt;br /&gt;
  Creation Time : Wed Oct 25 18:27:13 2017&lt;br /&gt;
     Raid Level : raid5&lt;br /&gt;
     Array Size : 2095104 (2046.34 MiB 2145.39 MB)&lt;br /&gt;
  Used Dev Size : 1047552 (1023.17 MiB 1072.69 MB)&lt;br /&gt;
   Raid Devices : 3&lt;br /&gt;
  Total Devices : 2&lt;br /&gt;
    Persistence : Superblock is persistent&lt;br /&gt;
    Update Time : Wed Oct 25 18:51:56 2017&lt;br /&gt;
          State : clean, degraded &lt;br /&gt;
 Active Devices : 2&lt;br /&gt;
 Working Devices : 2&lt;br /&gt;
 Failed Devices : 0&lt;br /&gt;
  Spare Devices : 0&lt;br /&gt;
         Layout : left-symmetric&lt;br /&gt;
     Chunk Size : 512K&lt;br /&gt;
           Name : IMA5-BANANE:0  (local to host IMA5-BANANE)&lt;br /&gt;
           UUID : b70ad336:fb198d84:a5909f1c:f4b33229&lt;br /&gt;
         Events : 12&lt;br /&gt;
    Number   Major   Minor   RaidDevice State&lt;br /&gt;
       0       0        0        0      removed&lt;br /&gt;
       1     202       64        1      active sync   /dev/xvde&lt;br /&gt;
       2     202       80        2      active sync   /dev/xvdf&lt;br /&gt;
&lt;br /&gt;
Nous arrêtons la MV, mettons en commentaire la 1ère partition dans le fichier de configuration, puis redémarrons la machine.&lt;br /&gt;
&lt;br /&gt;
On voit bien qu'une partition a été supprimée mais que le fichier créé auparavant est toujours présent:&lt;br /&gt;
&lt;br /&gt;
 root@IMA5-BANANE:~# ls /datamd0/&lt;br /&gt;
 raid5test.txt&lt;br /&gt;
&lt;br /&gt;
Pour le test de réparation, afin de bien voir l'avancement de la reconstruction, nous avons procédé comme dans l'exemple du cours: Suppression de la partition xvdd:&lt;br /&gt;
&lt;br /&gt;
 root@IMA5-BANANE:~# mdadm --set-faulty /dev/md0 /dev/xvdd&lt;br /&gt;
 root@IMA5-BANANE:~# mdadm --remove /dev/md0 /dev/xvdd&lt;br /&gt;
 La partition est bien supprimée:&lt;br /&gt;
 Personalities : [raid6] [raid5] [raid4] &lt;br /&gt;
 md0 : active raid5 xvde[1] xvdf[2]&lt;br /&gt;
      2095104 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/2] [UU_]&lt;br /&gt;
&lt;br /&gt;
On remet à présent la partition supprimée:&lt;br /&gt;
 root@IMA5-BANANE:~# mdadm --add /dev/md0 /dev/xvdd&lt;br /&gt;
&lt;br /&gt;
On essaie ensuite de remonter le RAID5 et on peut constater l'avancement de la reconstruction en lançant la même commande assez régulièrement:&lt;br /&gt;
&lt;br /&gt;
    7) root@IMA5-BANANE:~# cat /proc/mdstat&lt;br /&gt;
 Personalities : [raid6] [raid5] [raid4] &lt;br /&gt;
 md0 : active raid5 xvdd[3] xvde[1] xvdf[2]&lt;br /&gt;
      2095104 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/2] [_UU]&lt;br /&gt;
      [===========&amp;gt;.........]  recovery = 59.7% (627140/1047552) finish=0.2min speed=28506K/sec&lt;br /&gt;
 unused devices: &amp;lt;none&amp;gt;&lt;br /&gt;
 root@IMA5-BANANE:~# cat /proc/mdstat&lt;br /&gt;
 Personalities : [raid6] [raid5] [raid4] &lt;br /&gt;
 md0 : active raid5 xvdd[3] xvde[1] xvdf[2]&lt;br /&gt;
      2095104 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/2] [_UU]&lt;br /&gt;
      [============&amp;gt;........]  recovery = 64.5% (676392/1047552) finish=0.2min speed=29408K/sec     &lt;br /&gt;
 unused devices: &amp;lt;none&amp;gt;&lt;br /&gt;
 root@IMA5-BANANE:~# cat /proc/mdstat&lt;br /&gt;
 Personalities : [raid6] [raid5] [raid4] &lt;br /&gt;
 md0 : active raid5 xvdd[3] xvde[1] xvdf[2]&lt;br /&gt;
      2095104 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/2] [_UU]&lt;br /&gt;
      [=============&amp;gt;.......]  recovery = 66.2% (695080/1047552) finish=0.2min speed=28961K/sec     &lt;br /&gt;
 unused devices: &amp;lt;none&amp;gt;&lt;br /&gt;
 root@IMA5-BANANE:~# cat /proc/mdstat&lt;br /&gt;
 Personalities : [raid6] [raid5] [raid4] &lt;br /&gt;
 md0 : active raid5 xvdd[3] xvde[1] xvdf[2]&lt;br /&gt;
      2095104 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/2] [_UU]&lt;br /&gt;
      [=============&amp;gt;.......]  recovery = 68.1% (714664/1047552) finish=0.1min speed=28586K/sec&lt;br /&gt;
 unused devices: &amp;lt;none&amp;gt;&lt;br /&gt;
 root@IMA5-BANANE:~# cat /proc/mdstat&lt;br /&gt;
 Personalities : [raid6] [raid5] [raid4] &lt;br /&gt;
 md0 : active raid5 xvdd[3] xvde[1] xvdf[2]&lt;br /&gt;
      2095104 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/2] [_UU]&lt;br /&gt;
      [==================&amp;gt;..]  recovery = 94.6% (991996/1047552) finish=0.0min speed=29206K/sec   &lt;br /&gt;
 unused devices: &amp;lt;none&amp;gt;&lt;br /&gt;
 root@IMA5-BANANE:~# cat /proc/mdstat&lt;br /&gt;
 Personalities : [raid6] [raid5] [raid4] &lt;br /&gt;
 md0 : active raid5 xvdd[3] xvde[1] xvdf[2]&lt;br /&gt;
      2095104 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/3] [UUU]     &lt;br /&gt;
 unused devices: &amp;lt;none&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;Cryptage des données&amp;lt;/span&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
 cryptsetup luksFormat -c aes -h sha256 /dev/mmcblk1&lt;br /&gt;
 cryptsetup luksOpen /dev/sdb1 crypt_sd&lt;br /&gt;
 mkfs.ext4 /dev/mapper/crypt_sd&lt;br /&gt;
 mount /dev/mapper/crypt_sd /mnt&lt;br /&gt;
 vi /mnt/test.txt #on marque un texte dans le fichier&lt;br /&gt;
 umount /mnt&lt;br /&gt;
 cryptsetup luksClose crypt_sd&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;span style=&amp;quot;color:#4169E1&amp;quot;&amp;gt;Mise en réseau de la MV Xen IMA5-BANANE&amp;lt;/span&amp;gt;====&lt;/div&gt;</summary>
		<author><name>Hdelatte</name></author>	</entry>

	</feed>