aioble — BLE אסינכרוני

aioble הוא עטיפה ברמה גבוהה וידידותית ל-asyncio סביב המודול bluetooth. הוא מספק קורוטינות נקיות לסריקה, התחברות, פרסום, שירותי GATT וערוצי L2CAP.

כל הפעולות המרוחקות (connect, disconnect, קריאה/כתיבה של לקוח, indicate של שרת, recv/send של l2cap, pair) ניתנות להמתנה (awaitable) ותומכות בפסקי זמן.

תפקידים נתמכים:

  • משדר (מפרסם) — יצירת מטעני פרסום ותגובת סריקה עבור שדות נפוצים, פיצול אוטומטי של המטען בין הפרסום לתגובת הסריקה, פרסום ללא הגבלת זמן או למשך זמן קבוע.

  • התקן היקפי — המתנה להתחברות מצד התקן מרכזי, המתנה להחלפת MTU.

  • צופה (סורק) — סריקה פסיבית ואקטיבית, שילוב מטעני פרסום ותגובת סריקה עבור אותו התקן, ניתוח שדות נפוצים ממטעני פרסום.

  • מרכזי — התחברות להתקן היקפי, יזימת החלפת MTU.

  • לקוח GATT — גילוי שירותים / מאפיינים / מתארים (אופציונלית לפי UUID); קריאה / כתיבה / כתיבה-עם-תגובה על מאפיינים ומתארים; הרשמה להתראות (notifications) ולחיוויים (indications) (באמצעות ה-CCCD); המתנה להתראות ולחיוויים.

  • שרת GATT — רישום שירותים / מאפיינים / מתארים; המתנה לכתיבות על מאפיינים ומתארים; יירוט בקשות קריאה; שליחת התראות וחיוויים (והמתנה לתגובה).

  • L2CAP — קבלה והתחברות של ערוצי L2CAP מבוססי-חיבור, ניהול בקרת זרימה של הערוץ.

  • אבטחה — ניהול מפתחות/סודות מגובה JSON, יזימת התאמה (pairing), שאילתת מצב הצפנה / אימות.

דוגמאות

סרוק אחר התקני BLE סמוכים והדפס כל אחד מהם כשהוא נראה:

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())

התחבר כ-מרכזי להתקן היקפי המפרסם את שירות קצב הלב והירשם להתראות המדידה שלו:

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())

פעל כ-התקן היקפי: רשום שירות GATT, פרסם אותו, ודחוף התראות לכל מי שמתחבר:

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())

פונקציות ברמת המודול

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

מעביר אל bluetooth.BLE.config(), תוך הבטחה שרדיו ה-BLE פעיל תחילה.

args

שם פרמטר יחיד אופציונלי לשאילתה.

kwargs

ארגומנטים בעלי מילות מפתח לקביעת ערכי תצורה.

aioble.stop() None

השבת את רדיו ה-BLE הבסיסי והרץ את כל מטפלי הכיבוי הרשומים של תת-המודולים. לאחר קריאה לזה, כל הסורקים, המפרסמים, החיבורים וערוצי L2CAP מפורקים.

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

מחזיר מנהל-הקשר אסינכרוני / איטרטור אסינכרוני של scan המניב מופעי ScanResult עבור כל התקן ייחודי שמתגלה (או עבור כל פיסת נתוני פרסום חדשה מהתקן מוכר).

duration_ms

כמה זמן לסרוק, באלפיות שנייה. העבר 0 כדי לסרוק ללא הגבלת זמן עד שמנהל ההקשר יוצא.

interval_us

מרווח סריקה במיקרו-שניות. ברירת המחדל היא 1,280,000.

window_us

חלון סריקה במיקרו-שניות (חייב להיות קטן או שווה ל-interval_us). ברירת המחדל היא 11,250.

active

אם True, בצע סריקה אקטיבית (בקש נתוני תגובת סריקה). ברירת המחדל היא 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

קורוטינה אסינכרונית שמתחילה לפרסם וממתינה להתחברות נכנסת של התקן מרכזי. מחזירה DeviceConnection המייצג את ההתקן המרכזי המחובר, או מעלה asyncio.TimeoutError בעת פסק זמן.

