English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Подробное объяснение операции forget() для Wi-Fi в Android

Detailed explanation of the Android Wifi forget() operation example

When processing a certain Wifi connection, we sometimes need to forget the current connection password information. To perform this operation, we need to call the WifiManager::forget() function:

/** 
 * Delete the network in the supplicant config. 
 * 
 * This function is used instead of a sequence of removeNetwork() 
 * and saveConfiguration(). 
 * 
 * @param config the set of variables that describe the configuration, 
 *      contained in a {@link WifiConfiguration} object. 
 * @param listener for callbacks on success or failure. Can be null. 
 * @throws IllegalStateException if the WifiManager instance needs to be 
 * initialized again 
 * @hide 
 */ 
public void forget(int netId, ActionListener listener) { 
  if (netId < 0) throw new IllegalArgumentException("Network id cannot be negative"); 
  validateChannel(); 
  sAsyncChannel.sendMessage(FORGET_NETWORK, netId, putListener(listener)); 
} 

Из описания функции можно понять, что вызов функции forget() удалит конфигурацию текущего подключения из файла wpa_supplicant.conf; после этого сеть не будет автоматически подключаться, так как в файле конфигурации уже нет информации о сети.

Трекинг сообщения FORGET_NETWORK, обработчик ClientHandler в WifiServiceImpl::

case WifiManager.FORGET_NETWORK: 
  if (isOwner(msg.sendingUid)) { 
    mWifiStateMachine.sendMessage(Message.obtain(msg)); 
  } else { 
    Slog.e(TAG, "Forget is not authorized for user"); 
    replyFailed(msg, WifiManager.FORGET_NETWORK_FAILED, 
        WifiManager.NOT_AUTHORIZED); 
  } 
  break; 

Просто перетаскиваем это сообщение в WifiStateMachine. В этот момент Wifi соединен, текущее состояние WifiStateMachine - ConnectedState, его родительское состояние ConnectModeState обрабатывает:

case WifiManager.FORGET_NETWORK: 
  // Debug only, remember last configuration that was forgotten 
  WifiConfiguration toRemove 
      = mWifiConfigStore.getWifiConfiguration(message.arg1); 
  if (toRemove == null) { 
    lastForgetConfigurationAttempt = null; 
  } else { 
    lastForgetConfigurationAttempt = new WifiConfiguration(toRemove); 
  } 
  // проверка, что вызыватель owns this network 
  netId = message.arg1; 
  if (!mWifiConfigStore.canModifyNetwork(message.sendingUid, netId, 
      /* onlyAnnotate */ false)) { 
    logw("Not authorized to forget network " 
       + " cnid=" + netId 
       + " uid=" + message.sendingUid); 
    replyToMessage(message, WifiManager.FORGET_NETWORK_FAILED, 
        WifiManager.NOT_AUTHORIZED); 
    break; 
  } 
  if (mWifiConfigStore.forgetNetwork(message.arg1)) { 
    replyToMessage(message, WifiManager.FORGET_NETWORK_SUCCEEDED); 
    broadcastWifiCredentialChanged(WifiManager.WIFI_CREDENTIAL_FORGOT, 
        (WifiConfiguration) message.obj); 
  } else { 
    loge("Failed to forget network"); 
    replyToMessage(message, WifiManager.FORGET_NETWORK_FAILED, 
        WifiManager.ERROR); 
  } 
  break; 

mWifiConfigStore.forgetNetwork():

/** 
 * Forget the specified network and save config 
 * 
 * @param netId network to forget 
 * @return {@code true} if it succeeds, {@code false} otherwise 
 */ 
boolean forgetNetwork(int netId) { 
  if (showNetworks) localLog("forgetNetwork", netId); 
  WifiConfiguration config = mConfiguredNetworks.get(netId); 
  boolean remove = removeConfigAndSendBroadcastIfNeeded(netId); 
  if (!remove) {}} 
    //success but we dont want to remove the network from supplicant conf file 
    return true; 
  } 
  if (mWifiNative.removeNetwork(netId)) { 
    if (config != null && config.isPasspoint()) { 
      writePasspointConfigs(config.FQDN, null); 
    } 
    mWifiNative.saveConfig(); 
    writeKnownNetworkHistory(true); 
    return true; 
  } else { 
    loge("Не удалось удалить сеть " + netId); 
    return false; 
  } 
} 

В зависимости от传入 текущего идентификатора сети netId, вызывается метод removeNetwork() и saveConfig() из WifiNative для удаления конфигурационных данных файла conf и их сохранения; после выполнения функция forget() завершает работу. По коду我们发现, вызов функции forget() не вызывает переключения состояния WifiStateMachine.

Спасибо за чтение, я надеюсь, что это поможет вам, спасибо за поддержку этого сайта!

Заявление: содержимое этой статьи взято из интернета, авторские права принадлежат их законным владельцам, контент был предоставлен пользователями интернета в порядке самостоятельной подачи, этот сайт не имеет права собственности, не производил редактирование содержимого и не несет ответственности за связанные с этим法律责任. Если вы обнаружите подозрительное содержимое, пожалуйста, отправьте письмо по адресу: notice#oldtoolbag.com (во время отправки письма, пожалуйста, замените # на @) для сообщения о нарушении и предоставьте соответствующие доказательства. В случае подтверждения, этот сайт немедленно удалит涉嫌侵权的内容.

Рекомендуем также