ioc-invicta/README.md
2023-11-19 13:03:35 +01:00

137 lines
4.5 KiB
Markdown

# 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](https://github.com/knolleary/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](https://github.com/DaveGamble/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 :
```sh
$ flask --app web run
```
- Ouvrir la page `localhost:5000` dans un navigateur