Architecture, stack technique, structure du projet et base de données. La conception du système SmartLocker, telle que décrite dans le TFE.
Quatre couches indépendantes communiquant entre elles
L'architecture de SmartLocker repose sur quatre couches distinctes qui communiquent de façon indépendante : le smartphone (ou le navigateur de l'utilisateur), l'application Flask hébergée sur PythonAnywhere, la base de données Firebase Realtime, et l'infrastructure matérielle — un Raspberry Pi 4B en passerelle et deux Raspberry Pi Zero W équipant respectivement le casier École et le casier Sport, reliés par MQTT.
status / cmd_open_door dans Firebase.locker/SPORT_01/commande.locker/SPORT_01/etat.Choix technologiques et justifications
Micro-framework web Python, léger et flexible, adapté à un projet de taille moyenne. Il n'impose pas de structure rigide et autorise l'ajout progressif des fonctionnalités. Django (trop lourd) et Node.js/Express ont été écartés.
Stocke les données en JSON et synchronise tous les clients en quelques millisecondes. Essentiel pour que l'état physique de la porte soit visible quasi instantanément. Firebase Auth gère le login (email + Google OAuth) sans stocker les mots de passe.
Protocole de messagerie léger pour objets connectés (modèle publish/subscribe). Découple le casier de la connexion Internet et garantit la livraison (QoS 1). Paho-MQTT sur les Pi Zero, broker Mosquitto sur le Pi 4B.
API très bien documentée, mode test avec cartes fictives, page de paiement préconstruite. Les métadonnées de la session (date, durée, utilisateur) permettent d'appliquer la réservation côté serveur de manière idempotente.
Notifications push sur smartphone même app fermée. Lors d'une alerte d'intrusion, la passerelle transmet une notification via FCM à l'utilisateur concerné ; le Service Worker de la PWA l'affiche.
Hébergement Python/Flask avec domaine en pythonanywhere.com, certificat HTTPS automatique et interface d'administration simple. L'offre gratuite suffit pour la démonstration du TFE.
SmartLocker face aux alternatives existantes
| Critère | Casier classique | Solution pro | App mobile | SmartLocker |
|---|---|---|---|---|
| Coût | Très faible | Très élevé | Moyen | Faible |
| Traçabilité | Non | Oui | Partielle | Oui |
| Accessible web | Non | Partielle | Non | Oui |
| Paiement intégré | Non | Oui | Oui | Oui |
| Alerte intrusion | Non | Oui | Non | Oui |
| Open source | N/A | Non | Non | Oui |
| Matériel abordable | Oui | Non | Non | Oui |
Organisation selon les conventions de Flask
Structure de la Realtime Database
La Realtime Database s'articule autour de plusieurs arbres principaux : lockers (état des casiers), users (profils, historique et tokens FCM), lockers_index (index inverse casier → propriétaire) et gateways (état de la passerelle). Le schéma sépare clairement les états des commandes.
Communication entre la passerelle (Pi 4B) et les casiers (Pi Zero)
| Topic | Direction | Contenu |
|---|---|---|
locker/SPORT_01/commande | Pi 4B → Pi Zero | « ouvrir » | « reset » | « etat » |
locker/SPORT_01/etat | Pi Zero → Pi 4B | « Ouverte » | « Fermée » | « commande_recue » |
locker/SPORT_01/alerte | Pi Zero → Pi 4B | « intrusion » | « lockdown_actif » | « lockdown_reset » |
locker/SPORT_01/presence | Pi Zero → Pi 4B | Distance en cm (float) |
locker/SPORT_01/status | Pi Zero → Pi 4B | « en_ligne|timestamp|lockdown=non|alertes=0 » |
Pour le détail complet de la conception et de la réalisation, consultez la rédaction du TFE ou parcourez le code source.