aioble --- BLE غير المتزامن#
aioble هو غلاف عالي المستوى ومتوافق مع asyncio حول وحدة bluetooth. يوفر دوال coroutine نظيفة للمسح والاتصال والإعلان وخدمات GATT وقنوات L2CAP.
جميع العمليات البعيدة (الاتصال، قطع الاتصال، القراءة/الكتابة من العميل، الإشارة من الخادم، استقبال/إرسال l2cap، الإقران) قابلة للانتظار (awaitable) وتدعم المهل الزمنية.
الأدوار المدعومة:
المُذيع (المُعلِن) --- توليد حمولات الإعلان والاستجابة للمسح للحقول الشائعة، تقسيم الحمولة تلقائياً بين الإعلان واستجابة المسح، الإعلان إلى أجل غير مسمى أو لمدة محددة.
الطرفية (Peripheral) --- انتظار الاتصال من جهاز مركزي، انتظار تبادل MTU.
المراقب (الماسح) --- المسح السلبي والنشط، دمج حمولات الإعلان والاستجابة للمسح لنفس الجهاز، تحليل الحقول الشائعة من حمولات الإعلان.
المركزي (Central) --- الاتصال بجهاز طرفي، بدء تبادل MTU.
عميل GATT --- اكتشاف الخدمات / الخصائص / الواصفات (اختيارياً عبر UUID)؛ القراءة / الكتابة / الكتابة-مع-استجابة على الخصائص والواصفات؛ الاشتراك في الإشعارات والإشارات (عبر CCCD)؛ انتظار الإشعارات والإشارات.
خادم GATT --- تسجيل الخدمات / الخصائص / الواصفات؛ انتظار عمليات الكتابة على الخصائص والواصفات؛ اعتراض طلبات القراءة؛ إرسال الإشعارات والإشارات (وانتظار الاستجابة).
L2CAP --- قبول وإنشاء قنوات L2CAP الموجهة للاتصال، إدارة التحكم في تدفق القناة.
الأمان --- إدارة المفاتيح/الأسرار المدعومة بـ JSON، بدء الإقران، الاستعلام عن حالة التشفير / المصادقة.
أمثلة#
امسح بحثاً عن أجهزة 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#
دالة coroutine غير متزامنة تبدأ الإعلان وتنتظر اتصالاً وارداً من جهاز مركزي. تُرجع
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
قيمة المظهر بـ 16 بت (انظر الأرقام المخصصة لـ Bluetooth).
- manufacturer
صف (tuple) من
(company_id, data_bytes)للإعلان عنه كبيانات خاصة بالمُصنِّع.- timeout_ms
إيقاف الإعلان بعد هذا العدد من الميلي ثانية دون اتصال. القيمة
Noneتعني الإعلان حتى يحدث الاتصال.
ثوابت على مستوى الوحدة#
- aioble.ADDR_PUBLIC#
نوع عنوان جهاز BLE العام (
0).
- aioble.ADDR_RANDOM#
نوع عنوان جهاز BLE العشوائي (
1).
الاستثناءات#
- exception aioble.GattError#
يُطلق عندما تكتمل عملية GATT بعيدة (قراءة / كتابة / إشارة) بحالة غير صفرية. يتوفر رمز الحالة في السمة
_status.
- exception aioble.DeviceDisconnectedError#
يُطلق داخل عملية غير متزامنة (مثل القراءة، الكتابة، الإشعار) عندما يسقط الاتصال الأساسي أثناء الانتظار.
- exception aioble.L2CAPDisconnectedError#
يُطلق عند محاولة عملية إرسال/استقبال/تفريغ على قناة 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#
عنوان الجهاز الخام من ستة بايتات.
- 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يقطع الاتصال تلقائياً عند الخروج.لا تنشئه مباشرة.
- encrypted#
Trueبمجرد تشفير الرابط (مثلاً بعد الإقران).
- authenticated#
Trueإذا كان الرابط مُصادَقاً عليه (إقران محمي ضد MITM).
- bonded#
Trueإذا أنتج الإقران مفاتيح ربط (bonding).
- key_size#
حجم مفتاح التشفير المتفاوض عليه بالبايتات، أو
Falseإذا لم يكن مشفراً.
- mtu#
قيمة ATT MTU المتفاوض عليها بعد
exchange_mtu، أوNoneحتى تُعيَّن.
- 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
إبقاء مفاتيح الإقران (persist).
- le_secure
استخدام LE Secure Connections.
- mitm
اشتراط الحماية من هجمات الوسيط (man-in-the-middle).
- io
ثابت قدرة الإدخال/الإخراج (مثل
3لعدم وجود إدخال/إخراج).- timeout_ms
مهلة الإقران.
- l2cap_accept(psm: int, mtu: int, timeout_ms: int | None = None) Awaitable[L2CAPChannel]#
غير متزامنة. تستمع على الـ PSM المحدد وتُرجع
L2CAPChannelبمجرد فتح الطرف البعيد لها.- psm
مُجمِّع البروتوكول/الخدمة (PSM) للاستماع عليه.
- mtu
الحد الأقصى لحجم الاستقبال بالبايتات.
- timeout_ms
الحد الأقصى لزمن انتظار اتصال الطرف البعيد.
- l2cap_connect(psm: int, mtu: int, timeout_ms: int = 1000) Awaitable[L2CAPChannel]#
غير متزامنة. تفتح قناة L2CAP إلى الطرف البعيد على الـ PSM المحدد.
- psm
مُجمِّع البروتوكول/الخدمة (PSM) للاتصال به.
- mtu
الحد الأقصى لحجم الاستقبال بالبايتات.
- timeout_ms
مهلة الاتصال.
- class aioble.ScanResult#
جهاز وحيد اكتُشف أثناء
scan. تُعاد النسخة نفسها كلما وصلت بيانات إعلان جديدة.لا تنشئه مباشرة.
- rssi#
آخر قيمة RSSI مُبلَّغ عنها بوحدة dBm.
- adv_data#
حمولة الإعلان الخام (
bytesأوNone).
- resp_data#
حمولة استجابة المسح الخام (
bytesأوNone)، إذا كان المسح النشط ممكّناً.
- connectable#
Trueإذا كان أحدث إعلان قابلاً للاتصال.
- name() str | None#
يفك ترميز الاسم المحلي المُعلَن الكامل (أو المختصر) من الحمولة، أو
Noneإذا لم يكن موجوداً.
- services() Iterator[bluetooth.UUID]#
مولّد (generator) يُنتج كل
bluetooth.UUIDمُعلَن عنه في حقول قائمة الخدمات بـ 16/32/128 بت.
- 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
قيم منطقية (Booleans) تختار عمليات GATT المدعومة.
- initial
قيمة أولية اختيارية (
bytes).- capture
إذا كانت
True، تُوضع القيم المكتوبة في طابور (حتى عمق 10) بحيث لا تُفقد عمليات الكتابة المتتالية السريعة. ثم يُرجع كل استدعاء لـwrittenصفاً (tuple) من نوع(connection, data).
- uuid#
معرّف UUID للخاصية.
- flags#
قناع بِتّي (bitmask) لعلامات خاصية GATT المبني من المُنشئ.
- descriptors#
قائمة بكائنات
Descriptorالمرتبطة بهذه الخاصية.
- 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#
خطّاف تجاوز (override) يُستدعى تزامنياً عند استقبال قراءة بعيدة. أرجع
0للسماح بالقراءة أو رمز خطأ ATT غير صفري لرفضها. التنفيذ الافتراضي يُرجع0.
- class aioble.BufferedCharacteristic(service: Service, uuid: bluetooth.UUID, max_len: int = 20, append: bool = False, **kwargs)#
خاصية
Characteristicيمكن إعداد مخزن GATT الداعم لها. مفيدة لاستقبال قيم أكبر من حجم السمة الافتراضي، أو لوضع عمليات الكتابة المتتالية في طابور.- max_len
حجم المخزن بالبايتات.
- 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
قيم منطقية (Booleans) تختار عمليات 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#
قناع بِتّي (bitmask) لعمليات 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]#
غير متزامنة. تكتب واصف إعداد خاصية العميل (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
الحد الأقصى لزمن الانتظار.