aioble — Async BLE

aioble ist ein asyncio-freundlicher High-Level-Wrapper um das bluetooth-Modul. Es stellt saubere Coroutinen für Scannen, Verbinden, Werben (Advertising), GATT-Dienste und L2CAP-Kanäle bereit.

Alle Remote-Operationen (connect, disconnect, Client read/write, Server indicate, l2cap recv/send, pair) sind awaitable und unterstützen Timeouts.

Unterstützte Rollen:

  • Broadcaster (Advertiser) — erzeugt Advertising- und Scan-Response-Nutzdaten für gängige Felder, teilt die Nutzdaten automatisch auf Advertising und Scan Response auf und wirbt unbegrenzt oder für eine feste Dauer.

  • Peripheral — wartet auf eine Verbindung von einem Central und wartet auf den MTU-Austausch.

  • Observer (Scanner) — passives und aktives Scannen, kombiniert Advertising- und Scan-Response-Nutzdaten für dasselbe Gerät und parst gängige Felder aus Advertising-Nutzdaten.

  • Central — verbindet sich mit einem Peripheral und initiiert den MTU-Austausch.

  • GATT Client — ermittelt Dienste / Charakteristiken / Deskriptoren (optional nach UUID); read / write / write-with-response für Charakteristiken und Deskriptoren; abonniert Notifications und Indications (über das CCCD); wartet auf Notifications und Indications.

  • GATT Server — registriert Dienste / Charakteristiken / Deskriptoren; wartet auf Schreibvorgänge an Charakteristiken und Deskriptoren; fängt Leseanfragen ab; sendet Notifications und Indications (und wartet auf die Antwort).

  • L2CAP — akzeptiert und verbindet verbindungsorientierte L2CAP-Kanäle und verwaltet die Flusskontrolle des Kanals.

  • Sicherheit — JSON-gestützte Schlüssel-/Geheimnisverwaltung, initiiert das Pairing, fragt den Verschlüsselungs-/Authentifizierungsstatus ab.

Beispiele

Nach BLE-Geräten in der Nähe scannen und jedes anzeigen, sobald es erkannt wird:

import aioble
import asyncio

async def find_devices():
    async with aioble.scan(duration_ms=5000, active=True) as scanner:
        async for result in scanner:
            print(result.device.addr_hex(), result.rssi, result.name())

asyncio.run(find_devices())

Sich als Central mit einem Peripheral verbinden, das den Heart-Rate-Dienst bewirbt, und seine Mess-Notifications abonnieren:

import aioble
import asyncio
import bluetooth

_HR_SERVICE = bluetooth.UUID(0x180D)
_HR_MEASUREMENT = bluetooth.UUID(0x2A37)

async def connect_and_read():
    device = None
    async with aioble.scan(duration_ms=5000, active=True) as scanner:
        async for result in scanner:
            if _HR_SERVICE in result.services():
                device = result.device
                break
    if device is None:
        return

    async with await device.connect() as conn:
        service = await conn.service(_HR_SERVICE)
        char = await service.characteristic(_HR_MEASUREMENT)
        await char.subscribe(notify=True)
        while True:
            data = await char.notified()
            print("notify:", data)

asyncio.run(connect_and_read())

Als Peripheral agieren: einen GATT-Dienst registrieren, ihn bewerben und Notifications an alle senden, die sich verbinden:

import aioble
import asyncio
import bluetooth
import struct

_ENV_SERVICE = bluetooth.UUID(0x181A)
_TEMP_CHAR = bluetooth.UUID(0x2A6E)

def encode_temperature(deg_c):
    # Bluetooth Temperature (0x2A6E) is sint16 little-endian, 0.01 degC units.
    return struct.pack("<h", round(deg_c * 100))

service = aioble.Service(_ENV_SERVICE)
temp_char = aioble.Characteristic(service, _TEMP_CHAR, read=True, notify=True)
aioble.register_services(service)

async def peripheral_task():
    while True:
        connection = await aioble.advertise(
            interval_us=250000,
            name="openmv-sensor",
            services=[_ENV_SERVICE],
            appearance=0x0300,
        )
        print("connected:", connection.device.addr_hex())
        async with connection:
            while connection.is_connected():
                temp_char.write(encode_temperature(23.68), send_update=True)
                await asyncio.sleep(1)

asyncio.run(peripheral_task())

Funktionen auf Modulebene

aioble.config(*args, **kwargs) Any

