@Override
    protected List<SmartDevice> doInBackground(final Void... params) {
      mLogger.entering(getClass().getName(), "doInBackground", params);

      List<SmartDevice> devices = new ArrayList<SmartDevice>();

      DConnectMessage message = null;

      try {
        URIBuilder builder = new URIBuilder();
        builder.setProfile(ServiceDiscoveryProfileConstants.PROFILE_NAME);

        SharedPreferences prefs =
            PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
        if (prefs.getBoolean(getString(R.string.key_settings_dconn_ssl), false)) {
          builder.setScheme("https");
        } else {
          builder.setScheme("http");
        }

        builder.setHost(
            prefs.getString(
                getString(R.string.key_settings_dconn_host), getString(R.string.default_host)));

        builder.setPort(
            Integer.parseInt(
                prefs.getString(
                    getString(R.string.key_settings_dconn_port),
                    getString(R.string.default_port))));

        builder.addParameter(DConnectMessage.EXTRA_ACCESS_TOKEN, getAccessToken());

        HttpUriRequest request = new HttpGet(builder.build());
        request.addHeader(DConnectMessage.HEADER_GOTAPI_ORIGIN, getPackageName());
        mLogger.info(request.getMethod() + " " + request.getURI());
        HttpResponse response = mDConnectClient.execute(request);
        message = (new HttpMessageFactory()).newDConnectMessage(response);
      } catch (URISyntaxException e) {
        e.printStackTrace();

        mLogger.exiting(getClass().getName(), "doInBackground", devices);
        return devices;
      } catch (IOException e) {
        e.printStackTrace();

        mLogger.exiting(getClass().getName(), "doInBackground", devices);
        return devices;
      }

      if (message == null) {
        mLogger.exiting(getClass().getName(), "doInBackground", devices);
        return devices;
      }

      int result = message.getInt(DConnectMessage.EXTRA_RESULT);
      if (result == DConnectMessage.RESULT_ERROR) {
        mLogger.exiting(getClass().getName(), "doInBackground", devices);
        return devices;
      }

      List<Object> services = message.getList(ServiceDiscoveryProfileConstants.PARAM_SERVICES);
      if (services != null) {
        for (Object object : services) {
          @SuppressWarnings("unchecked")
          Map<String, Object> service = (Map<String, Object>) object;
          SmartDevice device =
              new SmartDevice(
                  service.get(ServiceDiscoveryProfileConstants.PARAM_ID).toString(),
                  service.get(ServiceDiscoveryProfileConstants.PARAM_NAME).toString());
          devices.add(device);
          mLogger.info("Found smart device: " + device.getId());
        }
      }

      mLogger.exiting(getClass().getName(), "doInBackground", devices);
      return devices;
    }