bumble 0.0.217__py3-none-any.whl → 0.0.219__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- bumble/_version.py +2 -2
- bumble/a2dp.py +57 -18
- bumble/avctp.py +8 -12
- bumble/avdtp.py +584 -533
- bumble/avrcp.py +20 -20
- bumble/controller.py +429 -229
- bumble/device.py +2 -3
- bumble/drivers/__init__.py +4 -0
- bumble/drivers/intel.py +33 -7
- bumble/drivers/rtk.py +3 -1
- bumble/hci.py +38 -0
- bumble/hfp.py +4 -4
- bumble/hid.py +1 -1
- bumble/rfcomm.py +7 -3
- bumble/transport/__init__.py +6 -1
- bumble/transport/common.py +6 -3
- bumble/transport/ws_client.py +2 -2
- bumble/transport/ws_server.py +16 -8
- {bumble-0.0.217.dist-info → bumble-0.0.219.dist-info}/METADATA +3 -3
- {bumble-0.0.217.dist-info → bumble-0.0.219.dist-info}/RECORD +24 -24
- {bumble-0.0.217.dist-info → bumble-0.0.219.dist-info}/WHEEL +0 -0
- {bumble-0.0.217.dist-info → bumble-0.0.219.dist-info}/entry_points.txt +0 -0
- {bumble-0.0.217.dist-info → bumble-0.0.219.dist-info}/licenses/LICENSE +0 -0
- {bumble-0.0.217.dist-info → bumble-0.0.219.dist-info}/top_level.txt +0 -0
bumble/device.py
CHANGED
|
@@ -2263,8 +2263,6 @@ class Device(utils.CompositeEventEmitter):
|
|
|
2263
2263
|
EVENT_CONNECTION_FAILURE = "connection_failure"
|
|
2264
2264
|
EVENT_SCO_REQUEST = "sco_request"
|
|
2265
2265
|
EVENT_INQUIRY_COMPLETE = "inquiry_complete"
|
|
2266
|
-
EVENT_REMOTE_NAME = "remote_name"
|
|
2267
|
-
EVENT_REMOTE_NAME_FAILURE = "remote_name_failure"
|
|
2268
2266
|
EVENT_SCO_CONNECTION = "sco_connection"
|
|
2269
2267
|
EVENT_SCO_CONNECTION_FAILURE = "sco_connection_failure"
|
|
2270
2268
|
EVENT_CIS_REQUEST = "cis_request"
|
|
@@ -4727,7 +4725,7 @@ class Device(utils.CompositeEventEmitter):
|
|
|
4727
4725
|
self, cis_acl_pairs: Sequence[tuple[int, Connection]]
|
|
4728
4726
|
) -> list[CisLink]:
|
|
4729
4727
|
for cis_handle, acl_connection in cis_acl_pairs:
|
|
4730
|
-
cis_id, cig_id = self._pending_cis
|
|
4728
|
+
cis_id, cig_id = self._pending_cis[cis_handle]
|
|
4731
4729
|
self.cis_links[cis_handle] = CisLink(
|
|
4732
4730
|
device=self,
|
|
4733
4731
|
acl_connection=acl_connection,
|
|
@@ -4743,6 +4741,7 @@ class Device(utils.CompositeEventEmitter):
|
|
|
4743
4741
|
}
|
|
4744
4742
|
|
|
4745
4743
|
def on_cis_establishment(cis_link: CisLink) -> None:
|
|
4744
|
+
self._pending_cis.pop(cis_link.handle)
|
|
4746
4745
|
if pending_future := pending_cis_establishments.get(cis_link.handle):
|
|
4747
4746
|
pending_future.set_result(cis_link)
|
|
4748
4747
|
|
bumble/drivers/__init__.py
CHANGED
|
@@ -49,6 +49,10 @@ async def get_driver_for_host(host: Host) -> Optional[Driver]:
|
|
|
49
49
|
driver_classes: dict[str, type[Driver]] = {"rtk": rtk.Driver, "intel": intel.Driver}
|
|
50
50
|
probe_list: Iterable[str]
|
|
51
51
|
if driver_name := host.hci_metadata.get("driver"):
|
|
52
|
+
# The "driver" metadata may include runtime options after a '/' (for example
|
|
53
|
+
# "intel/ddc=..."). Keep only the base driver name (the portion before the
|
|
54
|
+
# first slash) so it matches a key in driver_classes (e.g. "intel").
|
|
55
|
+
driver_name = driver_name.split("/")[0]
|
|
52
56
|
# Only probe a single driver
|
|
53
57
|
probe_list = [driver_name]
|
|
54
58
|
else:
|
bumble/drivers/intel.py
CHANGED
|
@@ -459,6 +459,10 @@ class Driver(common.Driver):
|
|
|
459
459
|
== ModeOfOperation.OPERATIONAL
|
|
460
460
|
):
|
|
461
461
|
logger.debug("firmware already loaded")
|
|
462
|
+
# If the firmeare is already loaded, still attempt to load any
|
|
463
|
+
# device configuration (DDC). DDC can be applied independently of a
|
|
464
|
+
# firmware reload and may contain runtime overrides or patches.
|
|
465
|
+
await self.load_ddc_if_any()
|
|
462
466
|
return
|
|
463
467
|
|
|
464
468
|
# We only support some platforms and variants.
|
|
@@ -598,17 +602,39 @@ class Driver(common.Driver):
|
|
|
598
602
|
await self.reset_complete.wait()
|
|
599
603
|
logger.debug("reset complete")
|
|
600
604
|
|
|
601
|
-
|
|
605
|
+
await self.load_ddc_if_any(firmware_base_name)
|
|
606
|
+
|
|
607
|
+
async def load_ddc_if_any(self, firmware_base_name: Optional[str] = None) -> None:
|
|
608
|
+
"""
|
|
609
|
+
Check for and load any Device Data Configuration (DDC) blobs.
|
|
610
|
+
|
|
611
|
+
Args:
|
|
612
|
+
firmware_base_name: Base name of the selected firmware (e.g. "ibt-XXXX-YYYY").
|
|
613
|
+
If None, don't attempt to look up a .ddc file that
|
|
614
|
+
corresponds to the firmware image.
|
|
615
|
+
Priority:
|
|
616
|
+
1. If a ddc_override was provided via driver metadata, use it (highest priority).
|
|
617
|
+
2. Otherwise, if firmware_base_name is provided, attempt to find a .ddc file
|
|
618
|
+
that corresponds to the selected firmware image.
|
|
619
|
+
3. Finally, if a ddc_addon was provided, append/load it after the primary DDC.
|
|
620
|
+
"""
|
|
621
|
+
# If an explicit DDC override was supplied, use it and skip file lookup.
|
|
602
622
|
if self.ddc_override:
|
|
603
623
|
logger.debug("loading overridden DDC")
|
|
604
624
|
await self.load_device_config(self.ddc_override)
|
|
605
625
|
else:
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
626
|
+
# Only attempt .ddc file lookup if a firmware_base_name was provided.
|
|
627
|
+
if firmware_base_name is None:
|
|
628
|
+
logger.debug(
|
|
629
|
+
"no firmware_base_name provided; skipping .ddc file lookup"
|
|
630
|
+
)
|
|
631
|
+
else:
|
|
632
|
+
ddc_name = f"{firmware_base_name}.ddc"
|
|
633
|
+
ddc_path = _find_binary_path(ddc_name)
|
|
634
|
+
if ddc_path:
|
|
635
|
+
logger.debug(f"loading DDC from {ddc_path}")
|
|
636
|
+
ddc_data = ddc_path.read_bytes()
|
|
637
|
+
await self.load_device_config(ddc_data)
|
|
612
638
|
if self.ddc_addon:
|
|
613
639
|
logger.debug("loading DDC addon")
|
|
614
640
|
await self.load_device_config(self.ddc_addon)
|
bumble/drivers/rtk.py
CHANGED
|
@@ -115,12 +115,14 @@ RTK_USB_PRODUCTS = {
|
|
|
115
115
|
# Realtek 8761BUV
|
|
116
116
|
(0x0B05, 0x190E),
|
|
117
117
|
(0x0BDA, 0x8771),
|
|
118
|
+
(0x0BDA, 0x877B),
|
|
119
|
+
(0x0BDA, 0xA728),
|
|
120
|
+
(0x0BDA, 0xA729),
|
|
118
121
|
(0x2230, 0x0016),
|
|
119
122
|
(0x2357, 0x0604),
|
|
120
123
|
(0x2550, 0x8761),
|
|
121
124
|
(0x2B89, 0x8761),
|
|
122
125
|
(0x7392, 0xC611),
|
|
123
|
-
(0x0BDA, 0x877B),
|
|
124
126
|
# Realtek 8821AE
|
|
125
127
|
(0x0B05, 0x17DC),
|
|
126
128
|
(0x13D3, 0x3414),
|
bumble/hci.py
CHANGED
|
@@ -3441,6 +3441,17 @@ class HCI_Write_Synchronous_Flow_Control_Enable_Command(HCI_Command):
|
|
|
3441
3441
|
synchronous_flow_control_enable: int = field(metadata=metadata(1))
|
|
3442
3442
|
|
|
3443
3443
|
|
|
3444
|
+
# -----------------------------------------------------------------------------
|
|
3445
|
+
@HCI_Command.command
|
|
3446
|
+
@dataclasses.dataclass
|
|
3447
|
+
class HCI_Set_Controller_To_Host_Flow_Control_Command(HCI_Command):
|
|
3448
|
+
'''
|
|
3449
|
+
See Bluetooth spec @ 7.3.38 Set Controller To Host Flow Control command
|
|
3450
|
+
'''
|
|
3451
|
+
|
|
3452
|
+
flow_control_enable: int = field(metadata=metadata(1))
|
|
3453
|
+
|
|
3454
|
+
|
|
3444
3455
|
# -----------------------------------------------------------------------------
|
|
3445
3456
|
@HCI_Command.command
|
|
3446
3457
|
@dataclasses.dataclass
|
|
@@ -4338,6 +4349,15 @@ class HCI_LE_Write_Suggested_Default_Data_Length_Command(HCI_Command):
|
|
|
4338
4349
|
suggested_max_tx_time: int = field(metadata=metadata(2))
|
|
4339
4350
|
|
|
4340
4351
|
|
|
4352
|
+
# -----------------------------------------------------------------------------
|
|
4353
|
+
@HCI_Command.command
|
|
4354
|
+
@dataclasses.dataclass
|
|
4355
|
+
class HCI_LE_Read_Local_P_256_Public_Key_Command(HCI_Command):
|
|
4356
|
+
'''
|
|
4357
|
+
See Bluetooth spec @ 7.8.36 LE LE Read Local P-256 Public Key command
|
|
4358
|
+
'''
|
|
4359
|
+
|
|
4360
|
+
|
|
4341
4361
|
# -----------------------------------------------------------------------------
|
|
4342
4362
|
@HCI_Command.command
|
|
4343
4363
|
@dataclasses.dataclass
|
|
@@ -4365,6 +4385,15 @@ class HCI_LE_Clear_Resolving_List_Command(HCI_Command):
|
|
|
4365
4385
|
'''
|
|
4366
4386
|
|
|
4367
4387
|
|
|
4388
|
+
# -----------------------------------------------------------------------------
|
|
4389
|
+
@HCI_Command.command
|
|
4390
|
+
@dataclasses.dataclass
|
|
4391
|
+
class HCI_LE_Read_Resolving_List_Size_Command(HCI_Command):
|
|
4392
|
+
'''
|
|
4393
|
+
See Bluetooth spec @ 7.8.41 LE Read Resolving List Size command
|
|
4394
|
+
'''
|
|
4395
|
+
|
|
4396
|
+
|
|
4368
4397
|
# -----------------------------------------------------------------------------
|
|
4369
4398
|
@HCI_Command.command
|
|
4370
4399
|
@dataclasses.dataclass
|
|
@@ -5028,6 +5057,15 @@ class HCI_LE_Periodic_Advertising_Terminate_Sync_Command(HCI_Command):
|
|
|
5028
5057
|
sync_handle: int = field(metadata=metadata(2))
|
|
5029
5058
|
|
|
5030
5059
|
|
|
5060
|
+
# -----------------------------------------------------------------------------
|
|
5061
|
+
@HCI_Command.command
|
|
5062
|
+
@dataclasses.dataclass
|
|
5063
|
+
class HCI_LE_Read_Transmit_Power_Command(HCI_Command):
|
|
5064
|
+
'''
|
|
5065
|
+
See Bluetooth spec @ 7.8.74 LE Read Transmit Power command
|
|
5066
|
+
'''
|
|
5067
|
+
|
|
5068
|
+
|
|
5031
5069
|
# -----------------------------------------------------------------------------
|
|
5032
5070
|
@HCI_Command.command
|
|
5033
5071
|
@dataclasses.dataclass
|
bumble/hfp.py
CHANGED
|
@@ -489,9 +489,9 @@ STATUS_CODES = {
|
|
|
489
489
|
|
|
490
490
|
@dataclasses.dataclass
|
|
491
491
|
class HfConfiguration:
|
|
492
|
-
supported_hf_features:
|
|
493
|
-
supported_hf_indicators:
|
|
494
|
-
supported_audio_codecs:
|
|
492
|
+
supported_hf_features: collections.abc.Sequence[HfFeature]
|
|
493
|
+
supported_hf_indicators: collections.abc.Sequence[HfIndicator]
|
|
494
|
+
supported_audio_codecs: collections.abc.Sequence[AudioCodec]
|
|
495
495
|
|
|
496
496
|
|
|
497
497
|
@dataclasses.dataclass
|
|
@@ -753,7 +753,7 @@ class HfProtocol(utils.EventEmitter):
|
|
|
753
753
|
|
|
754
754
|
# Build local features.
|
|
755
755
|
self.supported_hf_features = sum(configuration.supported_hf_features)
|
|
756
|
-
self.supported_audio_codecs = configuration.supported_audio_codecs
|
|
756
|
+
self.supported_audio_codecs = list(configuration.supported_audio_codecs)
|
|
757
757
|
|
|
758
758
|
self.hf_indicators = {
|
|
759
759
|
indicator: HfIndicatorState(indicator=indicator)
|
bumble/hid.py
CHANGED
|
@@ -246,7 +246,7 @@ class HID(ABC, utils.EventEmitter):
|
|
|
246
246
|
# Create a new L2CAP connection - interrupt channel
|
|
247
247
|
try:
|
|
248
248
|
channel = await self.connection.create_l2cap_channel(
|
|
249
|
-
l2cap.ClassicChannelSpec(
|
|
249
|
+
l2cap.ClassicChannelSpec(HID_INTERRUPT_PSM)
|
|
250
250
|
)
|
|
251
251
|
channel.sink = self.on_intr_pdu
|
|
252
252
|
self.l2cap_intr_channel = channel
|
bumble/rfcomm.py
CHANGED
|
@@ -674,10 +674,14 @@ class DLC(utils.EventEmitter):
|
|
|
674
674
|
while (self.tx_buffer and self.tx_credits > 0) or rx_credits_needed > 0:
|
|
675
675
|
# Get the next chunk, up to MTU size
|
|
676
676
|
if rx_credits_needed > 0:
|
|
677
|
-
chunk = bytes([rx_credits_needed])
|
|
678
|
-
self.tx_buffer = self.tx_buffer[len(chunk) - 1 :]
|
|
677
|
+
chunk = bytes([rx_credits_needed])
|
|
679
678
|
self.rx_credits += rx_credits_needed
|
|
680
|
-
|
|
679
|
+
if self.tx_buffer and self.tx_credits > 0:
|
|
680
|
+
chunk += self.tx_buffer[: self.mtu - 1]
|
|
681
|
+
self.tx_buffer = self.tx_buffer[len(chunk) - 1 :]
|
|
682
|
+
tx_credit_spent = True
|
|
683
|
+
else:
|
|
684
|
+
tx_credit_spent = False
|
|
681
685
|
else:
|
|
682
686
|
chunk = self.tx_buffer[: self.mtu]
|
|
683
687
|
self.tx_buffer = self.tx_buffer[len(chunk) :]
|
bumble/transport/__init__.py
CHANGED
|
@@ -84,7 +84,12 @@ async def open_transport(name: str) -> Transport:
|
|
|
84
84
|
scheme, *tail = name.split(':', 1)
|
|
85
85
|
spec = tail[0] if tail else None
|
|
86
86
|
metadata = None
|
|
87
|
-
|
|
87
|
+
# If a spec is provided, check for a metadata section in square brackets.
|
|
88
|
+
# The regex captures a comma-separated list of key=value pairs (allowing an
|
|
89
|
+
# optional trailing comma). The key is matched by \w+ and the value by [^,\]]+,
|
|
90
|
+
# meaning the value may contain any character except a comma or a closing
|
|
91
|
+
# bracket (']').
|
|
92
|
+
if spec and (m := re.search(r'\[(\w+=[^,\]]+(?:,\w+=[^,\]]+)*,?)\]', spec)):
|
|
88
93
|
metadata_str = m.group(1)
|
|
89
94
|
if m.start() == 0:
|
|
90
95
|
# <metadata><spec>
|
bumble/transport/common.py
CHANGED
|
@@ -22,6 +22,7 @@ import contextlib
|
|
|
22
22
|
import io
|
|
23
23
|
import logging
|
|
24
24
|
import struct
|
|
25
|
+
from collections.abc import Awaitable, Callable
|
|
25
26
|
from typing import Any, ContextManager, Optional, Protocol
|
|
26
27
|
|
|
27
28
|
from bumble import core, hci
|
|
@@ -389,15 +390,17 @@ class PumpedPacketSource(ParserSource):
|
|
|
389
390
|
|
|
390
391
|
# -----------------------------------------------------------------------------
|
|
391
392
|
class PumpedPacketSink:
|
|
392
|
-
|
|
393
|
+
pump_task: Optional[asyncio.Task[None]]
|
|
394
|
+
|
|
395
|
+
def __init__(self, send: Callable[[bytes], Awaitable[Any]]):
|
|
393
396
|
self.send_function = send
|
|
394
|
-
self.packet_queue = asyncio.Queue()
|
|
397
|
+
self.packet_queue = asyncio.Queue[bytes]()
|
|
395
398
|
self.pump_task = None
|
|
396
399
|
|
|
397
400
|
def on_packet(self, packet: bytes) -> None:
|
|
398
401
|
self.packet_queue.put_nowait(packet)
|
|
399
402
|
|
|
400
|
-
def start(self):
|
|
403
|
+
def start(self) -> None:
|
|
401
404
|
async def pump_packets():
|
|
402
405
|
while True:
|
|
403
406
|
try:
|
bumble/transport/ws_client.py
CHANGED
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
# -----------------------------------------------------------------------------
|
|
18
18
|
import logging
|
|
19
19
|
|
|
20
|
-
import websockets.client
|
|
20
|
+
import websockets.asyncio.client
|
|
21
21
|
|
|
22
22
|
from bumble.transport.common import (
|
|
23
23
|
PumpedPacketSink,
|
|
@@ -42,7 +42,7 @@ async def open_ws_client_transport(spec: str) -> Transport:
|
|
|
42
42
|
Example: ws://localhost:7681/v1/websocket/bt
|
|
43
43
|
'''
|
|
44
44
|
|
|
45
|
-
websocket = await websockets.client.connect(spec)
|
|
45
|
+
websocket = await websockets.asyncio.client.connect(spec)
|
|
46
46
|
|
|
47
47
|
class WsTransport(PumpedTransport):
|
|
48
48
|
async def close(self):
|
bumble/transport/ws_server.py
CHANGED
|
@@ -16,8 +16,9 @@
|
|
|
16
16
|
# Imports
|
|
17
17
|
# -----------------------------------------------------------------------------
|
|
18
18
|
import logging
|
|
19
|
+
from typing import Optional
|
|
19
20
|
|
|
20
|
-
import websockets
|
|
21
|
+
import websockets.asyncio.server
|
|
21
22
|
|
|
22
23
|
from bumble.transport.common import ParserSource, PumpedPacketSink, Transport
|
|
23
24
|
|
|
@@ -40,7 +41,12 @@ async def open_ws_server_transport(spec: str) -> Transport:
|
|
|
40
41
|
'''
|
|
41
42
|
|
|
42
43
|
class WsServerTransport(Transport):
|
|
43
|
-
|
|
44
|
+
sink: PumpedPacketSink
|
|
45
|
+
source: ParserSource
|
|
46
|
+
connection: Optional[websockets.asyncio.server.ServerConnection]
|
|
47
|
+
server: Optional[websockets.asyncio.server.Server]
|
|
48
|
+
|
|
49
|
+
def __init__(self) -> None:
|
|
44
50
|
source = ParserSource()
|
|
45
51
|
sink = PumpedPacketSink(self.send_packet)
|
|
46
52
|
self.connection = None
|
|
@@ -48,17 +54,19 @@ async def open_ws_server_transport(spec: str) -> Transport:
|
|
|
48
54
|
|
|
49
55
|
super().__init__(source, sink)
|
|
50
56
|
|
|
51
|
-
async def serve(self, local_host, local_port):
|
|
57
|
+
async def serve(self, local_host: str, local_port: str) -> None:
|
|
52
58
|
self.sink.start()
|
|
53
59
|
# pylint: disable-next=no-member
|
|
54
|
-
self.server = await websockets.serve(
|
|
55
|
-
|
|
60
|
+
self.server = await websockets.asyncio.server.serve(
|
|
61
|
+
handler=self.on_connection,
|
|
56
62
|
host=local_host if local_host != '_' else None,
|
|
57
63
|
port=int(local_port),
|
|
58
64
|
)
|
|
59
65
|
logger.debug(f'websocket server ready on port {local_port}')
|
|
60
66
|
|
|
61
|
-
async def on_connection(
|
|
67
|
+
async def on_connection(
|
|
68
|
+
self, connection: websockets.asyncio.server.ServerConnection
|
|
69
|
+
) -> None:
|
|
62
70
|
logger.debug(
|
|
63
71
|
f'new connection on {connection.local_address} '
|
|
64
72
|
f'from {connection.remote_address}'
|
|
@@ -77,11 +85,11 @@ async def open_ws_server_transport(spec: str) -> Transport:
|
|
|
77
85
|
# We're now disconnected
|
|
78
86
|
self.connection = None
|
|
79
87
|
|
|
80
|
-
async def send_packet(self, packet):
|
|
88
|
+
async def send_packet(self, packet: bytes) -> None:
|
|
81
89
|
if self.connection is None:
|
|
82
90
|
logger.debug('no connection, dropping packet')
|
|
83
91
|
return
|
|
84
|
-
|
|
92
|
+
await self.connection.send(packet)
|
|
85
93
|
|
|
86
94
|
local_host, local_port = spec.rsplit(':', maxsplit=1)
|
|
87
95
|
transport = WsServerTransport()
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: bumble
|
|
3
|
-
Version: 0.0.
|
|
3
|
+
Version: 0.0.219
|
|
4
4
|
Summary: Bluetooth Stack for Apps, Emulation, Test and Experimentation
|
|
5
5
|
Author-email: Google <bumble-dev@google.com>
|
|
6
6
|
License-Expression: Apache-2.0
|
|
@@ -25,7 +25,7 @@ Requires-Dist: pyee>=13.0.0
|
|
|
25
25
|
Requires-Dist: pyserial-asyncio>=0.5; platform_system != "Emscripten"
|
|
26
26
|
Requires-Dist: pyserial>=3.5; platform_system != "Emscripten"
|
|
27
27
|
Requires-Dist: pyusb>=1.2; platform_system != "Emscripten"
|
|
28
|
-
Requires-Dist: websockets
|
|
28
|
+
Requires-Dist: websockets>=15.0.1; platform_system != "Emscripten"
|
|
29
29
|
Provides-Extra: build
|
|
30
30
|
Requires-Dist: build>=0.7; extra == "build"
|
|
31
31
|
Provides-Extra: test
|
|
@@ -113,7 +113,7 @@ Bumble is easiest to use with a dedicated USB dongle.
|
|
|
113
113
|
This is because internal Bluetooth interfaces tend to be locked down by the operating system.
|
|
114
114
|
You can use the [usb_probe](/docs/mkdocs/src/apps_and_tools/usb_probe.md) tool (all platforms) or `lsusb` (Linux or macOS) to list the available USB devices on your system.
|
|
115
115
|
|
|
116
|
-
See the [USB Transport](/docs/mkdocs/src/transports/usb.md) page for details on how to refer to USB devices. Also, if
|
|
116
|
+
See the [USB Transport](/docs/mkdocs/src/transports/usb.md) page for details on how to refer to USB devices. Also, if you are on a mac, see [these instructions](docs/mkdocs/src/platforms/macos.md).
|
|
117
117
|
|
|
118
118
|
## License
|
|
119
119
|
|
|
@@ -1,30 +1,30 @@
|
|
|
1
1
|
bumble/__init__.py,sha256=Q8jkz6rgl95IMAeInQVt_2GLoJl3DcEP2cxtrQ-ho5c,110
|
|
2
|
-
bumble/_version.py,sha256=
|
|
3
|
-
bumble/a2dp.py,sha256=
|
|
2
|
+
bumble/_version.py,sha256=mj-phtz8CALrMdiyP-95WlA6nHLl_BYNWRSKnR4obAQ,708
|
|
3
|
+
bumble/a2dp.py,sha256=wvmQwVkSCFsoJv1Q1VGA17ncMnif-o5Bc-NQjgpsDbI,33454
|
|
4
4
|
bumble/at.py,sha256=u93DzB5Ghrxks_ufuUqoYV2RUSowLNLMDhq_j9GrCBc,3108
|
|
5
5
|
bumble/att.py,sha256=vS1dUwiuUgNU6PztARg_qPB_olLOWsAxFz6DZGX8zII,33423
|
|
6
6
|
bumble/avc.py,sha256=uu33BpDU58f4fvqZyBHKfc8OSnzYovQrBk8Yst-KVrk,16383
|
|
7
|
-
bumble/avctp.py,sha256=
|
|
8
|
-
bumble/avdtp.py,sha256=
|
|
9
|
-
bumble/avrcp.py,sha256=
|
|
7
|
+
bumble/avctp.py,sha256=E6JorAlrsW0hAS2y7q-DhMYY2aEAjVXMF-8FivbMN6w,9709
|
|
8
|
+
bumble/avdtp.py,sha256=XvCCAChz5FK5geF_KJrEjkct7QHC9GC8WAmh8GjCZPE,78498
|
|
9
|
+
bumble/avrcp.py,sha256=PFQ8t7Tiv3j_OV7qfVaFe0Mcn9gzhoo969AcMoVGg88,87357
|
|
10
10
|
bumble/bridge.py,sha256=yXwZNUe7pRpuTt41PEmgtfjBLpQKdDwvcxfbYxObqIU,3015
|
|
11
11
|
bumble/codecs.py,sha256=ZHUFvq2dhUUHp2EWYawht8zcPQGqOf5Opnh-7Ud_fb4,20917
|
|
12
12
|
bumble/colors.py,sha256=gm_PqgGfUF8Nkntn652apR4HrqN3vLv249YCIfw8mtk,3112
|
|
13
13
|
bumble/company_ids.py,sha256=B68e2QPsDeRYP9jjbGs4GGDwEkGxcXGTsON_CHA0uuI,118528
|
|
14
|
-
bumble/controller.py,sha256=
|
|
14
|
+
bumble/controller.py,sha256=JU97OmqBBxLr4r3ks7rz6zT2vddDaO-ekPgR2UVdPAE,76050
|
|
15
15
|
bumble/core.py,sha256=QojIUs4nP9qo_r-FWPVxHrCdVSg6CaIzHf6GVPTuu9s,94583
|
|
16
16
|
bumble/data_types.py,sha256=jLELcRiUcvRc4JcEo6vMO9kZmumZ9WuibFN-AK7ZYbc,32831
|
|
17
17
|
bumble/decoder.py,sha256=0-VNWZT-u7lvK3qBpAuYT0M6Rz_bMgMi4CjfUXX_6RM,9728
|
|
18
|
-
bumble/device.py,sha256=
|
|
18
|
+
bumble/device.py,sha256=lOO8MjKQ0hJ9BTgWtMA10zllGl2uHtbueGeQvn5JZ2k,251450
|
|
19
19
|
bumble/gap.py,sha256=j5mevt__i_fSdIc_B3x7YvCJLeCc7bVq8omRphxwXNw,2144
|
|
20
20
|
bumble/gatt.py,sha256=dBd-opQVUumlLPGw7EYZM5DF-ssnym3LsxhskAJMhig,34552
|
|
21
21
|
bumble/gatt_adapters.py,sha256=9uN2uXGIdlvNeSvv3nfwxCEa15uPfm5DVLR5bog_knI,13190
|
|
22
22
|
bumble/gatt_client.py,sha256=jLIa7OoJgw8X7pLBGqsdSY3Sde4HSWBxGWTVWH0FPpA,44268
|
|
23
23
|
bumble/gatt_server.py,sha256=Xx5UaXoNeEIcXfe1YjGrf4Mt7ZKEUak7e3dhFtdK-4Y,37907
|
|
24
|
-
bumble/hci.py,sha256=
|
|
24
|
+
bumble/hci.py,sha256=9ZN9koktUhmSJAWfPCRqaXAbECmDwEpa73lWrWizL_o,328355
|
|
25
25
|
bumble/helpers.py,sha256=WFyikseIRdXUqqeOplNlmd0giOegahlXv5e324ax9ck,12611
|
|
26
|
-
bumble/hfp.py,sha256=
|
|
27
|
-
bumble/hid.py,sha256=
|
|
26
|
+
bumble/hfp.py,sha256=rUfd1OvNnr9FbURRjeNvLA4CcMzv3NcowVxbG4s2FXM,76746
|
|
27
|
+
bumble/hid.py,sha256=KMSd2_minM8F4GJUSaeYubGVvDns2BEFDhYH9f8jVdk,21056
|
|
28
28
|
bumble/host.py,sha256=46fwcskNlfHyW8Ejo5wp8rHtMBZSMkR4URSdekKLPzg,68019
|
|
29
29
|
bumble/keys.py,sha256=VCOrtuw-xF_4Oa5Qt-ECRKaTqabL_GbwdQUKoZX20II,13416
|
|
30
30
|
bumble/l2cap.py,sha256=PZQnZQFB_GJZCCFuPpAsTuYz4E3WTgimDUAk83DUUtE,80758
|
|
@@ -32,7 +32,7 @@ bumble/link.py,sha256=O-T9fCJokvpLpTvIMAboEQbT3Sjg8L2ivSWSBH43fP0,14470
|
|
|
32
32
|
bumble/logging.py,sha256=WvB9v6HxsnmN6DaG-oIcE7DbFcE-jT8YN3T0PGbWbD8,2351
|
|
33
33
|
bumble/pairing.py,sha256=KPkJs4NgFmubdE3OhqP0uaGMm8aAg8RkHDCfAYrhTwo,10142
|
|
34
34
|
bumble/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
35
|
-
bumble/rfcomm.py,sha256=
|
|
35
|
+
bumble/rfcomm.py,sha256=kE3KbtLdcZhUUBcp2Xxu_G1XhU6eOciiJDfYWAOznlU,41067
|
|
36
36
|
bumble/rtp.py,sha256=wyAQJ3dRU31USfZT5DgpvC_TSVYU1QPDSg_uK9-i8V4,3464
|
|
37
37
|
bumble/sdp.py,sha256=PfKjPm_mDO9ZvR74zAFTcazf3MJBo0Ew0LVJMscPohA,49546
|
|
38
38
|
bumble/smp.py,sha256=YhTgEngwb7JmhXugmc3VTmm_lY5RRIg_cFgk5QuywmU,78597
|
|
@@ -73,10 +73,10 @@ bumble/audio/io.py,sha256=OVwQfav8V6zwlI-DRHTCSXEYxBRJZCoQxfirnJI0kgE,17764
|
|
|
73
73
|
bumble/crypto/__init__.py,sha256=n1V7wJp3-YOPl_GzM4zmjpYS8PI2J9xigtY81KMOiDY,6565
|
|
74
74
|
bumble/crypto/builtin.py,sha256=JNUHJIaUx3ylBDCpMjaaDYPl-K3eCdD3iCl_2AWLn8Q,60901
|
|
75
75
|
bumble/crypto/cryptography.py,sha256=yHznoBZ-hd8XqWheipkgn3Vdt5JydLxlTM3nTp5ayvc,2696
|
|
76
|
-
bumble/drivers/__init__.py,sha256=
|
|
76
|
+
bumble/drivers/__init__.py,sha256=03lZKWOvRi2qd_iogohvtTc76vpn89c5jvhbaNzxlSM,3505
|
|
77
77
|
bumble/drivers/common.py,sha256=pS783hudolLZAzF8IUWp7g6TXyQsUCEzqCsd1VGeYfQ,1507
|
|
78
|
-
bumble/drivers/intel.py,sha256=
|
|
79
|
-
bumble/drivers/rtk.py,sha256=
|
|
78
|
+
bumble/drivers/intel.py,sha256=2LmZL4ka1qz90WZGnrEzALd2mj7AcG_06rV03cnKKgY,24624
|
|
79
|
+
bumble/drivers/rtk.py,sha256=tkLXqjhlEdp934alr5SlV00zc2B1UfKpzZpL22Hj8Lg,22690
|
|
80
80
|
bumble/pandora/__init__.py,sha256=xlEwye5eIwHMDHS-qPT2weF0TT86fEUIHYCUvW6LGpc,3535
|
|
81
81
|
bumble/pandora/config.py,sha256=wfmko9UDEZWeRC4fccUdJnHn9D2Bus15R-Tqn2bLoAY,2384
|
|
82
82
|
bumble/pandora/device.py,sha256=U5dmH-eg61egL5sm9dlmQ5f6ZM7xxCNyQXCcMo3eScE,5333
|
|
@@ -116,10 +116,10 @@ bumble/tools/intel_fw_download.py,sha256=rLyiGcZ8XNhSTtv8ZWPozmO9QlyiV52ZS1brBu3
|
|
|
116
116
|
bumble/tools/intel_util.py,sha256=-ZYSW4b09D7346MgkSW4vr6SsG1L5iX4H75EZtzwctE,4672
|
|
117
117
|
bumble/tools/rtk_fw_download.py,sha256=kuJ2q-75Troc9hCrow0q5zKSMsVhocMeWHKvfdg6HC8,5645
|
|
118
118
|
bumble/tools/rtk_util.py,sha256=4kdaHON_pg2HElzBRaStolqvEJVWPd0eZPUyAQWAqxc,5726
|
|
119
|
-
bumble/transport/__init__.py,sha256=
|
|
119
|
+
bumble/transport/__init__.py,sha256=1z6WcJ0kkqSK1iugl3hYamJe54FdB8fmNI4M8M-zNx8,7376
|
|
120
120
|
bumble/transport/android_emulator.py,sha256=axEdFBj17c0dOD5lMqJjiULInG_SQVx5W7ptjyLtRJs,4281
|
|
121
121
|
bumble/transport/android_netsim.py,sha256=8C2kUITCl7L1ggl5FPwWcFq4It8e9O3esEpMjRaYkkw,17563
|
|
122
|
-
bumble/transport/common.py,sha256=
|
|
122
|
+
bumble/transport/common.py,sha256=yCJKUiLFEJ1qtepV1gU6hLkStHY0guKrZUNDoCS8sck,16913
|
|
123
123
|
bumble/transport/file.py,sha256=aqJD5US5TVl01dOb42rV_0OzuvFsBDDlqzipyrYA4q4,2026
|
|
124
124
|
bumble/transport/hci_socket.py,sha256=2PKQ43oDjayKDklx9sF98hSeyNmvTSUOWx_ooPWTjd0,6345
|
|
125
125
|
bumble/transport/pty.py,sha256=yzItc5ZO7WkHZKnAeEK-1XEyY4BWot4ZAMFzQvRiSQ4,2747
|
|
@@ -132,8 +132,8 @@ bumble/transport/udp.py,sha256=_3mePVr9ALzZbOfnlMwcaaMnnLkd5kxhw5-BxkeCSMU,2281
|
|
|
132
132
|
bumble/transport/unix.py,sha256=XbVakfqQiZVdAQnt05XWb4PymzkXIL7h0dn7Iq6xwlk,4240
|
|
133
133
|
bumble/transport/usb.py,sha256=9np33CTM1Sj4mQsym8TqIZ-DN28suCC8gJfy1O-hHPA,22113
|
|
134
134
|
bumble/transport/vhci.py,sha256=-S9M6iqSpdmNobliDBaUamWJtYTiQEMt_mSdfxKZypY,2281
|
|
135
|
-
bumble/transport/ws_client.py,sha256=
|
|
136
|
-
bumble/transport/ws_server.py,sha256=
|
|
135
|
+
bumble/transport/ws_client.py,sha256=qgPUpfnp1i5DxeilhJbKXwceVeNowXCVL05TyaBtiL0,1811
|
|
136
|
+
bumble/transport/ws_server.py,sha256=ttVIGfcd7Rqlo4JM8tIeJAeLGKV96vciv58fVjQCYC8,3714
|
|
137
137
|
bumble/transport/grpc_protobuf/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
138
138
|
bumble/transport/grpc_protobuf/emulated_bluetooth_device_pb2.py,sha256=NFz7pja_rxMEyU3fI-SgHLghTw4KeN1gXUjT4uglrEQ,7959
|
|
139
139
|
bumble/transport/grpc_protobuf/emulated_bluetooth_device_pb2.pyi,sha256=O0qhb2L_oAekmSnqCElidwIg4PZ3XjAyQ4oEy4ycD-A,8385
|
|
@@ -175,9 +175,9 @@ bumble/vendor/android/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3h
|
|
|
175
175
|
bumble/vendor/android/hci.py,sha256=LcV4_OBpzoLtpSiP2su7F4r3bDrHWxcQPR4OGnMVXDk,10485
|
|
176
176
|
bumble/vendor/zephyr/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
177
177
|
bumble/vendor/zephyr/hci.py,sha256=ysct40uIVohaKKLrWjcWo-7YqozU17xGia2dWeHoMoI,3435
|
|
178
|
-
bumble-0.0.
|
|
179
|
-
bumble-0.0.
|
|
180
|
-
bumble-0.0.
|
|
181
|
-
bumble-0.0.
|
|
182
|
-
bumble-0.0.
|
|
183
|
-
bumble-0.0.
|
|
178
|
+
bumble-0.0.219.dist-info/licenses/LICENSE,sha256=FvaYh4NRWIGgS_OwoBs5gFgkCmAghZ-DYnIGBZPuw-s,12142
|
|
179
|
+
bumble-0.0.219.dist-info/METADATA,sha256=NZSYDWv75ArP5gfp5mQ8W7ldDUdSrxi7fxnmJhyn1hM,6156
|
|
180
|
+
bumble-0.0.219.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
181
|
+
bumble-0.0.219.dist-info/entry_points.txt,sha256=mX5dzixNMRo4CTAEQqiYTr-JIaWF62TYrRvJOstjjL8,1081
|
|
182
|
+
bumble-0.0.219.dist-info/top_level.txt,sha256=tV6JJKaHPYMFiJYiBYFW24PCcfLxTJZdlu6BmH3Cb00,7
|
|
183
|
+
bumble-0.0.219.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|