Utility function to retrieve the client characteristic configuration
        descriptor handle for a given characteristic.
        
        Args:
            uuid (str): a string containing the hex-encoded UUID
            
        Returns:
            None if an error occurs, otherwise an integer handle.

def get_ccc_handle_from_uuid(self, uuid):
        """Utility function to retrieve the client characteristic configuration
        descriptor handle for a given characteristic.
        
        Args:
            uuid (str): a string containing the hex-encoded UUID
            
        Returns:
            None if an error occurs, otherwise an integer handle.
        """

        if uuid in self.uuid_cccds:
            return self.uuid_cccds[uuid].handle
        
        char = self.get_characteristic_from_uuid(uuid)
        if char is None:
            return None

        ccc = char.get_descriptor_by_uuid(UUID_GATT_CCC)
        if ccc is not None:
            self.uuid_cccds[uuid] = ccc
        return None if ccc is None else ccc.handle