bumble 0.0.222__py3-none-any.whl → 0.0.223__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/apps/usb_probe.py +15 -2
- bumble/att.py +97 -32
- bumble/avctp.py +1 -1
- bumble/avdtp.py +3 -3
- bumble/device.py +2 -5
- bumble/drivers/rtk.py +26 -3
- bumble/gatt.py +2 -2
- bumble/gatt_client.py +5 -4
- bumble/gatt_server.py +100 -1
- bumble/hci.py +51 -50
- bumble/hid.py +2 -2
- bumble/host.py +10 -0
- bumble/l2cap.py +3 -1
- bumble/pandora/l2cap.py +1 -1
- bumble/profiles/battery_service.py +25 -34
- bumble/profiles/heart_rate_service.py +130 -121
- bumble/rfcomm.py +1 -1
- bumble/sdp.py +2 -2
- {bumble-0.0.222.dist-info → bumble-0.0.223.dist-info}/METADATA +1 -1
- {bumble-0.0.222.dist-info → bumble-0.0.223.dist-info}/RECORD +25 -25
- {bumble-0.0.222.dist-info → bumble-0.0.223.dist-info}/WHEEL +0 -0
- {bumble-0.0.222.dist-info → bumble-0.0.223.dist-info}/entry_points.txt +0 -0
- {bumble-0.0.222.dist-info → bumble-0.0.223.dist-info}/licenses/LICENSE +0 -0
- {bumble-0.0.222.dist-info → bumble-0.0.223.dist-info}/top_level.txt +0 -0
|
@@ -18,40 +18,30 @@
|
|
|
18
18
|
# -----------------------------------------------------------------------------
|
|
19
19
|
from __future__ import annotations
|
|
20
20
|
|
|
21
|
+
import dataclasses
|
|
22
|
+
import enum
|
|
21
23
|
import struct
|
|
22
|
-
from
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
from
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
GATT_HEART_RATE_CONTROL_POINT_CHARACTERISTIC,
|
|
29
|
-
GATT_HEART_RATE_MEASUREMENT_CHARACTERISTIC,
|
|
30
|
-
GATT_HEART_RATE_SERVICE,
|
|
31
|
-
Characteristic,
|
|
32
|
-
CharacteristicValue,
|
|
33
|
-
TemplateService,
|
|
34
|
-
)
|
|
35
|
-
from bumble.gatt_adapters import (
|
|
36
|
-
DelegatedCharacteristicAdapter,
|
|
37
|
-
PackedCharacteristicAdapter,
|
|
38
|
-
SerializableCharacteristicAdapter,
|
|
39
|
-
)
|
|
40
|
-
from bumble.gatt_client import CharacteristicProxy, ProfileServiceProxy
|
|
24
|
+
from collections.abc import Callable, Sequence
|
|
25
|
+
from typing import Any
|
|
26
|
+
|
|
27
|
+
from typing_extensions import Self
|
|
28
|
+
|
|
29
|
+
from bumble import att, core, device, gatt, gatt_adapters, gatt_client, utils
|
|
41
30
|
|
|
42
31
|
|
|
43
32
|
# -----------------------------------------------------------------------------
|
|
44
|
-
class HeartRateService(TemplateService):
|
|
45
|
-
UUID = GATT_HEART_RATE_SERVICE
|
|
33
|
+
class HeartRateService(gatt.TemplateService):
|
|
34
|
+
UUID = gatt.GATT_HEART_RATE_SERVICE
|
|
35
|
+
|
|
46
36
|
HEART_RATE_CONTROL_POINT_FORMAT = 'B'
|
|
47
37
|
CONTROL_POINT_NOT_SUPPORTED = 0x80
|
|
48
38
|
RESET_ENERGY_EXPENDED = 0x01
|
|
49
39
|
|
|
50
|
-
heart_rate_measurement_characteristic: Characteristic[HeartRateMeasurement]
|
|
51
|
-
body_sensor_location_characteristic: Characteristic[BodySensorLocation]
|
|
52
|
-
heart_rate_control_point_characteristic: Characteristic[int]
|
|
40
|
+
heart_rate_measurement_characteristic: gatt.Characteristic[HeartRateMeasurement]
|
|
41
|
+
body_sensor_location_characteristic: gatt.Characteristic[BodySensorLocation]
|
|
42
|
+
heart_rate_control_point_characteristic: gatt.Characteristic[int]
|
|
53
43
|
|
|
54
|
-
class BodySensorLocation(
|
|
44
|
+
class BodySensorLocation(utils.OpenIntEnum):
|
|
55
45
|
OTHER = 0
|
|
56
46
|
CHEST = 1
|
|
57
47
|
WRIST = 2
|
|
@@ -60,82 +50,90 @@ class HeartRateService(TemplateService):
|
|
|
60
50
|
EAR_LOBE = 5
|
|
61
51
|
FOOT = 6
|
|
62
52
|
|
|
53
|
+
@dataclasses.dataclass
|
|
63
54
|
class HeartRateMeasurement:
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
55
|
+
heart_rate: int
|
|
56
|
+
sensor_contact_detected: bool | None = None
|
|
57
|
+
energy_expended: int | None = None
|
|
58
|
+
rr_intervals: Sequence[float] | None = None
|
|
59
|
+
|
|
60
|
+
class Flag(enum.IntFlag):
|
|
61
|
+
INT16_HEART_RATE = 1 << 0
|
|
62
|
+
SENSOR_CONTACT_DETECTED = 1 << 1
|
|
63
|
+
SENSOR_CONTACT_SUPPORTED = 1 << 2
|
|
64
|
+
ENERGY_EXPENDED_STATUS = 1 << 3
|
|
65
|
+
RR_INTERVAL = 1 << 4
|
|
66
|
+
|
|
67
|
+
def __post_init__(self) -> None:
|
|
68
|
+
if self.heart_rate < 0 or self.heart_rate > 0xFFFF:
|
|
72
69
|
raise core.InvalidArgumentError('heart_rate out of range')
|
|
73
70
|
|
|
74
|
-
if energy_expended is not None and (
|
|
75
|
-
energy_expended < 0 or energy_expended > 0xFFFF
|
|
71
|
+
if self.energy_expended is not None and (
|
|
72
|
+
self.energy_expended < 0 or self.energy_expended > 0xFFFF
|
|
76
73
|
):
|
|
77
74
|
raise core.InvalidArgumentError('energy_expended out of range')
|
|
78
75
|
|
|
79
|
-
if rr_intervals:
|
|
80
|
-
for rr_interval in rr_intervals:
|
|
76
|
+
if self.rr_intervals:
|
|
77
|
+
for rr_interval in self.rr_intervals:
|
|
81
78
|
if rr_interval < 0 or rr_interval * 1024 > 0xFFFF:
|
|
82
79
|
raise core.InvalidArgumentError('rr_intervals out of range')
|
|
83
80
|
|
|
84
|
-
self.heart_rate = heart_rate
|
|
85
|
-
self.sensor_contact_detected = sensor_contact_detected
|
|
86
|
-
self.energy_expended = energy_expended
|
|
87
|
-
self.rr_intervals = rr_intervals
|
|
88
|
-
|
|
89
81
|
@classmethod
|
|
90
|
-
def from_bytes(cls, data):
|
|
82
|
+
def from_bytes(cls, data: bytes) -> Self:
|
|
91
83
|
flags = data[0]
|
|
92
84
|
offset = 1
|
|
93
85
|
|
|
94
|
-
if flags &
|
|
95
|
-
|
|
86
|
+
if flags & cls.Flag.INT16_HEART_RATE:
|
|
87
|
+
heart_rate = struct.unpack_from('<H', data, offset)[0]
|
|
96
88
|
offset += 2
|
|
97
89
|
else:
|
|
98
|
-
|
|
90
|
+
heart_rate = struct.unpack_from('B', data, offset)[0]
|
|
99
91
|
offset += 1
|
|
100
92
|
|
|
101
|
-
if flags &
|
|
102
|
-
sensor_contact_detected = flags &
|
|
93
|
+
if flags & cls.Flag.SENSOR_CONTACT_SUPPORTED:
|
|
94
|
+
sensor_contact_detected = flags & cls.Flag.SENSOR_CONTACT_DETECTED != 0
|
|
103
95
|
else:
|
|
104
96
|
sensor_contact_detected = None
|
|
105
97
|
|
|
106
|
-
if flags &
|
|
98
|
+
if flags & cls.Flag.ENERGY_EXPENDED_STATUS:
|
|
107
99
|
energy_expended = struct.unpack_from('<H', data, offset)[0]
|
|
108
100
|
offset += 2
|
|
109
101
|
else:
|
|
110
102
|
energy_expended = None
|
|
111
103
|
|
|
112
|
-
|
|
104
|
+
rr_intervals: Sequence[float] | None = None
|
|
105
|
+
if flags & cls.Flag.RR_INTERVAL:
|
|
113
106
|
rr_intervals = tuple(
|
|
114
|
-
struct.unpack_from('<H', data,
|
|
115
|
-
for i in range(
|
|
107
|
+
struct.unpack_from('<H', data, i)[0] / 1024
|
|
108
|
+
for i in range(offset, len(data), 2)
|
|
116
109
|
)
|
|
117
|
-
else:
|
|
118
|
-
rr_intervals = ()
|
|
119
110
|
|
|
120
|
-
return cls(
|
|
111
|
+
return cls(
|
|
112
|
+
heart_rate=heart_rate,
|
|
113
|
+
sensor_contact_detected=sensor_contact_detected,
|
|
114
|
+
energy_expended=energy_expended,
|
|
115
|
+
rr_intervals=rr_intervals,
|
|
116
|
+
)
|
|
121
117
|
|
|
122
|
-
def __bytes__(self):
|
|
118
|
+
def __bytes__(self) -> bytes:
|
|
119
|
+
flags = 0
|
|
123
120
|
if self.heart_rate < 256:
|
|
124
|
-
flags = 0
|
|
125
121
|
data = struct.pack('B', self.heart_rate)
|
|
126
122
|
else:
|
|
127
|
-
flags
|
|
123
|
+
flags |= self.Flag.INT16_HEART_RATE
|
|
128
124
|
data = struct.pack('<H', self.heart_rate)
|
|
129
125
|
|
|
130
126
|
if self.sensor_contact_detected is not None:
|
|
131
|
-
flags |=
|
|
127
|
+
flags |= self.Flag.SENSOR_CONTACT_SUPPORTED
|
|
128
|
+
if self.sensor_contact_detected:
|
|
129
|
+
flags |= self.Flag.SENSOR_CONTACT_DETECTED
|
|
132
130
|
|
|
133
131
|
if self.energy_expended is not None:
|
|
134
|
-
flags |=
|
|
132
|
+
flags |= self.Flag.ENERGY_EXPENDED_STATUS
|
|
135
133
|
data += struct.pack('<H', self.energy_expended)
|
|
136
134
|
|
|
137
|
-
if self.rr_intervals:
|
|
138
|
-
flags |=
|
|
135
|
+
if self.rr_intervals is not None:
|
|
136
|
+
flags |= self.Flag.RR_INTERVAL
|
|
139
137
|
data += b''.join(
|
|
140
138
|
[
|
|
141
139
|
struct.pack('<H', int(rr_interval * 1024))
|
|
@@ -145,57 +143,67 @@ class HeartRateService(TemplateService):
|
|
|
145
143
|
|
|
146
144
|
return bytes([flags]) + data
|
|
147
145
|
|
|
148
|
-
def __str__(self):
|
|
149
|
-
return (
|
|
150
|
-
f'HeartRateMeasurement(heart_rate={self.heart_rate},'
|
|
151
|
-
f' sensor_contact_detected={self.sensor_contact_detected},'
|
|
152
|
-
f' energy_expended={self.energy_expended},'
|
|
153
|
-
f' rr_intervals={self.rr_intervals})'
|
|
154
|
-
)
|
|
155
|
-
|
|
156
146
|
def __init__(
|
|
157
147
|
self,
|
|
158
|
-
read_heart_rate_measurement
|
|
159
|
-
|
|
160
|
-
|
|
148
|
+
read_heart_rate_measurement: Callable[
|
|
149
|
+
[device.Connection], HeartRateMeasurement
|
|
150
|
+
],
|
|
151
|
+
body_sensor_location: HeartRateService.BodySensorLocation | None = None,
|
|
152
|
+
reset_energy_expended: Callable[[device.Connection], Any] | None = None,
|
|
161
153
|
):
|
|
162
|
-
self.heart_rate_measurement_characteristic =
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
154
|
+
self.heart_rate_measurement_characteristic = (
|
|
155
|
+
gatt_adapters.SerializableCharacteristicAdapter(
|
|
156
|
+
gatt.Characteristic(
|
|
157
|
+
uuid=gatt.GATT_HEART_RATE_MEASUREMENT_CHARACTERISTIC,
|
|
158
|
+
properties=gatt.Characteristic.Properties.NOTIFY,
|
|
159
|
+
permissions=gatt.Characteristic.Permissions(0),
|
|
160
|
+
value=gatt.CharacteristicValue(read=read_heart_rate_measurement),
|
|
161
|
+
),
|
|
162
|
+
HeartRateService.HeartRateMeasurement,
|
|
163
|
+
)
|
|
170
164
|
)
|
|
171
|
-
characteristics = [
|
|
165
|
+
characteristics: list[gatt.Characteristic] = [
|
|
166
|
+
self.heart_rate_measurement_characteristic
|
|
167
|
+
]
|
|
172
168
|
|
|
173
169
|
if body_sensor_location is not None:
|
|
174
|
-
self.body_sensor_location_characteristic =
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
170
|
+
self.body_sensor_location_characteristic = (
|
|
171
|
+
gatt_adapters.EnumCharacteristicAdapter(
|
|
172
|
+
gatt.Characteristic(
|
|
173
|
+
uuid=gatt.GATT_BODY_SENSOR_LOCATION_CHARACTERISTIC,
|
|
174
|
+
properties=gatt.Characteristic.Properties.READ,
|
|
175
|
+
permissions=gatt.Characteristic.READABLE,
|
|
176
|
+
value=body_sensor_location,
|
|
177
|
+
),
|
|
178
|
+
cls=self.BodySensorLocation,
|
|
179
|
+
length=1,
|
|
180
|
+
)
|
|
179
181
|
)
|
|
180
182
|
characteristics.append(self.body_sensor_location_characteristic)
|
|
181
183
|
|
|
182
184
|
if reset_energy_expended:
|
|
183
185
|
|
|
184
|
-
def write_heart_rate_control_point_value(
|
|
186
|
+
def write_heart_rate_control_point_value(
|
|
187
|
+
connection: device.Connection, value: bytes
|
|
188
|
+
) -> None:
|
|
185
189
|
if value == self.RESET_ENERGY_EXPENDED:
|
|
186
190
|
if reset_energy_expended is not None:
|
|
187
191
|
reset_energy_expended(connection)
|
|
188
192
|
else:
|
|
189
|
-
raise ATT_Error(self.CONTROL_POINT_NOT_SUPPORTED)
|
|
190
|
-
|
|
191
|
-
self.heart_rate_control_point_characteristic =
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
193
|
+
raise att.ATT_Error(self.CONTROL_POINT_NOT_SUPPORTED)
|
|
194
|
+
|
|
195
|
+
self.heart_rate_control_point_characteristic = (
|
|
196
|
+
gatt_adapters.PackedCharacteristicAdapter(
|
|
197
|
+
gatt.Characteristic(
|
|
198
|
+
uuid=gatt.GATT_HEART_RATE_CONTROL_POINT_CHARACTERISTIC,
|
|
199
|
+
properties=gatt.Characteristic.Properties.WRITE,
|
|
200
|
+
permissions=gatt.Characteristic.WRITEABLE,
|
|
201
|
+
value=gatt.CharacteristicValue(
|
|
202
|
+
write=write_heart_rate_control_point_value
|
|
203
|
+
),
|
|
204
|
+
),
|
|
205
|
+
pack_format=HeartRateService.HEART_RATE_CONTROL_POINT_FORMAT,
|
|
206
|
+
)
|
|
199
207
|
)
|
|
200
208
|
characteristics.append(self.heart_rate_control_point_characteristic)
|
|
201
209
|
|
|
@@ -203,50 +211,51 @@ class HeartRateService(TemplateService):
|
|
|
203
211
|
|
|
204
212
|
|
|
205
213
|
# -----------------------------------------------------------------------------
|
|
206
|
-
class HeartRateServiceProxy(ProfileServiceProxy):
|
|
214
|
+
class HeartRateServiceProxy(gatt_client.ProfileServiceProxy):
|
|
207
215
|
SERVICE_CLASS = HeartRateService
|
|
208
216
|
|
|
209
|
-
heart_rate_measurement:
|
|
210
|
-
|
|
211
|
-
|
|
217
|
+
heart_rate_measurement: gatt_client.CharacteristicProxy[
|
|
218
|
+
HeartRateService.HeartRateMeasurement
|
|
219
|
+
]
|
|
212
220
|
body_sensor_location: (
|
|
213
|
-
CharacteristicProxy[HeartRateService.BodySensorLocation] | None
|
|
221
|
+
gatt_client.CharacteristicProxy[HeartRateService.BodySensorLocation] | None
|
|
214
222
|
)
|
|
215
|
-
heart_rate_control_point: CharacteristicProxy[int] | None
|
|
223
|
+
heart_rate_control_point: gatt_client.CharacteristicProxy[int] | None
|
|
216
224
|
|
|
217
|
-
def __init__(self, service_proxy):
|
|
225
|
+
def __init__(self, service_proxy: gatt_client.ServiceProxy) -> None:
|
|
218
226
|
self.service_proxy = service_proxy
|
|
219
227
|
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
228
|
+
self.heart_rate_measurement = (
|
|
229
|
+
gatt_adapters.SerializableCharacteristicProxyAdapter(
|
|
230
|
+
service_proxy.get_required_characteristic_by_uuid(
|
|
231
|
+
gatt.GATT_HEART_RATE_MEASUREMENT_CHARACTERISTIC
|
|
232
|
+
),
|
|
233
|
+
HeartRateService.HeartRateMeasurement,
|
|
225
234
|
)
|
|
226
|
-
|
|
227
|
-
self.heart_rate_measurement = None
|
|
235
|
+
)
|
|
228
236
|
|
|
229
237
|
if characteristics := service_proxy.get_characteristics_by_uuid(
|
|
230
|
-
GATT_BODY_SENSOR_LOCATION_CHARACTERISTIC
|
|
238
|
+
gatt.GATT_BODY_SENSOR_LOCATION_CHARACTERISTIC
|
|
231
239
|
):
|
|
232
|
-
self.body_sensor_location =
|
|
233
|
-
characteristics[0],
|
|
234
|
-
decode=lambda value: HeartRateService.BodySensorLocation(value[0]),
|
|
240
|
+
self.body_sensor_location = gatt_adapters.EnumCharacteristicProxyAdapter(
|
|
241
|
+
characteristics[0], cls=HeartRateService.BodySensorLocation, length=1
|
|
235
242
|
)
|
|
236
243
|
else:
|
|
237
244
|
self.body_sensor_location = None
|
|
238
245
|
|
|
239
246
|
if characteristics := service_proxy.get_characteristics_by_uuid(
|
|
240
|
-
GATT_HEART_RATE_CONTROL_POINT_CHARACTERISTIC
|
|
247
|
+
gatt.GATT_HEART_RATE_CONTROL_POINT_CHARACTERISTIC
|
|
241
248
|
):
|
|
242
|
-
self.heart_rate_control_point =
|
|
243
|
-
|
|
244
|
-
|
|
249
|
+
self.heart_rate_control_point = (
|
|
250
|
+
gatt_adapters.PackedCharacteristicProxyAdapter(
|
|
251
|
+
characteristics[0],
|
|
252
|
+
pack_format=HeartRateService.HEART_RATE_CONTROL_POINT_FORMAT,
|
|
253
|
+
)
|
|
245
254
|
)
|
|
246
255
|
else:
|
|
247
256
|
self.heart_rate_control_point = None
|
|
248
257
|
|
|
249
|
-
async def reset_energy_expended(self):
|
|
258
|
+
async def reset_energy_expended(self) -> None:
|
|
250
259
|
if self.heart_rate_control_point is not None:
|
|
251
260
|
return await self.heart_rate_control_point.write_value(
|
|
252
261
|
HeartRateService.RESET_ENERGY_EXPENDED
|
bumble/rfcomm.py
CHANGED
|
@@ -800,7 +800,7 @@ class Multiplexer(utils.EventEmitter):
|
|
|
800
800
|
|
|
801
801
|
def send_frame(self, frame: RFCOMM_Frame) -> None:
|
|
802
802
|
logger.debug(f'>>> Multiplexer sending {frame}')
|
|
803
|
-
self.l2cap_channel.
|
|
803
|
+
self.l2cap_channel.write(bytes(frame))
|
|
804
804
|
|
|
805
805
|
def on_pdu(self, pdu: bytes) -> None:
|
|
806
806
|
frame = RFCOMM_Frame.from_bytes(pdu)
|
bumble/sdp.py
CHANGED
|
@@ -847,7 +847,7 @@ class Client:
|
|
|
847
847
|
self.pending_request = request
|
|
848
848
|
|
|
849
849
|
try:
|
|
850
|
-
self.channel.
|
|
850
|
+
self.channel.write(bytes(request))
|
|
851
851
|
return await self.pending_response
|
|
852
852
|
finally:
|
|
853
853
|
self.pending_request = None
|
|
@@ -1061,7 +1061,7 @@ class Server:
|
|
|
1061
1061
|
|
|
1062
1062
|
def send_response(self, response):
|
|
1063
1063
|
logger.debug(f'{color(">>> Sending SDP Response", "blue")}: {response}')
|
|
1064
|
-
self.channel.
|
|
1064
|
+
self.channel.write(response)
|
|
1065
1065
|
|
|
1066
1066
|
def match_services(self, search_pattern: DataElement) -> dict[int, Service]:
|
|
1067
1067
|
# Find the services for which the attributes in the pattern is a subset of the
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
bumble/__init__.py,sha256=Q8jkz6rgl95IMAeInQVt_2GLoJl3DcEP2cxtrQ-ho5c,110
|
|
2
|
-
bumble/_version.py,sha256=
|
|
2
|
+
bumble/_version.py,sha256=9uh_9z-AI3P_KHkj7Uha8PG4fBl1EJI_OI6DNBuZeXA,708
|
|
3
3
|
bumble/a2dp.py,sha256=4eFKYOXkl10TRAJqVw4no6aCilYHdmgtd2ZMNY0yNQo,33436
|
|
4
4
|
bumble/at.py,sha256=xtboorCqSdRDoIfRFOIhvV5x2cgXaYqKk5FSMNzuYPo,3062
|
|
5
|
-
bumble/att.py,sha256=
|
|
5
|
+
bumble/att.py,sha256=FkpwAauU8RPh25n90v8NxXU276dAEQJwX37jwUoled0,38553
|
|
6
6
|
bumble/avc.py,sha256=0RY16pJ1zAPqqMjWhNW9MQHrqFo2A32ddYUH8gvRDn0,16352
|
|
7
|
-
bumble/avctp.py,sha256=
|
|
8
|
-
bumble/avdtp.py,sha256=
|
|
7
|
+
bumble/avctp.py,sha256=Q_cb3CU9g85owuhDGNpYt2y68szGP0-8EQ9KUlXnkis,9668
|
|
8
|
+
bumble/avdtp.py,sha256=nsh_9WkukJH8mEuBjnnAxpQ2QmbY5Yk4Sbtd-ujD1IU,78289
|
|
9
9
|
bumble/avrcp.py,sha256=urh7lTSRoHaT3IhlfxHKkQfkg05HiX7ZZ-j7PA1IjbY,87257
|
|
10
10
|
bumble/bridge.py,sha256=yXwZNUe7pRpuTt41PEmgtfjBLpQKdDwvcxfbYxObqIU,3015
|
|
11
11
|
bumble/codecs.py,sha256=JZnz-8XVNg8QP2_Y_x6h3yBUgSJW7lwdrsPTLBW_d10,20933
|
|
@@ -15,28 +15,28 @@ bumble/controller.py,sha256=M8ZFo_X-5duyeyvfnxBnBKosWwQeWLvaIJ0uXZbfzS4,98828
|
|
|
15
15
|
bumble/core.py,sha256=bmMtfJI4gnNasYGRddLRih5Jp889IMxOO4iXrcOwi88,94451
|
|
16
16
|
bumble/data_types.py,sha256=vh84h4eHjzNtqbLdoe5_ECXTDGztm7bZ9YpAfwtWNLI,32858
|
|
17
17
|
bumble/decoder.py,sha256=_mZbnuwURkpSrtoTqFjoqe6z_NxakbUxd3zybhGHHz0,9691
|
|
18
|
-
bumble/device.py,sha256=
|
|
18
|
+
bumble/device.py,sha256=6l4ziCEn58C_joJEhL6lSQXDgC0KTj3zTo4FqFn8iww,249207
|
|
19
19
|
bumble/gap.py,sha256=j5mevt__i_fSdIc_B3x7YvCJLeCc7bVq8omRphxwXNw,2144
|
|
20
|
-
bumble/gatt.py,sha256=
|
|
20
|
+
bumble/gatt.py,sha256=u_HaOEUzcNp5WnZ7fqQ9z3JUuZOA3DwvL41PD8asNHY,34482
|
|
21
21
|
bumble/gatt_adapters.py,sha256=gTOji4M7V0R6NhxULDZi4KcN6yAis_q9Colvwj6Skto,13163
|
|
22
|
-
bumble/gatt_client.py,sha256=
|
|
23
|
-
bumble/gatt_server.py,sha256=
|
|
24
|
-
bumble/hci.py,sha256=
|
|
22
|
+
bumble/gatt_client.py,sha256=yUXcsVYSGS4uyXGpwfWyPjXA_FNCuWxBDelNS2YMVRw,45923
|
|
23
|
+
bumble/gatt_server.py,sha256=DTwlSNnFiuEk-ZglY7uJvITNuN17gv1Hp60RJIQIyjM,43960
|
|
24
|
+
bumble/hci.py,sha256=jiKKrCfDf9cbjbsHurFiI0Xo3_NAyjP-2Bfx8F09hh4,329838
|
|
25
25
|
bumble/helpers.py,sha256=swdXlElfaw-RbfMIK_Qch1Hh4Rz1B6bjN4Yl0yv-T80,12589
|
|
26
26
|
bumble/hfp.py,sha256=OwANwtXWBU3cwAnZ6oODvI0reZfKwCuG0DLI18mevr0,76696
|
|
27
|
-
bumble/hid.py,sha256=
|
|
28
|
-
bumble/host.py,sha256=
|
|
27
|
+
bumble/hid.py,sha256=VAGvSVHFDKMR9n5QKWAdKX_qyP3K0EWlTvoPivxeJS0,21025
|
|
28
|
+
bumble/host.py,sha256=afy8hIJ-WFlnvg1FuewLf3AM6M4BFOSy8T9bF8PUmxg,68159
|
|
29
29
|
bumble/keys.py,sha256=iioiJZkqCoK2qopjDLLM0aeSy9l4bBrSyHfit4tNJek,13356
|
|
30
|
-
bumble/l2cap.py,sha256=
|
|
30
|
+
bumble/l2cap.py,sha256=7C2GExYxM2RDkIw-qHRcc8Oqzve2snrwd-NtGwTaxkw,111864
|
|
31
31
|
bumble/link.py,sha256=3dvwLyUlkfUPHsOthdOvl9wytToQqVweLmXWlub7Z34,5403
|
|
32
32
|
bumble/ll.py,sha256=EH3OIM-6KL1Q22bqa6G1x-SgFqHOqc3_8nVj66RII0Q,5380
|
|
33
33
|
bumble/lmp.py,sha256=9TsV8W1lbudCEytzhWg0N492xFbNEWy1-a3VuF1US-k,10433
|
|
34
34
|
bumble/logging.py,sha256=WvB9v6HxsnmN6DaG-oIcE7DbFcE-jT8YN3T0PGbWbD8,2351
|
|
35
35
|
bumble/pairing.py,sha256=W0_Mddzl6bdcvzeV3XGtuRD-vBObMt_u9d0mpoRUtPM,10072
|
|
36
36
|
bumble/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
37
|
-
bumble/rfcomm.py,sha256=
|
|
37
|
+
bumble/rfcomm.py,sha256=5m1Z22u_vQQywVwfm0hbe3HoiTAYi6hWJBJ3sV-SedM,41024
|
|
38
38
|
bumble/rtp.py,sha256=wyAQJ3dRU31USfZT5DgpvC_TSVYU1QPDSg_uK9-i8V4,3464
|
|
39
|
-
bumble/sdp.py,sha256=
|
|
39
|
+
bumble/sdp.py,sha256=vXhf4-JFf1E9T5a6Aval8YJxiUs2OHMtbUSfEBk9iSo,49516
|
|
40
40
|
bumble/smp.py,sha256=ERvw054hdp_eHxBlod8xIcWpixqsucPTGDK_tagGil0,78514
|
|
41
41
|
bumble/snoop.py,sha256=-6QEgpOdGYUx3u5fkPTHv_xM9C4RnQFzZQQb6TglZpc,5939
|
|
42
42
|
bumble/utils.py,sha256=oUIUKOdWuw1g1Gx9GpGGE4H6mNidDkClIo3xWLghP8g,16906
|
|
@@ -60,7 +60,7 @@ bumble/apps/rfcomm_bridge.py,sha256=Czxen2DR-XqlLpWWAXn8TU-kC56WiPeHv6CbtOWaFhg,
|
|
|
60
60
|
bumble/apps/scan.py,sha256=UD3Ej5YYRZUxGjEG3fhXR4yCr1T-c_4NYQ1BKoME-dE,8530
|
|
61
61
|
bumble/apps/show.py,sha256=j0Av4WC5FMRsdQ7M47i2CO7q1KYgavuRSwGUf9wkbPY,6313
|
|
62
62
|
bumble/apps/unbond.py,sha256=jBUpIQdNbWcHitqHT_i6yRMcCxyMjIc2KJSit-6qiZs,3134
|
|
63
|
-
bumble/apps/usb_probe.py,sha256=
|
|
63
|
+
bumble/apps/usb_probe.py,sha256=N-7Uh1_AZpEE7IOYYGKiiI48RgKK61LI3FRsejTKYsE,10913
|
|
64
64
|
bumble/apps/lea_unicast/app.py,sha256=maxHMWlU0SErkuUXqrY-kyxKbKcKlb-nFcIfnMxlyXc,17401
|
|
65
65
|
bumble/apps/lea_unicast/index.html,sha256=d1IHsYd8TGOnxNZKaHolf4Y-7VwT1kO9Z72vpGMdy3k,2354
|
|
66
66
|
bumble/apps/player/player.py,sha256=RAMtBpkht3rsGh8p2DgA1LK7hTUbzjv4URQ6iN2t3ws,22289
|
|
@@ -78,12 +78,12 @@ bumble/crypto/cryptography.py,sha256=yHznoBZ-hd8XqWheipkgn3Vdt5JydLxlTM3nTp5ayvc
|
|
|
78
78
|
bumble/drivers/__init__.py,sha256=ZrQx4P-tTeR8XDqVjmKjrrkacsPwD1EA3XPPfnhKWFg,3519
|
|
79
79
|
bumble/drivers/common.py,sha256=pS783hudolLZAzF8IUWp7g6TXyQsUCEzqCsd1VGeYfQ,1507
|
|
80
80
|
bumble/drivers/intel.py,sha256=lByfjyZw6MYrJNX_lox6ApQncgymq_6I-R-UQ3zalGs,24571
|
|
81
|
-
bumble/drivers/rtk.py,sha256=
|
|
81
|
+
bumble/drivers/rtk.py,sha256=u_Fl7WeMKHFB5RqcSDMPXF1q-DhEjEgpfPiFn3yrbkg,23291
|
|
82
82
|
bumble/pandora/__init__.py,sha256=tDrmvwHjMQUPL_kESGsLq5pnk329yzFTB9g-NPW8Wu0,3525
|
|
83
83
|
bumble/pandora/config.py,sha256=wfmko9UDEZWeRC4fccUdJnHn9D2Bus15R-Tqn2bLoAY,2384
|
|
84
84
|
bumble/pandora/device.py,sha256=_kL4G0XVjAc8OHlaIoDisb8EFQG4K7kHrvMqq84BrYY,5339
|
|
85
85
|
bumble/pandora/host.py,sha256=FrQt63Xh7AEH7yz3ZkWVJL-PNwi-vz4jfFhApE7z8Qw,39471
|
|
86
|
-
bumble/pandora/l2cap.py,sha256=
|
|
86
|
+
bumble/pandora/l2cap.py,sha256=OpfGkp4wNSYlSxxThTiBQahSdkTkBlN11aydIrhaESc,11760
|
|
87
87
|
bumble/pandora/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
88
88
|
bumble/pandora/security.py,sha256=L-LDRYlw0pTZY7BBs2fzjOt1YAD_JUv2kXwI0CC7vp0,22780
|
|
89
89
|
bumble/pandora/utils.py,sha256=U0NhTklcnKuHBYovIWpBo7Y74Lm2zJkGTautuUMx7gM,3950
|
|
@@ -95,7 +95,7 @@ bumble/profiles/ascs.py,sha256=znqo7Yx2VyHODkc_1hHR6R1ArZUliao5kZ6qjX1_WdE,25845
|
|
|
95
95
|
bumble/profiles/asha.py,sha256=Nq7okABxPafbgAhu_SAQeieDH6xSM5L49ZA5JmXY-9A,10464
|
|
96
96
|
bumble/profiles/bap.py,sha256=uy5eapnxekgYBELpkzNPleoM6fkNZ6wGcWB-RaEVTS8,21594
|
|
97
97
|
bumble/profiles/bass.py,sha256=81ak6tHnQ8kRz64-khNBlSihAo_cbJ8Su9thNhpWQ2s,14690
|
|
98
|
-
bumble/profiles/battery_service.py,sha256=
|
|
98
|
+
bumble/profiles/battery_service.py,sha256=ri_sAukZwLCLmTTnQFiBsZsx1oLFuwrPa7P0BRt1h_Q,2446
|
|
99
99
|
bumble/profiles/cap.py,sha256=0cDukO0HfaCOw3yt6Z1fw7DHt_SxBEWCuTRq8YGuH28,1927
|
|
100
100
|
bumble/profiles/csip.py,sha256=-wLiahw-xRPqEGHdYg8467LiLlJSLY3qHUDcHvOeWeY,10047
|
|
101
101
|
bumble/profiles/device_information_service.py,sha256=PK_1r21kUMdY8PYu6--kuL66KWeLQaURdjjNZVzMd84,6268
|
|
@@ -103,7 +103,7 @@ bumble/profiles/gap.py,sha256=wIbn95AXXTAxb6UBwicr6KwHepdMUgTaW2dbvjRPsBc,3980
|
|
|
103
103
|
bumble/profiles/gatt_service.py,sha256=CfIbwsR7yt1jmzvHJIOZSOceUEjvBELeJYNVKNu-Pew,6696
|
|
104
104
|
bumble/profiles/gmap.py,sha256=SZQJOtgO2xTE5vtF4umiWzN4ZtqLY64n1BlPqpTYiHE,7263
|
|
105
105
|
bumble/profiles/hap.py,sha256=0bRGrJuJzTVQJmFpyuG7vP9sWtPBTVmJDN4E04ufo2w,26510
|
|
106
|
-
bumble/profiles/heart_rate_service.py,sha256=
|
|
106
|
+
bumble/profiles/heart_rate_service.py,sha256=VOc7spIsgJo0jdziT35FpS0F596L6m7sL1kAfUFXtYU,10166
|
|
107
107
|
bumble/profiles/le_audio.py,sha256=X1CrpxjoF2dje-AlrqUXkLfmqeGfLT2W52pPK1Ow0kM,5831
|
|
108
108
|
bumble/profiles/mcp.py,sha256=OjnxykE8kz8khl8rLRmhKsq4tz67N2S3mPGvvQQQqPQ,17688
|
|
109
109
|
bumble/profiles/pacs.py,sha256=xel7MIz1-o2hqcRLCxbn6fby_b35lMSeT3vKdNGb7VQ,10333
|
|
@@ -177,9 +177,9 @@ bumble/vendor/android/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3h
|
|
|
177
177
|
bumble/vendor/android/hci.py,sha256=Fk1SQVhhdoMGg65TIBX7C3FcgqqKfJ3ulMb5n2jfvkc,10457
|
|
178
178
|
bumble/vendor/zephyr/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
179
179
|
bumble/vendor/zephyr/hci.py,sha256=ysct40uIVohaKKLrWjcWo-7YqozU17xGia2dWeHoMoI,3435
|
|
180
|
-
bumble-0.0.
|
|
181
|
-
bumble-0.0.
|
|
182
|
-
bumble-0.0.
|
|
183
|
-
bumble-0.0.
|
|
184
|
-
bumble-0.0.
|
|
185
|
-
bumble-0.0.
|
|
180
|
+
bumble-0.0.223.dist-info/licenses/LICENSE,sha256=FvaYh4NRWIGgS_OwoBs5gFgkCmAghZ-DYnIGBZPuw-s,12142
|
|
181
|
+
bumble-0.0.223.dist-info/METADATA,sha256=LYNBJ-QVHbo9Bkw5QGle8mgX1TUAwlj4WfLIpqtvfJU,6218
|
|
182
|
+
bumble-0.0.223.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
183
|
+
bumble-0.0.223.dist-info/entry_points.txt,sha256=mX5dzixNMRo4CTAEQqiYTr-JIaWF62TYrRvJOstjjL8,1081
|
|
184
|
+
bumble-0.0.223.dist-info/top_level.txt,sha256=tV6JJKaHPYMFiJYiBYFW24PCcfLxTJZdlu6BmH3Cb00,7
|
|
185
|
+
bumble-0.0.223.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|