01 - Application "pont" BDD
Parc
– MQTT
→ App "pont" 
Un programme fiable et efficace qui fait le pont entre le broker MQTT Mosquitto et la base de données MySQL du projet.
Programme génére à l'aide de ClaudeCode ![]()
Architecture
[IoT sensors / controleurs]
│ MQTT serre/X/bac/Y
▼
┌─────────────┐ ┌──────────────────────┐
│ Mosquitto │ ───────▶│ bridge.py (Python) │ ──▶ MySQL (external)
│ (broker) │ │ subscribe + persist │
└─────────────┘ └──────────────────────┘
Docker container Docker container
Les 2 conteneurs partages le même réseau docker (parc-net).
Le serveur MySQL n'est pas géré sur cette machine.
Application docker
Lors du lancement du docker compose, l'application est construite à partir du DockerFile suivant.
FROM python:3.12-slim
# Dépendences système (mise à jours + installation de pip)
RUN apt-get update && apt-get install -y --no-install-recommends \
gcc \
default-libmysqlclient-dev \
pkg-config \
&& rm -rf /var/lib/apt/lists/*
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY bridge.py .
# Lancé en non-root
RUN useradd -r -u 1001 bridge
USER bridge
CMD ["python", "-u", "bridge.py"]
MQTT topics
| Format topic MQTT | Description |
|---|---|
serre/<x>/bac/<y> |
Mesure du bac y dans la serre x |
Format du payload (JSON)
{ "temperatureAmbiante": 28.5 }
{ "humiditeAmbiante": 65.3, "temperatureAmbiante": 22.1 }
{ "humiditeAmbiante": 18.7, "temperatureAmbiante": 23, "humiditeSol": 58.6 }
Chaque payload peut contenir une seule ou plusieurs mesures.
Capteurs
| Clé JSON | id_capteur |
|---|---|
humiditeAmbiante |
1 |
humiditeSol |
2 |
temperatureAmbiante |
3 |
Support des erreurs
L'intégralité des erreurs sont enregistré dans la table error avec chacune une valeure dans la table type_erreur:
| Code | Déclencheur |
|---|---|
BAC_NOT_FOUND |
Numéro de bac ou serre non présent en base de données |
UNKNOWN_SENSOR |
La clé du capteur n'est pas dans la liste connu |
INVALID_PAYLOAD |
Erreur de format du JSON ou contenu du payload incorrect |
INVALID_VALUE |
Valeur non numérique reçu |
VALUE_OUT_OF_RANGE |
Valeur hors limite des valeurs min/max du capteur |
INVALID_ENCODING |
Non-UTF-8 payload |
MQTT_DISCONNECT |
Déconnexion du broker |
DB_ERROR |
Communications avec la base de données échoué |
DB_INSERT_ERROR |
Echec d'insertion d'une mesure en base de donnée |
UNEXPECTED_ERROR |
Erreur générale (cas non prévu) |
Quand une valeur est hors plage du capteur, le minimum / maximum est écrit en base de donné et un ligne d'erreur est inséré.
Variables d'environment
| Variable | valeur par défaut | Description |
|---|---|---|
DB_HOST |
(requis) | hébergeur MySQL |
DB_PORT |
3306 |
port du serveur MySQL |
DB_NAME |
parc |
nom de la base de données |
DB_USER |
(requis) | utilisateur MySQL |
DB_PASSWORD |
(requis) | mot de passe MySQL |
MQTT_HOST |
mosquitto |
nom de l'hébergeur Broker |
MQTT_PORT |
1883 |
port du Broker |
MQTT_KEEPALIVE |
60 |
MQTT keepalive (seconde) |
MQTT_USER |
(vide) | utilisateur du Broker (optionel) |
MQTT_PASSWORD |
(vide) | mot de passe du Broker (optionel) |
DB_RETRY_DELAY |
5 |
secondes entre les essais d'écriture en bdd |
MQTT_RETRY_DELAY |
5 |
secondes entre les essais MQTT |
LOG_LEVEL |
INFO |
DEBUG/INFO/WARNING/ERROR |
Arborescence des fichiers
.
└── mqtt-bridge
├── bridge.py
├── docker-compose.yml
├── Dockerfile
├── mosquitto
│ ├── client-certs
│ │ ├── client.crt
│ │ ├── client.csr
│ │ └── client.key
│ ├── clients-certs.sh
│ ├── config
│ │ ├── mosquitto.conf
│ │ └── mosquitto.conf.bak
│ ├── server-certs
│ │ ├── ca.crt
│ │ ├── ca.key
│ │ ├── ca.srl
│ │ ├── server.crt
│ │ ├── server.csr
│ │ └── server.key
│ ├── server-certs.sh
│ └── v3.ext
├── README.md
└── requirements.txt