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)Wenn dieser Beitrag dir geholfen hat, erwäge, mir einen Kaffee zu spendieren oder per PayPal zu spenden, um die Recherche und Veröffentlichung neuer Beiträge auf TechOverflow zu unterstützen