Leitet an bluetooth.BLE.config() weiter und stellt sicher, dass das BLE-Radio zuvor aktiv ist.

args

Optionaler einzelner Parametername, der abgefragt werden soll.

kwargs

Keyword-Argumente zum Setzen von Konfigurationswerten.

aioble.stop() None

Deaktiviert das zugrunde liegende BLE-Radio und führt alle registrierten Shutdown-Handler von Submodulen aus. Nach diesem Aufruf werden Scanner, Advertiser, Verbindungen und L2CAP-Kanäle allesamt abgebaut.

aioble.scan(duration_ms: int, interval_us: int | None = None, window_us: int | None = None, active: bool = False) scan

Gibt einen scan-Async-Context-Manager / Async-Iterator zurück, der für jedes eindeutig erkannte Gerät (oder für jedes neue Advertising-Datenpaket eines bekannten Geräts) eine ScanResult-Instanz liefert.

duration_ms

Wie lange gescannt werden soll, in Millisekunden. Übergeben Sie 0, um unbegrenzt zu scannen, bis der Context Manager beendet wird.

interval_us

Scan-Intervall in Mikrosekunden. Standardwert ist 1.280.000.

window_us

Scan-Fenster in Mikrosekunden (muss kleiner oder gleich interval_us sein). Standardwert ist 11.250.

active

Wenn True, wird ein aktiver Scan durchgeführt (Scan-Response-Daten werden angefordert). Standardwert ist False.

aioble.advertise(interval_us: int, adv_data: bytes | None = None, resp_data: bytes | None = None, connectable: bool = True, limited_disc: bool = False, br_edr: bool = False, name: str | None = None, services: list | None = None, appearance: int = 0, manufacturer: tuple | None = None, timeout_ms: int | None = None) DeviceConnection

Async-Coroutine, die mit dem Advertising beginnt und auf eine eingehende Central-Verbindung wartet. Gibt eine DeviceConnection zurück, die das verbundene Central repräsentiert, oder löst bei Timeout asyncio.TimeoutError aus.

interval_us

Advertising-Intervall, in Mikrosekunden.

adv_data

Rohe Advertising-Nutzdaten. Wenn nicht gesetzt, werden adv_data aus den übrigen Keyword-Argumenten erstellt.

resp_data

Rohe Scan-Response-Nutzdaten. Wird bei Bedarf automatisch mit dem Überlauf aus adv_data befüllt.

connectable

Wenn True, handelt es sich um eine verbindbare Werbung (Advertisement).

limited_disc

Verwendet das Limited-Discoverable-Flag anstelle von General.

br_edr

Setzt das BR/EDR-Supported-Flag.

name

Optionaler vollständiger lokaler Name, der eingebettet werden soll.

services

Iterable von bluetooth.UUID, die beworben werden sollen.

appearance

16-Bit-Appearance-Wert (siehe Bluetooth Assigned Numbers).

manufacturer

Tupel aus (company_id, data_bytes), das als herstellerspezifische Daten beworben werden soll.

timeout_ms

Stoppt das Advertising nach dieser Anzahl von Millisekunden ohne Verbindung. None bedeutet, bis zur Verbindung zu werben.

aioble.register_services(*services: Service) None

Registriert ein oder mehrere Service-Objekte (und ihre Charakteristiken und Deskriptoren) beim GATT-Server. Muss einmal aufgerufen werden, bevor advertise gestartet wird. Nachfolgende Aufrufe ersetzen die vorherige Registrierung.

services

Eine oder mehrere Service-Instanzen.

Konstanten auf Modulebene

aioble.ADDR_PUBLIC

Öffentlicher BLE-Geräteadresstyp (0).

aioble.ADDR_RANDOM

Zufälliger BLE-Geräteadresstyp (1).

Ausnahmen

exception aioble.GattError

Wird ausgelöst, wenn eine Remote-GATT-Operation (read / write / indicate) mit einem von null verschiedenen Status abgeschlossen wird. Der Statuscode ist über das Attribut _status verfügbar.

exception aioble.DeviceDisconnectedError

Wird innerhalb einer Async-Operation (z. B. read, write, notified) ausgelöst, wenn die zugrunde liegende Verbindung während des Wartens abbricht.

exception aioble.L2CAPDisconnectedError

Wird ausgelöst, wenn eine L2CAP-Kanaloperation send/recv/flush auf einem getrennten Kanal versucht (oder durch diesen unterbrochen) wird.

exception aioble.L2CAPConnectionError

