Script basique pour lister les appareils BLE en Python avec Bleak
Ce script liste les appareils Bluetooth Low Energy (BLE) en utilisant la bibliothèque Bleak en Python. Actuellement, la liste RSSI et des services NE fonctionne PAS.
list_ble_devices.py
#!/usr/bin/env python3
"""
Scanner d'appareils BLE
Ce script scanne et liste tous les appareils Bluetooth Low Energy (BLE) disponibles
à proximité. Il affiche les informations de l'appareil dont le nom, l'adresse et le RSSI.
Prérequis :
- bibliothèque bleak : pip install bleak
Utilisation :
python list_ble_devices.py
"""
import asyncio
import sys
from bleak import BleakScanner
from datetime import datetime
async def scan_ble_devices(scan_time=10):
"""
Scanner les appareils BLE et retourner une liste des appareils découverts.
Args :
scan_time (int) : Durée du scan en secondes (par défaut : 10)
Retourne :
list : Liste d'objets BleakDevice
"""
print(f"Scanning for BLE devices for {scan_time} seconds...")
print("=" * 50)
try:
devices = await BleakScanner.discover(timeout=scan_time)
return devices
except Exception as e:
print(f"Error during scanning: {e}")
return []
def display_devices(devices):
"""
Afficher les appareils BLE découverts dans un tableau formaté.
Args :
devices (list) : Liste d'objets BleakDevice
"""
if not devices:
print("No BLE devices found.")
return
print(f"Found {len(devices)} BLE device(s):")
print("-" * 80)
print(f"{'Name':<25} {'Address':<20} {'RSSI':<6} {'Services'}")
print("-" * 80)
for device in devices:
name = device.name if device.name else "<Unknown>"
address = device.address
rssi = "N/A"
if hasattr(device, 'metadata') and 'rssi' in device.metadata:
rssi_val = device.metadata['rssi']
rssi = f"{rssi_val} dBm" if rssi_val is not None else "N/A"
# Obtenir les UUIDs de service si disponibles
services = ""
if hasattr(device, 'metadata') and 'uuids' in device.metadata:
services = ', '.join(device.metadata['uuids'][:2]) # Show first 2 UUIDs
if len(device.metadata['uuids']) > 2:
services += "..."
print(f"{name:<25} {address:<20} {rssi:<6} {services}")
async def main():
"""
Fonction principale pour exécuter le scanner d'appareils BLE.
"""
print("BLE Device Scanner")
print(f"Scan started at: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
print()
# Vérifier si la durée de scan est fournie comme argument en ligne de commande
scan_time = 10
if len(sys.argv) > 1:
try:
scan_time = int(sys.argv[1])
if scan_time <= 0:
raise ValueError("Scan time must be positive")
except ValueError as e:
print(f"Invalid scan time: {e}")
print("Using default scan time of 10 seconds")
scan_time = 10
# Effectuer le scan
devices = await scan_ble_devices(scan_time)
# Afficher les résultats
print()
display_devices(devices)
# Détails supplémentaires sur l'appareil
if devices:
print()
print("Additional device information:")
print("-" * 50)
for i, device in enumerate(devices, 1):
print(f"{i}. {device.name or '<Unknown>'} ({device.address})")
metadata = getattr(device, 'metadata', None)
if metadata:
for key, value in metadata.items():
if key != 'uuids': # uuids déjà affichés ci-dessus
print(f" {key}: {value}")
print()
if __name__ == "__main__":
try:
asyncio.run(main())
except KeyboardInterrupt:
print("\nScan interrupted by user.")
except Exception as e:
print(f"An error occurred: {e}")
sys.exit(1)Si cet article vous a aidé, pensez à m'offrir un café ou à faire un don via PayPal pour soutenir la recherche et la publication de nouveaux articles sur TechOverflow