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.
- bumble/_version.py +9 -4
- bumble/apps/auracast.py +29 -35
- bumble/apps/bench.py +13 -10
- bumble/apps/console.py +19 -12
- bumble/apps/gg_bridge.py +1 -1
- bumble/att.py +61 -39
- bumble/controller.py +7 -8
- bumble/core.py +306 -159
- bumble/device.py +127 -82
- bumble/gatt.py +25 -228
- bumble/gatt_adapters.py +374 -0
- bumble/gatt_client.py +38 -31
- bumble/gatt_server.py +5 -5
- bumble/hci.py +76 -71
- bumble/host.py +19 -8
- bumble/l2cap.py +2 -2
- bumble/link.py +2 -2
- bumble/pairing.py +5 -5
- bumble/pandora/host.py +19 -23
- bumble/pandora/security.py +2 -3
- bumble/pandora/utils.py +2 -2
- bumble/profiles/aics.py +33 -23
- bumble/profiles/ancs.py +514 -0
- bumble/profiles/ascs.py +2 -1
- bumble/profiles/asha.py +11 -9
- bumble/profiles/bass.py +8 -5
- bumble/profiles/battery_service.py +13 -3
- bumble/profiles/device_information_service.py +16 -14
- bumble/profiles/gap.py +12 -8
- bumble/profiles/gatt_service.py +1 -0
- bumble/profiles/gmap.py +16 -11
- bumble/profiles/hap.py +8 -6
- bumble/profiles/heart_rate_service.py +20 -4
- bumble/profiles/mcp.py +11 -9
- bumble/profiles/pacs.py +37 -24
- bumble/profiles/tmap.py +6 -4
- bumble/profiles/vcs.py +6 -5
- bumble/profiles/vocs.py +49 -41
- bumble/smp.py +3 -3
- bumble/transport/usb.py +1 -3
- bumble/utils.py +10 -0
- {bumble-0.0.207.dist-info → bumble-0.0.209.dist-info}/METADATA +3 -3
- {bumble-0.0.207.dist-info → bumble-0.0.209.dist-info}/RECORD +47 -45
- {bumble-0.0.207.dist-info → bumble-0.0.209.dist-info}/WHEEL +1 -1
- {bumble-0.0.207.dist-info → bumble-0.0.209.dist-info}/LICENSE +0 -0
- {bumble-0.0.207.dist-info → bumble-0.0.209.dist-info}/entry_points.txt +0 -0
- {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
|
-
|
|
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.
|
|
85
|
-
await connection.device.notify_subscribers(attribute=self.
|
|
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
|
-
|
|
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.
|
|
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.
|
|
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
|
-
|
|
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.
|
|
167
|
+
assert self.attribute
|
|
166
168
|
|
|
167
169
|
self.audio_output_description = value.decode('utf-8')
|
|
168
|
-
await connection.device.notify_subscribers(attribute=self.
|
|
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.
|
|
226
|
-
|
|
227
|
-
self.volume_offset_control_point_characteristic =
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
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 =
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
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.
|
|
251
|
-
self.audio_output_description_characteristic
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 ==
|
|
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 !=
|
|
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
|
|
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.
|
|
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.
|
|
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=
|
|
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=
|
|
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=
|
|
15
|
-
bumble/core.py,sha256=
|
|
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=
|
|
18
|
+
bumble/device.py,sha256=7lj4wPufJuAhh9KWsvIyeDlDrBr-_QgI7NNj18ow2sM,231548
|
|
19
19
|
bumble/gap.py,sha256=dRU2_TWvqTDx80hxeSbXlWIeWvptWH4_XbItG5y948Q,2138
|
|
20
|
-
bumble/gatt.py,sha256
|
|
21
|
-
bumble/
|
|
22
|
-
bumble/
|
|
23
|
-
bumble/
|
|
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=
|
|
28
|
+
bumble/host.py,sha256=Ytxk0_4q5VTJ2MiWBlmSr6ryKCedGBtfMMJl0LeyHmc,61529
|
|
28
29
|
bumble/keys.py,sha256=WbIQ7Ob81mW75qmEPQ2rBLfnqBMA-ts2yowWXP9UaCY,12654
|
|
29
|
-
bumble/l2cap.py,sha256=
|
|
30
|
-
bumble/link.py,sha256=
|
|
31
|
-
bumble/pairing.py,sha256=
|
|
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=
|
|
37
|
+
bumble/smp.py,sha256=WiEgjsAb2DepLPCajMOeQJbFjs3I9yJOrTrGjcc9mQ4,77861
|
|
37
38
|
bumble/snoop.py,sha256=1mzwmp9LToUXbPnFsLrt8S4UHs0kqzbu7LDydwbmkZI,5715
|
|
38
|
-
bumble/utils.py,sha256=
|
|
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=
|
|
42
|
-
bumble/apps/bench.py,sha256=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
85
|
-
bumble/pandora/utils.py,sha256=
|
|
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=
|
|
88
|
-
bumble/profiles/
|
|
89
|
-
bumble/profiles/
|
|
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=
|
|
92
|
-
bumble/profiles/battery_service.py,sha256
|
|
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=
|
|
96
|
-
bumble/profiles/gap.py,sha256=
|
|
97
|
-
bumble/profiles/gatt_service.py,sha256=
|
|
98
|
-
bumble/profiles/gmap.py,sha256=
|
|
99
|
-
bumble/profiles/hap.py,sha256=
|
|
100
|
-
bumble/profiles/heart_rate_service.py,sha256=
|
|
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=
|
|
103
|
-
bumble/profiles/pacs.py,sha256=
|
|
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=
|
|
107
|
-
bumble/profiles/vcs.py,sha256=
|
|
108
|
-
bumble/profiles/vocs.py,sha256=
|
|
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=
|
|
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.
|
|
175
|
-
bumble-0.0.
|
|
176
|
-
bumble-0.0.
|
|
177
|
-
bumble-0.0.
|
|
178
|
-
bumble-0.0.
|
|
179
|
-
bumble-0.0.
|
|
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,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|