From 1ea12b1bf7644b6f4d68c52f48bd0b89502a7f5d Mon Sep 17 00:00:00 2001 From: Gilles Boccon-Gibod Date: Wed, 6 Sep 2023 16:33:47 -0700 Subject: [PATCH] rebase --- bumble/rfcomm.py | 60 +++++++++++++++++++++++++++++++++-- examples/run_rfcomm_server.py | 43 +++---------------------- 2 files changed, 63 insertions(+), 40 deletions(-) diff --git a/bumble/rfcomm.py b/bumble/rfcomm.py index c67ea560..5920eb0b 100644 --- a/bumble/rfcomm.py +++ b/bumble/rfcomm.py @@ -20,13 +20,29 @@ from __future__ import annotations import logging import asyncio import enum +from typing import Callable, Dict, List, Optional, Tuple, Union, TYPE_CHECKING from pyee import EventEmitter -from typing import Optional, Tuple, Callable, Dict, Union, TYPE_CHECKING from . import core, l2cap from .colors import color -from .core import BT_BR_EDR_TRANSPORT, InvalidStateError, ProtocolError +from .core import ( + UUID, + BT_RFCOMM_PROTOCOL_ID, + BT_BR_EDR_TRANSPORT, + BT_L2CAP_PROTOCOL_ID, + InvalidStateError, + ProtocolError, +) +from .sdp import ( + SDP_SERVICE_RECORD_HANDLE_ATTRIBUTE_ID, + SDP_BROWSE_GROUP_LIST_ATTRIBUTE_ID, + SDP_SERVICE_CLASS_ID_LIST_ATTRIBUTE_ID, + SDP_PROTOCOL_DESCRIPTOR_LIST_ATTRIBUTE_ID, + SDP_PUBLIC_BROWSE_ROOT, + DataElement, + ServiceAttribute, +) if TYPE_CHECKING: from bumble.device import Device, Connection @@ -111,6 +127,46 @@ RFCOMM_DYNAMIC_CHANNEL_NUMBER_END = 30 # fmt: on +# ----------------------------------------------------------------------------- +def make_service_sdp_records( + service_record_handle: int, channel: int, uuid: UUID = None +) -> List[ServiceAttribute]: + records = [ + ServiceAttribute( + SDP_SERVICE_RECORD_HANDLE_ATTRIBUTE_ID, + DataElement.unsigned_integer_32(service_record_handle), + ), + ServiceAttribute( + SDP_BROWSE_GROUP_LIST_ATTRIBUTE_ID, + DataElement.sequence([DataElement.uuid(SDP_PUBLIC_BROWSE_ROOT)]), + ), + ServiceAttribute( + SDP_PROTOCOL_DESCRIPTOR_LIST_ATTRIBUTE_ID, + DataElement.sequence( + [ + DataElement.sequence([DataElement.uuid(BT_L2CAP_PROTOCOL_ID)]), + DataElement.sequence( + [ + DataElement.uuid(BT_RFCOMM_PROTOCOL_ID), + DataElement.unsigned_integer_8(channel), + ] + ), + ] + ), + ), + ] + + if uuid: + records.append( + ServiceAttribute( + SDP_SERVICE_CLASS_ID_LIST_ATTRIBUTE_ID, + DataElement.sequence([DataElement.uuid(UUID(uuid))]), + ) + ) + + return records + + # ----------------------------------------------------------------------------- def compute_fcs(buffer: bytes) -> int: result = 0xFF diff --git a/examples/run_rfcomm_server.py b/examples/run_rfcomm_server.py index a27c67e3..0e7e72ef 100644 --- a/examples/run_rfcomm_server.py +++ b/examples/run_rfcomm_server.py @@ -22,51 +22,18 @@ import logging from bumble.device import Device from bumble.transport import open_transport_or_link -from bumble.core import BT_L2CAP_PROTOCOL_ID, BT_RFCOMM_PROTOCOL_ID, UUID from bumble.rfcomm import Server -from bumble.sdp import ( - DataElement, - ServiceAttribute, - SDP_PUBLIC_BROWSE_ROOT, - SDP_SERVICE_RECORD_HANDLE_ATTRIBUTE_ID, - SDP_BROWSE_GROUP_LIST_ATTRIBUTE_ID, - SDP_SERVICE_CLASS_ID_LIST_ATTRIBUTE_ID, - SDP_PROTOCOL_DESCRIPTOR_LIST_ATTRIBUTE_ID, -) from bumble.utils import AsyncRunner +from bumble.rfcomm import make_service_sdp_records # ----------------------------------------------------------------------------- def sdp_records(channel, uuid): + service_record_handle = 0x00010001 return { - 0x00010001: [ - ServiceAttribute( - SDP_SERVICE_RECORD_HANDLE_ATTRIBUTE_ID, - DataElement.unsigned_integer_32(0x00010001), - ), - ServiceAttribute( - SDP_BROWSE_GROUP_LIST_ATTRIBUTE_ID, - DataElement.sequence([DataElement.uuid(SDP_PUBLIC_BROWSE_ROOT)]), - ), - ServiceAttribute( - SDP_SERVICE_CLASS_ID_LIST_ATTRIBUTE_ID, - DataElement.sequence([DataElement.uuid(UUID(uuid))]), - ), - ServiceAttribute( - SDP_PROTOCOL_DESCRIPTOR_LIST_ATTRIBUTE_ID, - DataElement.sequence( - [ - DataElement.sequence([DataElement.uuid(BT_L2CAP_PROTOCOL_ID)]), - DataElement.sequence( - [ - DataElement.uuid(BT_RFCOMM_PROTOCOL_ID), - DataElement.unsigned_integer_8(channel), - ] - ), - ] - ), - ), - ] + service_record_handle: make_service_sdp_records( + service_record_handle, channel, uuid + ) }