Wird von DeviceConnection.l2cap_connect ausgelöst, wenn das Einrichten des Kanals fehlschlägt. Der Bluetooth-Statuscode ist das erste Argument.

Klassen

class aioble.Device(addr_type: int, addr: bytes | str)

Repräsentiert ein Remote-BLE-Gerät anhand seiner Adresse. Zwei Device-Instanzen sind gleich, wenn sowohl addr_type als auch addr übereinstimmen. Wird als Handle zum Initiieren von Verbindungen verwendet.

addr_type

Entweder ADDR_PUBLIC oder ADDR_RANDOM.

addr

Sechs-Byte-Adresse als bytes oder ein durch Doppelpunkte getrennter Hex-String (z. B. "aa:bb:cc:dd:ee:ff").

addr_type

Der Adresstyp, mit dem das Gerät erstellt wurde.

addr

Die rohe Sechs-Byte-Geräteadresse.

addr_hex() str

Gibt die Adresse als durch Doppelpunkte getrennten Hex-String formatiert zurück.

connect(timeout_ms: int = 10000, scan_duration_ms: int | None = None, min_conn_interval_us: int | None = None, max_conn_interval_us: int | None = None) Awaitable[DeviceConnection]

Async. Initiiert eine GAP-Verbindung zu diesem Gerät und gibt die resultierende DeviceConnection zurück. Bricht jeden laufenden Scan ab.

timeout_ms

Wie lange auf den Abschluss der Verbindung gewartet werden soll.

scan_duration_ms

Anfängliche Scan-Dauer vor dem Verbinden (controllerspezifisch).

min_conn_interval_us / max_conn_interval_us

Optionale Grenzen für das Verbindungsintervall, in Mikrosekunden.

class aioble.DeviceConnection

Eine aktive GAP-Verbindung zu einem Device. Wird von Device.connect() oder advertise zurückgegeben. Unterstützt die Verwendung als async with-Context-Manager, der beim Verlassen automatisch trennt.

Nicht direkt konstruieren.

device

Das zugrunde liegende Device.

encrypted

True, sobald der Link verschlüsselt ist (z. B. nach dem Pairing).

authenticated

True, wenn der Link authentifiziert wurde (MITM-geschütztes Pair).

bonded

True, wenn das Pairing Bonding-Schlüssel erzeugt hat.

key_size

Ausgehandelte Verschlüsselungsschlüsselgröße in Bytes oder False, wenn nicht verschlüsselt.

mtu

Ausgehandelte ATT-MTU nach exchange_mtu oder None, bis sie gesetzt ist.

is_connected() bool

Gibt zurück, ob die Verbindung noch aktiv ist.

disconnect(timeout_ms: int = 2000) Awaitable[None]

Async. Trennt die Verbindung und wartet auf den Disconnection-IRQ.

timeout_ms

Maximale Wartezeit auf die Trennung.

disconnected(timeout_ms: int | None = None, disconnect: bool = False) Awaitable[None]

Async. Wartet darauf, dass die Verbindung von einer der beiden Seiten beendet wird. Wenn disconnect True ist, wird zuvor aktiv getrennt.

timeout_ms

Maximale Wartezeit. None bedeutet, unbegrenzt zu warten.

disconnect

Wenn True, wird die Trennung initiiert.

timeout(timeout_ms: int | None) DeviceTimeout

Gibt einen Context Manager zurück, der seinen Rumpf abbricht, wenn entweder das Timeout abläuft (löst asyncio.TimeoutError aus) oder das Gerät die Verbindung trennt (löst DeviceDisconnectedError aus).

timeout_ms

Timeout in Millisekunden oder None für kein Timeout.

exchange_mtu(mtu: int | None = None, timeout_ms: int = 1000) Awaitable[int]

Async. Initiiert einen ATT-MTU-Austausch und gibt die ausgehandelte MTU zurück.

mtu

Optionale bevorzugte MTU, die vor dem Austausch auf der zugrunde liegenden BLE-Schnittstelle gesetzt werden soll.

timeout_ms

Timeout für den Austausch.

service(uuid: bluetooth.UUID, timeout_ms: int = 2000) Awaitable[ClientService | None]

Async. Ermittelt einen einzelnen Remote-Dienst, der zu uuid passt, oder None, falls nicht gefunden.

services(uuid: bluetooth.UUID | None = None, timeout_ms: int = 2000) ClientDiscover

Gibt einen Async-Iterator von Remote-ClientService-Objekten zurück. Mit async for verwenden und die Schleife vollständig durchlaufen.