interval_us

מרווח הפרסום, במיקרו-שניות.

adv_data

מטען פרסום גולמי. אם לא הוגדר, adv_data נבנה מיתר הארגומנטים בעלי מילות המפתח.

resp_data

מטען תגובת סריקה גולמי. מאוכלס אוטומטית מהגלישה של adv_data במידת הצורך.

connectable

אם True, זהו פרסום הניתן להתחברות.

limited_disc

השתמש בדגל הגילוי-המוגבל במקום בכללי.

br_edr

קבע את דגל תמיכת BR/EDR.

name

שם מקומי מלא אופציונלי להטמעה.

services

אובייקט נתן-לאיטרציה של bluetooth.UUID לפרסום.

appearance

ערך מראה (appearance) בן 16 סיביות (ראה מספרי Bluetooth מוקצים).

manufacturer

טפל (tuple) של (company_id, data_bytes) לפרסום כנתונים ספציפיים ליצרן.

timeout_ms

הפסק לפרסם לאחר כל כך הרבה אלפיות שנייה ללא חיבור. None פירושו לפרסם עד להתחברות.

aioble.register_services(*services: Service) None

רשום אובייקט Service אחד או יותר (ואת המאפיינים והמתארים שלהם) בשרת ה-GATT. חייב להיקרא פעם אחת לפני התחלת advertise. קריאות עוקבות מחליפות את הרישום הקודם.

services

מופע Service אחד או יותר.

קבועים ברמת המודול

aioble.ADDR_PUBLIC

סוג כתובת התקן BLE ציבורי (0).

aioble.ADDR_RANDOM

סוג כתובת התקן BLE אקראי (1).

חריגות

exception aioble.GattError

מועלית כאשר פעולת GATT מרוחקת (קריאה / כתיבה / חיווי) מסתיימת עם סטטוס שאינו אפס. קוד הסטטוס זמין במאפיין _status.

exception aioble.DeviceDisconnectedError

מועלית בתוך פעולה אסינכרונית (למשל read, write, notified) כאשר החיבור הבסיסי נופל בזמן ההמתנה.

exception aioble.L2CAPDisconnectedError

מועלית כאשר מתבצע ניסיון לפעולת send/recv/flush של ערוץ L2CAP על (או מופרע על ידי) ערוץ מנותק.

exception aioble.L2CAPConnectionError

מועלית על ידי DeviceConnection.l2cap_connect כאשר יצירת הערוץ נכשלת. קוד סטטוס ה-Bluetooth הוא הארגומנט הראשון.

מחלקות

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

מייצג התקן BLE מרוחק לפי כתובת. שני מופעי Device שווים אם גם addr_type וגם addr תואמים. משמש כידית לייזום חיבורים.

addr_type

או ADDR_PUBLIC או ADDR_RANDOM.

addr

כתובת בת שישה בתים כ-bytes, או מחרוזת הקסדצימלית מופרדת בנקודתיים (למשל "aa:bb:cc:dd:ee:ff").

addr_type

סוג הכתובת שאיתה נבנה ההתקן.

addr

כתובת ההתקן הגולמית בת שישה הבתים.

addr_hex() str

החזר את הכתובת מעוצבת כמחרוזת הקסדצימלית מופרדת בנקודתיים.

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]

אסינכרוני. יזום חיבור GAP להתקן זה והחזר את ה-DeviceConnection המתקבל. מבטל כל סריקה המתבצעת.

timeout_ms

כמה זמן להמתין להשלמת החיבור.

scan_duration_ms

משך הסריקה ההתחלתי לפני ההתחברות (ספציפי לבקר).

min_conn_interval_us / max_conn_interval_us

גבולות מרווח חיבור אופציונליים, במיקרו-שניות.

class aioble.DeviceConnection

חיבור GAP פעיל אל Device. מוחזר על ידי Device.connect() או advertise. תומך בשימוש כמנהל הקשר async with שמתנתק אוטומטית ביציאה.

אל תבנה ישירות.

device

ה-Device הבסיסי.

encrypted

True ברגע שהקישור מוצפן (למשל לאחר התאמה).

authenticated

True אם הקישור אומת (התאמה מוגנת-MITM).

