Skip to content

Commit ad94c1e

Browse files
authored
Merge pull request #509 from AlanRosenthal/discover
device.py: Add discover_all() api
2 parents 546a0bc + df20666 commit ad94c1e

File tree

3 files changed

+63
-15
lines changed

3 files changed

+63
-15
lines changed

apps/console.py

Lines changed: 3 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -500,21 +500,9 @@ async def discover_services(self):
500500
self.show_error('not connected')
501501
return
502502

503-
# Discover all services, characteristics and descriptors
504-
self.append_to_output('discovering services...')
505-
await self.connected_peer.discover_services()
506-
self.append_to_output(
507-
f'found {len(self.connected_peer.services)} services,'
508-
' discovering characteristics...'
509-
)
510-
await self.connected_peer.discover_characteristics()
511-
self.append_to_output('found characteristics, discovering descriptors...')
512-
for service in self.connected_peer.services:
513-
for characteristic in service.characteristics:
514-
await self.connected_peer.discover_descriptors(characteristic)
515-
self.append_to_output('discovery completed')
516-
517-
self.show_remote_services(self.connected_peer.services)
503+
self.append_to_output('Service Discovery starting...')
504+
await self.connected_peer.discover_all()
505+
self.append_to_output('Service Discovery done!')
518506

519507
async def discover_attributes(self):
520508
if not self.connected_peer:

bumble/device.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1134,6 +1134,15 @@ async def discover_descriptors(
11341134
async def discover_attributes(self) -> List[gatt_client.AttributeProxy]:
11351135
return await self.gatt_client.discover_attributes()
11361136

1137+
async def discover_all(self):
1138+
await self.discover_services()
1139+
for service in self.services:
1140+
await self.discover_characteristics(service=service)
1141+
1142+
for service in self.services:
1143+
for characteristic in service.characteristics:
1144+
await self.discover_descriptors(characteristic=characteristic)
1145+
11371146
async def subscribe(
11381147
self,
11391148
characteristic: gatt_client.CharacteristicProxy,

tests/gatt_test.py

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -879,6 +879,57 @@ async def test_unsubscribe():
879879
mock1.assert_called_once_with(ANY, False, False)
880880

881881

882+
# -----------------------------------------------------------------------------
883+
@pytest.mark.asyncio
884+
async def test_discover_all():
885+
[client, server] = LinkedDevices().devices[:2]
886+
887+
characteristic1 = Characteristic(
888+
'FDB159DB-036C-49E3-B3DB-6325AC750806',
889+
Characteristic.Properties.READ | Characteristic.Properties.NOTIFY,
890+
Characteristic.READABLE,
891+
bytes([1, 2, 3]),
892+
)
893+
894+
descriptor1 = Descriptor('2902', 'READABLE,WRITEABLE')
895+
descriptor2 = Descriptor('AAAA', 'READABLE,WRITEABLE')
896+
characteristic2 = Characteristic(
897+
'3234C4F4-3F34-4616-8935-45A50EE05DEB',
898+
Characteristic.Properties.READ | Characteristic.Properties.NOTIFY,
899+
Characteristic.READABLE,
900+
bytes([1, 2, 3]),
901+
descriptors=[descriptor1, descriptor2],
902+
)
903+
904+
service1 = Service(
905+
'3A657F47-D34F-46B3-B1EC-698E29B6B829',
906+
[characteristic1, characteristic2],
907+
)
908+
service2 = Service('1111', [])
909+
server.add_services([service1, service2])
910+
911+
await client.power_on()
912+
await server.power_on()
913+
connection = await client.connect(server.random_address)
914+
peer = Peer(connection)
915+
916+
await peer.discover_all()
917+
assert len(peer.gatt_client.services) == 3
918+
# service 1800 gets added automatically
919+
assert peer.gatt_client.services[0].uuid == UUID('1800')
920+
assert peer.gatt_client.services[1].uuid == service1.uuid
921+
assert peer.gatt_client.services[2].uuid == service2.uuid
922+
s = peer.get_services_by_uuid(service1.uuid)
923+
assert len(s) == 1
924+
assert len(s[0].characteristics) == 2
925+
c = peer.get_characteristics_by_uuid(uuid=characteristic2.uuid, service=s[0])
926+
assert len(c) == 1
927+
assert len(c[0].descriptors) == 2
928+
s = peer.get_services_by_uuid(service2.uuid)
929+
assert len(s) == 1
930+
assert len(s[0].characteristics) == 0
931+
932+
882933
# -----------------------------------------------------------------------------
883934
@pytest.mark.asyncio
884935
async def test_mtu_exchange():

0 commit comments

Comments
 (0)