Si vous avez accès à un terminal Linux et au paquet mosquitto-clients, vous pouvez vous abonner à l’ensemble des topics (#) et enregistrer le résultat directement dans un fichier texte ou CSV.
Commande en ligne de commande :
mosquitto_sub -h localhost -p 1883 -v -t "#" | while read -r line; do
echo "$(date '+%Y-%m-%d %H:%M:%S') - $line" >> mqtt_events.log
done
Si vous souhaitez enregistrer ces données en base de données ou calculer le délai exact entre la réception de deux messages sur un même topic, un script Python avec la bibliothèque paho-mqtt offre une grande souplesse.
Installation de la bibliothèque :
pip install paho-mqtt
Code du script mqtt_logger.py :
import datetime
import time
import paho.mqtt.client as mqtt
# Dictionnaire pour suivre le temps du dernier message par topic
last_seen = {}
LOG_FILE = "mqtt_log.csv"
# Initialisation du fichier CSV avec l'en-tête
with open(LOG_FILE, "a") as f:
f.write("Timestamp;Topic;Payload;Delai_sec\n")
def on_connect(client, userdata, flags, rc):
print(f"Connecté au broker MQTT avec le code : {rc}")
# S'abonner à tous les topics
client.subscribe("#")
def on_message(client, userdata, msg):
now = datetime.datetime.now()
now_ts = time.time()
topic = msg.topic
payload = msg.payload.decode("utf-8", errors="ignore")
# Calcul du délai par rapport au dernier message sur ce topic
delay = 0.0
if topic in last_seen:
delay = round(now_ts - last_seen[topic], 3)
last_seen[topic] = now_ts
# Formatage de la ligne de log
log_line = f"{now.strftime('%Y-%m-%d %H:%M:%S')};{topic};{payload};{delay}\n"
print(
f"[{now.strftime('%H:%M:%S')}] {topic} -> {payload} (Délai : {delay}s)"
)
# Écriture dans le fichier de log
with open(LOG_FILE, "a", encoding="utf-8") as f:
f.write(log_line)
# Configuration du client MQTT
client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message
# Remplacer par l'IP/nom de votre serveur MQTT
client.connect("localhost", 1883, 60)
# Boucle d'écoute infinie
client.loop_forever()
Voici la version modifiée du script Python. Elle enregistre automatiquement les messages MQTT, leurs topics, payloads et le délai calculé dans une base de données SQLite (mqtt_events.db).
La bibliothèque sqlite3 étant intégrée par défaut dans Python, aucune installation supplémentaire n’est requise en dehors de paho-mqtt.
import datetime
import sqlite3
import time
import paho.mqtt.client as mqtt
DB_FILE = "mqtt_events.db"
MQTT_BROKER = "localhost"
MQTT_PORT = 1883
# Dictionnaire mémoire pour calculer le délai par topic
last_seen = {}
def init_db():
"""Initialise la base SQLite et crée la table si elle n'existe pas."""
conn = sqlite3.connect(DB_FILE)
cursor = conn.cursor()
cursor.execute(
"""
CREATE TABLE IF NOT EXISTS events (
id INTEGER PRIMARY KEY AUTOINCREMENT,
timestamp TEXT NOT NULL,
topic TEXT NOT NULL,
payload TEXT,
delay_sec REAL
)
"""
)
conn.commit()
conn.close()
def save_to_db(timestamp, topic, payload, delay):
"""Insère un événement dans la base SQLite."""
try:
conn = sqlite3.connect(DB_FILE)
cursor = conn.cursor()
cursor.execute(
"""
INSERT INTO events (timestamp, topic, payload, delay_sec)
VALUES (?, ?, ?, ?)
""",
(timestamp, topic, payload, delay),
)
conn.commit()
conn.close()
except Exception as e:
print(f"Erreur d'écriture SQLite : {e}")
def on_connect(client, userdata, flags, rc):
print(f"Connecté au broker MQTT (code : {rc})")
# S'abonner à tous les topics
client.subscribe("#")
def on_message(client, userdata, msg):
now = datetime.datetime.now()
now_ts = time.time()
topic = msg.topic
payload = msg.payload.decode("utf-8", errors="ignore")
# Calcul du délai depuis le dernier message sur CE topic
delay = 0.0
if topic in last_seen:
delay = round(now_ts - last_seen[topic], 3)
last_seen[topic] = now_ts
timestamp_str = now.strftime("%Y-%m-%d %H:%M:%S.%f")[:-3]
print(f"[{timestamp_str}] {topic} -> {payload} (Délai : {delay}s)")
# Enregistrement en BDD
save_to_db(timestamp_str, topic, payload, delay)
# Initialisation
init_db()
client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message
client.connect(MQTT_BROKER, MQTT_PORT, 60)
client.loop_forever()
Vous pouvez interroger le fichier mqtt_events.db avec n’importe quel client SQLite (ex: DB Browser for SQLite) ou en ligne de commande :
SELECT * FROM events ORDER BY id DESC LIMIT 20;
SELECT timestamp, payload, delay_sec FROM events WHERE topic = 'votre/topic' ORDER BY id DESC;
SELECT * FROM events WHERE delay_sec > 5.0;