Android 4.4 wifi start scanning process

Press wifienabler

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

By communicating with wifiservice.java aidl

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);

Back wifisettings.java, this time has 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)

Now scan result acquired
by the previous available mWifiMonitor.startMonitoring ()

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

eventStr is monitored event reported by the supplicant
subsequent call dispatchEvent (eventStr) :: mStateMachine.sendMessage (SCAN_RESULTS_EVENT ); then enter wifistatemachine, can be obtained from the previous state is now DriverStartedState, messages are not processed in this state, and therefore referred to the parent state SupplicantStartedState processing, called here the two functions:
. 1) setScanResults
the first of the first function tmpResults = mWifiNative.scanResults(sid),WifiNative.java::scanResults::doStringCommand:: doStringCommandNative(mInterfacePrefix + command), followed by jni
android_net_wifi_WifiNative.cpp::android_net_wifi_doStringCommand(JNIEnv* env, jobject, jstring javaCommand)::doStringCommand(env,javaCommand)is the process sends a command with the acquired scan results of processing the subsequent scan command.
2) sendScanResultsAvailableBroadcast ()
mContext.sendBroadcastAsUser(intent, UserHandle.ALL); broadcast transmitting WifiManager.SCAN_RESULTS_AVAILABLE_ACTION

Back wifisettings.java,
WifiSettings.java::wifisettings::mReceiver = new BroadcastReceiver, registered a broadcast receiver receives

WifiManager.SCAN_RESULTS_AVAILABLE_ACTION,调用 handleEvent(context, intent);
updateAccessPoints()
Released eight original articles · won praise 1 · views 139

Guess you like

Origin blog.csdn.net/qq_33707295/article/details/103879858