uuid

Optionaler UUID-Filter. None gibt jeden Dienst zurück.

timeout_ms

Timeout pro Discovery.

pair(bond: bool = True, le_secure: bool = True, mitm: bool = False, io: int = 3, timeout_ms: int = 20000) Awaitable[None]

Async. Initiiert das Pairing auf dieser Verbindung. Aktualisiert nach Abschluss die Attribute encrypted / authenticated / bonded / key_size.

bond

Pairing-Schlüssel dauerhaft speichern.

le_secure

LE Secure Connections verwenden.

mitm

Man-in-the-Middle-Schutz erfordern.

io

IO-Capability-Konstante (z. B. 3 für kein Input/Output).

timeout_ms

Pairing-Timeout.

l2cap_accept(psm: int, mtu: int, timeout_ms: int | None = None) Awaitable[L2CAPChannel]

Async. Lauscht am angegebenen PSM und gibt einen L2CAPChannel zurück, sobald die Gegenstelle ihn öffnet.

psm

Protocol/Service Multiplexer, auf dem gelauscht werden soll.

mtu

Maximale Empfangsgröße, in Bytes.

timeout_ms

Maximale Wartezeit, bis sich die Gegenstelle verbindet.

l2cap_connect(psm: int, mtu: int, timeout_ms: int = 1000) Awaitable[L2CAPChannel]

Async. Öffnet einen L2CAP-Kanal zur Gegenstelle am angegebenen PSM.

psm

Protocol/Service Multiplexer, mit dem verbunden werden soll.

mtu

Maximale Empfangsgröße, in Bytes.

timeout_ms

Verbindungs-Timeout.

class aioble.ScanResult

Ein einzelnes während scan erkanntes Gerät. Dieselbe Instanz wird erneut geliefert, sobald neue Advertising-Daten eintreffen.

Nicht direkt konstruieren.

device

Das zugrunde liegende Device.

rssi

Zuletzt gemeldeter RSSI, in dBm.

adv_data

Rohe Advertising-Nutzdaten (bytes oder None).

resp_data

Rohe Scan-Response-Nutzdaten (bytes oder None), falls aktives Scannen aktiviert ist.

connectable

True, wenn die jüngste Werbung verbindbar war.

name() str | None

Dekodiert den vollständigen (oder verkürzten) beworbenen lokalen Namen aus den Nutzdaten oder None, falls nicht vorhanden.

services() Iterator[bluetooth.UUID]

Generator, der jede bluetooth.UUID liefert, die in den 16/32/128-Bit-Service-List-Feldern beworben wird.

manufacturer(filter: int | None = None) Iterator[tuple[int, bytes]]

Generator, der (company_id, data)-Tupel aus den herstellerspezifischen Advertising-Feldern liefert.

filter

Wenn angegeben, werden nur Einträge geliefert, deren Company-ID übereinstimmt.

class aioble.Service(uuid: bluetooth.UUID)

Ein lokaler GATT-Dienst. Erstellen Sie einen Dienst mit einer oder mehreren Characteristic-Instanzen und übergeben Sie ihn dann an register_services.

uuid

Die Dienst-UUID.

uuid

Die Dienst-UUID.

characteristics

Liste der an diesen Dienst gebundenen Characteristic-Objekte.

class aioble.Characteristic(service: Service, uuid: bluetooth.UUID, read: bool = False, write: bool = False, write_no_response: bool = False, notify: bool = False, indicate: bool = False, initial: bytes | None = None, capture: bool = False)

Eine lokale GATT-Charakteristik. Beim Konstruieren wird sie automatisch an service angehängt.

service

Der besitzende Service.

uuid

Die Charakteristik-UUID.

read, write, write_no_response, notify, indicate

Booleans, die die unterstützten GATT-Operationen auswählen.

initial

Optionaler Anfangswert (bytes).

capture

Wenn True, werden geschriebene Werte in eine Warteschlange gestellt (bis zu 10 tief), damit rasch aufeinanderfolgende Schreibvorgänge nicht verloren gehen. Jeder written-Aufruf gibt dann ein (connection, data)-Tupel zurück.

uuid

Die Charakteristik-UUID.

flags

Bitmaske der GATT-Property-Flags, die aus dem Konstruktor aufgebaut wird.

descriptors

Liste der an diese Charakteristik gebundenen Descriptor-Objekte.

read() bytes

Liest den aktuellen Wert aus der lokalen GATT-Datenbank.

