GPS LoRa Tracking

De Ensiwiki
Aller à : navigation, rechercher


Project schedule.png
Titre du projet Création de Transmission de donnée via TheThingsNetwork avec une carte Nucleo
Cadre Projets Réseaux Mobiles et Avancés

Équipe Lebbar HamzaDelevoye Jean
Encadrants Franck Rousseau


Présentation

Objectifs

Le but de ce projet est de se familiariser avec l'utilisation des réseaux wifi basse consommation (LoRa). L'objectif est de pouvoir envoyer les données GPS (latitude/longitude) de la position actuelle de la carte LoRa via The Things Network et pouvoir afficher les résultat à l'aide d'une API web adaptée à notre cas.

Composantes

L'ensemble des composantes utilisées dans le projet sont:

  • Une carte NUCLEO-L073RZ: carte de programmation embarquée permettant le traitement des données reçu par l'ensemble des composantes branchés avec, c'est le cerveau de l'application.
  • Une shield LoRa SX1272MB2DAS pour la carte NUCLEO: permet l'envoi de données vers les Gateway LoRa en réduisant au maximum la consommation d'énergie.
  • Module GNSS X-NUCLEO-GNSS1A1: permet la localisation de la carte à l'aide d'une antenne GPS.
  • Le réseau TTN (The Things Network): plate-forme web permettant aux utilisateurs d'ajouter de nouvelles Gateway ou d'utiliser des Gateway public existantes.
  • Serveur web connecté à TTN via HTTP integration: ce serveur contient une API qui permet la réception des données depuis TTN pour un affichage plus adapté.

Architecture et workflow

Le workflow global de notre application se résume dans les étapes suivantes:

  • La carte Nucleo est alimentée (par cable Mini USB B/USB A avec PC ou PowerBank) et attachée au module GNSS X-NUCLEO-GNSS1A1 qui est ensuite attaché au shield LoRa SX1272MB2DAS.
  • Le module GNSS récupère la position actuelle de la carte à l'aide de l'antenne GPS.
  • Cette position est envoyée à l'aide du shield LoRa vers l'ensemble des Gateway LoRa disponibles.
  • Les Gateway vérifient la connexion au noeud LoRa et renvoient la position vers The Things Network.
  • Notre serveur récupère en temps réel ces informations et les affichent sur une Map.

La figure suivante montre l'architecture globale et la relation entre les différents composantes du système:

Architecture et workflow global
Architecture et workflow global

Environnement de travail

Pour pouvoir mettre en place cette application il faut suivre l'ensemble des étapes suivantes:

Installation des outils nécessaires

