Projet 2020 · Capteurs de Pollution

Objectifs
Mise en application des concepts vus en algorithmique / programmation cette année pour traiter les mesures de pollution fournies par un ensemble de capteurs connectés. Utilisation des techniques d'automatisation pour la compilation, test et suivi du code.

Résumé

Mise en application des concepts vus en algorithmique / programmation cette année pour traiter les mesures de pollution fournies par un ensemble de capteurs connectés. Utilisation des techniques d’automatisation pour la compilation, test et suivi du code.

Objectifs

L’objectif de ce projet est de mettre en application et de vous évaluer sur les différentes connaissances et concepts suivants:

Cahier des Charges

Contexte

Pour effectuer une analyse de la qualité de l’air, une association a déployé 449 capteurs de pollution dans la ville de Århus (Danemark). Ces capteurs connectés ont effectué des mesures pendant 2 mois (du 1er août 2014 au 1er octobre 2014). Les données mesurées ont ensuite été compilés dans des fichiers et rendus publics. Le projet proposé consiste à analyser les données récoltées (la création et le déploiement de tels capteurs seront vus ultérieurement dans votre formation) sous forme d’un programme fonctionnant en ligne de commandes.

Données

L’archive disponible à l’adresse /upload/ima3/pollution.zip contient 449 fichiers CSV. Chaque fichier correspond aux données enregistrées par un capteur. Comme l’ensemble des données est très volumineuse (81 Mo), il est possible de récupérer un fichier exemple à l’adresse /upload/ima3/pollutionData158324.csv. La norme CSV (comma-separated values) est un format texte permettant de stocker des tableaux. Chaque ligne du fichier correspond à une ligne du tableau et les différents éléments d’une ligne sont séparés par un élément particulier (en général une virgule , mais d’autres sont possibles \t, ;…). La première ligne sert à décrire le nom des différents champs. Par exemple sur le fichier qui nous intéresse:

ozone,particullate_matter,carbon_monoxide,sulfure_dioxide,nitrogen_dioxide,longitude,latitude,timestamp
103,30,56,71,48,10.109984271163967,56.16459887184971,2014-08-01 00:05:00

Les 5 premiers éléments sont les données mesurées (ozone, particules fines, monoxyde de carbone, dioxyde de soufre, oxyde d’azote). L’unité utilisé est le PPM (partie par million) qui est utilisée habituellement pour les mesures de qualité de l’air. Les trois dernières valeurs sont la position du capteur (longitude, latitude) ainsi que la date de l’enregistrement.

Expression fonctionnelle du besoin

Logiciel de traitement de données de pollution

Le programme demandé devra obligatoirement être réalisé en langage C et devra pouvoir être capable de charger les fichiers de données stockés dans un répertoire et de traiter des requêtes utilisateurs. De plus le programme devra proposer deux modes de fonctionnement:

En supposant que le logiciel s’appelle projet, le mode interactif sera lancé via:

$ ./projet rep_donnees

rep_donnees est un répertoire qui contient les fichiers CSV.

Le mode batch pourra s’activer avec:

$ ./projet rep_donnees fichier.txt

ou fichier.txt contient la liste des requêtes à utiliser. Votre programme devra avoir le comportement suivant:

  1. charger le fichier de données
  2. attendre une commande
  3. traiter la commande
  4. afficher le résultat de cette commande et retourner à l’étape 2 jusqu’à ce que EOF (fin de fichier ou CTRL+D soit reçu).

Requêtes demandées

Les requêtes seront de la forme suivante:

metric [opt] type [longitude latitude radius]

où:

Voici par exemple des exemples de requêtes valides (une requête par ligne)

global ozone                    # mesure d'ozone sur la totalité des données enregistrés
monthly 2014-08 ozone           # mesure d'ozone pour le mois d'août 2014
daily 2014-08-15 ozone          # mesure d'ozone pour le 15 août 2014
log 2014-08-15 08:00:00 ozone   # mesure d'ozone pour le 15 août 2014 à 8h de matin
global ozone 10.109 56.164 100  # mesure d'ozone sur les 2 mois à 100m autour du point 10.109 56.164

Format de retour

Quelle que soit la requête utilisée, le format de retour devra être de la forme:

avg min max

Performance

Un des aspects qui sera évalué sera la performance de votre programme, en particulier le nombre de requêtes traitées par seconde. ̀A vous de choisir les structures et algorithmes adaptés pour permettre un traitement efficace des requêtes qui seront spécifiées.

Déliverables

Le déliverable attendu est un dépôt GitLab créé sur GitLab. Vous pouvez demandé aux enseignants de vous ajouter sur le groupe Polytech Lille pour pouvoir bénéficier gratuitement des outils premium de GitLab. Il sera inspecté au plus tard le dimanche 24/05/2020 23:59 (CEST) et évalué en partie automatiquement. Ce dépôt devra être accessible aux correcteurs et devra contenir:

Annexes

Rayon autour de coordonnées d’un point

L’approximation suivante (valide près de l’équateur) donne:

Par souci de simplification, on s’autorisera ainsi les approximations suivantes en fonction de la valeur de radius:

Parcours d’un répertoire en C

#include <dirent.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

int main ()
{
    DIR *          folder;
    struct dirent *entry;
    const char     folder_name[] = ".";

    folder = opendir (folder_name);
    if (folder == NULL)
    {
        perror ("Unable to read directory");
        exit (-1);
    }

    while ((entry = readdir (folder)))
    {
        struct stat buffer;
        int         status;
        status = lstat (entry->d_name, &buffer);
        if (S_ISREG(buffer.st_mode))
            printf ("Fichier %s\n", entry->d_name);
    }

    closedir (folder);

    return (0);
}

Évaluation

L’évaluation de ce projet sera faite en utilisant de manière intensive les outils de traitement automatique. D’une part parce que ce sont des outils qui sont utilisés dans le monde professionnel (et autant les maîtriser le plus tôt possible) et d’autre part puisque cela permet d’évaluer objectivement une partie de votre travail.

Un exemple de dépôt GitLab conforme à ce qui est attendu est disponible à l’adresse suivante https://gitlab.com/jeremie.dequidt/ima_prog_adv.

Convention de nommage des commits

Pour etre plus facilement lisible, vos commits GIT devront suivre une convention de nommage. La convention utilisée par AngularJS est devenue très populaire. Elle est décrite à l’adresse suivante Commit Message Conventions.