ioc-invicta/README.md

4.5 KiB

Projet IOC

Auteurs

Martin HART

Volodymyr PATUTA

Introduction

Notre projet est constitué de 3 composants:

  1. Client MQTT esp32 esp
  2. Client MQTT subscribe (remplissage de la base de donnée) db_feeder
  3. Serveur Web + client MQTT publish (contrôle du buzzer et de l'écran OLED) web

Client esp

Le client MQTT esp utilise la librairie PubSubClient pour pouvoir subscribe/publish sur des topics différents.

Nous avons 5 topics :

  • brightness

    Utilisé pour publish la valeur de la photorésistance.

  • OLED

    Utilisé pour subscribe et afficher le texte sur l'écran OLED.

  • led

    Utilisé pour subscribe et allumer/éteindre la led ou la faire clignoter avec une période.

  • buzzer

    Utilisé pour subscribe et jouer une des musiques prédéfinis.

  • button

    Utilisé pour publish l'appui du bouton poussoir.

Setup

Dans la fonction setup() nous initialisons le module WiFi de l'esp32 à l'aide de la librairie WiFi.h et nous gênerons le hash SHA256 de l'adresse MAC du module. Cela nous permet d'avoir un identifiant unique pour chaque esp.

Puis, nous initialisons le client MQTT. Nous connectons l'esp32 à notre broker MQTT et puis souscrivons (subscribe) sur les topics : buzzer, oled et led.

Enfin, nous initialisons chaque composant de l'esp : photorésistance, buzzer, led, bouton et écran OLED.

Loop

Dans la fonction loop, nous appelons nos différentes taches qui fonctionnent de la même manière que cela a été introduit dans le TME4.

Publish

Pour publish nos données issues des composants de l'esp, nous utilisons le format de sérialization JSON, ce qui nous permet de simplifier la tache de réception et de gestion de données.

Pour chaque publish, nous sérialisons l'identifiant unique de l'esp afin de distinguer les esp utilisés.

Dans le cas de la tache de la photorésistance, nous envoyons l'identifiant et la valeur de la photorésistance (converti en pourcentage).

Pour l'appui de bouton poussoir, nous envoyons seulement l'identifiant.

Subscribe

Nous avons défini un callback pour les topics sur lesquels nous sommes souscrits.

Dans ce callback, nous désérialisons les données transmit, nous comparons l'identifiant afin d'assurer que le message est adressé au bon esp.

Puis, nous regardons le topic du message reçu. Si le topic correspond au topic de l'écran OLED, nous affichons le texte reçu. Si c'est le topic du LED, nous remplissons la mailbox de la tache LED. Dans le cas du topic du buzzer, nous jouons la musique sélectionnée.

Client db_feeder

Le client db_feeder nous permet de subscribe aux différents topics relayés par le broker MQTT utilisé dans notre projet : mosquitto. Ainsi nous sommes en mesure de stocker de manière permanente, dans une base de donnée SQLite, les données reçus depuis différents esp. Les données sont stockées après avoir été désérialisées par la librairie cJSON.

Pour nous connecter au daemon mosquitto nous faisons usage de la librairie client mosquitto. Nous bloquons le thread principal du programme avec un sémaphore. Le déblocage se fait via le handler du signal SIGINT, qui nous permet de quitter le programme avec un CTRL + c.

Le chemin de stockage de la base de donnée peut être spécifié via la variable d'environnement IOC_DB. Si la variable d'environnement IOC_DB n'est pas initialisée, la base de donnée SQLite porte le nom de data.db et est située dans le dossier courant.

Serveur web

Le serveur web est un serveur écrit en python en utilisant le framework Flask.

Le serveur web interagit avec la base de données et sert les pages HTML et les fichiers JavaScript. De plus, ce serveur est également un client MQTT pour publish sur les topics buzzer, oled et led. Pour chaque topic nous avons une page dédié. Pour chaque publish, nous pouvons choisir un esp précis.

Sur la page d'accueil nous avons 2 chronogrammes. Un pour afficher les valeurs de la photorésistance au cours de temps et la deuxième pour afficher les appuis sur le bouton poussoir, au cour du temps. Nous affichons aussi le nombre total d'appui de bouton poussoir par esp.

Utilisation

Afin d'utiliser notre projet, il faut :

  • Flasher les esp
  • Lancer un broker MQTT (mosquitto)
  • Compiler (make) et exécuter le client db_feeder
  • Lancer le serveur web Dans le dossier de projet, exécuter :
$ flask --app web run
  • Ouvrir la page localhost:5000 dans un navigateur