# 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