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)

Consultez les articles similaires par catégorie : Bluetooth, Python