128 lines
5.2 KiB
Python
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())
|