IMA5 2018/2019 P06

De Wiki de Projets IMA
Révision datée du 26 septembre 2018 à 12:48 par Aduqueno (discussion | contributions) (Semaine 1)


Présentation générale

Conception et développement d'un système de gestion d'un réseau de capteur.

Description

Notre projet s'inscrit dans le cadre d'un projet de recherche à l'IRCICA sur un réseau de capteurs à large échelle (100 noeuds). Face à un réseau de cette ampleur, il est intéressant de développer une solution de maintenance à distance de ce réseau. Il sera bien plus aisé pour les chercheurs de tester leurs hypothèses en déployant rapidement leurs logicielles sur tout ou une partie des noeuds disponibles grâce à des fonctionnalités telles que la sélection d'une partie du réseau ou encore la mise à jour d'un ensemble de capteurs de même type / architecture.

Objectifs

L'objectif de notre travail consiste pour cela à développer simultanément le front-office et le back-office. La partie front sera réalisée en utilisant les technologies web classiques. La partie back-end sera constituée d'un ensemble de webservices en différents langages permettant la communication réseau et la gestion d'une base de données de noeuds et capteurs. Il faudra y développer des services classiques comme la gestion des utilisateurs et des services spécifiques (compilation du code source, téléchargement à distance du logiciel sur les noeuds). La partie front-end aura vocation à être utilisée par des utilisateurs externes au projet et devra donc être ergonomique et facile de compréhension. Elle devra également être fonctionnel et modifiable facilement.

Préparation du projet

Cahier des charges

Choix techniques : matériel et logiciel

Matériel

  • Un Serveur dédié contenant l'ensemble des services
  • Un réseau de capteurs orchestré par des Raspberry Pi

Logiciel

  • Ansible pour faciliter le déploiement des binaires sur les noeuds
  • La plateforme Java EE pour la partie back-end couplé au framework Spring
  • Une base de données PostgreSQL dans un premier temps pour assurer la persistance des données
  • Une partie front-end moderne basée sur le framework Vue.js et sur un framework CSS tel que Bootsrap, Semantic UI ou Foundation pour ne citer que les plus connus

Liste des tâches à effectuer

  • Comparaison et documentation sur les frameworks web de création d'interface (Angular, React, Vue ...)
  • Documentation sur Spring et Java EE en général
  • Configuration des routes du projet Spring (racine, connexion dans un premier temps)
  • Création d'une interface utilisateur (front-end)
    • Page de connexion pour commencer
  • Implémentation d'un gestionnaire d'utilisateurs
  • Création d'une base de données pour gérer les noeuds
  • Implémentation du service d’envoi des fichiers de mise à jour

Calendrier prévisionnel

Réalisation du Projet

Semaine 1

Comme pour tout début de projet, nous avons passé une bonne partie de cette semaine à nous documenter et à évaluer des solutions potentielles. Le monde du front-end évoluant rapidement, il n'est pas toujours facile de s'y retrouver et de faire les choix adéquats. En l'occurrence, nous avons comparé les trois solutions qui sont Angular, React et Vue pour concevoir une interface web dynamique et moderne. Notre choix s'est finalement porté sur le framework Vue.js pour les raisons suivantes :

  • Une prise en main rapide : sans même avoir suivi un cours spécifique à Vue.js, le choix pertinent des mot-clés aide la compréhension
  • Des performances supérieures à ses concurrents sur bien des aspects
  • Sa légèreté principalement causée par son fonctionnement par plugins

Concernant le framework CSS, nous avons fait simple et avons choisi Bootstrap, un standard du web depuis quelques années et qui reste d'actualité face à des alternatives en vogue telles que Foundation ou Semantic UI. Les classes proposées par ces feuilles de styles se démarquent quasi-exclusivement par la pâte graphique qu'elles apportent et non par les technologies employées qui sont identiques.

Avec ces outils en main, nous avons commencé par créer la page sur laquelle l’utilisateur arrivera s'il n'est pas déjà enregistré, la page de connexion. Rien de particulier sur cette page, un champ pour le login et un pour le mot de passe. Nous allons tout de même ajouter un peu de dynamisme en affichant un message d'erreur en d'échec de la connexion pour mauvais login ou mot de passe.


Login form.png


En parallèle, nous nous sommes intéressés à Spring et de manière plus générale à Java EE. Pour pratiquer et prendre ce vaste écosystème en main, nous avons créé quelques projets avec Spring comme une API REST basique ou encore un controller plus classique capable de servir des pages web statiques. Une fois cette étape de découverte effectuée, nous sommes rentrés dans le vif du sujet. L'idée dans un premier temps et de concevoir le gestionnaire d'utilisateurs et de prouver son fonctionnement en affichant le login de la personne enregistrée sur une page d'accueil. Pour ce faire, nous avons parcouru quelques projets existants sur Internet afin d'avoir une idée de la structure globale des projets de plus grande taille et également pour identifier les outils que nous allons devoir utiliser. En cette fin de première semaine, nous avons un bon aperçu des bibliothèques et frameworks que nous allons utiliser. A titre d'exemple, nous pensions devoir implémenter nous même le système de session et donc gérer les cookies émis et reçus mais il s'est avéré que Spring dispose d'un framework nommé Spring Security qui fournit des fonctionnalités d’authentification et d'autorisation pour les applications web. Les objectifs de la semaine suivante seront de se renseigner sur ce framework, de pratiquer l'utilisation d'une base de données et finalement d'associer ces travaux pour stocker des utilisateurs dans la base et permettre l'accès à une page sécurisée au moyen d'un formulaire de connexion.

Semaine 2

Spring-Jpa-PostgreSQL.jpg

Durant cette deuxième semaine nous avons décidé de reprendre les bases de Spring pour mieux comprendre le fonctionnement des dépendances utilisés. Notamment, nous nous sommes concentré sur la communication avec des bases de données en ProgreSQL via la Java Persistence API (ou JPA) qui permet justement de communiquer avec une base de donnée, quelque soit le type (MySQL, PostgreSQL). Nous avons pu ainsi comprendre comment établir une classe qui sera interprété comme une entité par le projet et donc servira à créer et remplir une table de données. Ainsi pour un projet comme le notre il sera nécessaire d'avoir :

  • Pour les bases de données :
    • une classe par table de donnée
    • une classe qui permet à la JPA d’interagir avec la première classe décrite comme une table
    • un fichier application.properties pour indiquer au projet la localisation de la BD et les identifiants pour y accéder
  • De manière général pour un projet Spring boot :
    • une classe pour gérer les chemins de notre site Web (et donc les requêtes)
    • le fichier pom.xml dans le cas de l'utilisation de Maeven dans le cadre des dépendances
    • des fichiers .html pour afficher les informations nécessaires à l'utilisateur
    • une classe Application qui permet de lancer l'application depuis le projet (il sera ultérieurement utile d'utiliser une exportation en Jar ou War pour utiliser le projet de manière indépendante)

Pour la suite du projet il est également nécessaire d'intégrer le framework Spring Security qui permet justement de gérer l'accès à différentes pages. Il est possible d'utiliser ce Framework sans base de donnée mais il serait compliquer de modifier les utilisateurs, les supprimer, ajouter de nouveaux rôles, etc. Il va donc être important de faire communiquer le framework Spring Security avec la base de donnée SQL. Pour cela il va falloir indiquer au framework que tel ou tel classe correspond à un utilisateur. Ainsi il va pouvoir récupérer ses données dans une classe qui s'occupera de gérer quel rôle peut accéder à tel ou tel page.

Documents Rendus