bonded

True אם ההתאמה הפיקה מפתחות קישור (bonding).

key_size

גודל מפתח ההצפנה שהוסכם בבתים, או False אם לא מוצפן.

mtu

ATT MTU שהוסכם לאחר exchange_mtu, או None עד להגדרה.

is_connected() bool

החזר אם החיבור עדיין פעיל.

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

אסינכרוני. התנתק והמתן לפסיקת ההתנתקות (IRQ).

timeout_ms

הזמן המרבי להמתנה להתנתקות.

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

אסינכרוני. המתן לכך שהחיבור יסתיים על ידי אחד הצדדים. אם disconnect הוא True הוא מתנתק אקטיבית תחילה.

timeout_ms

הזמן המרבי להמתנה. None פירושו להמתין לנצח.

disconnect

אם True, יזום התנתקות.

timeout(timeout_ms: int | None) DeviceTimeout

החזר מנהל הקשר שמבטל את גוף הקוד שלו אם פסק הזמן חולף (ומעלה asyncio.TimeoutError) או אם ההתקן מתנתק (ומעלה DeviceDisconnectedError).

timeout_ms

פסק זמן באלפיות שנייה, או None ללא פסק זמן.

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

אסינכרוני. יזום החלפת ATT MTU והחזר את ה-MTU שהוסכם.

mtu

MTU מועדף אופציונלי לקביעה על ממשק ה-BLE הבסיסי לפני ההחלפה.

timeout_ms

פסק זמן עבור ההחלפה.

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

אסינכרוני. גלה שירות מרוחק יחיד התואם את uuid, או None אם לא נמצא.

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

החזר איטרטור אסינכרוני של אובייקטי ClientService מרוחקים. השתמש עם async for והרץ את הלולאה עד סופה.

uuid

מסנן UUID אופציונלי. None מחזיר כל שירות.

timeout_ms

פסק זמן לכל גילוי.

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

אסינכרוני. יזום התאמה על חיבור זה. מעדכן את המאפיינים encrypted / authenticated / bonded / key_size בעת ההשלמה.

bond

שמור את מפתחות ההתאמה.

le_secure

השתמש ב-LE Secure Connections.

mitm

דרוש הגנת man-in-the-middle.

io

קבוע יכולת IO (למשל 3 עבור ללא קלט/פלט).

timeout_ms

פסק זמן להתאמה.

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

אסינכרוני. האזן ב-PSM הנתון והחזר L2CAPChannel ברגע שהצד המרוחק פותח אותו.

psm

ה-Protocol/Service Multiplexer להאזנה בו.

mtu

גודל הקבלה המרבי, בבתים.

timeout_ms

הזמן המרבי להמתנה להתחברות הצד המרוחק.

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

אסינכרוני. פתח ערוץ L2CAP לצד המרוחק ב-PSM הנתון.

psm

ה-Protocol/Service Multiplexer להתחברות אליו.

mtu

גודל הקבלה המרבי, בבתים.

timeout_ms

פסק זמן לחיבור.

class aioble.ScanResult

התקן יחיד שהתגלה במהלך scan. אותו מופע מונב מחדש ככל שמגיעים נתוני פרסום חדשים.

אל תבנה ישירות.

device

ה-Device הבסיסי.

rssi

ה-RSSI האחרון שדווח, ב-dBm.

adv_data

מטען פרסום גולמי (bytes או None).

resp_data

מטען תגובת סריקה גולמי (bytes או None), אם סריקה אקטיבית מאופשרת.

connectable

True אם הפרסום האחרון היה ניתן להתחברות.

name() str | None

פענח את השם המקומי המלא (או המקוצר) שפורסם מתוך המטען, או None אם אינו קיים.

services() Iterator[bluetooth.UUID]

גנרטור המניב כל bluetooth.UUID שפורסם בשדות רשימת-השירותים בני 16/32/128 הסיביות.

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

גנרטור המניב טפלים (tuples) של (company_id, data) משדות פרסום ספציפיים ליצרן.

filter

אם ניתן, הנב רק רשומות שמזהה החברה שלהן תואם.

class aioble.Service(uuid: bluetooth.UUID)

