code: def _probe_services(self, handle):
          
  
          code = 0x2800
  
          def event_filter_func(event):
              if (event.command_class == 4 and event.command == 2):
                  event_handle, = unpack("B", event.payload[0:1])
                  return event_handle == handle
  
              return False
  
          def end_filter_func(event):
              if (event.command_class == 4 and event.command == 1):
                  event_handle, = unpack("B", event.payload[0:1])
                  return event_handle == handle
  
              return False
  
          payload = struct.pack('<BHHBH', handle, 1, 0xFFFF, 2, code)
  
          try:
              response = self._send_command(4, 1, payload)
          except InternalTimeoutError:
              return False, {'reason': 'Timeout waiting for command response'}
  
          handle, result = unpack("<BH", response.payload)
          if result != 0:
              return False, None
  
          events = self._wait_process_events(0.5, event_filter_func, end_filter_func)
          gatt_events = [x for x in events if event_filter_func(x)]
          end_events = [x for x in events if end_filter_func(x)]
  
          if len(end_events) == 0:
              return False, None
  
          #Make sure we successfully probed the gatt table
          end_event = end_events[0]
          _, result, _ = unpack("<BHH", end_event.payload)
          if result != 0:
              self._logger.warn("Error enumerating GATT table, protocol error code = %d (0x%X)" % (result, result))
              return False, None
  
          services = {}
          for event in gatt_events:
              process_gatt_service(services, event)
  
          return True, {'services': services}
docs: Probe for all primary services and characteristics in those services
  
          Args:
              handle (int): the connection handle to probe