""" XIAO BLE Diagnostic Tool Scan et test de connexion BLE """ import asyncio from bleak import BleakScanner, BleakClient # ⚠️ VÉRIFIEZ CES VALEURS ⚠️ DEVICE_ADDRESS = "00:a5:54:89:f1:ec" # ← Votre adresse MAC DEVICE_NAME = "XIAO Airsoft Pro" # ← Nouveau nom dans le code v2 # UUIDs (version pro) SERVICE_UUID = "6E400001-B5A3-F393-E0A9-E50E24DCCA9E" IMU_CHAR_UUID = "6E400002-B5A3-F393-E0A9-E50E24DCCA9E" SHOT_CHAR_UUID = "6E400004-B5A3-F393-E0A9-E50E24DCCA9E" DEBUG_CHAR_UUID = "6E400005-B5A3-F393-E0A9-E50E24DCCA9E" CONFIG_CHAR_UUID = "6E400006-B5A3-F393-E0A9-E50E24DCCA9E" async def scan_all(): """Scan tous les appareils BLE visibles""" print("\n🔍 Scan BLE en cours (10 secondes)...") print(" Assurez-vous que le XIAO est allumé (LED bleue clignotante)\n") devices = await BleakScanner.discover(timeout=10.0) if not devices: print("❌ Aucun appareil BLE trouvé !") print(" → Vérifiez que le Bluetooth Windows est activé") print(" → Vérifiez que le XIAO est allumé") return [] print(f"📡 {len(devices)} appareil(s) trouvé(s) :\n") for d in sorted(devices, key=lambda x: x.rssi, reverse=True): marker = " ← XIAO !" if (d.name and "XIAO" in d.name) else "" marker2 = " ← XIAO !" if d.address.lower() == DEVICE_ADDRESS.lower() else marker print(f" [{d.rssi:4d} dBm] {d.address} | {d.name or '(sans nom)'}{marker2}") return devices async def test_connection(): """Tente une connexion et liste les services""" print(f"\n🔌 Tentative de connexion à {DEVICE_ADDRESS}...") device = await BleakScanner.find_device_by_address(DEVICE_ADDRESS, timeout=10.0) if not device: print("❌ Appareil non trouvé à cette adresse !") print(" → Vérifiez l'adresse MAC dans le Moniteur Série Arduino") print(" → Ou lancez d'abord le scan pour voir l'adresse réelle") return print(f"✅ Appareil trouvé : {device.name} ({device.address})") try: async with BleakClient(device, timeout=10.0) as client: print(f"✅ Connecté !\n") print("📋 Services et caractéristiques disponibles :\n") for service in client.services: print(f" Service : {service.uuid}") for char in service.characteristics: props = ", ".join(char.properties) known = "" if char.uuid.upper() == IMU_CHAR_UUID.upper(): known = " ← IMU (Roll/Pitch/Yaw)" elif char.uuid.upper() == SHOT_CHAR_UUID.upper(): known = " ← Shot Event" elif char.uuid.upper() == DEBUG_CHAR_UUID.upper(): known = " ← Debug Data" elif char.uuid.upper() == CONFIG_CHAR_UUID.upper(): known = " ← Configuration" print(f" ├─ {char.uuid} [{props}]{known}") print() print("✅ Connexion OK - Toutes les caractéristiques sont accessibles !") except Exception as e: print(f"❌ Erreur de connexion : {e}") print("\n Solutions possibles :") print(" → Supprimez 'XIAO Airsoft Pro' dans les paramètres Bluetooth Windows") print(" → Redémarrez le XIAO (bouton RESET)") print(" → Relancez ce diagnostic") async def main(): print("╔══════════════════════════════════════╗") print("║ XIAO BLE Diagnostic Tool ║") print("╚══════════════════════════════════════╝") print(f"\nAdresse cible : {DEVICE_ADDRESS}") print(f"Nom cible : {DEVICE_NAME}") # Étape 1 : Scan devices = await scan_all() # Vérifier si notre appareil est visible found = any( d.address.lower() == DEVICE_ADDRESS.lower() or (d.name and "XIAO" in d.name) for d in devices ) if not found: print(f"\n⚠️ '{DEVICE_NAME}' non trouvé dans le scan !") print(" → LED du XIAO : quelle couleur voyez-vous ?") print(" 🔵 Bleu clignotant = OK, cherchez dans la liste ci-dessus") print(" 🟡 Jaune = Aucun PC enregistré, essayez de vous connecter") print(" 🔴 Rouge = Erreur hardware") print(" Éteinte = XIAO pas alimenté\n") # Chercher un XIAO par nom xiao_devices = [d for d in devices if d.name and "XIAO" in d.name] if xiao_devices: print("🔎 XIAO trouvé avec un nom différent :") for d in xiao_devices: print(f" {d.address} | {d.name}") print(f"\n ⚠️ Mettez à jour DEVICE_ADDRESS dans ce script et dans vos autres scripts !") return # Étape 2 : Test connexion await test_connection() print("\n📝 Si tout fonctionne ici, mettez à jour l'adresse dans :") print(f" xiao_unreal_bridge.py → DEVICE_ADDRESS = \"{DEVICE_ADDRESS}\"") print(f" xiao_calibration_tool.py → DEVICE_ADDRESS = \"{DEVICE_ADDRESS}\"") if __name__ == "__main__": asyncio.run(main())