getDiscoveredServices method

Future<List<Service>> getDiscoveredServices(
  1. String deviceId
)

Services can be discovered by:

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);
}