本文将带你了解Android应用开发wifi连接问题:密码正确但连接时supplicant state返回的是ERROR_AUTHENTICATING,希望本文对大家学Android有所帮助。
frameworks\opt\net\wifi\service\java\com\android\server\wifi\WifiStateMachine.java
frameworks\base\core\java\com\android\internal\util\StateMachine.java
frameworks\base\core\java\com\android\internal\util\State.java
frameworks\opt\net\wifi\service\java\com\android\server\wifi\WifiService.java
反正把frameworks导入source insight中就可以全部都搜得到了。
wifi hal(wifi抽象层)的源码在:
hardware\broadcom\wlan\bcmdhd\wifi_hal\wifi_hal.cpp
hardware\broadcom\wlan\bcmdhd\wifi_hal\wifi_logger.cpp
导入hardware\broadcom\wlan\bcmdhd\wifi_hal到source insight就可以很方便看wifi hal相关的代码了。
各个State的关系(WifiStateMachine的构造方法,父类是StateMachine):
addState(mDefaultState);
addState(mInitialState, mDefaultState);
addState(mSupplicantStartingState, mDefaultState);
addState(mSupplicantStartedState, mDefaultState);
addState(mDriverStartingState, mSupplicantStartedState);
addState(mDriverStartedState, mSupplicantStartedState);
addState(mScanModeState, mDriverStartedState);
addState(mConnectModeState, mDriverStartedState);
addState(mL2ConnectedState, mConnectModeState);
addState(mObtainingIpState, mL2ConnectedState);
addState(mVerifyingLinkState, mL2ConnectedState);
addState(mConnectedState, mL2ConnectedState);
addState(mRoamingState, mL2ConnectedState);
addState(mDisconnectingState, mConnectModeState);
addState(mDisconnectedState, mConnectModeState);
addState(mWpsRunningState, mConnectModeState);
addState(mWaitForP2pDisableState, mSupplicantStartedState);
addState(mDriverStoppingState, mSupplicantStartedState);
addState(mDriverStoppedState, mSupplicantStartedState);
addState(mSupplicantStoppingState, mDefaultState);
addState(mSoftApStartingState, mDefaultState);
addState(mSoftApStartedState, mDefaultState);
addState(mTetheringState, mSoftApStartedState);
addState(mTetheredState, mSoftApStartedState);
addState(mUntetheringState, mSoftApStartedState);
setInitialState(mInitialState);
初始状态是InitialState,而InitialState的父状态是DefaultState。StateMachine#addState()
/**
* Add a new state to the state machine
* @param state the state to add
* @param parent the parent of state
*/
protected final void addState(State state, State parent) {
mSmHandler.addState(state, parent);
}
WifiStateMachine对消息的处理原则是,如果子状态处理不了,就给父状态处理,层层上报,直到DefaultState,如果DefaultState都处理不了就报Error。消息由State的子类的processMessage(Message
msg)去处理,返回true表示处理了,false则表示给父状态处理。给出ConnectModeState#processMessage的部分代码:
@Override
public boolean processMessage(Message message) {
WifiConfiguration config;
int netId;
boolean ok;
boolean didDisconnect;
String bssid;
String ssid;
NetworkUpdateResult result;
logStateAndMessage(message, getClass().getSimpleName());
switch (message.what) {
case WifiMonitor.ASSOCIATION_REJECTION_EVENT:
mWifiLogger.captureBugReportData(WifiLogger.REPORT_REASON_ASSOC_FAILURE);
didBlackListBSSID = false;
bssid = (String) message.obj;
if (bssid == null || TextUtils.isEmpty(bssid)) {
// If BSSID is null, use the target roam BSSID
bssid = mTargetRoamBSSID;
}
if (bssid != null) {
// If we have a BSSID, tell configStore to black list it
synchronized(mScanResultCache) {
didBlackListBSSID = mWifiConfigStore.handleBSSIDBlackList
(mLastNetworkId, bssid, false);
}
}
mSupplicantStateTracker.sendMessage(WifiMonitor.ASSOCIATION_REJECTION_EVENT);
break;
case WifiMonitor.AUTHENTICATION_FAILURE_EVENT:
mWifiLogger.captureBugReportData(WifiLogger.REPORT_REASON_AUTH_FAILURE);
mSupplicantStateTracker.sendMessage(WifiMonitor.AUTHENTICATION_FAILURE_EVENT);
///M:@{
if (mWifiFwkExt != null) {
mWifiFwkExt.setNotificationVisible(true);
}
///@}
break;
case WifiMonitor.SSID_TEMP_DISABLED:
case WifiMonitor.SSID_REENABLED:
String substr = (String) message.obj;
String en = message.what == WifiMonitor.SSID_TEMP_DISABLED
"temp-disabled" : "re-enabled";
logd("ConnectModeState SSID state=" + en + " nid="
+ Integer.toString(message.arg1) + " [" + substr + "]");
synchronized(mScanResultCache) {
mWifiConfigStore.handleSSIDStateChange(message.arg1, message.what ==
WifiMonitor.SSID_REENABLED, substr, mWifiInfo.getBSSID());
}
break;
//... ...
}
State的子类都在WifiStateMachine.cpp中实现,是WifiStateMachine的内部类,每个State子类都会在processMessage中调用logStateAndMessage(message,
getClass().getSimpleName());,下面看logStateAndMessage的源码:
private void logStateAndMessage(Message message, String state) {
messageHandlingStatus = 0;
if (mLogMessages) {
//long now = SystemClock.elapsedRealtimeNanos();
//String ts = String.format("[%,d us]", now/1000);
logd(" " + state + " " + getLogRecString(message));
}
}
本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标移动开发之Android频道!