android wifi 问题是什么意思,Android应用开发之wifi连接问题:密码正确但连接时supplicant state返回的是ERROR_AUTHENTICATING...

本文将带你了解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频道!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值