前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Android8.1的WIFI扫描后连接过程和配置IP地址

Android8.1的WIFI扫描后连接过程和配置IP地址

作者头像
用户7557625
发布2020-07-15 10:27:14
1.6K0
发布2020-07-15 10:27:14
举报
文章被收录于专栏:程序猿的那点事

frameworks/base/wifi/java/android/net/wifi/WifiManager.java 在service中开启扫描。

代码语言:javascript
复制
    @RequiresPermission(android.Manifest.permission.UPDATE_DEVICE_STATS)
    public boolean startScan(WorkSource workSource) {
        try {
            String packageName = getContext().getOpPackageName();
            mService.startScan(null, workSource, packageName);
            return true;
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
        }
    }

frameworks/opt/net/wifi/service/java/com/android/server/wifi/WifiServiceImpl.java 跳转到Wifi状态机中的开始扫描。

代码语言:javascript
复制
    public void startScan(ScanSettings settings, WorkSource workSource, String packageName) {
        enforceChangePermission();

        mWifiStateMachine.startScan(Binder.getCallingUid(), scanRequestCounter++,
                settings, workSource);
    }

frameworks/opt/net/wifi/service/java/com/android/server/wifi/WifiStateMachine.java 发送`CMD_START_SCAN消息

代码语言:javascript
复制
    public void startScan(int callingUid, int scanCounter,
                          ScanSettings settings, WorkSource workSource) {
        Bundle bundle = new Bundle();
        bundle.putParcelable(CUSTOMIZED_SCAN_SETTING, settings);
        bundle.putParcelable(CUSTOMIZED_SCAN_WORKSOURCE, workSource);
        bundle.putLong(SCAN_REQUEST_TIME, mClock.getWallClockMillis());
        sendMessage(CMD_START_SCAN, callingUid, scanCounter, bundle);
    }

处理CMD_START_SCAN消息

代码语言:javascript
复制
                case CMD_START_SCAN:
                    handleScanRequest(message);
                    break;

跳转到handleScanRequest函数。

代码语言:javascript
复制
1636    private void handleScanRequest(Message message) {
1661        if (startScanNative(freqs, hiddenNetworks, workSource)) {
1710    private boolean startScanNative(final Set<Integer> freqs,
1751        mWifiScanner.startScan(settings, nativeScanListener, workSource);

frameworks/base/wifi/java/android/net/wifi/WifiScanner.java 跳转到WifiScanner.java中的startscan()函数

代码语言:javascript
复制
808    @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE)
809    public void startScan(ScanSettings settings, ScanListener listener, WorkSource workSource) {
810        Preconditions.checkNotNull(listener, "listener cannot be null");
811        int key = addListener(listener);
812        if (key == INVALID_KEY) return;
813        validateChannel();
814        Bundle scanParams = new Bundle();
815        scanParams.putParcelable(SCAN_PARAMS_SCAN_SETTINGS_KEY, settings);
816        scanParams.putParcelable(SCAN_PARAMS_WORK_SOURCE_KEY, workSource);
817        mAsyncChannel.sendMessage(CMD_START_SINGLE_SCAN, 0, key, scanParams);
818    }

frameworks/opt/net/wifi/service/java/com/android/server/wifi/scanner/WifiScanningServiceImpl.java 在DriverStartedState中处理CMD_START_SINGLE_SCAN消息。

代码语言:javascript
复制
        class DriverStartedState extends State {
                    case WifiScanner.CMD_START_SINGLE_SCAN:
                                tryToStartNewScan();

        void tryToStartNewScan() {
            if (mScannerImpl.startSingleScan(settings, this)) {

/frameworks/opt/net/wifi/service/java/com/android/server/wifi/WifiStateMachine.java

代码语言:javascript
复制
            case WifiMonitor.SCAN_RESULTS_EVENT:
            case WifiMonitor.SCAN_FAILED_EVENT:
                maybeRegisterNetworkFactory(); 
                setScanResults();
                mIsScanOngoing = false;
                mIsFullScanOngoing = false;
                if (mBufferedScanMsg.size() > 0)
                    sendMessage(mBufferedScanMsg.remove());
                break;

/frameworks/base/wifi/java/android/net/wifi/WifiManager.java

代码语言:javascript
复制
    public void connect(WifiConfiguration config, ActionListener listener) {
        if (config == null) throw new IllegalArgumentException("config cannot be null");
        getChannel().sendMessage(CONNECT_NETWORK, WifiConfiguration.INVALID_NETWORK_ID,
                putListener(listener), config);
    }

frameworks/opt/net/wifi/service/java/com/android/server/wifi/WifiServiceImpl.java

代码语言:javascript
复制
                case WifiManager.CONNECT_NETWORK: {
                    if (checkChangePermissionAndReplyIfNotAuthorized(
                            msg, WifiManager.CONNECT_NETWORK_FAILED)) {
                        WifiConfiguration config = (WifiConfiguration) msg.obj;
                        int networkId = msg.arg1;
                        Slog.d(TAG, "CONNECT "
                                + " nid=" + Integer.toString(networkId)
                                + " uid=" + msg.sendingUid
                                + " name="
                                + mContext.getPackageManager().getNameForUid(msg.sendingUid));
                        if (config != null) {
                            if (DBG) Slog.d(TAG, "Connect with config " + config);
                            /* Command is forwarded to state machine */
                            mWifiStateMachine.sendMessage(Message.obtain(msg));
                        } else if (config == null
                                && networkId != WifiConfiguration.INVALID_NETWORK_ID) {
                            if (DBG) Slog.d(TAG, "Connect with networkId " + networkId);
                            mWifiStateMachine.sendMessage(Message.obtain(msg));
                        } else {
                            Slog.e(TAG, "ClientHandler.handleMessage ignoring invalid msg=" + msg);
                            replyFailed(msg, WifiManager.CONNECT_NETWORK_FAILED,
                                    WifiManager.INVALID_ARGS);
                        }
                    }
                    break;
                }

frameworks/opt/net/wifi/service/java/com/android/server/wifi/WifiStateMachine.java

代码语言:javascript
复制
                case WifiManager.CONNECT_NETWORK:
                        result = mWifiConfigManager.addOrUpdateNetwork(config, message.sendingUid);

                    broadcastWifiCredentialChanged(WifiManager.WIFI_CREDENTIAL_SAVED, config);
                    replyToMessage(message, WifiManager.CONNECT_NETWORK_SUCCEEDED);
                    break;

                case WifiMonitor.NETWORK_CONNECTION_EVENT:
                        transitionTo(mObtainingIpState);

frameworks/base/services/net/java/android/net/dhcp/DhcpClient.java 在DhcpClient中处理IP地址的获取。DhcpClient是一个小型的状态机,

代码语言:javascript
复制
                case CMD_START_DHCP:
                    if (mRegisteredForPreDhcpNotification) {
                        transitionTo(mWaitBeforeStartState);
                    } else {
                        transitionTo(mDhcpInitState);
                   }

       public void enter() {
           super.enter();
        mController.sendMessage(CMD_PRE_DHCP_ACTION);
       }

frameworks/opt/net/wifi/service/java/com/android/server/wifi/WifiStateMachine.java

代码语言:javascript
复制
                case DhcpClient.CMD_PRE_DHCP_ACTION:
                    handlePreDhcpSetup();
                    break;

                case DhcpClient.CMD_POST_DHCP_ACTION:
                    mIsAutoRoamOngoing = false;
                    handlePostDhcpSetup();

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019/08/27 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
命令行工具
腾讯云命令行工具 TCCLI 是管理腾讯云资源的统一工具。使用腾讯云命令行工具,您可以快速调用腾讯云 API 来管理您的腾讯云资源。此外,您还可以基于腾讯云的命令行工具来做自动化和脚本处理,以更多样的方式进行组合和重用。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档