bumble 0.0.207__py3-none-any.whl → 0.0.209__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 (47) hide show
  1. bumble/_version.py +9 -4
  2. bumble/apps/auracast.py +29 -35
  3. bumble/apps/bench.py +13 -10
  4. bumble/apps/console.py +19 -12
  5. bumble/apps/gg_bridge.py +1 -1
  6. bumble/att.py +61 -39
  7. bumble/controller.py +7 -8
  8. bumble/core.py +306 -159
  9. bumble/device.py +127 -82
  10. bumble/gatt.py +25 -228
  11. bumble/gatt_adapters.py +374 -0
  12. bumble/gatt_client.py +38 -31
  13. bumble/gatt_server.py +5 -5
  14. bumble/hci.py +76 -71
  15. bumble/host.py +19 -8
  16. bumble/l2cap.py +2 -2
  17. bumble/link.py +2 -2
  18. bumble/pairing.py +5 -5
  19. bumble/pandora/host.py +19 -23
  20. bumble/pandora/security.py +2 -3
  21. bumble/pandora/utils.py +2 -2
  22. bumble/profiles/aics.py +33 -23
  23. bumble/profiles/ancs.py +514 -0
  24. bumble/profiles/ascs.py +2 -1
  25. bumble/profiles/asha.py +11 -9
  26. bumble/profiles/bass.py +8 -5
  27. bumble/profiles/battery_service.py +13 -3
  28. bumble/profiles/device_information_service.py +16 -14
  29. bumble/profiles/gap.py +12 -8
  30. bumble/profiles/gatt_service.py +1 -0
  31. bumble/profiles/gmap.py +16 -11
  32. bumble/profiles/hap.py +8 -6
  33. bumble/profiles/heart_rate_service.py +20 -4
  34. bumble/profiles/mcp.py +11 -9
  35. bumble/profiles/pacs.py +37 -24
  36. bumble/profiles/tmap.py +6 -4
  37. bumble/profiles/vcs.py +6 -5
  38. bumble/profiles/vocs.py +49 -41
  39. bumble/smp.py +3 -3
  40. bumble/transport/usb.py +1 -3
  41. bumble/utils.py +10 -0
  42. {bumble-0.0.207.dist-info → bumble-0.0.209.dist-info}/METADATA +3 -3
  43. {bumble-0.0.207.dist-info → bumble-0.0.209.dist-info}/RECORD +47 -45
  44. {bumble-0.0.207.dist-info → bumble-0.0.209.dist-info}/WHEEL +1 -1
  45. {bumble-0.0.207.dist-info → bumble-0.0.209.dist-info}/LICENSE +0 -0
  46. {bumble-0.0.207.dist-info → bumble-0.0.209.dist-info}/entry_points.txt +0 -0
  47. {bumble-0.0.207.dist-info → bumble-0.0.209.dist-info}/top_level.txt +0 -0
bumble/profiles/vocs.py CHANGED
@@ -24,17 +24,19 @@ from bumble.device import Connection
24
24
  from bumble.att import ATT_Error
25
25
  from bumble.gatt import (
26
26
  Characteristic,
27
- DelegatedCharacteristicAdapter,
28
27
  TemplateService,
29
28
  CharacteristicValue,
30
- SerializableCharacteristicAdapter,
31
- UTF8CharacteristicAdapter,
32
29
  GATT_VOLUME_OFFSET_CONTROL_SERVICE,
33
30
  GATT_VOLUME_OFFSET_STATE_CHARACTERISTIC,
34
31
  GATT_AUDIO_LOCATION_CHARACTERISTIC,
35
32
  GATT_VOLUME_OFFSET_CONTROL_POINT_CHARACTERISTIC,
36
33
  GATT_AUDIO_OUTPUT_DESCRIPTION_CHARACTERISTIC,
37
34
  )
35
+ from bumble.gatt_adapters import (
36
+ DelegatedCharacteristicProxyAdapter,
37
+ SerializableCharacteristicProxyAdapter,
38
+ UTF8CharacteristicProxyAdapter,
39
+ )
38
40
  from bumble.gatt_client import ProfileServiceProxy, ServiceProxy
39
41
  from bumble.utils import OpenIntEnum
40
42
  from bumble.profiles.bap import AudioLocation
@@ -67,7 +69,7 @@ class ErrorCode(OpenIntEnum):
67
69
  class VolumeOffsetState:
68
70
  volume_offset: int = 0
69
71
  change_counter: int = 0
70
- attribute_value: Optional[CharacteristicValue] = None
72
+ attribute: Optional[Characteristic] = None
71
73
 
72
74
  def __bytes__(self) -> bytes:
73
75
  return struct.pack('<hB', self.volume_offset, self.change_counter)
@@ -81,8 +83,8 @@ class VolumeOffsetState:
81
83
  self.change_counter = (self.change_counter + 1) % (CHANGE_COUNTER_MAX_VALUE + 1)
82
84
 
83
85
  async def notify_subscribers_via_connection(self, connection: Connection) -> None:
84
- assert self.attribute_value is not None
85
- await connection.device.notify_subscribers(attribute=self.attribute_value)
86
+ assert self.attribute is not None
87
+ await connection.device.notify_subscribers(attribute=self.attribute)
86
88
 
