code: def _on_services_probed(self, success, result, failure_reason, context):
          
          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]
          )
docs: 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)