PS_BLE_Tracker/Python/Xiao_BLE_tools/xiao_ble_diagnostic.py

128 lines
5.2 KiB
Python

"""
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())