87
89
  def on_read(self, _connection: Optional[Connection]) -> bytes:
88
90
  return bytes(self)
@@ -91,7 +93,7 @@ class VolumeOffsetState:
91
93
  @dataclass
92
94
  class VocsAudioLocation:
93
95
  audio_location: AudioLocation = AudioLocation.NOT_ALLOWED
94
- attribute_value: Optional[CharacteristicValue] = None
96
+ attribute: Optional[Characteristic] = None
95
97
 
96
98
  def __bytes__(self) -> bytes:
97
99
  return struct.pack('<I', self.audio_location)
@@ -106,10 +108,10 @@ class VocsAudioLocation:
106
108
 
107
109
  async def on_write(self, connection: Optional[Connection], value: bytes) -> None:
108
110
  assert connection
109
- assert self.attribute_value
111
+ assert self.attribute
110
112
 
111
113
  self.audio_location = AudioLocation(int.from_bytes(value, 'little'))
112
- await connection.device.notify_subscribers(attribute=self.attribute_value)
114
+ await connection.device.notify_subscribers(attribute=self.attribute)
113
115
 
114
116
 
115
117
  @dataclass
@@ -148,7 +150,7 @@ class VolumeOffsetControlPoint:
148
150
  @dataclass
149
151
  class AudioOutputDescription:
150
152
  audio_output_description: str = ''
151
- attribute_value: Optional[CharacteristicValue] = None
153
+ attribute: Optional[Characteristic] = None
152
154
 
153
155
  @classmethod
154
156
  def from_bytes(cls, data: bytes):
@@ -162,10 +164,10 @@ class AudioOutputDescription:
162
164
 
163
165
  async def on_write(self, connection: Optional[Connection], value: bytes) -> None:
164
166
  assert connection
165
- assert self.attribute_value
167
+ assert self.attribute
166
168
 
167
169
  self.audio_output_description = value.decode('utf-8')
168
- await connection.device.notify_subscribers(attribute=self.attribute_value)
170
+ await connection.device.notify_subscribers(attribute=self.attribute)
169
171
 
170
172
 
171
173
  # -----------------------------------------------------------------------------
@@ -197,7 +199,7 @@ class VolumeOffsetControlService(TemplateService):
197
199
  VolumeOffsetControlPoint(self.volume_offset_state)
198
200
  )
199
201
 
