Basisskript zum Auflisten von BLE-Geräten in Python mit Bleak

Dieses Skript listet Bluetooth Low Energy (BLE)-Geräte mit der Bleak-Bibliothek in Python auf. Aktuell funktionieren die RSSI- und Dienste-Liste NICHT.

list_ble_devices.py
#!/usr/bin/env python3
"""
BLE Device Scanner

Dieses Skript sucht nach allen verfügbaren Bluetooth Low Energy (BLE)-Geräten
in der Umgebung und listet diese auf. Es zeigt Geräteinformationen inklusive
Name, Adresse und RSSI an.

Voraussetzungen:
    - bleak-Bibliothek: pip install bleak

Verwendung:
    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):
    """
    Sucht nach BLE-Geräten und gibt eine Liste der gefundenen Geräte zurück.

    Args:
        scan_time (int): Dauer des Suchlaufs in Sekunden (Standard: 10)

    Returns:
        list: Liste von BleakDevice-Objekten
    """
    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):
    """
    Zeigt die gefundenen BLE-Geräte in einer formatierten Tabelle an.

    Args:
        devices (list): Liste von BleakDevice-Objekten
    """
    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"

        # Service-UUIDs abrufen, falls verfügbar
        services = ""
        if hasattr(device, 'metadata') and 'uuids' in device.metadata:
            services = ', '.join(device.metadata['uuids'][:2])  # Erste 2 UUIDs anzeigen
            if len(device.metadata['uuids']) > 2:
                services += "..."

        print(f"{name:<25} {address:<20} {rssi:<6} {services}")


async def main():
    """
    Hauptfunktion zum Ausführen des BLE-Geräte-Scanners.
    """
    print("BLE Device Scanner")
    print(f"Scan started at: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
    print()

    # Prüfen, ob die Suchdauer als Kommandozeilenargument übergeben wurde
    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

    # Suchlauf durchführen
    devices = await scan_ble_devices(scan_time)

    # Ergebnisse anzeigen
    print()
    display_devices(devices)

    # Zusätzliche Gerätedetails
    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 oben bereits angezeigt
                        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)

Ähnliche Beiträge nach Kategorie: Bluetooth, Python