write(data: bytes, send_update: bool = False) None

Aktualisiert den Wert in der lokalen GATT-Datenbank.

data

Neue Wertbytes.

send_update

Wenn True, wird zusätzlich jede abonnierte Verbindung benachrichtigt (notify/indicate).

notify(connection: DeviceConnection, data: bytes | None = None) None

Sendet ein GATT Notify an connection.

connection

Die Ziel-Client-Verbindung.

data

Zu sendende Nutzdaten. Wenn None, wird der aktuelle lokale Wert gesendet.

indicate(connection: DeviceConnection, data: bytes | None = None, timeout_ms: int = 1000) Awaitable[None]

Async. Sendet ein GATT Indicate an connection und wartet auf die Bestätigung des Clients. Löst bei einem von null verschiedenen Status GattError aus.

connection

Die Ziel-Client-Verbindung.

data

Zu meldende Nutzdaten oder None, um den lokalen Wert zu senden.

timeout_ms

Maximale Wartezeit auf die Bestätigung.

written(timeout_ms: int | None = None) Awaitable[DeviceConnection | tuple[DeviceConnection, bytes]]

Async. Wartet auf einen Remote-Schreibvorgang. Gibt die schreibende DeviceConnection zurück oder (connection, data), falls die Charakteristik mit capture=True erstellt wurde.

timeout_ms

Maximale Wartezeit. None wartet unbegrenzt.

on_read(connection: DeviceConnection) int

Override-Hook, der synchron aufgerufen wird, wenn ein Remote-Read empfangen wird. Geben Sie 0 zurück, um den Read zuzulassen, oder einen von null verschiedenen ATT-Fehlercode, um ihn abzulehnen. Die Standardimplementierung gibt 0 zurück.

class aioble.BufferedCharacteristic(service: Service, uuid: bluetooth.UUID, max_len: int = 20, append: bool = False, **kwargs)

Eine Characteristic, deren zugrunde liegender GATT-Puffer konfiguriert werden kann. Nützlich für den Empfang von Werten, die größer als die Standard-Attributgröße sind, oder zum Einreihen aufeinanderfolgender Schreibvorgänge.

max_len

Puffergröße, in Bytes.

append

Wenn True, hängen aufeinanderfolgende Schreibvorgänge an den Puffer an, statt ihn zu überschreiben.

Weitere Argumente werden an Characteristic weitergeleitet.

class aioble.Descriptor(characteristic: Characteristic, uuid: bluetooth.UUID, read: bool = False, write: bool = False, initial: bytes | None = None)

Ein lokaler GATT-Deskriptor. Beim Konstruieren wird er automatisch an characteristic angehängt. Erbt read, write und written von Characteristic.

characteristic

Die besitzende Characteristic.

uuid

Die Deskriptor-UUID.

read, write

Booleans, die die unterstützten GATT-Operationen auswählen.

initial

Optionaler Anfangswert (bytes).

class aioble.ClientService

Ein auf einer Gegenstelle erkannter Remote-GATT-Dienst. Wird von DeviceConnection.service() zurückgegeben oder über DeviceConnection.services() iteriert.

Nicht direkt konstruieren.

connection

Die besitzende DeviceConnection.

uuid

Die Remote-Dienst-UUID.

characteristic(uuid: bluetooth.UUID, timeout_ms: int = 2000) Awaitable[ClientCharacteristic | None]

Async. Ermittelt eine einzelne Charakteristik nach UUID oder None, falls nicht gefunden.

characteristics(uuid: bluetooth.UUID | None = None, timeout_ms: int = 2000) ClientDiscover

Gibt einen Async-Iterator von ClientCharacteristic-Objekten zurück. Mit async for verwenden und die Schleife vollständig durchlaufen.

uuid

Optionaler UUID-Filter.

timeout_ms

Timeout pro Discovery.

class aioble.ClientCharacteristic

Eine auf einer Gegenstelle erkannte Remote-GATT-Charakteristik. Wird von ClientService.characteristic() zurückgegeben oder über ClientService.characteristics() iteriert.

Nicht direkt konstruieren.

service

Der besitzende ClientService.

uuid

Die Charakteristik-UUID.

properties

Bitmaske der unterstützten GATT-Operationen, wie von der Gegenstelle gemeldet.

read(timeout_ms: int = 1000) Awaitable[bytes]

Async. Führt ein GATT Read aus und gibt den Wert zurück. Löst bei einem von null verschiedenen Status GattError aus.

