Android 4.4 wifi启动扫描流程

按下wifienabler

WifiEnabler.java::onPreferenceChange&onPreferenceClick::mWifiManager.setWifiEnabled(ischecked)
WifiManager.java::setWifiEnabled:: mService.setWifiEnabled(enabled);

通过aidl与wifiservice.java通信

WifiService.java::setWifiEnabled:: mWifiController.sendMessage(CMD_WIFI_TOGGLED);
WifiController.java状态机,初始状态是ApStaDisabledState::processMessage:: transitionTo(mDeviceActiveState);
DeviceActiveState不做处理,交由父状态StaEnabledState::enter:: mWifiStateMachine.setSupplicantRunning(true)::sendMessage(CMD_START_SUPPLICANT);
这里进入wifi状态机处理,WifiStateMachine.java:: InitialState::processMessage,这里调用mWifiNative.loadDriver加载wifi驱动,mWifiNative.startSupplicant(mP2pSupported)启动supplicant进程, setWifiState(WIFI_STATE_ENABLING):: mContext.sendStickyBroadcastAsUser(intent, UserHandle.ALL)发送WIFI_STATE_CHANGED_ACTION广播, mWifiMonitor.startMonitoring()::mWifiNative.connectToSupplicant
 且调用m.mWifiStateMachine.sendMessage(SUP_CONNECTION_EVENT),之后回到WifiStateMachine.java:: InitialState::processMessage,调用 transitionTo(mSupplicantStartingState),接收到m.mWifiStateMachine.sendMessage(SUP_CONNECTION_EVENT)事件,SupplicantStartingState::processMessage::setWifiState(WIFI_STATE_ENABLED)::mContext.sendStickyBroadcastAsUser(intent, UserHandle.ALL)设置wifi状态为enabled并发送WIFI_STATE_CHANGED_ACTION广播,sendSupplicantConnectionChangedBroadcast(true)设置WifiManager.EXTRA_SUPPLICANT_CONNECTED状态为connected并发送SUPPLICANT_CONNECTION_CHANGE_ACTION广播,transitionTo(mDriverStartedState);

回到wifisettings.java,此时wifi已经enabled,

WifiSettings.java::wifisettings::mReceiver = new BroadcastReceiver,注册了一个广播接收器,接收到WIFI_STATE_CHANGED_ACTION,调用 handleEvent(context, intent);
handleEvent::updateWifiState::mScanner.resume();
Scanner::resume::sendEmptyMessage(0);
handleMessage::mWifiManager.startScan,开始扫描,随后调用sendEmptyMessageDelayed(0, WIFI_RESCAN_INTERVAL_MS)10s扫一次.
 mService.startScan(workSource), mWifiStateMachine.startScan(Binder.getCallingUid(), workSource)
WifiStateMachine.java::startScan::sendMessage(CMD_START_SCAN, callingUid, 0, workSource);
由前面可以知道,wifstatemachine现在是DriverStartedState
DriverStartedState::processMessage::startScanNative(WifiNative.SCAN_WITH_CONNECTION_SETUP):: mWifiNative.scan(type);
WifiNative.java::scan::doBooleanCommand("SCAN")::doBooleanCommandNative(mInterfacePrefix + command),其中mInterfacePrefix指的是"IFNAME=" + interfaceName + " ",比如ifname=wlan0+空格+command
android_net_wifi_WifiNative.cpp::android_net_wifi_doBooleanCommand::doBooleanCommand(env, javaCommand)::doCommand(env, javaCommand, reply, sizeof(reply))::wifi_command(command.c_str(), reply, &reply_len)::wifi_send_command(command, reply, reply_len)::wpa_ctrl_request(ctrl_conn, cmd, strlen(cmd), reply, reply_len, NULL)

现在开始获取scan result
由前面可得mWifiMonitor.startMonitoring()

WifiMonitor.java::MonitorThread::run:: String eventStr =  mWifiNative.waitForEvent();

eventStr是监听到的supplicant上报的事件
随后调用dispatchEvent(eventStr)::mStateMachine.sendMessage(SCAN_RESULTS_EVENT);然后进入wifistatemachine,由前面可得现在状态是DriverStartedState,消息在该状态中不处理,因此交由父状态SupplicantStartedState处理,这里调用了两个函数:
1)setScanResults
该函数里首先tmpResults = mWifiNative.scanResults(sid),WifiNative.java::scanResults::doStringCommand:: doStringCommandNative(mInterfacePrefix + command),随后通过jni
android_net_wifi_WifiNative.cpp::android_net_wifi_doStringCommand(JNIEnv* env, jobject, jstring javaCommand)::doStringCommand(env,javaCommand)后续处理就是发送获取扫描结果的命令同扫描命令的处理.
2)sendScanResultsAvailableBroadcast()
mContext.sendBroadcastAsUser(intent, UserHandle.ALL);发送WifiManager.SCAN_RESULTS_AVAILABLE_ACTION广播

回到wifisettings.java,
WifiSettings.java::wifisettings::mReceiver = new BroadcastReceiver,注册了一个广播接收器,接收到

WifiManager.SCAN_RESULTS_AVAILABLE_ACTION,调用 handleEvent(context, intent);
updateAccessPoints()
发布了8 篇原创文章 · 获赞 1 · 访问量 139

猜你喜欢

转载自blog.csdn.net/qq_33707295/article/details/103879858