getDiscoveredServices method
Services can be discovered by:
- specify
servicesWithCharacteristicsToDiscover
in connectToDevice or connectToAdvertisingDevice. Or, - by calling discoverAllServices
Discovered services and charactersitcs remain valid for as long as the device stays connected. After reconnecting to a device, getDiscoveredServices must be called again to get updated services and characteristics.
Note: On Android, this method performs service discovery if one was done yet after connecting the device.
Implementation
Future<List<Service>> getDiscoveredServices(String deviceId) async {
_disconnectionUpdates ??= connectedDeviceStream
.where((update) => update.connectionState == DeviceConnectionState.disconnected)
.listen((update) {
_services[update.deviceId]?.forEach((service) => service._markInvalid());
_services[update.deviceId]?.clear();
});
final discoveredServices = await _connectedDeviceOperator.getDiscoverServices(deviceId);
final services = _services[deviceId] ?? [];
for (final discoveredService in discoveredServices) {
final service = services.firstWhere(
(service) => _isMatchingService(service, discoveredService),
orElse: () {
final newService = Service._(
id: discoveredService.serviceId,
instanceId: discoveredService.serviceInstanceId,
deviceId: deviceId,
);
services.add(newService);
return newService;
},
);
for (final discoveredCharacteristic in discoveredService.characteristics) {
if (!service._characteristics.any((char) => _isMatchingCharacteristic(char, discoveredCharacteristic))) {
service._characteristics.add(Characteristic._(
id: discoveredCharacteristic.characteristicId,
instanceId: discoveredCharacteristic.characteristicInstanceId,
service: service,
lib: this,
isReadable: discoveredCharacteristic.isReadable,
isWritableWithoutResponse: discoveredCharacteristic.isWritableWithoutResponse,
isWritableWithResponse: discoveredCharacteristic.isWritableWithResponse,
isNotifiable: discoveredCharacteristic.isNotifiable,
isIndicatable: discoveredCharacteristic.isIndicatable,
));
}
}
service._characteristics.removeWhere((char) => !discoveredService.characteristics.any(
(discoveredCharacteristic) => _isMatchingCharacteristic(char, discoveredCharacteristic),
));
}
services.removeWhere(
(service) => !discoveredServices.any((discoveredService) => _isMatchingService(service, discoveredService)),
);
return UnmodifiableListView(services);
}