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