Il est à noter que les commandes indiquées après chaque outil concernent les machines MacOS:

  • Homebrew (uniquement dans le cas d'une machine MacOS): logiciel de gestion de paquets pour macOS gratuit et open-source qui simplifie l'installation des programmes.
xcode-select --install
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
  • openocd: logiciel open-source qui joue le rôle d'interface avec le port JTAG du debugger de notre carte Nucleoo.
brew install openocd
  • arm-none-eabi-gdb: arm-none-eabi est un toolchain qui concerne l'architecture ARM, arm-none-eabi-gdb nous permettra la communication avec openocd pour ensuite flasher la carte.
brew tap ArmMbed/homebrew-formulae
brew install arm-none-eabi-gcc
  • minicom: program de communication serial qui nou permettra l'affichage des données provenants de la carte et faciliter le debbugage.
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" < /dev/null 2> /dev/null
brew install minicom

Configuration du compte The Things Network

  • Connectez vous à votre compte préalablement créé sur The Things Network
  • Créer une nouvelle application en passant par Console -> Applications -> add application
  • Renseigner les différents champs de la façon suivante :
 Application ID: Name_Of_Your_Application 
 Description: Description_Of_Your_Application
 Application EUI: Laisser vide
 Handler registration : ttn-handler-eu
  • Enregistrer ensuite un device à votre application
 Device ID: saisisser_un_id_unique_pour_votre_device
 Device EUI: passer ce champ en génération automatique
 App Key: passer le champ en génération automatique
 App EUI: ne pas toucher

Préparation de la carte Nucleo

JP1 et JP6 Closed, JP5 sur E5V
  • S'assurer que les jumper JP1 et JP6 sont fermés et que le jumper JP5 est positionné sur E5V.
  • Pluger ensuite la shield LoraWan1 sur la carte Nucleo.
  • Visser l'antenne sur la shield si ce n'est déjà fait.
  • Brancher la carte au pc .


Envoi de données

Configuration de la shield LoRa

  • La première étape est de récupérer le projet GitHub "st-lrwan" (réalisé par Franck Rousseau) qui intègre un dossier gcc avec Makefile adaptés à notre cas: https://github.com/drakkar-lig/st-lrwan [1]
  • Aller ensuite vers le fichier --chemin--du--projet--st-lrwan--/Projects/Multi/Applications/LoRa/End_Node/inc/Commissioning.h et renseigner les variables suivantes avec les informations que vous récupererez sur The Things Network dans console->Applications->votre_app->Devices->votre_device:
#define OVER_THE_AIR_ACTIVATION                   1
#define LORAWAN_PUBLIC_NETWORK                  true
#define STATIC_DEVICE_EUI                         1
#define LORAWAN_DEVICE_EUI                { --indiquer--device--eui--en--big--endian }
#define LORAWAN_APPLICATION_EUI            { --indiquer--application--eui--en--big--endian }
#define LORAWAN_APPLICATION_KEY           { --indiquer--application--key--en--big--endian }
#define STATIC_DEVICE_ADDRESS                     0

On choisit d'utiliser l'option Over The Air Activation (OTAA) car c'est le moyen privilégié et le plus sécurisé pour se connecter à The Things Network. Le noeud LoRa exécutent une procédure de jointure avec le réseau, au cours de laquelle un DevAddr dynamique est attribué et des clés de sécurité sont négociées avec la shield LoRa. Vous pouvez aussi utiliser l'option Activation By Personalization (dans ce cas: #define OVER_THE_AIR_ACTIVATION 0, #define STATIC_DEVICE_ADDRESS 1), mais cette méthode est moins sécurisée et il faut renseigner en plus les informations suivantes:

#define LORAWAN_DEVICE_ADDRESS               {--indiquer--device--address} 
#define LORAWAN_NWKSKEY                       { --indiquer--network--session--key--en--big--endian }
#define LORAWAN_APPSKEY                     { --indiquer--application--session--key--en--big--endian }

Pour prendre en considération ses changements lors du flashage de la carte, ouvrez un terminal, allez vers "--chemin--du--projet--st-lrwan--/Projects/Multi/Applications/LoRa/End_Node/gcc/STM32L073RZ-Nucleo" et exécutez le fichier Makefile à l'aide de la commande make:

cd st-lrwan/Projects/Multi/Applications/LoRa/End_Node/gcc/STM32L073RZ-Nucleo
make

Flash carte Nucléo et débuggage

  • Etape 1: ouvrir un terminal et lancer la commande suivante qui permet de charger la configuration de la carte Nucleo STM32L037RZ et attendre la connexion de telnet ou gdb etc. Vous devez changer le chemin du fichier openocd selon votre système. En cas d'erreur d'execution essayer de maintenir le button reset de la carte Nucleo (button noir) et de le relâcher juste après l'execution de la commande.
openocd -f --chemin--vers--openocd--/openocd/scripts/board/stm32l0discovery.cfg < à changer--* 
  • Etape 2: ouvrir un nouveau terminal pour se connecter via arm-none-eabi-gdb sur le port 3333 à openocd et donc à la carte Nucleo. choisissez le fichier end_node.elf contenu dans --chemin--du--projet--st-lrwan--/Projects/Multi/Applications/LoRa/End_Node/gcc/STM32L073RZ-Nucleo puis chargez le à l'aide de la commande load. Faite ensuite un 'monitor reset' pour lancer l'application. Vous avez maintenant exécuté le traitement contenu dans le fichier main.c (--chemin--du--projet--st-lrwan--/Projects/Multi/Applications/LoRa/End_Node/src.main.c) sur la carte Nucleo.
arm-none-eabi-gdb
target remote localhost:3333
monitor reset halt
file  --chemin--du--projet--st-lrwan--/Projects/Multi/Applications/LoRa/End_Node/gcc/STM32L073RZ-Nucleo/end_node.elf
load
monitor reset
  • Etape 3: pour faciliter le débuggage et voir l'ensemble des données affiché par le programme sur la console (en utilisant la fonction PRINTF("--contenu--pour--debugger--") dans main.c etc.) exécutez les commandes suivantes:
ls /dev/tty.*                     //pour afficher les port séries attachés au PC, copier celui qui correspond au port de Nucleo
minicom -s                    // cette commande affiche un menu, aller sur 'Serial port setup' et changer la première valeur par celle copié à l'étape précédente, retourner et choisir 'Save setup as dfl', choisir 'exit, vous devez maintenant   voir les résultats de debuggage 
  • Etape 4: aller sur The Things Network sur Console->Applications->--Votre-Application--->Data, vous devez voir les données envoyés par le noeud LoRa. Les données envoyées par LoRa se trouvent dans la fonction 'LoraTxData' du programme main.c. En cas de modification, n'oubliez pas de faire un 'make' du projet comme indiqué dans la section précédente avant de reflasher la carte (i.e Etapes 1,2,3).

Affichage de la localisation (GPS)

Les étapes suivantes permettent d'afficher la localisation de la carte Nucleo et le module GPS en local sur un terminal:

  • Rendez-vous sur la page suivante pour télécharger le projet X-CUBE-GNSS1: [2]
  • En attachant la carte Nucleo à votre PC, copier le dossier --chemin--vers--projet--x-cube-gnss1--/Projects/Multi/Applications/GetPos/Binary dans l'espace de stalockage de la carte 'NODE-LO73RZ'
  • Attacher ensuite l'extension GNSS X-NUCLEO-GNSS1A1 à la carte Nucleo et utiliser minicom pour afficher les données de localisation sur la console.

Envoi de données de localisation

On n'a pas pu envoyer les données de localisation reçues par le module GNSS via le noeud LoRa vers The Things Network. Les dépendances, les mêmes noms de quelques fonctions et variables, la taille des données à intégrer ont tous compliqués notre tâche. Il nous reste des problèmes au niveau sémantique qu'on n'a pas encore pu résoudre vu le grand nombre de dépendances entre les différents fonctions, fichiers en jeu. La partie compilation est quant à elle bien intégrée, voici les étapes à suivre afin d'ajouter un fichier.c que vous compter utiliser pour votre traitement au corps du main.c:

  • Aller au Makefile.
  • Ajouter votre fichier à la variable SRCS (i.e SRCS += --fichier.c--)
  • Ajouter le chemin vers ce fichier dans la variable VPATH (VPATH += --chemin--vers--fichier.c--)


Récupération de données

Voici le lien gitlab de l'application web : https://gitlab.com/jeandlv/geoloc

L'application Web se compose de 3 parties : une API en Node.js, une base de données MongoDB et un Front qui exploite la Google Maps Javascript API.

L'application a été crée pour être hébergé sur une plateforme de Cloud tel que AWS.

Fonctionnement

L'API autorise 3 requêtes :

  • POST newPosition : envoi des données par the Things Network. A chaque donnée envoyées par une getaway LoRa au seveur de the Things Network, ce serveur déclenche un processus d'intégration et effectue ce POST. La requête récupère ensuite les données envoyées et les poste sur la base de données.
  • GET lastPosition : récupération des données par un client web. Le client Web effectue une demande pour récupérer la dernière position de l'appareil, l'API récupère cette position sur la base de données et la renvoit au client.
  • GET lifePosition : même requête qu'au dessus mais pour l'ensemble des positions.

Le Front est constitué d'un simple fichier HTML et exploite les modules jquery pour faire des requêtes à l'API et d'un module Google Maps qui à l'aide d'une Google Maps API Key permet d'afficher une carte interactive.

Installation

Le processus d'installation est détaillé dans le fichier README.md à la racine du projet.

Nous rappellerons simplement ici la procédure à suivre pour connecter the Things Network à l'application Web.


Go to your application on the Things Network Website.
Go to Integration and click on "add integration". Select HTTP integration.
Select default-key in Access Key.
In the URL field enter : http:///api/newPosition/
Select the POST method.
In field "Custom Header Name" put "content-type".
In field "Custom Header Value" put "application/json".
Finally save.
When receiving datas the things network should now post them to geoloc API.