timeout_ms

Lese-Timeout.

write(data: bytes, response: bool | None = None, timeout_ms: int = 1000) Awaitable[None]

Async. Führt ein GATT Write aus.

data

Zu schreibender Wert.

response

True, um eine Write-Response zu erfordern (und bei Fehlschlag GattError auszulösen). False für Write-without-Response. None (Standard) wählt automatisch anhand dessen, was die Gegenstelle bewirbt.

timeout_ms

Schreib-Timeout (nur relevant, wenn response True ist).

notified(timeout_ms: int | None = None) Awaitable[bytes]

Async. Wartet auf die nächste Notification an dieser Charakteristik und gibt deren Nutzdaten zurück. Kehrt sofort zurück, wenn bereits eine Notification in der Warteschlange steht.

timeout_ms

Maximale Wartezeit. None wartet unbegrenzt.

indicated(timeout_ms: int | None = None) Awaitable[bytes]

Async. Wartet auf die nächste Indication an dieser Charakteristik und gibt deren Nutzdaten zurück.

timeout_ms

Maximale Wartezeit.

subscribe(notify: bool = True, indicate: bool = False) Awaitable[None]

Async. Schreibt den Client Characteristic Configuration Descriptor (CCCD), um Notifications und/oder Indications zu abonnieren (oder abzubestellen).

notify

Notifications aktivieren.

indicate

Indications aktivieren.

descriptor(uuid: bluetooth.UUID, timeout_ms: int = 2000) Awaitable[ClientDescriptor | None]

Async. Ermittelt einen einzelnen Deskriptor nach UUID oder None, falls nicht gefunden.

descriptors(timeout_ms: int = 2000) ClientDiscover

Gibt einen Async-Iterator von ClientDescriptor-Objekten zurück. Mit async for verwenden und die Schleife vollständig durchlaufen.

class aioble.ClientDescriptor

Ein auf einer Gegenstelle erkannter Remote-GATT-Deskriptor. Erbt read und write von ClientCharacteristic.

Nicht direkt konstruieren.

characteristic

Die besitzende ClientCharacteristic.

uuid

Die Deskriptor-UUID.

class aioble.L2CAPChannel

Ein aktiver verbindungsorientierter L2CAP-Kanal. Wird von DeviceConnection.l2cap_accept() oder DeviceConnection.l2cap_connect() zurückgegeben. Unterstützt die Verwendung als async with-Context-Manager, der beim Verlassen automatisch trennt.

Nicht direkt konstruieren.

our_mtu

Maximale Größe, in Bytes, die die Gegenstelle uns in einer einzelnen SDU senden darf.

peer_mtu

Maximale Größe, in Bytes, die wir der Gegenstelle in einer einzelnen SDU senden dürfen.

available() bool

Gibt synchron True zurück, wenn gepufferte Empfangsdaten bereit sind (d. h. recvinto nicht blockiert).

recvinto(buf: bytearray, timeout_ms: int | None = None) Awaitable[int]

Async. Empfängt in buf und gibt die Anzahl der gelesenen Bytes zurück. Wartet auf neue Daten, wenn der Kanal leer ist.

buf

Vorab allokierter Puffer, der gefüllt werden soll.

timeout_ms

Maximale Wartezeit. None wartet unbegrenzt.

send(buf: bytes, timeout_ms: int | None = None, chunk_size: int | None = None) Awaitable[None]

Async. Sendet buf auf dem Kanal und fragmentiert größere Nutzdaten in MTU-große Stücke. Wartet bei Bedarf auf Flusskontroll-Credits.

buf

Bytes-ähnliches Objekt, das gesendet werden soll.

timeout_ms

Maximale Wartezeit pro Stück.

chunk_size

Optionale Überschreibung der Stückgröße pro Aufruf. Begrenzt auf min(our_mtu * 2, peer_mtu).

flush(timeout_ms: int | None = None) Awaitable[None]

Async. Wartet, bis ein blockiertes send vom Controller abgearbeitet wurde.

timeout_ms

Maximale Wartezeit.

disconnect(timeout_ms: int = 1000) Awaitable[None]

Async. Trennt den Kanal und wartet auf den Disconnection-IRQ.

timeout_ms

Maximale Wartezeit.

disconnected(timeout_ms: int = 1000) Awaitable[None]

Async. Wartet, bis der Kanal von einer der beiden Seiten getrennt wird.

timeout_ms

Maximale Wartezeit.