200
- self.volume_offset_state_characteristic = Characteristic(
202
+ self.volume_offset_state_characteristic: Characteristic[bytes] = Characteristic(
201
203
  uuid=GATT_VOLUME_OFFSET_STATE_CHARACTERISTIC,
202
204
  properties=(
203
205
  Characteristic.Properties.READ | Characteristic.Properties.NOTIFY
@@ -206,7 +208,7 @@ class VolumeOffsetControlService(TemplateService):
206
208
  value=CharacteristicValue(read=self.volume_offset_state.on_read),
207
209
  )
208
210
 
209
- self.audio_location_characteristic = Characteristic(
211
+ self.audio_location_characteristic: Characteristic[bytes] = Characteristic(
210
212
  uuid=GATT_AUDIO_LOCATION_CHARACTERISTIC,
211
213
  properties=(
212
214
  Characteristic.Properties.READ
@@ -222,33 +224,39 @@ class VolumeOffsetControlService(TemplateService):
222
224
  write=self.audio_location.on_write,
223
225
  ),
224
226
  )
225
- self.audio_location.attribute_value = self.audio_location_characteristic.value
226
-
227
- self.volume_offset_control_point_characteristic = Characteristic(
228
- uuid=GATT_VOLUME_OFFSET_CONTROL_POINT_CHARACTERISTIC,
229
- properties=Characteristic.Properties.WRITE,
230
- permissions=Characteristic.Permissions.WRITE_REQUIRES_ENCRYPTION,
231
- value=CharacteristicValue(write=self.volume_offset_control_point.on_write),
227
+ self.audio_location.attribute = self.audio_location_characteristic
228
+
229
+ self.volume_offset_control_point_characteristic: Characteristic[bytes] = (
230
+ Characteristic(
231
+ uuid=GATT_VOLUME_OFFSET_CONTROL_POINT_CHARACTERISTIC,
232
+ properties=Characteristic.Properties.WRITE,
233
+ permissions=Characteristic.Permissions.WRITE_REQUIRES_ENCRYPTION,
234
+ value=CharacteristicValue(
235
+ write=self.volume_offset_control_point.on_write
236
+ ),
237
+ )
232
238
  )
233
239
 
234
- self.audio_output_description_characteristic = Characteristic(
235
- uuid=GATT_AUDIO_OUTPUT_DESCRIPTION_CHARACTERISTIC,
236
- properties=(
237
- Characteristic.Properties.READ
238
- | Characteristic.Properties.NOTIFY
239
- | Characteristic.Properties.WRITE_WITHOUT_RESPONSE
240
- ),
241
- permissions=(
242
- Characteristic.Permissions.READ_REQUIRES_ENCRYPTION
243
- | Characteristic.Permissions.WRITE_REQUIRES_ENCRYPTION
244
- ),
245
- value=CharacteristicValue(
246
- read=self.audio_output_description.on_read,
247
- write=self.audio_output_description.on_write,
248
- ),
240
+ self.audio_output_description_characteristic: Characteristic[bytes] = (
241
+ Characteristic(
242
+ uuid=GATT_AUDIO_OUTPUT_DESCRIPTION_CHARACTERISTIC,
243
+ properties=(
244
+ Characteristic.Properties.READ
245
+ | Characteristic.Properties.NOTIFY
246
+ | Characteristic.Properties.WRITE_WITHOUT_RESPONSE
247
+ ),
248
+ permissions=(
249
+ Characteristic.Permissions.READ_REQUIRES_ENCRYPTION
250
+ | Characteristic.Permissions.WRITE_REQUIRES_ENCRYPTION
251
+ ),
252
+ value=CharacteristicValue(
253
+ read=self.audio_output_description.on_read,
254
+ write=self.audio_output_description.on_write,
255
+ ),
256
+ )
249
257
  )
250
- self.audio_output_description.attribute_value = (
251
- self.audio_output_description_characteristic.value
258
+ self.audio_output_description.attribute = (
259
+ self.audio_output_description_characteristic
252
260
  )
253
261
 
254
262
  super().__init__(
@@ -271,14 +279,14 @@ class VolumeOffsetControlServiceProxy(ProfileServiceProxy):
271
279
  def __init__(self, service_proxy: ServiceProxy) -> None:
272
280
  self.service_proxy = service_proxy
273
281
 
274
- self.volume_offset_state = SerializableCharacteristicAdapter(
282
+ self.volume_offset_state = SerializableCharacteristicProxyAdapter(
275
283
  service_proxy.get_required_characteristic_by_uuid(
276
284
  GATT_VOLUME_OFFSET_STATE_CHARACTERISTIC
277
285
  ),
278
286
  VolumeOffsetState,
279
287
  )
280
288
 
281
- self.audio_location = DelegatedCharacteristicAdapter(
289
+ self.audio_location = DelegatedCharacteristicProxyAdapter(
282
290
  service_proxy.get_required_characteristic_by_uuid(
283
291
  GATT_AUDIO_LOCATION_CHARACTERISTIC
284
292
  ),
@@ -292,7 +300,7 @@ class VolumeOffsetControlServiceProxy(ProfileServiceProxy):
292
300
  )
293
301
  )
294
302
 
295
- self.audio_output_description = UTF8CharacteristicAdapter(
303
+ self.audio_output_description = UTF8CharacteristicProxyAdapter(
296
304
  service_proxy.get_required_characteristic_by_uuid(
297
305
  GATT_AUDIO_OUTPUT_DESCRIPTION_CHARACTERISTIC
298
306
  )
bumble/smp.py CHANGED
@@ -46,13 +46,13 @@ from pyee import EventEmitter
46
46
  from .colors import color
47
47
  from .hci import (
48
48
  Address,
49
+ Role,
49
50
  HCI_LE_Enable_Encryption_Command,
50
51
  HCI_Object,
51
52
  key_with_value,
52
53
  )
53
54
  from .core import (
54
55
  BT_BR_EDR_TRANSPORT,
55
- BT_CENTRAL_ROLE,
56
56
  BT_LE_TRANSPORT,
57
57
  AdvertisingData,
58
58
  InvalidArgumentError,
@@ -1975,7 +1975,7 @@ class Manager(EventEmitter):
1975
1975
 
1976
1976
  # Look for a session with this connection, and create one if none exists
1977
1977
  if not (session := self.sessions.get(connection.handle)):
1978
- if connection.role == BT_CENTRAL_ROLE:
1978
+ if connection.role == Role.CENTRAL:
1979
1979
  logger.warning('Remote starts pairing as Peripheral!')
1980
1980
  pairing_config = self.pairing_config_factory(connection)
1981
1981
  session = self.session_proxy(
@@ -1995,7 +1995,7 @@ class Manager(EventEmitter):
1995
1995
 
1996
1996
  async def pair(self, connection: Connection) -> None:
1997
1997
  # TODO: check if there's already a session for this connection
1998
- if connection.role != BT_CENTRAL_ROLE:
1998
+ if connection.role != Role.CENTRAL:
1999
1999
  logger.warning('Start pairing as Peripheral!')
2000
2000
  pairing_config = self.pairing_config_factory(connection)
2001
2001
  session = self.session_proxy(
bumble/transport/usb.py CHANGED
@@ -115,9 +115,7 @@ async def open_usb_transport(spec: str) -> Transport:
115
115
  self.acl_out = acl_out
116
116
  self.acl_out_transfer = device.getTransfer()
117
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
118
+ self.packets = asyncio.Queue[bytes]() # Queue of packets waiting to be sent
121
119
  self.loop = asyncio.get_running_loop()
122
120
  self.queue_task = None
123
121
  self.cancel_done = self.loop.create_future()
bumble/utils.py CHANGED
@@ -502,3 +502,13 @@ class ByteSerializable(Protocol):
502
502
  def from_bytes(cls, data: bytes) -> Self: ...
503
503
 
504
504
  def __bytes__(self) -> bytes: ...
505
+
506
+
507
+ # -----------------------------------------------------------------------------
508
+ class IntConvertible(Protocol):
509
+ """
510
+ Type protocol for classes that can be instantiated from int and converted to int.
511
+ """
512
+
513
+ def __init__(self, value: int) -> None: ...
514
+ def __int__(self) -> int: ...
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: bumble
3
- Version: 0.0.207
3
+ Version: 0.0.209
4
4
  Summary: Bluetooth Stack for Apps, Emulation, Test and Experimentation
5
5
  Author-email: Google <bumble-dev@google.com>
6
6
  Project-URL: Homepage, https://github.com/google/bumble
@@ -47,7 +47,7 @@ Requires-Dist: types-invoke>=1.7.3; extra == "development"
47
47
  Requires-Dist: types-protobuf>=4.21.0; extra == "development"
48
48
  Provides-Extra: avatar
49
49
  Requires-Dist: pandora-avatar==0.0.10; extra == "avatar"
50
- Requires-Dist: rootcanal==1.10.0; python_version >= "3.10" and extra == "avatar"
50
+ Requires-Dist: rootcanal==1.11.1; python_version >= "3.10" and extra == "avatar"
51
51
  Provides-Extra: pandora
52
52
  Requires-Dist: bt-test-interfaces>=0.0.6; extra == "pandora"
53
53
  Provides-Extra: documentation
@@ -55,7 +55,7 @@ Requires-Dist: mkdocs>=1.6.0; extra == "documentation"
55
55
  Requires-Dist: mkdocs-material>=9.6; extra == "documentation"
56
56
  Requires-Dist: mkdocstrings[python]>=0.27.0; extra == "documentation"
57
57
  Provides-Extra: auracast
58
- Requires-Dist: lc3py; (python_version >= "3.10" and platform_system == "Linux" and platform_machine == "x86_64") and extra == "auracast"
58
+ Requires-Dist: lc3py>=1.1.3; (python_version >= "3.10" and ((platform_system == "Linux" and platform_machine == "x86_64") or (platform_system == "Darwin" and platform_machine == "arm64"))) and extra == "auracast"
59
59
  Requires-Dist: sounddevice>=0.5.1; extra == "auracast"
60
60
 
61
61
 
@@ -1,8 +1,8 @@
1
1
  bumble/__init__.py,sha256=Q8jkz6rgl95IMAeInQVt_2GLoJl3DcEP2cxtrQ-ho5c,110
2
- bumble/_version.py,sha256=jmWBoK3noH8SOitnHxsR8mEYSEdPJ5p78NFlFLHEizc,415
2
+ bumble/_version.py,sha256=dtxcFpVo8DNrOrsy5nzwd1pAeYiqoWWMRBoWGh6mNeU,515
3
3
  bumble/a2dp.py,sha256=_dCq-qyG5OglDVlaOFwAgFe_ugvHuEdEYL-kWFf6sWQ,31775
4
4
  bumble/at.py,sha256=Giu2VUSJKH-jIh10lOfumiqy-FyO99Ra6nJ7UiWQ0H8,3114
5
- bumble/att.py,sha256=XyVtZ7AXbuperIm_uqMSN2haXYU_nPcXVz7HXGlex-Q,32567
5
+ bumble/att.py,sha256=RfX9m2WnNsClcevP8h6mJSAQZAjK8J9Q4-2zlJDrHKY,33480
6
6
  bumble/avc.py,sha256=cO1-8x7BvuBCQVJg-9nTibkLFC4y0_2SNERZ8_7Kn_c,16407
7
7
  bumble/avctp.py,sha256=yHAjJRjLGtR0Q-iWcLS7cJRz5Jr2YiRmZd6LZV4Xjt4,9935
8
8
  bumble/avdtp.py,sha256=2ki_BE4SHiu3Sx9oHCknfjF-bBcgPB9TsyF5upciUYI,76773
@@ -11,43 +11,44 @@ bumble/bridge.py,sha256=T6es5oS1dy8QgkxQ8iOD-YcZ0SWOv8jaqC7TGxqodk4,3003
11
11
  bumble/codecs.py,sha256=75TGfq-XWWtr-mCRRG7QzJYNRebG50Ypt_QGQkoWlxU,20915
12
12
  bumble/colors.py,sha256=CC5tBDnN86bvlbYf1KIVdyj7QBLaqEDT_hQVB0p7FeU,3118
13
13
  bumble/company_ids.py,sha256=B68e2QPsDeRYP9jjbGs4GGDwEkGxcXGTsON_CHA0uuI,118528
14
- bumble/controller.py,sha256=w7KAbh1NH1_TRiiiXZX2EBgM9nGXteHH8fpns8Dshg4,62116
15
- bumble/core.py,sha256=TWXoBItq0UFwLmjbm4QXQoEK4eWFLnFhJzuTSpKb-LM,72544
14
+ bumble/controller.py,sha256=RveOhD3hLg9C8iFNKC8AZ2w3cXSrTQygaX9g6CaxDyA,62067
15
+ bumble/core.py,sha256=gVQO27va4l2N2pNFFMls6SwOyYVvBWRaeV0myViLq3s,78415
16
16
  bumble/crypto.py,sha256=L6z3dn9-dgKYRtOM6O3F6n6Ju4PwTM3LAFJtCg_ie78,9382
17
17
  bumble/decoder.py,sha256=0-VNWZT-u7lvK3qBpAuYT0M6Rz_bMgMi4CjfUXX_6RM,9728
18
- bumble/device.py,sha256=al6h9s0WAIWeWWEY0Z_O8BONhUqF4uifJFHzJKX5MQc,230241
18
+ bumble/device.py,sha256=7lj4wPufJuAhh9KWsvIyeDlDrBr-_QgI7NNj18ow2sM,231548
19
19
  bumble/gap.py,sha256=dRU2_TWvqTDx80hxeSbXlWIeWvptWH4_XbItG5y948Q,2138
20
- bumble/gatt.py,sha256=cwU6c0UjhNICIVhA4hnVhvysHXDC7S-vB4byBY9SK-0,40972
21
- bumble/gatt_client.py,sha256=oZupZy_vHpyLoh8HvN0gtDBgK-zUnEvdweggdt1vQOE,43788
22
- bumble/gatt_server.py,sha256=cRIvPUrfTa8Kwn6KWsTzC33-AVoAPNzEMbXWbk_I6N4,37516
23
- bumble/hci.py,sha256=xYKsSvwjZj0pAPgtGDyRaVxKOi4garuzSaiTd2ICWok,313243
20
+ bumble/gatt.py,sha256=-46xllOWG4klMjhdqWqIyQs0HeeYikCImAzjVk6OkzU,34659
21
+ bumble/gatt_adapters.py,sha256=00kmVHW63hBesBnZhfmPTEofaXEtsvx3RmTrSCZ7ruc,13254
22
+ bumble/gatt_client.py,sha256=TWI_iiI6AHiWwTZWMXnIDYR9JAsZTNg3dhidL6cy3wk,44187
23
+ bumble/gatt_server.py,sha256=Um-7gI3trC7qSpXyjOIk4072VMDCAivSDoL8suXtWHw,37503
24
+ bumble/hci.py,sha256=VAI91bCBmIk4BOrAsF34gKvMqhab4hwO24J1hCT_rng,313545
24
25
  bumble/helpers.py,sha256=m0w4UgFFNDEnXwHrDyfRlcBObdVed2fqXGL0lvR3c8s,12733
25
26
  bumble/hfp.py,sha256=UDqB-z5nEzLgRojJeC6TbFRaPXV3Ht0jvQV03ksyiLU,75749
26
27
  bumble/hid.py,sha256=hJKm6qhNa0kQTGmp_VxNh3-ywgBDdJpPPFcvtFiRL0A,20335
27
- bumble/host.py,sha256=MNjN_NFQxPB1NKWw5jf35z0VbOzE3nrNub6opqecwtA,61315
28
+ bumble/host.py,sha256=Ytxk0_4q5VTJ2MiWBlmSr6ryKCedGBtfMMJl0LeyHmc,61529
28
29
  bumble/keys.py,sha256=WbIQ7Ob81mW75qmEPQ2rBLfnqBMA-ts2yowWXP9UaCY,12654
29
- bumble/l2cap.py,sha256=_bDO9VXhqDc1eNjqQBO82NYAsQipVxlrvcNSQIaWfL0,80809
30
- bumble/link.py,sha256=SU7Ls2Lyg1XuY8x6yP9tAC83SYmMTU2a-vQ_CWCfq90,24107
31
- bumble/pairing.py,sha256=OJ3mzv46iTtv8P0mZb3PEDUzTemlcIADPMah21jeSyA,10008
30
+ bumble/l2cap.py,sha256=LErH18csaIve93OsXgsdjdWYhKiNNnsF_jQ1VzH6Awc,80795
31
+ bumble/link.py,sha256=HGdWpoE9RtbL7juM9VHTu0bGBN_ILQtvZxu6CNu-PfA,24090
32
+ bumble/pairing.py,sha256=CEY7gC42DkNL8CitGyuBDvHcTiE82AxaznsGjdsnGkQ,10048
32
33
  bumble/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
33
34
  bumble/rfcomm.py,sha256=dh5t5vlDEfw3yHgQfzegMYPnShP8Zo-3ScABUvmXNLI,40751
34
35
  bumble/rtp.py,sha256=388X3aCv-QrWJ37r_VPqXYJtvNGWPsHnJasqs41g_-s,3487
35
36
  bumble/sdp.py,sha256=x7TQ1LlggWQDIaEZZaVNSd2PhfVtnjQ9xV1LTJ_y0Xs,49583
36
- bumble/smp.py,sha256=ic_9ozECbsZPsho0kU6eMcB2zIl6JODUx-tqdm8IdxU,77878
37
+ bumble/smp.py,sha256=WiEgjsAb2DepLPCajMOeQJbFjs3I9yJOrTrGjcc9mQ4,77861
37
38
  bumble/snoop.py,sha256=1mzwmp9LToUXbPnFsLrt8S4UHs0kqzbu7LDydwbmkZI,5715
38
- bumble/utils.py,sha256=pddRUOgO8GJbymfLGDq-paWfk1N6lV0vieZ1DR1YCAY,15510
39
+ bumble/utils.py,sha256=ODWbIpQBkT0L5K1n6wn4GWMqkQg85NhDCC9REAsQLVA,15809
39
40
  bumble/apps/README.md,sha256=XTwjRAY-EJWDXpl1V8K3Mw8B7kIqzUIUizRjVBVhoIE,1769
40
41
  bumble/apps/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
41
- bumble/apps/auracast.py,sha256=ATs15CV082WbMm6Vl7tpz7DRzorY6x_of6DVJMywKeA,44040
42
- bumble/apps/bench.py,sha256=2Lf3fZD79rMRyaIZy5DqBSdMMT9YlcE3-aqE4c7eD38,61236
42
+ bumble/apps/auracast.py,sha256=zVuPJ-XSoNe7DyB6qFXImW-BXfln3qVDiPHRR8bSTbA,43535
43
+ bumble/apps/bench.py,sha256=m9J64h4_4t4ViNWpYQ_Dr438bqAmWOW2UGcRyRpSApE,61323
43
44
  bumble/apps/ble_rpa_tool.py,sha256=ZQtsbfnLPd5qUAkEBPpNgJLRynBBc7q_9cDHKUW2SQ0,1701
44
- bumble/apps/console.py,sha256=rwD9y3g8Mm_mAEvrcXjbtcv5d8mwF3yTbmE6Vet2BEk,45300
45
+ bumble/apps/console.py,sha256=VbwQElCKEWlWgsb5_k9UCeVIhWOKDn3S71J7fjN6OJ0,45475
45
46
  bumble/apps/controller_info.py,sha256=SRjTY66I8752oPa_G3y2D_H9NQj3HWxQ_fWKllNu4yo,12484
46
47
  bumble/apps/controller_loopback.py,sha256=VJAFsUdFwm2KgOrRuLADymMpZl5qVO0RGkDSr-1XKtY,7214
47
48
  bumble/apps/controllers.py,sha256=R6XJ1XpyuXlyqSCmI7PromVIcoYTcYfpmO-TqTYXnUI,2326
48
49
  bumble/apps/device_info.py,sha256=K7LcVpOOaunRMAKSSOTiDvqCavOZRdsDiXj2ofoJeG0,9942
49
50
  bumble/apps/gatt_dump.py,sha256=wwA-NhRnbgUkbj-Ukym7NDG2j2n_36t_tn93dLDVdIg,4487
50
- bumble/apps/gg_bridge.py,sha256=JdW5QT6xN9c2XDDJoHDRo5W3N_RdVkCtTmlcOsJhlx8,14693
51
+ bumble/apps/gg_bridge.py,sha256=hLWKq5fpX_OoRYHxFFPpwHiR7yW__1rarwicJCqoaHE,14716
51
52
  bumble/apps/hci_bridge.py,sha256=0mO36AO3ea0yrrTaYuySc7Un5NTuvVn08ItXvJql3CQ,4029
52
53
  bumble/apps/l2cap_bridge.py,sha256=524VgEmgCP4g7T0UdgmsePmNVhDFRJECeaZ_uzKsbco,13062
53
54
  bumble/apps/pair.py,sha256=cZovlR4alLGCruS4Iy_dcJkJchIoV4vNwcNyycWLhxw,18591
@@ -78,34 +79,35 @@ bumble/drivers/rtk.py,sha256=nsfAqNzvxvAwbh6UYgxOCSNwgw7XouIBFA03FrLTs4M,22088
78
79
  bumble/pandora/__init__.py,sha256=jaPtYCLfLeLUGj8-TmS3Gkv0l1_DBadYj8ZMAPLPAao,3463
79
80
  bumble/pandora/config.py,sha256=KD85n3oRbuvD65sRah2H0gpxEW4YbD7HbYbsxdcpDDA,2388
80
81
  bumble/pandora/device.py,sha256=LFqCWrgYkQWrFUSKArsAABXkge8sB2DhvaQoEsC4Jn0,5344
81
- bumble/pandora/host.py,sha256=PihXDb09a1IkV56MPNe4-5QRr54_Dp679pA4ldnLHlM,39235
82
+ bumble/pandora/host.py,sha256=X2PT6_f3RLqI-a_hOaYdrb4JDMkxzHDRoGZYzg2H5Lc,38990
82
83
  bumble/pandora/l2cap.py,sha256=OT-pPprVAQr7xwjYnNwDQujayG2zWUS5FPXVBGNCW3o,11725
83
84
  bumble/pandora/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
84
- bumble/pandora/security.py,sha256=YErueKNLsnmcRe6dKo724Ht-buOqmZl2Gauswcc8FW0,21946
85
- bumble/pandora/utils.py,sha256=Fq4glL0T5cJ2FODoDotmDNdYFOkTOR7DyyL8vkcxp20,3949
85
+ bumble/pandora/security.py,sha256=7RiUeSTnENcdRkod5tnzLbWCcRB9PPe7Aw0r8pSuLOs,21925
86
+ bumble/pandora/utils.py,sha256=A1JA-0cyfjDnzMpwxZqas8JGqS8VOXk8YdwegWevRJg,3970
86
87
  bumble/profiles/__init__.py,sha256=yBGC8Ti5LvZuoh1F42XtfrBilb39T77_yuxESZeX2yI,581
87
- bumble/profiles/aics.py,sha256=Kb50MTBPxWHZbc0JUBogv3YEV2wZIGrqs8E7qhEm7aI,17230
88
- bumble/profiles/ascs.py,sha256=jRFZDPgym7ZRs_bqmLjLwi5nAHg_lwfRcq_P6Ynvg4s,24839
89
- bumble/profiles/asha.py,sha256=XLXinlmC1Zn1MiK_eg62F89gG-4HnBHco_KzoEXtCUE,10273
88
+ bumble/profiles/aics.py,sha256=ApqW_e7Z_8GOIeR-lFJKn9qjQeo_g4UVsNICVzuluW0,17793
89
+ bumble/profiles/ancs.py,sha256=z9kq91Jr4L7NIHS0-mwP3t_Id6zGcPU-8SwrrQRg1nc,17752
90
+ bumble/profiles/ascs.py,sha256=417wewqM-zCcSyg8xWA-0-4ExzCzNzBvJ7T9BE9Lbhw,24880
91
+ bumble/profiles/asha.py,sha256=WRC9MItDXzjp6JDe4YYhSnRvUGmqrJM39hW1twp1EXI,10377
90
92
  bumble/profiles/bap.py,sha256=3fI8IB34l1CSzH0CwAD84qCxz_nV-SOP5q9VDzb3Aqk,21979
91
- bumble/profiles/bass.py,sha256=5t91bOZDolmfiv9c1pQ1FmewKhXUtqPH7c1Qr8GR9IA,14557
92
- bumble/profiles/battery_service.py,sha256=w-uF4jLoDozJOoykimb2RkrKjVyCke6ts2-h-F1PYyc,2292
93
+ bumble/profiles/bass.py,sha256=A0CpMMnoB7ODM7YwMXQ7bhlJ9bTwA_Hqcyufb-9rqHk,14641
94
+ bumble/profiles/battery_service.py,sha256=-PM8gwXV2Aym5Z2Z4PAbl31Wefa7E260qy5P5jYVC4A,2572
93
95
  bumble/profiles/cap.py,sha256=6gH7oOnUKjOggMPuB7rtbwj0AneoNmnWzQ_iR3io8e0,1945
94
96
  bumble/profiles/csip.py,sha256=qpI9W0_FWIpsuJrHhxfbKaa-TD21epxEa3EuCm8gh6c,10156
95
- bumble/profiles/device_information_service.py,sha256=3c_p3s7jMxPKWHObXOesZ4ZZKr1SgaTe8RvyuangZuM,6258
96
- bumble/profiles/gap.py,sha256=jUjfy6MPL7k6wgNn3ny3PVgSX6-SLmjUepFYHjGc3IU,3870
97
- bumble/profiles/gatt_service.py,sha256=n85zh22nNNcxeajLtX0ZzZLESPwXDGDxoZdttEtOZW4,6675
98
- bumble/profiles/gmap.py,sha256=jNhYoqD9oLkZubCQ9zllwKtXVyVoZVoIZJcI_DUuJGw,7035
99
- bumble/profiles/hap.py,sha256=IbE1KzjIMEq6FxtFqTgA2DN0pPnpu0996KJRjuN3oaQ,25614
100
- bumble/profiles/heart_rate_service.py,sha256=56LFL3lYoCMJZ-4ec3mQPDqcvr5lahCeZzDVRKsbakE,8609
97
+ bumble/profiles/device_information_service.py,sha256=CyJmLdMCBYpQMNp-35nljjlPVTR6ZIVmkORhT_FreaE,6351
98
+ bumble/profiles/gap.py,sha256=UvynHzS_MfN_Bjjfw81CdAY49Zm6ejq-dxFp988zvNE,4033
99
+ bumble/profiles/gatt_service.py,sha256=BgQLOO5iAlOfammLLXQIivnggiVMYGty94MxN9BBKv0,6729
100
+ bumble/profiles/gmap.py,sha256=t59LucWKYSW8vAZIf3DHU3sbt3tdbw5M8BDE2bxTN-k,7327
101
+ bumble/profiles/hap.py,sha256=sG8yG54nH6A8u5Jhw7hZoWAf_ki1Sged7KPvEwtq9Nk,25710
102
+ bumble/profiles/heart_rate_service.py,sha256=Hw46AHc1NEVl0HAvjt4kc_HNSFK3byvETcXraZtW0ow,9251
101
103
  bumble/profiles/le_audio.py,sha256=eDdMLwaisA3Wg7XhNVDoLOWchJ5CCfT0cqxOqCo8l04,5839
102
- bumble/profiles/mcp.py,sha256=vIN1r_if4LmOcGCgZuDYTYLMQzU6-1pKUFx1Z3iSAeY,17415
103
- bumble/profiles/pacs.py,sha256=3q_d2Dfc9kYIip9TChgu49SG_BE-vQhhLyDgJh-_0eM,10012
104
+ bumble/profiles/mcp.py,sha256=smfXmWDPNg1_ov-cisj1BRGaa59jvH5ByRL-DqN4SJU,17510
105
+ bumble/profiles/pacs.py,sha256=MyBD015F9nZz-D9T6EQ9oQabYin0QdvueU9BS3zUeFc,10427
104
106
  bumble/profiles/pbp.py,sha256=51aoQcZMXzTzeatHd0zNVN7kYcv4atzr2OWpzxlSVP8,1630
105
107
  bumble/profiles/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
106
- bumble/profiles/tmap.py,sha256=24hPPDc4xVKanRqTHRaOG_R95qmUVrO5_m_MhCcltiQ,2833
107
- bumble/profiles/vcs.py,sha256=cB9-DU9gFhGQxfjStRCAZmkGXj3SDtfZlBtBOR26c_E,8149
108
- bumble/profiles/vocs.py,sha256=V_UWVL83MPR2GNJMouiMzXUhsazD1xhbrQqZ2gP_mFw,10895
108
+ bumble/profiles/tmap.py,sha256=8VocfKspJpK8UiYS8sSNYXYaE6qUI-OPQnRPeMoFh6A,2935
109
+ bumble/profiles/vcs.py,sha256=3Y2HWNkhEqwY3xkfLy85ntTQm5lZyKO9X4FNSHvLuHs,8232
110
+ bumble/profiles/vocs.py,sha256=ZgufVLiSenmYgy1eteKhjOyLUbkJxC3iVo61azq39zc,11127
109
111
  bumble/tools/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
110
112
  bumble/tools/generate_company_id_list.py,sha256=ysbPb3zmxKFBiSQ_MBG2r15-sqR5P_GWT6i0YUTTXOM,1736
111
113
  bumble/tools/intel_fw_download.py,sha256=8YJ3y3yww7bEvL9cINq9cFucoCWf-Gf3pyu-gl4-UJE,4453
@@ -126,7 +128,7 @@ bumble/transport/tcp_client.py,sha256=deyUJYpj04QE00Mw_PTU5PHPA6mr1Nui3f5-QCy2zO
126
128
  bumble/transport/tcp_server.py,sha256=tvu7FuPeqiXfoj2HQU8wu4AiwKjDDDCKlKjgtqWc5hg,3779
127
129
  bumble/transport/udp.py,sha256=di8I6HHACgBx3un-dzAahz9lTIUrh4LdeuYpeoifQEM,2239
128
130
  bumble/transport/unix.py,sha256=CS6Ksrkat5uUXOpo7RlxAYJsM3lMS4T3OrdCqzIHTg8,1981
129
- bumble/transport/usb.py,sha256=K-uFelrgEA9Q2IxWpGui2PmuX2-DvCSczkQQXI22qLQ,22179
131
+ bumble/transport/usb.py,sha256=QD3UTdl20wEXGgHJPfEG2nZ0M9m6ntk9L1039QLfsF4,22132
130
132
  bumble/transport/vhci.py,sha256=iI2WpighnvIP5zeyJUFSbjEdmCo24CWMdICamIcyJck,2250
131
133
  bumble/transport/ws_client.py,sha256=9gqm5jlVT_H6LfwsQwPpky07CINhgOK96ef53SMAxms,1757
132
134
  bumble/transport/ws_server.py,sha256=goe4xx7OnZiJy1a00Bg0CXM8uJhsGXbsijMYq2n62bI,3328
@@ -171,9 +173,9 @@ bumble/vendor/android/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3h
171
173
  bumble/vendor/android/hci.py,sha256=-ZryisGrnxYEXEM9kcR2ta4joNhAgAxgRYAEYLq5tT0,11651
172
174
  bumble/vendor/zephyr/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
173
175
  bumble/vendor/zephyr/hci.py,sha256=d83bC0TvT947eN4roFjLkQefWtHOoNsr4xib2ctSkvA,3195
174
- bumble-0.0.207.dist-info/LICENSE,sha256=FvaYh4NRWIGgS_OwoBs5gFgkCmAghZ-DYnIGBZPuw-s,12142
175
- bumble-0.0.207.dist-info/METADATA,sha256=-k4cZeBTfBD0smZbv1GOk9jsvJVd2toT4qS6bZRqXws,5966
176
- bumble-0.0.207.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
177
- bumble-0.0.207.dist-info/entry_points.txt,sha256=0mBShtMEyPU3NxVWkl-cixtC7W04yZxJmAh2WN-UzX8,1140
178
- bumble-0.0.207.dist-info/top_level.txt,sha256=tV6JJKaHPYMFiJYiBYFW24PCcfLxTJZdlu6BmH3Cb00,7
179
- bumble-0.0.207.dist-info/RECORD,,
176
+ bumble-0.0.209.dist-info/LICENSE,sha256=FvaYh4NRWIGgS_OwoBs5gFgkCmAghZ-DYnIGBZPuw-s,12142
177
+ bumble-0.0.209.dist-info/METADATA,sha256=eJFzI8Lt8wuQz1FLTv8CwGBhVrbpff-hXTMhQ1R3ZOQ,6042
178
+ bumble-0.0.209.dist-info/WHEEL,sha256=52BFRY2Up02UkjOa29eZOS2VxUrpPORXg1pkohGGUS8,91
179
+ bumble-0.0.209.dist-info/entry_points.txt,sha256=0mBShtMEyPU3NxVWkl-cixtC7W04yZxJmAh2WN-UzX8,1140
180
+ bumble-0.0.209.dist-info/top_level.txt,sha256=tV6JJKaHPYMFiJYiBYFW24PCcfLxTJZdlu6BmH3Cb00,7
181
+ bumble-0.0.209.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (75.8.0)
2
+ Generator: setuptools (76.0.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5