69 lines
2.4 KiB
Python
69 lines
2.4 KiB
Python
import threading
|
|
import queue
|
|
import time
|
|
from shared import get_lora, deviceTypes
|
|
|
|
# --- Lecture de l'ID unique du Raspberry Pi ---
|
|
try:
|
|
with open("device_id.txt", "r") as f:
|
|
DEVICE_ID = f.read().strip()
|
|
except Exception:
|
|
# Alternative si le script est lancé depuis un autre dossier
|
|
try:
|
|
with open("/home/pi/SmartWave/orchestrateur/device_id.txt", "r") as f:
|
|
DEVICE_ID = f.read().strip()
|
|
except Exception:
|
|
DEVICE_ID = "RPI_Orchestrateur_Default"
|
|
|
|
# Création de la file d'attente pour les messages (thread-safe)
|
|
data_queue = queue.Queue()
|
|
|
|
lora = get_lora()
|
|
lora.configure()
|
|
|
|
def lora_listener():
|
|
"""Thread de fond : écoute en permanence et répond aux Heartbeats."""
|
|
print("Thread Écouteur démarré.")
|
|
while True:
|
|
# On attend un paquet (timeout court pour rester réactif)
|
|
paquet = lora.receive_packet(timeout_ms=1000)
|
|
|
|
if paquet:
|
|
donnees = paquet["data"]
|
|
expediteur_type = donnees.get("type")
|
|
|
|
# --- Cas 1 : Gestion automatique du Heartbeat ---
|
|
if expediteur_type == deviceTypes.DEVICE_TYPES["MICROWAVE"]:
|
|
print(f"\n[Thread Fond] Heartbeat reçu de {donnees.get('id')}")
|
|
|
|
reponse = {
|
|
"id": DEVICE_ID, # Ou lecture de ton fichier device_id.txt
|
|
"type": deviceTypes.DEVICE_TYPES["ORCHESTRATOR"]
|
|
}
|
|
lora.send(reponse)
|
|
|
|
# --- Cas 2 : Donnée applicative, on l'envoie vers le thread principal ---
|
|
else:
|
|
data_queue.put(paquet)
|
|
|
|
# 2. Lancement du thread d'écoute
|
|
listener_thread = threading.Thread(target=lora_listener, daemon=True)
|
|
listener_thread.start()
|
|
|
|
# 3. Boucle principale (Main Thread) : tu es libre de faire autre chose !
|
|
print("Orchestrateur prêt. Le main loop est libre.")
|
|
while True:
|
|
try:
|
|
# On regarde si on a reçu des données applicatives (non-heartbeat)
|
|
# On utilise block=False pour ne pas bloquer si la queue est vide
|
|
try:
|
|
msg = data_queue.get(block=False)
|
|
print(f"\n[Main Loop] Données traitées : {msg['data']}")
|
|
except queue.Empty:
|
|
pass # Rien à traiter, on fait autre chose...
|
|
|
|
# Ici tu peux faire tes autres tâches
|
|
time.sleep(1)
|
|
|
|
except KeyboardInterrupt:
|
|
break |