שירות GATT מקומי. בנה שירות עם מופע Characteristic אחד או יותר, ואז העבר אותו אל register_services.

uuid

ה-UUID של השירות.

uuid

ה-UUID של השירות.

characteristics

רשימת אובייקטי Characteristic המאוגדים לשירות זה.

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)

מאפיין GATT מקומי. בנייה של אחד מצרפת אותו אוטומטית אל service.

service

ה-Service הבעלים.

uuid

ה-UUID של המאפיין.

read, write, write_no_response, notify, indicate

ערכים בוליאניים הבוחרים את פעולות ה-GATT הנתמכות.

initial

ערך התחלתי אופציונלי (bytes).

capture

אם True, ערכים שנכתבו מוכנסים לתור (עד עומק 10) כך שכתיבות רצופות מהירות לא יאבדו. כל קריאת written מחזירה אז טפל (tuple) של (connection, data).

uuid

ה-UUID של המאפיין.

flags

מסכת סיביות של דגלי תכונות ה-GATT שנבנו מהבנאי.

descriptors

רשימת אובייקטי Descriptor המאוגדים למאפיין זה.

read() bytes

קרא את הערך הנוכחי ממסד הנתונים המקומי של GATT.

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

עדכן את הערך במסד הנתונים המקומי של GATT.

data

בתי הערך החדש.

send_update

אם True, גם התראה/חיווי לכל חיבור שנרשם.

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

שלח GATT Notify אל connection.

connection

חיבור הלקוח היעד.

data

מטען לשליחה. אם None, הערך המקומי הנוכחי נשלח.

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

אסינכרוני. שלח GATT Indicate אל connection והמתן לאישור הלקוח. מעלה GattError בעת סטטוס שאינו אפס.

connection

חיבור הלקוח היעד.

data

מטען לחיווי, או None לשליחת הערך המקומי.

timeout_ms

הזמן המרבי להמתנה לאישור.

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

אסינכרוני. המתן לכתיבה מרוחקת. מחזיר את ה-DeviceConnection הכותב, או (connection, data) אם המאפיין נוצר עם capture=True.

timeout_ms

הזמן המרבי להמתנה. None ממתין לנצח.

on_read(connection: DeviceConnection) int

וו עקיפה (hook) המופעל באופן סינכרוני כאשר מתקבלת קריאה מרוחקת. החזר 0 כדי לאפשר את הקריאה או קוד שגיאת ATT שאינו אפס כדי לדחות אותה. יישום ברירת המחדל מחזיר 0.

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

Characteristic שאת חוצץ ה-GATT המגבה שלו ניתן להגדיר. שימושי לקבלת ערכים גדולים מגודל התכונה כברירת מחדל, או לתיעדוף כתיבות רצופות.

max_len

גודל החוצץ (buffer), בבתים.

append

אם True, כתיבות עוקבות מתווספות לחוצץ במקום לדרוס אותו.

ארגומנטים אחרים מועברים אל Characteristic.

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

מתאר GATT מקומי. בנייה של אחד מצרפת אותו אוטומטית אל characteristic. יורש את read, write ו-written מ-Characteristic.

characteristic

ה-Characteristic הבעלים.

uuid

ה-UUID של המתאר.

read, write

ערכים בוליאניים הבוחרים את פעולות ה-GATT הנתמכות.

initial

ערך התחלתי אופציונלי (bytes).

class aioble.ClientService

שירות GATT מרוחק שהתגלה על עמית. מוחזר על ידי DeviceConnection.service() או נאסף באיטרציה מ-DeviceConnection.services().

אל תבנה ישירות.

connection

ה-DeviceConnection הבעלים.

uuid

ה-UUID של השירות המרוחק.

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

אסינכרוני. גלה מאפיין יחיד לפי UUID, או None אם לא נמצא.

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

החזר איטרטור אסינכרוני של אובייקטי ClientCharacteristic. השתמש עם async for והרץ את הלולאה עד סופה.

uuid

מסנן UUID אופציונלי.

timeout_ms

פסק זמן לכל גילוי.

class aioble.ClientCharacteristic

מאפיין GATT מרוחק שהתגלה על עמית. מוחזר על ידי ClientService.characteristic() או נאסף באיטרציה מ-ClientService.characteristics().

