Analyse de Données Sensorielles d'une Pile CoAP/IPv6 sur FIT IoT Lab

De Ensiwiki
Aller à : navigation, rechercher


Project schedule.png
Titre du projet Analyse de Données Sensorielles d'une Pile CoAP/IPv6 sur FIT IoT Lab
Cadre Projets Réseaux Mobiles et Avancés

Équipe Lailson Azevedo Do RegoLucca Sergi Berquo Xavier,Rafael Bortolon Paulovic,
Encadrants Franck Rousseau


Introduction

Fit IoT Lab Website[1]

Dans le cadre du projet Réseaux Mobiles et Avancés, nous avons décidé d'utiliser la plataforme Fit IoT Lab.

La taille du domaine IoT a explosé dans les dernières années, aujourd'hui il y a une infinité d'applications et différents capteurs. À ce propos, la plate-forme Fit IoT Lab a été développée pour faire progresser la recherche dans ce domaine. Elle compte aujourd'hui avec 1786 nœuds qui possèdent plusieurs capteurs et sont situés dans 5 sites différents en France.

Notre objectif était de créer une pile IPv6 sur les différents nœuds afin de récuperer quelques informations mésurées par ces derniers, comme par exemple la pression actuelle, le niveau de luminosité, entre autres. De cette façon, les protocoles mis en place nous permettront d'envoyer ces données capturées via l'Internet et ensuite d'effectuer une analyse temporelle à l'aide des logiciels adéquats.

L'architecture de notre expérimentation
La pile IoT implementée

Matériels et outils

Matériels

Nous n'utilisons pas de matériaux physique dans le sens où nous ne voyons pas les capteurs ni les nœuds: on les opère à distance. Ils sont placés dans différents villes française, dans les laboratoires de FIT IoT-LAB (Grenoble, Lille, Saclay, Strasbourg, Paris et Lyon).

L'éxperiment à mettre en place utilisera plusieurs (aux utilisateurs de décider combien) nœuds M3 disponibles sur FIT IoT-LAB.

Outils logiciels

Nous avons utilisé les outils suivants:

  • Contiki OS, système d'exploitation open-source pour les agents IoT.
  • InfluxDB, une base de données dediée aux séries temporélles.
  • Node-Red, plate-forme de programmation basée sur le flux de données.
  • Grafana, outil pour la visualisation et surveillance de données.

Tutoriel

Le tutoriel suivant vous permettra de reproduire la pile décrite dans l'introduction de cette page et de récupérer des données em temps réels des capteurs de FIT IoT-LAB. Pour cela, vous allez d'abord allouer onze noeuds sur le site de Grenoble, démarrer un tunnel SSH sur votre machine, et configurer une réseau IPv6 globale pour vos noeuds. Ensuite, vous irez compiler le système d'exploitation Contiki pour créer les firmwares que le routeur de bordure et les serveurs CoAP iront tourner. Finalement, avec l'aide de InfluxDB, de Node-RED et de Grafana, les données récupéres via le protocole CoAP pourront être visualisées sur votre machine.

Prérequis

