[RK3288][Android6.0] WiFi之Framework扫描过程

来源:互联网 发布:科来抓包软件破解版 编辑:程序博客网 时间:2024/05/10 16:37

Platform: Rockchip
OS: Android 6.0
Kernel: 3.10.92


Settings去开启wifi时,会调用到DisconnectedState类

enter -> WifiStateMachine.java//DisconnectedState
  startScan ->
    sendMessage -> //cmd:CMD_START_SCAN
      processMessage -> //DisconnectedState类,返回NOT_HANDLED,让父类处理
        processMessage -> //ConnectModeState类,返回NOT_HANDLED,让父类处理
         processMessage -> //DriverStartedState类
          handleScanRequest ->  //cmd: SCAN_WITHOUT_CONNECTION_SETUP
            startScanNative ->
              mWifiNative.scan ->
                scan -> WifiNative.java
                  doBooleanCommand    -> //command会根据type及freq list决定发的命令,这里是"SCAN TYPE=ONLY"
                    wpa_supplicant_ctrl_iface_receive -> ctrl_iface_unix.c
                      wpa_supplicant_ctrl_iface_process -> //cmd: scan
                        wpas_ctrl_scan ->
                          can_res_handler = scan_only_handler    //设置type=only才会跑的handler
                            wpa_supplicant_req_scan //发起扫描请求
                                
调用返回成功只表示发送扫描请求被接受,而扫描完成后会发送完成事件给framework,framework通过WifiMonitor类负责监听事件接收。
_wpa_supplicant_event_scan_results -> events.c
  wpa_msg_ctrl -> //event: WPA_EVENT_SCAN_RESULTS
    run -> WifiMonitor.java
      mWifiNative.waitForEvent //等到event后返回往下运行
        mWifiMonitorSingleton.dispatchEvent ->
          m.dispatchEvent ->
            handleEvent ->
              mStateMachine.sendMessage -> //event: SCAN_RESULTS_EVENT
                processMessage -> //DisconnectedState
                  processMessage -> //ConnectModeState
                    processMessage -> //DriverStartedState
                      processMessage -> //SupplicantStartedState
                        setScanResults -> //从native获取并保存扫描结果
                          mWifiNative.scanResults ->
                            doStringCommandWithoutLogging("BSS RANGE=" + sid + "- MASK=0x29d87");
                        sendScanResultsAvailableBroadcast    //通知app扫描完成,intent是WifiManager.SCAN_RESULTS_AVAILABLE_ACTION

设置了WifiManager.SCAN_RESULTS_AVAILABLE_ACTION的app就能收到消息,可以通过接口getScanResults()来获取,比如Settings apk利用它来更新扫描列表。


扫描返回结果的格式如下:
 * =================
 * id=1
 * bssid=68:7f:74:d7:1b:6e
 * freq=2412
 * level=-43
 * tsf=1344621975160944
 * age=2623
 * flags=[WPA2-PSK-CCMP][WPS][ESS]
 * ssid=zubyb
 * ====

             
参考:
Android -- Wifi扫描流程分析

阅读全文
1 0
原创粉丝点击