WIFI操作流程源码分析—扫描

WIFI操作流程源码分析—扫描

在处理该消息的代码中做真正的使能工作:首先装载 WIFI 内核模块(该模块的位置硬编码为

"/system/lib/modules/wlan.ko" ), 然后启动 wpa_supplicant ( 配置文件硬编码为

"/data/misc/wifi/wpa_supplicant.conf") 再通过 WifiStateTracker 来启动 WifiMonitor 中的监视线程。

当使能成功后,会广播发送 WIFI_STATE_CHANGED_ACTION通知外界 WIFI已经成功使能了。

应用一侧扫描

WifiSettings创建的时候就会向 Android 注册接收WIFI_STATE_CHANGED_ACTION,因此它会收到该 Intent,从而开始扫描。

mReceiver = new BroadcastReceiver() {

            @Override

            public void onReceive(Context context, Intent intent) {

                handleEvent(context, intent);

            }

        };

private void handleEvent(Context context, Intent intent) {

        String action = intent.getAction();

        if (WifiManager.WIFI_STATE_CHANGED_ACTION.equals(action)) {

            updateWifiState(intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE,

                    WifiManager.WIFI_STATE_UNKNOWN));

        } else if (WifiManager.SCAN_RESULTS_AVAILABLE_ACTION.equals(action) ||

                WifiManager.CONFIGURED_NETWORKS_CHANGED_ACTION.equals(action) ||

                WifiManager.LINK_CONFIGURATION_CHANGED_ACTION.equals(action)) {

                ……

        }

}

private void updateWifiState(int state) {

        Activity activity = getActivity();

        if (activity != null) {

            activity.invalidateOptionsMenu();

        }

        switch (state) {

            case WifiManager.WIFI_STATE_ENABLED:

                mScanner.resume();

                /// M: update priority

                // if wifi has connectd, not need to updatePriority

                WifiInfo mCurrentConnecdInfo = mWifiManager.getConnectionInfo();

                if (mCurrentConnecdInfo != null && mCurrentConnecdInfo.getSSID() != null

                                   && mCurrentConnecdInfo.getSSID().length() > 0) {                   

                    mExt.updatePriority();                

                }

                return; // not break, to avoid the call to pause() below           

        }

        mLastInfo = null;

        mLastState = null;

        mScanner.pause();

    }

Scanner是一个内部类,实现如下:

private class Scanner extends Handler {

        private int mRetry = 0;

        void resume() {

            if (!hasMessages(0)) {

                sendEmptyMessage(0);//首先发送消息

            }

        }

        @Override

        public void handleMessage(Message message) {

            if (mWifiManager.startScanActive()) {

                mRetry = 0;

            } else if (++mRetry >= 3) {

                mRetry = 0;

                Activity activity = getActivity();

                if (activity != null) {

                    Toast.makeText(activity, R.string.wifi_fail_to_scan,

                        Toast.LENGTH_LONG).show();

                }

                return;

            }

            sendEmptyMessageDelayed(0, WIFI_RESCAN_INTERVAL_MS);

        }

    }

WifiManager中函数startScanActive进行处理

public boolean startScanActive() {

        try {

            mService.startScan(true);

            return true;

        } catch (RemoteException e) {

            return false;

        }

    }

服务一侧扫描

通过 AIDL,实际调用的是 WifiService startScan函数,

public void startScan(boolean forceActive) {       

        enforceChangePermission();//首先判断是否有权限

        mWifiStateMachine.startScan(forceActive);

        noteScanStart();

    }

WifiStateMachine中函数startScan会发送消息CMD_START_SCAN

public void startScan(boolean forceActive) {

        sendMessage(obtainMessage(CMD_START_SCAN, forceActive ?

                SCAN_ACTIVE : SCAN_PASSIVE, 0));

    }

WifiStateMachine内部类DriverStartedState会处理该消息

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值