Sur FIT IoT-LAB

  • Avoir une compte sur FIT IoT-LAB (très vite de la créer avec le mail de l'Ensimag): Lien vers tutoriel
  • Avoir l'accès SSH configuré sur votre poste pour dialoguer avec les serveurs de IoT-LAB: Lien vers tutoriel
  • Comprendre les bases des sous-réseaux IPv6 sur FIT IoT-LAB: Lien vers tutoriel

Instalations sur votre poste de travail

On installe d'abord InfluxDB et Node.js:

 sudo apt-get update
 sudo apt-get install influxdb influxdb-client

Avant de procéder avec l'instalation, il faut télecharger NodeJS[2] et l'exporter sur PATH:

 wget https://nodejs.org/dist/v10.15.1/node-v10.15.1-linux-x64.tar.xz
 export PATH = <DIRECTORY>/node-<version>-linux-x64/bin:$PATH

Pour vérifier la version de Node.js installée sur votre machine, tapez:

 node -v

Pour finir, on installe le composant Node-RED et les respectives supports pour InfluxDB et CoAP :

 sudo npm install -g --unsafe-perm node-red
 sudo npm install -g node-red-contrib-influxdb
 sudo npm install -g coap --save
 sudo npm install -g node-red-contrib-coap

Archives sur poste de travail

On vous fournit les fichiers suivants pour la suite du tutoriel:

 tunslip6
 iot_lab_mesh.json
 sensors_dashboard.json

Téléchargez-les via le lien: Fichier:Resources.zip

Configuration du Réseaux IPv6

Lancer une expérimentation avec 11 noeuds M3 sur le site de Grenoble

Accédez à votre compte FIT IoT-LAB avec ssh:

 ssh <login>@grenoble.iot-lab.info

Dans la suite du tutoriel, on va appeler le frontend SSH auquel vous vous connectez avec vos identifiants terminal distant, alors que les instances de terminal que vous ouvrez sur votre machine seront les terminaux locales.

Authentifiez-vous avec vos identifiants:

 iotlab-auth -u <login>

Ensuite, clonez le repertoire de FIT IoT-LAB pour compiler Contiki et les firmwares:

 git clone https://github.com/iot-lab/iot-lab.git
 cd iot-lab/
 make setup-contiki
 cd parts/contiki/examples/ipv6/rpl-border-router/
 make TARGET=iotlab-m3
 cp border-router.iotlab-m3 ~/
 cd ~/iot-lab/parts/contiki/examples/iotlab/04-er-rest-example
 make TARGET=iotlab-m3
 cp er-example-server.iotlab-m3 ~/

Démarrez votre expérimentation. On utilise les drapeaux:

  • -n pour la nommer
  • -d sert à préciser la durée en minutes
  • -l pour allouer les noeuds à Grenoble, de type m3 ayant l'identifiant 1 jusqu'au identifiant 11.

Dans ce tutoriel, on demande quelques noeuds spécifiques (id 1-11). Néanmoins, vous pouvez allouer des noeuds au hazard, en modifiant le drapeau -l par -l grenoble,m3,<nombre_de_noeuds_souhaité>. Si vous optez pour cela, quelques points devront être modifiés dans la suite. Nous vous indiqueront quand cela est requis.

 iotlab-experiment submit -n coap_iot_mesh -d 150 -l grenoble,m3,1-11
 iotlab-experiment wait

Création du tunnel sur votre poste personnel

Une fois l'expériment demarré, vous créerez le tunnel IPv6.

Dans un terminal local, configurez le tunnel pour que votre machine soyez capable d'écouter le traffic provenant de notre réseau IPv6. Vous utliserez le programme tunslip6 qu'on vous a fourni.

Remarque: on a choisit un prefixe valide pour le site de Grenoble (2001:660:5307:3103::). Vous pouvez choisir un autre, mais veillez pour qu'il soit valide! Cette page vous explique comment le choisir correctement.

Avant de lancer le tunnel, sur le terminal distant lancez la commande:

 ip -6 route

Ceci ira lister toutes les prefixes IPv6 en utilisation sur le site auquel vous êtes connecté. Si vous voyez le vôtre, alors il est en utilisation (cela se passe rarement), et il faudra choisir un autre.

Finalement:

 ssh <login>@grenoble.iot-lab.info -N -L 2000:m3-1:20000 &
 chmod +x tunslip6
 sudo ./tunslip6 2001:660:5307:3103::1/64 -t tun0 -a localhost -p 

Sur le terminal distant connecté au site de Grenoble, configurez le routeur de bordure et les serveurs CoAP. On a choisit le noeud avec ID 1 (m3-1) comme noeud de bordure, et les autres (ID 2-11) comme les serveurs CoAP qui transmettront les donnés des capteurs. Les firmwares requis se trouvent dans la racine du terminal distant:

 cd ~
 iotlab-node --update border-router.iotlab-m3 -l grenoble,m3,1
 iotlab-node --update er-example-server.iotlab-m3 -e grenoble,m3,1

Pour tester si notre réseau IPv6 est accesible depuis notre terminal local, il suffit de l'envoyer un ping6 depuis votre machine:

 ping6 2001:660:5307:3103::2354

Dans la dernière commande vous observez l'adresse IPv6 globale utilisée. Elle est composée par le prefixe global choisi, une suite de zeros, et pour le deniers deux octets, un identifiant de noeud. On vous explique plus précisement la méthode d'adressage dans la section suivante

Observation sur les identifiants des noeuds et la réseau IPv6

Par défaut, la configuration de Contiki pour les noeuds M3 de FIT IoT-LAB utilise le iotlab-uid comme étant les deux derniers octets de l'addresse IPv6, et tous les restants sont considerés comme 0.

Vous pouvez obtenir les valeurs iotlab-uid de votre expériment courant en tapant:

 iotlab-experiment get -r 

Cela ira lister tous les informations sur les noeuds alloués dans votre expériment. Observez le champ "uid" . Par example, dans l'expériment qu'on a lancé précédemment, la commande ci-dessus renvoi, entre autres informations, le suivant:

 <login>@grenoble:~$ iotlab-experiment get -r
 {
     "items": [
       {
           "archi": "m3:at86rf231", 
           "mobile": "0", 
           "mobility_type": " ", 
           "network_address": "m3-3.grenoble.iot-lab.info", 
           "site": "grenoble", 
           "state": "Alive", 
           "uid": "b868", 
           "x": "21.30", 
           "y": "26.76", 
           "z": "-0.04"
       },
    ...
 }


Cela nous indique que le noeud m3-3 de Grenoble possède un uid de b868. Donc, son adresse IPv6 dans notre réseau sera 2001:660:5307:3103::b868, et on peut bien faire un ping6 à cette destination depuis un terminal local.

De cette façon, si vous avez alloué des noeuds m3 ayant des identifiants autres que 1-11, il suffit de taper cette commande pour trouver ses identifiants uniques. Alors, vous pouvez facilement composer un adresse globale avec ces informations (uid du noeud + préfixe global choisi).

Voilà! Votre réseau IPv6 est configurée, et les noeuds serveurs peuvent répondre aux requêtes CoAP GET faites à coap://[<prefixe_global>:<node_id>]:5683/<chemin_du_capteur>. Par exemple, "coap://[2001:660:5307:3103::b868]:5683/sensors/magne" est un adresse valide, et renvoyera les données du magnétomètre du node m3-3.

Création de la base de données

Démarrez InfluxDB:

 sudo influx &
 influx

Le logiciel InfluxDB sera connecté au localhost:8086. Dans l'interface presentée, créez la base de données sensors et un utilisateur administrateur

 CREATE DATABASE sensors
 CREATE USER admin WITH PASSWORD 'admin' WITH ALL PRIVILEGES

Étant donné que InfluxDB est configuré pour les agents IoT, il nous permet d'observer les mesures stockés avec la commande:

 show measurements

Bien évidemment, à ce moment là vous n'avez pas aucune mesure observée dans la base. Donc, vous allez la peupler avec les donnés des nos noeuds, lancés sur FIT IoT-LAB.

Lancement de Node-RED

Sur un autre terminal local, lancez Node-RED avec le fichier iot_lab_mesh.json :

 node-red iot_lab_mesh.json

Sur un navigateur on peut mainteant visualiser le modèle d'extration de données fait pour l'éxperiment

 http://127.0.0.1:1880/
Architecture de la recupération de données via CoAP sur Node-Red

Il s'agit d'un pipeline d'ingestion de données, qui utilise les serveurs CoAP que vous avez configuré sur FIT IoT-LAB pour récupérer les données de trois capteurs:

  • Le magnétomètre, representé par les boîtes "Subscribe to magnetometer"
  • L'accéléromètre, representé par les boîtes "Subscribe to accelerometer"
  • Le gyroscope, representé par les boîtes "Subscribe to gyroscope"

Elles représentent des requêtes CoAP sur la plate-forme Node-RED.

Dans la configuration de chacune de ces boîtes (double clique dessus), on ajoute le lien au serveur CoAP souhaité; dans notre cas, il a la forme:

 coap://[2001:660:5307:3103::<node_id>]:5683/sensors/<sensor_name>

Où <node_id> est l'identifiant d'un noeud alloué dans notre expériment, et <sensor_name> est magne, accel ou gyros. Dans ce pipeline on a choisit les identifiants 2162, 9982 et 9983. À chaque 10 seconds, une requête CoAP est faite à ces trois noeuds. Finalement, les valeurs sont extraits de la réponse avec la boîte "Format data", et sauvegardés sur l'instance de InfluxDB que vous avez demarré (localhost:8086).

Vous pouvez augmenter la fréquence avec laquelle vous faites les requêtes CoAP. Cliquez deux fois sur chaque boîte "Retrieve" (Retrieve magnetometer, Retrieve accelerometer et Retrieve gyroscope) et au-dessous du champ "interval", modifiez le nombre de seconds.

Laissez le pipeline s'exécuter pendant quelques minutes pour remplir la base de donnés. Pour arrêter l'éxecution, cliquez deux fois sur l'onglet avec le nom "IoT-LAB Sensors", et sur la fenêtre affichée, mettez le "Status" à "Disabled". Finalement, appuyez sur "Deploy" pour l'arrêter.

Arrêter ou démarrer l'éxecution du pipeline.

Grafana

On passe maintenant à la dernière partie du tutoriel: la visualisation interactive des données. Pour cela, on va utiliser l'outil Grafana.

Installation et exécution

Installation:

 wget https://grafanarel.s3.amazonaws.com/builds/grafana_4.1.1-1484211277_amd64.deb
 sudo dpkg -i grafana_4.1.1-1484211277_amd64.deb
 rm grafana_4.1.1-1484211277_amd64.deb

Exécution de Grafana:

 sudo systemctl start grafana-server.service

Vérifiez le fonctionneement:

 sudo systemctl status grafana-server.service

Configuration

L'interface du Grafana est très interactive et facile à utiliser, pour y accéder il suffit d'entrer sur le lien;

 http://127.0.0.1:3000/

Complétez les champs demandés avec un nom d'utilisateur et un mot de passe. On recommande "admin" pour le premier, et "admin" pour le deuxième.

Écran de connexion de Grafana

Prochainement, vous rencontrerez une petite interface de configurations. Vous allez d'abord ajouter la source de données, notre base InfluxDB.

Ajouter une source de données

Il faut faire la liason entre InfluxDB et Grafana. Par conséquent, vous sélectionnez "Add data source", et vous configurez votre source de données de la façon suivante:

Grafana setup 2.png
Configuration pour accéder à la base de données Influx

Par rapport aux champs "User" et "Password", remplissez-les avec "admin" (ou bien le nom d'utilisateur et le mot de passe que vous avez tapé lorsque l'utilisateur de InfluxDB a été crée, plus en haut).

Ensuite, cliquez sur "Save & Test", et puis sur "Cancel" pour revenir à l'accueil

Ajouter un Dashboard pour les capteurs

La base étant configurée, maintenant il suffit d'importer le dashboard de visualization des données. Sur le Menu Principal, cliquez sur l'icône de Grafana situé dans la partie supérieure à gauche, et ensuite: Dashboards, après import et sélectionez le fichier du projet sensors_dashboard.json.

Visualisation de données envoyées

Vous allez voir l'interface suivante:

Données captées des nœuds selon l'architecture Node-Red fait

Il s'agit des données des magnétomètres, des accéléromètres et des gyroscopes ingérés pendant la période que vous avez executé votre pipeline avec Node-RED. Cliquez une fois sur le titre "Sensor Data" au dessus du graphe, et après selectionnez "Edit":

Requêtes réalisées pour récuperer les données de InfluxDB

Sélectionnez l'échelle de temps dans la partie supérieure à droite et changez le temps d'observation. Normalement, une bonne option est "Last 30 Minutes", mais vous êtes libre pour explorer et essayer différentes options.

Si vous voulez, vous pouvez déployer votre pipeline sur Node-RED et changer les paramètres de temps pour rafraîchir l'affichage des données à chaque 5s:

Grafana-time.png

De cette façon, vous voyerez les données ingérées en temps réel.

Extensions possibles

  • Déploiement sur environnement cloud (AWS, par exemple).
  • Agréger les informations des différents sites.
  • Utiliser des noeuds A8 comme routeur de bordure.
  • Faire une application dans laquelle on traite les données avant de les stocker (développement d'un système distribué).

Références

  • Fit IoT Lab: Banc d'essai ouvert à grande échelle
  • Contiki OS: Système d'exploitation ouvert pour l'Internet des objets
  • InfluxData: Plateforme de séries chronologiques pour le développement d'applications et processus métier dans divers domaines.
  • Node-Red: Plateforme de programmation basée sur flux de données pour l'Internet des objets
  • Grafana: Plateforme ouverte pour l'analyse et surveillance de données
  • OpenWSN Wiki: Le projet OpenWSN possède implémentations ouvertes et tutoriales de piles de protocoles pour l'Internet des objets