async def get_services(self) -> BleakGATTServiceCollection: """Get all services registered for this GATT server. Returns: A :py:class:`bleak.backends.service.BleakGATTServiceCollection` with this device's services tree. """ # Return the Service Collection. if self._services_resolved: return self.services else: logger.debug("Get Services...") services_result = await wrap_IAsyncOperation( IAsyncOperation[GattDeviceServicesResult]( self._requester.GetGattServicesAsync()), return_type=GattDeviceServicesResult, loop=self.loop, ) if services_result.Status != GattCommunicationStatus.Success: raise BleakDotNetTaskError("Could not get GATT services.") # TODO: Check if fetching yeilds failures... for service in services_result.Services: characteristics_result = await wrap_IAsyncOperation( IAsyncOperation[GattCharacteristicsResult]( service.GetCharacteristicsAsync()), return_type=GattCharacteristicsResult, loop=self.loop, ) self.services.add_service(BleakGATTServiceDotNet(service)) if characteristics_result.Status != GattCommunicationStatus.Success: raise BleakDotNetTaskError( "Could not get GATT characteristics for {0}.".format( service)) for characteristic in characteristics_result.Characteristics: descriptors_result = await wrap_IAsyncOperation( IAsyncOperation[GattDescriptorsResult]( characteristic.GetDescriptorsAsync()), return_type=GattDescriptorsResult, loop=self.loop, ) self.services.add_characteristic( BleakGATTCharacteristicDotNet(characteristic)) if descriptors_result.Status != GattCommunicationStatus.Success: raise BleakDotNetTaskError( "Could not get GATT descriptors for {0}.".format( characteristic)) for descriptor in list(descriptors_result.Descriptors): self.services.add_descriptor( BleakGATTDescriptorDotNet( descriptor, characteristic.Uuid.ToString())) self._services_resolved = True return self.services
async def add_new_service(self, uuid: str): """ Generate a new service to be associated with the server Parameters ---------- uuid : str The string representation of the UUID of the service to be added """ logger.debug("Creating a new service with uuid: {}".format(uuid)) guid: Guid = Guid.Parse(uuid) spr: GattServiceProviderResult = await wrap_IAsyncOperation( IAsyncOperation[GattServiceProviderResult]( GattServiceProvider.CreateAsync(guid) ), return_type=GattServiceProviderResult) self.service_provider: GattServiceProvider = spr.ServiceProvider new_service: GattLocalService = self.service_provider.Service bleak_service = BleakGATTServiceDotNet(obj=new_service) logger.debug("Adding service to server with uuid {}".format(uuid)) self.services[uuid] = bleak_service
async def get_services(self) -> BleakGATTServiceCollection: """Get all services registered for this GATT server. Returns: A :py:class:`bleak.backends.service.BleakGATTServiceCollection` with this device's services tree. """ # Return the Service Collection. if self._services_resolved: return self.services else: logger.debug("Get Services...") services_result = await wrap_IAsyncOperation( IAsyncOperation[GattDeviceServicesResult]( self._requester.GetGattServicesAsync()), return_type=GattDeviceServicesResult, ) if services_result.Status != GattCommunicationStatus.Success: if services_result.Status == GattCommunicationStatus.ProtocolError: raise BleakDotNetTaskError( "Could not get GATT services: {0} (Error: 0x{1:02X}: {2})" .format( _communication_statues.get(services_result.Status, ""), services_result.ProtocolError, CONTROLLER_ERROR_CODES.get( services_result.ProtocolError, "Unknown"), )) else: raise BleakDotNetTaskError( "Could not get GATT services: {0}".format( _communication_statues.get(services_result.Status, ""))) for service in services_result.Services: characteristics_result = await wrap_IAsyncOperation( IAsyncOperation[GattCharacteristicsResult]( service.GetCharacteristicsAsync()), return_type=GattCharacteristicsResult, ) self.services.add_service(BleakGATTServiceDotNet(service)) if characteristics_result.Status != GattCommunicationStatus.Success: if (characteristics_result.Status == GattCommunicationStatus.ProtocolError): raise BleakDotNetTaskError( "Could not get GATT characteristics for {0}: {1} (Error: 0x{2:02X}: {3})" .format( service, _communication_statues.get( characteristics_result.Status, ""), characteristics_result.ProtocolError, CONTROLLER_ERROR_CODES.get( characteristics_result.ProtocolError, "Unknown"), )) else: raise BleakDotNetTaskError( "Could not get GATT characteristics for {0}: {1}". format( service, _communication_statues.get( characteristics_result.Status, ""), )) for characteristic in characteristics_result.Characteristics: descriptors_result = await wrap_IAsyncOperation( IAsyncOperation[GattDescriptorsResult]( characteristic.GetDescriptorsAsync()), return_type=GattDescriptorsResult, ) self.services.add_characteristic( BleakGATTCharacteristicDotNet(characteristic)) if descriptors_result.Status != GattCommunicationStatus.Success: if (characteristics_result.Status == GattCommunicationStatus.ProtocolError): raise BleakDotNetTaskError( "Could not get GATT descriptors for {0}: {1} (Error: 0x{2:02X}: {3})" .format( service, _communication_statues.get( descriptors_result.Status, ""), descriptors_result.ProtocolError, CONTROLLER_ERROR_CODES.get( descriptors_result.ProtocolError, "Unknown"), )) else: raise BleakDotNetTaskError( "Could not get GATT descriptors for {0}: {1}". format( characteristic, _communication_statues.get( descriptors_result.Status, ""), )) for descriptor in list(descriptors_result.Descriptors): self.services.add_descriptor( BleakGATTDescriptorDotNet( descriptor, characteristic.Uuid.ToString(), int(characteristic.AttributeHandle), )) logger.info("Services resolved for %s", str(self)) self._services_resolved = True return self.services