אל תבנה ישירות.

service

ה-ClientService הבעלים.

uuid

ה-UUID של המאפיין.

properties

מסכת סיביות של פעולות ה-GATT הנתמכות כפי שדווח על ידי העמית.

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

אסינכרוני. הוצא GATT Read והחזר את הערך. מעלה GattError בעת סטטוס שאינו אפס.

timeout_ms

פסק זמן לקריאה.

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

אסינכרוני. הוצא GATT Write.

data

ערך לכתיבה.

response

True כדי לדרוש תגובת-כתיבה (ולהעלות GattError בעת כישלון). False עבור כתיבה-ללא-תגובה. None (ברירת מחדל) בוחר אוטומטית בהתאם למה שהעמית מפרסם.

timeout_ms

פסק זמן לכתיבה (רלוונטי רק אם response הוא True).

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

אסינכרוני. המתן להתראה הבאה על מאפיין זה והחזר את המטען שלה. מחזיר מיד אם התראה כבר נמצאת בתור.

timeout_ms

הזמן המרבי להמתנה. None ממתין לנצח.

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

אסינכרוני. המתן לחיווי הבא על מאפיין זה והחזר את המטען שלו.

timeout_ms

הזמן המרבי להמתנה.

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

אסינכרוני. כתוב את ה-Client Characteristic Configuration Descriptor (CCCD) כדי להירשם (או לבטל הרשמה) להתראות ו/או לחיוויים.

notify

אפשר התראות.

indicate

אפשר חיוויים.

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

אסינכרוני. גלה מתאר יחיד לפי UUID, או None אם לא נמצא.

descriptors(timeout_ms: int = 2000) ClientDiscover

החזר איטרטור אסינכרוני של אובייקטי ClientDescriptor. השתמש עם async for והרץ את הלולאה עד סופה.

class aioble.ClientDescriptor

מתאר GATT מרוחק שהתגלה על עמית. יורש את read ו-write מ-ClientCharacteristic.

אל תבנה ישירות.

characteristic

ה-ClientCharacteristic הבעלים.

uuid

ה-UUID של המתאר.

class aioble.L2CAPChannel

ערוץ L2CAP פעיל מבוסס-חיבור. מוחזר על ידי DeviceConnection.l2cap_accept() או DeviceConnection.l2cap_connect(). תומך בשימוש כמנהל הקשר async with שמתנתק אוטומטית ביציאה.

אל תבנה ישירות.

our_mtu

הגודל המרבי, בבתים, שהעמית רשאי לשלוח אלינו ב-SDU יחיד.

peer_mtu

הגודל המרבי, בבתים, שאנו רשאים לשלוח לעמית ב-SDU יחיד.

available() bool

החזר באופן סינכרוני True אם נתוני קבלה מאוחסנים בחוצץ מוכנים (כלומר recvinto לא ייחסם).

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

אסינכרוני. קבל אל תוך buf, והחזר את מספר הבתים שנקראו. ממתין לנתונים חדשים אם הערוץ ריק.

buf

חוצץ מוקצה-מראש למילוי.

timeout_ms

הזמן המרבי להמתנה. None ממתין לנצח.

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

אסינכרוני. שלח את buf על הערוץ, תוך פיצול מטענים גדולים יותר לחלקים בגודל MTU. ממתין לאשראי בקרת-זרימה לפי הצורך.

buf

אובייקט דמוי-בתים לשליחה.

timeout_ms

הזמן המרבי להמתנה לכל חלק.

chunk_size

עקיפה אופציונלית לגודל החלק לכל קריאה. מוגבל ל-min(our_mtu * 2, peer_mtu).

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

אסינכרוני. המתן עד שכל send תקוע נוקז על ידי הבקר.

timeout_ms

הזמן המרבי להמתנה.

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

אסינכרוני. נתק את הערוץ והמתן לפסיקת ההתנתקות (IRQ).

timeout_ms

הזמן המרבי להמתנה.

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

אסינכרוני. המתן עד שהערוץ ינותק על ידי אחד הצדדים.

timeout_ms

הזמן המרבי להמתנה.