bumble 0.0.194__py3-none-any.whl → 0.0.198__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.
Files changed (54) hide show
  1. bumble/_version.py +2 -2
  2. bumble/apps/auracast.py +692 -0
  3. bumble/apps/bench.py +77 -23
  4. bumble/apps/console.py +5 -20
  5. bumble/apps/controller_info.py +3 -3
  6. bumble/apps/device_info.py +230 -0
  7. bumble/apps/gatt_dump.py +4 -0
  8. bumble/apps/lea_unicast/app.py +16 -17
  9. bumble/at.py +12 -6
  10. bumble/avc.py +8 -5
  11. bumble/avctp.py +3 -2
  12. bumble/avdtp.py +5 -1
  13. bumble/avrcp.py +2 -1
  14. bumble/codecs.py +17 -13
  15. bumble/colors.py +6 -2
  16. bumble/core.py +726 -122
  17. bumble/device.py +817 -117
  18. bumble/drivers/rtk.py +13 -8
  19. bumble/gatt.py +6 -1
  20. bumble/gatt_client.py +10 -4
  21. bumble/hci.py +283 -20
  22. bumble/hid.py +24 -28
  23. bumble/host.py +29 -0
  24. bumble/l2cap.py +24 -17
  25. bumble/link.py +8 -3
  26. bumble/pandora/host.py +3 -2
  27. bumble/profiles/ascs.py +739 -0
  28. bumble/profiles/bap.py +85 -862
  29. bumble/profiles/bass.py +440 -0
  30. bumble/profiles/csip.py +4 -4
  31. bumble/profiles/gap.py +110 -0
  32. bumble/profiles/heart_rate_service.py +4 -3
  33. bumble/profiles/le_audio.py +83 -0
  34. bumble/profiles/mcp.py +448 -0
  35. bumble/profiles/pacs.py +210 -0
  36. bumble/profiles/pbp.py +46 -0
  37. bumble/profiles/tmap.py +89 -0
  38. bumble/rfcomm.py +14 -3
  39. bumble/sdp.py +13 -11
  40. bumble/smp.py +20 -8
  41. bumble/snoop.py +5 -4
  42. bumble/transport/__init__.py +8 -2
  43. bumble/transport/android_emulator.py +9 -3
  44. bumble/transport/android_netsim.py +9 -7
  45. bumble/transport/common.py +46 -18
  46. bumble/transport/pyusb.py +2 -2
  47. bumble/transport/unix.py +56 -0
  48. bumble/transport/usb.py +57 -46
  49. {bumble-0.0.194.dist-info → bumble-0.0.198.dist-info}/METADATA +41 -41
  50. {bumble-0.0.194.dist-info → bumble-0.0.198.dist-info}/RECORD +54 -43
  51. {bumble-0.0.194.dist-info → bumble-0.0.198.dist-info}/WHEEL +1 -1
  52. {bumble-0.0.194.dist-info → bumble-0.0.198.dist-info}/LICENSE +0 -0
  53. {bumble-0.0.194.dist-info → bumble-0.0.198.dist-info}/entry_points.txt +0 -0
  54. {bumble-0.0.194.dist-info → bumble-0.0.198.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,56 @@
1
+ # Copyright 2021-2024 Google LLC
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # https://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ # -----------------------------------------------------------------------------
16
+ # Imports
17
+ # -----------------------------------------------------------------------------
18
+ import asyncio
19
+ import logging
20
+
21
+ from .common import Transport, StreamPacketSource, StreamPacketSink
22
+
23
+ # -----------------------------------------------------------------------------
24
+ # Logging
25
+ # -----------------------------------------------------------------------------
26
+ logger = logging.getLogger(__name__)
27
+
28
+
29
+ # -----------------------------------------------------------------------------
30
+ async def open_unix_client_transport(spec: str) -> Transport:
31
+ '''Open a UNIX socket client transport.
32
+
33
+ The parameter is the path of unix socket. For abstract socket, the first character
34
+ needs to be '@'.
35
+
36
+ Example:
37
+ * /tmp/hci.socket
38
+ * @hci_socket
39
+ '''
40
+
41
+ class UnixPacketSource(StreamPacketSource):
42
+ def connection_lost(self, exc):
43
+ logger.debug(f'connection lost: {exc}')
44
+ self.on_transport_lost()
45
+
46
+ # For abstract socket, the first character should be null character.
47
+ if spec.startswith('@'):
48
+ spec = '\0' + spec[1:]
49
+
50
+ (
51
+ unix_transport,
52
+ packet_source,
53
+ ) = await asyncio.get_running_loop().create_unix_connection(UnixPacketSource, spec)
54
+ packet_sink = StreamPacketSink(unix_transport)
55
+
56
+ return Transport(packet_source, packet_sink)
bumble/transport/usb.py CHANGED
@@ -15,19 +15,18 @@
15
15
  # -----------------------------------------------------------------------------
16
16
  # Imports
17
17
  # -----------------------------------------------------------------------------
18
+ from __future__ import annotations
18
19
  import asyncio
19
20
  import logging
20
21
  import threading
21
- import collections
22
22
  import ctypes
23
23
  import platform
24
24
 
25
25
  import usb1
26
26
 
27
- from bumble.transport.common import Transport, ParserSource
27
+ from bumble.transport.common import Transport, BaseSource, TransportInitError
28
28
  from bumble import hci
29
29
  from bumble.colors import color
30
- from bumble.utils import AsyncRunner
31
30
 
32
31
 
33
32
  # -----------------------------------------------------------------------------
@@ -115,13 +114,17 @@ async def open_usb_transport(spec: str) -> Transport:
115
114
  self.device = device
116
115
  self.acl_out = acl_out
117
116
  self.acl_out_transfer = device.getTransfer()
118
- self.packets = collections.deque() # Queue of packets waiting to be sent
117
+ self.acl_out_transfer_ready = asyncio.Semaphore(1)
118
+ self.packets: asyncio.Queue[bytes] = (
119
+ asyncio.Queue()
120
+ ) # Queue of packets waiting to be sent
119
121
  self.loop = asyncio.get_running_loop()
122
+ self.queue_task = None
120
123
  self.cancel_done = self.loop.create_future()
121
124
  self.closed = False
122
125
 
123
126
  def start(self):
124
- pass
127
+ self.queue_task = asyncio.create_task(self.process_queue())
125
128
 
126
129
  def on_packet(self, packet):
127
130
  # Ignore packets if we're closed
@@ -133,62 +136,64 @@ async def open_usb_transport(spec: str) -> Transport:
133
136
  return
134
137
 
135
138
  # Queue the packet
136
- self.packets.append(packet)
137
- if len(self.packets) == 1:
138
- # The queue was previously empty, re-prime the pump
139
- self.process_queue()
139
+ self.packets.put_nowait(packet)
140
140
 
141
141
  def transfer_callback(self, transfer):
142
+ self.loop.call_soon_threadsafe(self.acl_out_transfer_ready.release)
142
143
  status = transfer.getStatus()
143
144
 
144
145
  # pylint: disable=no-member
145
- if status == usb1.TRANSFER_COMPLETED:
146
- self.loop.call_soon_threadsafe(self.on_packet_sent)
147
- elif status == usb1.TRANSFER_CANCELLED:
146
+ if status == usb1.TRANSFER_CANCELLED:
148
147
  self.loop.call_soon_threadsafe(self.cancel_done.set_result, None)
149
- else:
148
+ return
149
+
150
+ if status != usb1.TRANSFER_COMPLETED:
150
151
  logger.warning(
151
152
  color(f'!!! OUT transfer not completed: status={status}', 'red')
152
153
  )
153
154
 
154
- def on_packet_sent(self):
155
- if self.packets:
156
- self.packets.popleft()
157
- self.process_queue()
158
-
159
- def process_queue(self):
160
- if len(self.packets) == 0:
161
- return # Nothing to do
162
-
163
- packet = self.packets[0]
164
- packet_type = packet[0]
165
- if packet_type == hci.HCI_ACL_DATA_PACKET:
166
- self.acl_out_transfer.setBulk(
167
- self.acl_out, packet[1:], callback=self.transfer_callback
168
- )
169
- self.acl_out_transfer.submit()
170
- elif packet_type == hci.HCI_COMMAND_PACKET:
171
- self.acl_out_transfer.setControl(
172
- USB_RECIPIENT_DEVICE | USB_REQUEST_TYPE_CLASS,
173
- 0,
174
- 0,
175
- 0,
176
- packet[1:],
177
- callback=self.transfer_callback,
178
- )
179
- self.acl_out_transfer.submit()
180
- else:
181
- logger.warning(color(f'unsupported packet type {packet_type}', 'red'))
155
+ async def process_queue(self):
156
+ while True:
157
+ # Wait for a packet to transfer.
158
+ packet = await self.packets.get()
159
+
160
+ # Wait until we can start a transfer.
161
+ await self.acl_out_transfer_ready.acquire()
162
+
163
+ # Transfer the packet.
164
+ packet_type = packet[0]
165
+ if packet_type == hci.HCI_ACL_DATA_PACKET:
166
+ self.acl_out_transfer.setBulk(
167
+ self.acl_out, packet[1:], callback=self.transfer_callback
168
+ )
169
+ self.acl_out_transfer.submit()
170
+ elif packet_type == hci.HCI_COMMAND_PACKET:
171
+ self.acl_out_transfer.setControl(
172
+ USB_RECIPIENT_DEVICE | USB_REQUEST_TYPE_CLASS,
173
+ 0,
174
+ 0,
175
+ 0,
176
+ packet[1:],
177
+ callback=self.transfer_callback,
178
+ )
179
+ self.acl_out_transfer.submit()
180
+ else:
181
+ logger.warning(
182
+ color(f'unsupported packet type {packet_type}', 'red')
183
+ )
182
184
 
183
185
  def close(self):
184
186
  self.closed = True
187
+ if self.queue_task:
188
+ self.queue_task.cancel()
185
189
 
186
190
  async def terminate(self):
187
191
  if not self.closed:
188
192
  self.close()
189
193
 
190
194
  # Empty the packet queue so that we don't send any more data
191
- self.packets.clear()
195
+ while not self.packets.empty():
196
+ self.packets.get_nowait()
192
197
 
193
198
  # If we have a transfer in flight, cancel it
194
199
  if self.acl_out_transfer.isSubmitted():
@@ -203,7 +208,7 @@ async def open_usb_transport(spec: str) -> Transport:
203
208
  except usb1.USBError:
204
209
  logger.debug('OUT transfer likely already completed')
205
210
 
206
- class UsbPacketSource(asyncio.Protocol, ParserSource):
211
+ class UsbPacketSource(asyncio.Protocol, BaseSource):
207
212
  def __init__(self, device, metadata, acl_in, events_in):
208
213
  super().__init__()
209
214
  self.device = device
@@ -280,7 +285,13 @@ async def open_usb_transport(spec: str) -> Transport:
280
285
  packet = await self.queue.get()
281
286
  except asyncio.CancelledError:
282
287
  return
283
- self.parser.feed_data(packet)
288
+ if self.sink:
289
+ try:
290
+ self.sink.on_packet(packet)
291
+ except Exception as error:
292
+ logger.exception(
293
+ color(f'!!! Exception in sink.on_packet: {error}', 'red')
294
+ )
284
295
 
285
296
  def close(self):
286
297
  self.closed = True
@@ -442,7 +453,7 @@ async def open_usb_transport(spec: str) -> Transport:
442
453
 
443
454
  if found is None:
444
455
  context.close()
445
- raise ValueError('device not found')
456
+ raise TransportInitError('device not found')
446
457
 
447
458
  logger.debug(f'USB Device: {found}')
448
459
 
@@ -507,7 +518,7 @@ async def open_usb_transport(spec: str) -> Transport:
507
518
 
508
519
  endpoints = find_endpoints(found)
509
520
  if endpoints is None:
510
- raise ValueError('no compatible interface found for device')
521
+ raise TransportInitError('no compatible interface found for device')
511
522
  (configuration, interface, setting, acl_in, acl_out, events_in) = endpoints
512
523
  logger.debug(
513
524
  f'selected endpoints: configuration={configuration}, '
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: bumble
3
- Version: 0.0.194
3
+ Version: 0.0.198
4
4
  Summary: Bluetooth Stack for Apps, Emulation, Test and Experimentation
5
5
  Home-page: https://github.com/google/bumble
6
6
  Author: Google
@@ -8,52 +8,52 @@ Author-email: tbd@tbd.com
8
8
  Requires-Python: >=3.8
9
9
  Description-Content-Type: text/markdown
10
10
  License-File: LICENSE
11
- Requires-Dist: pyee >=8.2.2
12
- Requires-Dist: aiohttp ~=3.8 ; platform_system != "Emscripten"
13
- Requires-Dist: appdirs >=1.4 ; platform_system != "Emscripten"
14
- Requires-Dist: click >=8.1.3 ; platform_system != "Emscripten"
15
- Requires-Dist: cryptography ==39 ; platform_system != "Emscripten"
16
- Requires-Dist: grpcio >=1.62.1 ; platform_system != "Emscripten"
17
- Requires-Dist: humanize >=4.6.0 ; platform_system != "Emscripten"
18
- Requires-Dist: libusb1 >=2.0.1 ; platform_system != "Emscripten"
19
- Requires-Dist: libusb-package ==1.0.26.1 ; platform_system != "Emscripten"
20
- Requires-Dist: platformdirs >=3.10.0 ; platform_system != "Emscripten"
21
- Requires-Dist: prompt-toolkit >=3.0.16 ; platform_system != "Emscripten"
22
- Requires-Dist: prettytable >=3.6.0 ; platform_system != "Emscripten"
23
- Requires-Dist: protobuf >=3.12.4 ; platform_system != "Emscripten"
24
- Requires-Dist: pyserial-asyncio >=0.5 ; platform_system != "Emscripten"
25
- Requires-Dist: pyserial >=3.5 ; platform_system != "Emscripten"
26
- Requires-Dist: pyusb >=1.2 ; platform_system != "Emscripten"
27
- Requires-Dist: websockets >=12.0 ; platform_system != "Emscripten"
28
- Requires-Dist: cryptography >=39.0 ; platform_system == "Emscripten"
11
+ Requires-Dist: pyee>=8.2.2
12
+ Requires-Dist: aiohttp~=3.8; platform_system != "Emscripten"
13
+ Requires-Dist: appdirs>=1.4; platform_system != "Emscripten"
14
+ Requires-Dist: click>=8.1.3; platform_system != "Emscripten"
15
+ Requires-Dist: cryptography==39; platform_system != "Emscripten"
16
+ Requires-Dist: grpcio>=1.62.1; platform_system != "Emscripten"
17
+ Requires-Dist: humanize>=4.6.0; platform_system != "Emscripten"
18
+ Requires-Dist: libusb1>=2.0.1; platform_system != "Emscripten"
19
+ Requires-Dist: libusb-package==1.0.26.1; platform_system != "Emscripten"
20
+ Requires-Dist: platformdirs>=3.10.0; platform_system != "Emscripten"
21
+ Requires-Dist: prompt-toolkit>=3.0.16; platform_system != "Emscripten"
22
+ Requires-Dist: prettytable>=3.6.0; platform_system != "Emscripten"
23
+ Requires-Dist: protobuf>=3.12.4; platform_system != "Emscripten"
24
+ Requires-Dist: pyserial-asyncio>=0.5; platform_system != "Emscripten"
25
+ Requires-Dist: pyserial>=3.5; platform_system != "Emscripten"
26
+ Requires-Dist: pyusb>=1.2; platform_system != "Emscripten"
27
+ Requires-Dist: websockets>=12.0; platform_system != "Emscripten"
28
+ Requires-Dist: cryptography>=39.0; platform_system == "Emscripten"
29
29
  Provides-Extra: avatar
30
- Requires-Dist: pandora-avatar ==0.0.9 ; extra == 'avatar'
31
- Requires-Dist: rootcanal ==1.10.0 ; (python_version >= "3.10") and extra == 'avatar'
30
+ Requires-Dist: pandora-avatar==0.0.9; extra == "avatar"
31
+ Requires-Dist: rootcanal==1.10.0; python_version >= "3.10" and extra == "avatar"
32
32
  Provides-Extra: build
33
- Requires-Dist: build >=0.7 ; extra == 'build'
33
+ Requires-Dist: build>=0.7; extra == "build"
34
34
  Provides-Extra: development
35
- Requires-Dist: black ==24.3 ; extra == 'development'
36
- Requires-Dist: grpcio-tools >=1.62.1 ; extra == 'development'
37
- Requires-Dist: invoke >=1.7.3 ; extra == 'development'
38
- Requires-Dist: mypy ==1.10.0 ; extra == 'development'
39
- Requires-Dist: nox >=2022 ; extra == 'development'
40
- Requires-Dist: pylint ==3.1.0 ; extra == 'development'
41
- Requires-Dist: pyyaml >=6.0 ; extra == 'development'
42
- Requires-Dist: types-appdirs >=1.4.3 ; extra == 'development'
43
- Requires-Dist: types-invoke >=1.7.3 ; extra == 'development'
44
- Requires-Dist: types-protobuf >=4.21.0 ; extra == 'development'
45
- Requires-Dist: wasmtime ==20.0.0 ; extra == 'development'
35
+ Requires-Dist: black==24.3; extra == "development"
36
+ Requires-Dist: grpcio-tools>=1.62.1; extra == "development"
37
+ Requires-Dist: invoke>=1.7.3; extra == "development"
38
+ Requires-Dist: mypy==1.10.0; extra == "development"
39
+ Requires-Dist: nox>=2022; extra == "development"
40
+ Requires-Dist: pylint==3.1.0; extra == "development"
41
+ Requires-Dist: pyyaml>=6.0; extra == "development"
42
+ Requires-Dist: types-appdirs>=1.4.3; extra == "development"
43
+ Requires-Dist: types-invoke>=1.7.3; extra == "development"
44
+ Requires-Dist: types-protobuf>=4.21.0; extra == "development"
45
+ Requires-Dist: wasmtime==20.0.0; extra == "development"
46
46
  Provides-Extra: documentation
47
- Requires-Dist: mkdocs >=1.4.0 ; extra == 'documentation'
48
- Requires-Dist: mkdocs-material >=8.5.6 ; extra == 'documentation'
49
- Requires-Dist: mkdocstrings[python] >=0.19.0 ; extra == 'documentation'
47
+ Requires-Dist: mkdocs>=1.4.0; extra == "documentation"
48
+ Requires-Dist: mkdocs-material>=8.5.6; extra == "documentation"
49
+ Requires-Dist: mkdocstrings[python]>=0.19.0; extra == "documentation"
50
50
  Provides-Extra: pandora
51
- Requires-Dist: bt-test-interfaces >=0.0.6 ; extra == 'pandora'
51
+ Requires-Dist: bt-test-interfaces>=0.0.6; extra == "pandora"
52
52
  Provides-Extra: test
53
- Requires-Dist: pytest >=8.2 ; extra == 'test'
54
- Requires-Dist: pytest-asyncio >=0.23.5 ; extra == 'test'
55
- Requires-Dist: pytest-html >=3.2.0 ; extra == 'test'
56
- Requires-Dist: coverage >=6.4 ; extra == 'test'
53
+ Requires-Dist: pytest>=8.2; extra == "test"
54
+ Requires-Dist: pytest-asyncio>=0.23.5; extra == "test"
55
+ Requires-Dist: pytest-html>=3.2.0; extra == "test"
56
+ Requires-Dist: coverage>=6.4; extra == "test"
57
57
 
58
58
 
59
59
  _ _ _
@@ -1,49 +1,51 @@
1
1
  bumble/__init__.py,sha256=Q8jkz6rgl95IMAeInQVt_2GLoJl3DcEP2cxtrQ-ho5c,110
2
- bumble/_version.py,sha256=bNzvTCoTQ0mZBbxGZ_NgDoKjW449n_BkE6JvREc5fNw,415
2
+ bumble/_version.py,sha256=wj4Uoyl4fbIliDzkMZfA-f07UNZEG-IYvFEisYUdjJ0,415
3
3
  bumble/a2dp.py,sha256=VEeAOCfT1ZqpwnEgel6DJ32vxR8jYX3IAaBfCqPdWO8,22675
4
- bumble/at.py,sha256=kdrcsx2C8Rg61EWESD2QHwpZntkXkRBJLrPn9auv9K8,2961
4
+ bumble/at.py,sha256=Giu2VUSJKH-jIh10lOfumiqy-FyO99Ra6nJ7UiWQ0H8,3114
5
5
  bumble/att.py,sha256=TGzhhBKCQPA_P_eDDSNASJVfa3dCr-QzzrRB3GekrI0,32366
6
- bumble/avc.py,sha256=O6ujcmWHMgH821aCLidXN23QFPMAjJ2B50oCu0HxaO0,16188
7
- bumble/avctp.py,sha256=W_CgqSRV7Z8xOAz8Q4BZGuuZUHEEJjmioSVg1iDINtM,9881
8
- bumble/avdtp.py,sha256=RmQiDYeKNitR9jkSXcCzCXacrK_Kbiyt1klO3iylr8Q,77322
9
- bumble/avrcp.py,sha256=MKyJkyYmL-M1H_Pi4fr8HABXi-E-F9mBOQpbv_Ilysc,69327
6
+ bumble/avc.py,sha256=Ho-WweU9lU15vlTwIbrGBa18M5vUKYm5q8aToaLSh70,16311
7
+ bumble/avctp.py,sha256=yHAjJRjLGtR0Q-iWcLS7cJRz5Jr2YiRmZd6LZV4Xjt4,9935
8
+ bumble/avdtp.py,sha256=6kx4FiFHuV6zmYYrHYnJO4ilDksJauyu9d6XBO4wPVg,77450
9
+ bumble/avrcp.py,sha256=BhDjc8TxhOpPnuvGn5-dGB6JK1aqshg4x7tm_vI4LLU,69363
10
10
  bumble/bridge.py,sha256=T6es5oS1dy8QgkxQ8iOD-YcZ0SWOv8jaqC7TGxqodk4,3003
11
- bumble/codecs.py,sha256=Vc7FOo6d-6VCgDI0ibnLmX8vCZ4-jtX_-0vEUM-yOrI,15343
12
- bumble/colors.py,sha256=9H-qzGgMr-YoWdIFpcGPaiRvTvkCzz7FPIkpwqKyKug,3033
11
+ bumble/codecs.py,sha256=yels_alICohfM5DuvR2wMpYlebt7OrZHCtRXWyMyYYI,15581
12
+ bumble/colors.py,sha256=CC5tBDnN86bvlbYf1KIVdyj7QBLaqEDT_hQVB0p7FeU,3118
13
13
  bumble/company_ids.py,sha256=B68e2QPsDeRYP9jjbGs4GGDwEkGxcXGTsON_CHA0uuI,118528
14
14
  bumble/controller.py,sha256=XkYTQb2J5MhH_dGfnFkrLXdChFD2s1wSvqXaHQFeo48,59688
15
- bumble/core.py,sha256=l71AacyuFijZJH-kBYB41riW9SEsRtlVIPYyhnhPwmc,53132
15
+ bumble/core.py,sha256=T43ZszjsU_89B0UJwQ9GCzvKU7oj1_RBzsdGr9jX9xY,72440
16
16
  bumble/crypto.py,sha256=L6z3dn9-dgKYRtOM6O3F6n6Ju4PwTM3LAFJtCg_ie78,9382
17
17
  bumble/decoder.py,sha256=N9nMvuVhuwpnfw7EDVuNe9uYY6B6c3RY2dh8RhRPC1U,9608
18
- bumble/device.py,sha256=W6u3zI9ivj5ypFycq8r7OGs0svBGrFVq3KplXI5minA,168751
18
+ bumble/device.py,sha256=4TcC6v_zwyTcZMAMZd7qb06oLVGtw84LtdlgIsilFbU,194632
19
19
  bumble/gap.py,sha256=dRU2_TWvqTDx80hxeSbXlWIeWvptWH4_XbItG5y948Q,2138
20
- bumble/gatt.py,sha256=W7h8hEyxM8fu3HbAKYJ2HStb8NM7T98UICVnf4G9HDo,38447
21
- bumble/gatt_client.py,sha256=pJ29537m9L_cY2nrtEqZdssOEpg4147fF7vhz0BweyY,43071
20
+ bumble/gatt.py,sha256=FiueS6Uj4go3LB7PjhXlzLHBFiiiMJWiuHtsILEuVLo,38651
21
+ bumble/gatt_client.py,sha256=C8HlxEYpe3FBOPS2RXZZ9_tX3KfqPnn0XZsmhakSXNc,43332
22
22
  bumble/gatt_server.py,sha256=uPYbn2-y0MLnyR8xxpOf18gPua_Q49pSlMR1zxEnU-Q,37118
23
- bumble/hci.py,sha256=mL7xvgGyTz56Bn75yQSelFIl3Pys6ZImJIvZnjgkLCM,266912
23
+ bumble/hci.py,sha256=v4JeftZq-j1XYCNUwgBH_3JnXOpJ_cJCYmj1HO6GKzE,275223
24
24
  bumble/helpers.py,sha256=m0w4UgFFNDEnXwHrDyfRlcBObdVed2fqXGL0lvR3c8s,12733
25
25
  bumble/hfp.py,sha256=OsBDREelxhLMi_UZO9Kxlqzbts08CcGxoiicUgrYlXg,75353
26
- bumble/hid.py,sha256=Dd4rsmkRxcxt1IjoozJdu9Qd-QWruKJfsiYqTT89NDk,20590
27
- bumble/host.py,sha256=2hT-HRAlxPhVMoXUwn5E1-M90bbCNsWOam5nV3fnF1o,47175
26
+ bumble/hid.py,sha256=hJKm6qhNa0kQTGmp_VxNh3-ywgBDdJpPPFcvtFiRL0A,20335
27
+ bumble/host.py,sha256=OIV1_Alfjn6-VbvnHzmnFuuXt6kVZ0zvIptaj3waRe4,48415
28
28
  bumble/keys.py,sha256=WbIQ7Ob81mW75qmEPQ2rBLfnqBMA-ts2yowWXP9UaCY,12654
29
- bumble/l2cap.py,sha256=YjUoLVR8gYpPzF4JyLoEE8Jhuu72fbW-eXYhXnFphSc,81170
30
- bumble/link.py,sha256=QiiMSCZ0z0ko2oUEMYg6nbq-h5A_3DLN4pjqAx_E-SA,23980
29
+ bumble/l2cap.py,sha256=Bu6oTD3DzqLOKiarynT1cfQefNgR0gCJoKxnwQJl2_o,81398
30
+ bumble/link.py,sha256=MYKsIKpbbAkh_ldxPZKu_GhS90ImC0IQtCAqbY4Ddg4,24034
31
31
  bumble/pairing.py,sha256=tgPUba6xNxMi-2plm3xfRlzHq-uPRNZEIGWaN0qNGCs,9853
32
32
  bumble/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
33
- bumble/rfcomm.py,sha256=nfagIDp26xBEwwzrpyWJt0NKCWTMOQvPUWrSPvIUGOA,40361
34
- bumble/sdp.py,sha256=yA3gkyyFaLkt-nHff3Ge5BgFgqX9uVgr56fWJVA1py8,45289
35
- bumble/smp.py,sha256=PcQj8mDoM8fBc4gKECHoOs0A2ukUAaSZQGdgLj6YzB0,76277
36
- bumble/snoop.py,sha256=_QfF36eylBW6Snd-_KYOwKaGiM8i_Ed-B5XoFIPt3Dg,5631
33
+ bumble/rfcomm.py,sha256=dh5t5vlDEfw3yHgQfzegMYPnShP8Zo-3ScABUvmXNLI,40751
34
+ bumble/sdp.py,sha256=aajRQybcMWh_Kc4IuQahix6bXnHg61OXl1gSdrSysl4,45465
35
+ bumble/smp.py,sha256=h8KSaBMSPeVSU_wwRPUnRu2wFSXW-J_ez8FQSOayH4s,77040
36
+ bumble/snoop.py,sha256=1mzwmp9LToUXbPnFsLrt8S4UHs0kqzbu7LDydwbmkZI,5715
37
37
  bumble/utils.py,sha256=e0i-4d28-9zP3gYcd1rdNd669rkPnRs5oJCERUEDfxo,15099
38
38
  bumble/apps/README.md,sha256=XTwjRAY-EJWDXpl1V8K3Mw8B7kIqzUIUizRjVBVhoIE,1769
39
39
  bumble/apps/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
40
- bumble/apps/bench.py,sha256=7tZH14ykiNcX5g3_Lw-s2ciuiAW8G4E2wSCjkwclU0Q,54300
40
+ bumble/apps/auracast.py,sha256=hrG6dW79UkMXqcMLgYjziWEjcVibFUITvjPb4LX1lxM,24686
41
+ bumble/apps/bench.py,sha256=nPACg5gQWxJ-6phze12FVCv1_WS2UjrWR7OUWj0o8PU,56350
41
42
  bumble/apps/ble_rpa_tool.py,sha256=ZQtsbfnLPd5qUAkEBPpNgJLRynBBc7q_9cDHKUW2SQ0,1701
42
- bumble/apps/console.py,sha256=rVR2jmP6Yd76B4zzGPYnpJFtgeYgq19CL6DMSe2-A1M,46093
43
- bumble/apps/controller_info.py,sha256=pgi6leHpwGdi3-kFUc7uFfuyGPTkNEoOws8cWycQVT0,9249
43
+ bumble/apps/console.py,sha256=rwD9y3g8Mm_mAEvrcXjbtcv5d8mwF3yTbmE6Vet2BEk,45300
44
+ bumble/apps/controller_info.py,sha256=m29omI2r8q01GccgN6Lb-HfSsBjYdGpLDHlgZ99ldTM,9249
44
45
  bumble/apps/controller_loopback.py,sha256=VJAFsUdFwm2KgOrRuLADymMpZl5qVO0RGkDSr-1XKtY,7214
45
46
  bumble/apps/controllers.py,sha256=R6XJ1XpyuXlyqSCmI7PromVIcoYTcYfpmO-TqTYXnUI,2326
46
- bumble/apps/gatt_dump.py,sha256=-dCvCgjuHAp0h1zxm-gmqB4lVlSdas1Kp4cpzzx4gGw,4245
47
+ bumble/apps/device_info.py,sha256=kQSO7F60cmUKw99LHfyly9s_ox2mD0dNGsgxCnKoFOQ,7999
48
+ bumble/apps/gatt_dump.py,sha256=wwA-NhRnbgUkbj-Ukym7NDG2j2n_36t_tn93dLDVdIg,4487
47
49
  bumble/apps/gg_bridge.py,sha256=JdW5QT6xN9c2XDDJoHDRo5W3N_RdVkCtTmlcOsJhlx8,14693
48
50
  bumble/apps/hci_bridge.py,sha256=KISv352tKnsQsoxjkDiCQbMFmhnPWdnug5wSFAAXxEs,4033
49
51
  bumble/apps/l2cap_bridge.py,sha256=524VgEmgCP4g7T0UdgmsePmNVhDFRJECeaZ_uzKsbco,13062
@@ -54,7 +56,7 @@ bumble/apps/scan.py,sha256=b6hIppiJqDfR7VFW2wl3-lkPdFvHLqYZKY8VjjNnhls,8366
54
56
  bumble/apps/show.py,sha256=8w0-8jLtN6IM6_58pOHbEmE1Rmxm71O48ACrXixC2jk,6218
55
57
  bumble/apps/unbond.py,sha256=LDPWpmgKLMGYDdIFGTdGciFDcUliZ0OmseEbGfJ-MAM,3176
56
58
  bumble/apps/usb_probe.py,sha256=zJqrqKSGVYcOntXzgONdluZDE6jfj3IwPNuLqmDPDsU,10351
57
- bumble/apps/lea_unicast/app.py,sha256=LBJn5_wOPehHACnrw2N9JwIyYH-MhyadGl5A9SqhXSs,20625
59
+ bumble/apps/lea_unicast/app.py,sha256=7hK3s5I0vHneECo01UpVoP10LcEcMRIHjmO35lMhNwY,20659
58
60
  bumble/apps/lea_unicast/index.html,sha256=d1IHsYd8TGOnxNZKaHolf4Y-7VwT1kO9Z72vpGMdy3k,2354
59
61
  bumble/apps/lea_unicast/liblc3.wasm,sha256=nYMzG9fP8_71K9dQfVI9QPQPkFRPHoqZEEExs1y6Oac,158603
60
62
  bumble/apps/link_relay/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -69,42 +71,51 @@ bumble/apps/speaker/speaker.py,sha256=f7cOyVqD6HOiLPCgdcnwN7sakj2SScybVHVTBR6eFw
69
71
  bumble/drivers/__init__.py,sha256=lxqJTghh21rQFThRTurwLysZm385TUcn8ZdpHQSWD88,3196
70
72
  bumble/drivers/common.py,sha256=pS783hudolLZAzF8IUWp7g6TXyQsUCEzqCsd1VGeYfQ,1507
71
73
  bumble/drivers/intel.py,sha256=-YcJI4ZC_fhHHxWyE8b4eB8V7suOFH1n9uayckGE9Uw,3231
72
- bumble/drivers/rtk.py,sha256=MMxmUo85VkRhFuhbc9SJEZVL9dnRjmsU9k8djmbUGcA,21369
74
+ bumble/drivers/rtk.py,sha256=xFPzTxSJYVTIkru2D3oQMtAcNCAXSChhMSIsE7ksO8I,21552
73
75
  bumble/pandora/__init__.py,sha256=5NBVmndeTulANawift0jPT9ISp562wyIHTZ-4uP34Mg,3283
74
76
  bumble/pandora/config.py,sha256=KD85n3oRbuvD65sRah2H0gpxEW4YbD7HbYbsxdcpDDA,2388
75
77
  bumble/pandora/device.py,sha256=LFqCWrgYkQWrFUSKArsAABXkge8sB2DhvaQoEsC4Jn0,5344
76
- bumble/pandora/host.py,sha256=d0qGQ769K9SSfBftEJcktTBebXZU6M8MMbh0xLYKwGk,39189
78
+ bumble/pandora/host.py,sha256=LnEQ3DJAhmJVgHA7VyokvypQejsi2VcbauSFYn1a9Jk,39235
77
79
  bumble/pandora/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
78
80
  bumble/pandora/security.py,sha256=YErueKNLsnmcRe6dKo724Ht-buOqmZl2Gauswcc8FW0,21946
79
81
  bumble/pandora/utils.py,sha256=Fq4glL0T5cJ2FODoDotmDNdYFOkTOR7DyyL8vkcxp20,3949
80
82
  bumble/profiles/__init__.py,sha256=yBGC8Ti5LvZuoh1F42XtfrBilb39T77_yuxESZeX2yI,581
83
+ bumble/profiles/ascs.py,sha256=Y2_fd_5LOb9hon60LcQl3R-FoAIsOd_J37RZpveh-7c,25471
81
84
  bumble/profiles/asha_service.py,sha256=J4i5jkJciZWMtTWJ1zGJkEx65DlAEIADqjCRYf_CWNs,7220
82
- bumble/profiles/bap.py,sha256=m5abJqb49iDPEkxc_EL3r1jOl2LKtKHSqB4E-4I5Dzw,47272
85
+ bumble/profiles/bap.py,sha256=wLnrbXso203rgw0WNa91qIdMdjuIoGc9VqOHc9Ey_b4,19421
86
+ bumble/profiles/bass.py,sha256=Wiqum0Wsr5PpVzTAPDcyKLTfJoKXJUYOzqB320aSiUs,14950
83
87
  bumble/profiles/battery_service.py,sha256=w-uF4jLoDozJOoykimb2RkrKjVyCke6ts2-h-F1PYyc,2292
84
88
  bumble/profiles/cap.py,sha256=6gH7oOnUKjOggMPuB7rtbwj0AneoNmnWzQ_iR3io8e0,1945
85
- bumble/profiles/csip.py,sha256=wzSpNRCOMWtKw2Yd9OTAzPoFDoQWG-KYwWdA6sUkwiI,10102
89
+ bumble/profiles/csip.py,sha256=qpI9W0_FWIpsuJrHhxfbKaa-TD21epxEa3EuCm8gh6c,10156
86
90
  bumble/profiles/device_information_service.py,sha256=RfqnXywcwcSTiFalxd1LVTTdeWLxHGsMvlvr9fI0GJI,6193
87
- bumble/profiles/heart_rate_service.py,sha256=7V2LGcWLp6RurjWxsVgMWr3wPDt5aS9qjNxTbHcOK6o,8575
91
+ bumble/profiles/gap.py,sha256=jUjfy6MPL7k6wgNn3ny3PVgSX6-SLmjUepFYHjGc3IU,3870
92
+ bumble/profiles/heart_rate_service.py,sha256=_MG1ApmF1B7b4xRzELuahtRWzLm49i9O4m7I6ZFU4mw,8644
93
+ bumble/profiles/le_audio.py,sha256=1x6OpIc0JMa32YVcfM8lq6jnXHlriHUcOkAs0EttJJk,3093
94
+ bumble/profiles/mcp.py,sha256=vIN1r_if4LmOcGCgZuDYTYLMQzU6-1pKUFx1Z3iSAeY,17415
95
+ bumble/profiles/pacs.py,sha256=bhlU5M6E9e1YKf-qJnJL3GwTqOPuSvYDpY_UYq0Nnd8,8730
96
+ bumble/profiles/pbp.py,sha256=51aoQcZMXzTzeatHd0zNVN7kYcv4atzr2OWpzxlSVP8,1630
88
97
  bumble/profiles/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
98
+ bumble/profiles/tmap.py,sha256=hpz5VYEdEOty4D9ApCRDero9Tf3L9arSZWnLCNkZoHI,3005
89
99
  bumble/profiles/vcp.py,sha256=wkbTf2NRCbBtvpXplpNJq4dzXp6JGeaEHeeC1kHqW7s,7897
90
100
  bumble/tools/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
91
101
  bumble/tools/generate_company_id_list.py,sha256=ysbPb3zmxKFBiSQ_MBG2r15-sqR5P_GWT6i0YUTTXOM,1736
92
102
  bumble/tools/rtk_fw_download.py,sha256=KEPG-rDrdPGKBzZ78P4s3udLRYT3p7vesGhXvJTWTic,5453
93
103
  bumble/tools/rtk_util.py,sha256=TwZhupHQrQYsYHLdRGyzXKd24pwCk8kkzqK1Rj2guco,5087
94
- bumble/transport/__init__.py,sha256=W_IjqBehWCvjyTghgRYvbbLqDlh2xh7ZRDRvun5iYB0,6830
95
- bumble/transport/android_emulator.py,sha256=eH8H1aB7MvQ8lpdwVG6SGKg5uwCRb_aPJk8pPwoTXSY,4321
96
- bumble/transport/android_netsim.py,sha256=SVh-IUZ2bhcIESZFGzOsofybsi4H0qoBRwBieeqUINE,16215
97
- bumble/transport/common.py,sha256=LHZNCrSNMd3AwaOT31WZXRdu9ydidNO3pnmonWBWhLA,15818
104
+ bumble/transport/__init__.py,sha256=Z01fvuKpqAbhJd0wYcGhW09W2tycM71ck80XoZ8a87Q,7012
105
+ bumble/transport/android_emulator.py,sha256=6HR2cEqdU0XbOldwxCtQuXtvwOUYhRfHkPz0TRt3mbo,4382
106
+ bumble/transport/android_netsim.py,sha256=39RYKZJX806nbS6I2Yu31Z9h7-FJgYGIshXUoT0GjS8,16315
107
+ bumble/transport/common.py,sha256=bJWYH-vRJJl0nWwlAjGTHrRQFdZayKkH7YoGor5abH8,16659
98
108
  bumble/transport/file.py,sha256=eVM2V6Nk2nDAFdE7Rt01ZI3JdTovsH9OEU1gKYPJjpE,2010
99
109
  bumble/transport/hci_socket.py,sha256=EdgWi3-O5yvYcH4R4BkPtG79pnUo7GQtXWawuUHDoDQ,6331
100
110
  bumble/transport/pty.py,sha256=grTl-yvjMWHflNwuME4ccVqDbk6NIEgQMgH6Y9lf1fU,2732
101
111
  bumble/transport/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
102
- bumble/transport/pyusb.py,sha256=Wa1QlfjwN_9bdisoaBVYXN0DfHQgwi4L7nWbUisZmVE,15504
112
+ bumble/transport/pyusb.py,sha256=znHdx0h_XNiDVa7bs2qlq9sG4vURlK8XloApZ73InDo,15532
103
113
  bumble/transport/serial.py,sha256=loQxkeG7uE09enXWg2uGbxi6CeG70wn3kzPbEwULKw4,2446
104
114
  bumble/transport/tcp_client.py,sha256=deyUJYpj04QE00Mw_PTU5PHPA6mr1Nui3f5-QCy2zOw,1854
105
115
  bumble/transport/tcp_server.py,sha256=tvu7FuPeqiXfoj2HQU8wu4AiwKjDDDCKlKjgtqWc5hg,3779
106
116
  bumble/transport/udp.py,sha256=di8I6HHACgBx3un-dzAahz9lTIUrh4LdeuYpeoifQEM,2239
107
- bumble/transport/usb.py,sha256=dFNN-kGI3pMTXeT5Amwu2H6e4J48WAJotG_D18W3RBM,21399
117
+ bumble/transport/unix.py,sha256=CS6Ksrkat5uUXOpo7RlxAYJsM3lMS4T3OrdCqzIHTg8,1981
118
+ bumble/transport/usb.py,sha256=FO2Trx9rQ_pdX6Aal7eDxOpubjBEeUmoH3jcwVwKSYA,22022
108
119
  bumble/transport/vhci.py,sha256=iI2WpighnvIP5zeyJUFSbjEdmCo24CWMdICamIcyJck,2250
109
120
  bumble/transport/ws_client.py,sha256=9gqm5jlVT_H6LfwsQwPpky07CINhgOK96ef53SMAxms,1757
110
121
  bumble/transport/ws_server.py,sha256=goe4xx7OnZiJy1a00Bg0CXM8uJhsGXbsijMYq2n62bI,3328
@@ -141,9 +152,9 @@ bumble/vendor/android/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3h
141
152
  bumble/vendor/android/hci.py,sha256=GZrkhaWmcMt1JpnRhv0NoySGkf2H4lNUV2f_omRZW0I,10741
142
153
  bumble/vendor/zephyr/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
143
154
  bumble/vendor/zephyr/hci.py,sha256=d83bC0TvT947eN4roFjLkQefWtHOoNsr4xib2ctSkvA,3195
144
- bumble-0.0.194.dist-info/LICENSE,sha256=FvaYh4NRWIGgS_OwoBs5gFgkCmAghZ-DYnIGBZPuw-s,12142
145
- bumble-0.0.194.dist-info/METADATA,sha256=DtzxP6olXav-014VOgDx0WaJokHXKAS0tU0w4xVcjoM,5753
146
- bumble-0.0.194.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
147
- bumble-0.0.194.dist-info/entry_points.txt,sha256=AOFf_gnWbZ7jk5fzspxXHCQUay1ik71pK3HYO7sZQsk,937
148
- bumble-0.0.194.dist-info/top_level.txt,sha256=tV6JJKaHPYMFiJYiBYFW24PCcfLxTJZdlu6BmH3Cb00,7
149
- bumble-0.0.194.dist-info/RECORD,,
155
+ bumble-0.0.198.dist-info/LICENSE,sha256=FvaYh4NRWIGgS_OwoBs5gFgkCmAghZ-DYnIGBZPuw-s,12142
156
+ bumble-0.0.198.dist-info/METADATA,sha256=fVbh2d9h95IUX4z5lP0FC4aXJ2WGsWX8Wb8gMKyjfLw,5672
157
+ bumble-0.0.198.dist-info/WHEEL,sha256=Mdi9PDNwEZptOjTlUcAth7XJDFtKrHYaQMPulZeBCiQ,91
158
+ bumble-0.0.198.dist-info/entry_points.txt,sha256=AOFf_gnWbZ7jk5fzspxXHCQUay1ik71pK3HYO7sZQsk,937
159
+ bumble-0.0.198.dist-info/top_level.txt,sha256=tV6JJKaHPYMFiJYiBYFW24PCcfLxTJZdlu6BmH3Cb00,7
160
+ bumble-0.0.198.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: bdist_wheel (0.43.0)
2
+ Generator: setuptools (73.0.1)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5