def _on_services_probed(self, success, result, failure_reason, context):
        """Callback called when the services has been probed.
        It is executed in the baBLE working thread: should not be blocking.

        Args:
            success (bool): A bool indicating that the operation is successful or not
            result (dict): Information probed (if successful)
              - services (list): The list of services probed (bable_interface.Service instances)
            failure_reason (any): An object indicating the reason why the operation is not successful (else None)
        """
        connection_id = context['connection_id']

        if not success:
            self._logger.error("Error while probing services to the device, err=%s", failure_reason)
            context['failure_reason'] = "Error while probing services"
            self.disconnect_async(connection_id, self._on_connection_failed)
            return

        services = {service: {} for service in result['services']}

        # Validate that this is a proper IOTile device
        if TileBusService not in services:
            context['failure_reason'] = 'TileBus service not present in GATT services'
            self.disconnect_async(connection_id, self._on_connection_failed)
            return

        context['services'] = services

        # Finally, probe GATT characteristics
        self.bable.probe_characteristics(
            connection_handle=context['connection_handle'],
            start_handle=TileBusService.handle,
            end_handle=TileBusService.group_end_handle,
            on_characteristics_probed=[self._on_characteristics_probed, context]
        )