Android12 Wifi的连接过程梳理

1. app调用wifiManager的connect方法

WifiManager WifiService WifiServiceImpl ConnectHelper ClientModeManager ClientModeImpl WifiNative SupplicantStaIfaceHal SupplicantStaNetworkHal App层 connect connectInternal framework层 connect (Binder调用) connect connectToNetwork connectNetwork connectNetwork ClientModeImpl设计了状态机,后面会单独研究这块 connectToNetwork (调到native层) native层 connectToNetwork (与hal层交互) hal层 select() (选定要连接的wifi) WifiManager WifiService WifiServiceImpl ConnectHelper ClientModeManager ClientModeImpl WifiNative SupplicantStaIfaceHal SupplicantStaNetworkHal

2.APP侧监听连接结果

2.1 应用层监听代码

cpp 复制代码
    private void listenConnectState() {
        IntentFilter intentFilter = new IntentFilter();
        intentFilter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);
        BroadcastReceiver receiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                NetworkInfo networkInfo = intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO);
                Log.d(TAG, "*************** networkState:" + networkInfo.getState());
                assert networkInfo != null;

                if (networkInfo.isConnected()) {
                    Log.d(TAG, "sucess------------");
                } else if (networkInfo.getState() == NetworkInfo.State.DISCONNECTED) {
                    Log.d(TAG, "disconnected------------");
                }
            }
        };
        mContext.registerReceiver(receiver, intentFilter);
    }

2.2 重要接口概述:

  1. Client Mode(客户端模式):设备作为客户端连接到一个无线接入点(AP),进行互联网或局域网通信。然后clientMode的实现在ClientModeImpl
  • wifi回调事件都会进入ClientModeImpl::WifiNetworkAgentCallback
  1. Scan-Only Mode(仅扫描模式):设备在该模式下仅进行 Wi-Fi 网络扫描,并不进行实际的数据连接。这通常用于搜索附近的 Wi-Fi 网络或检查网络状态。scanOnly则实现在ScanOnlyModeImpl

2.3 ClientModeImpl类的状态切换

  • 简单的说: 就是app发起连接调用,按1描述的流程调用到ClientModeImpl, 然后再各个子状态之间跳转。比如下面的流程就是app发起wifi连接的流程,从DisconnectedState一步步变到L3ConnectedState。

APP ClientModeImpl DisconnectedState ConnectableState wifiNative L2ConnectingState L2ConnectedState WifiNetworkAgentCallback NetworkAgent ConnectivityManager L3ConnectedState APP侧调用wifiManager发起连接 收到CMD_CONNECT_NETWORK 调用connectToUserSelectNetwork 发送CMD_START_CONNECT 消息 处理 CMD_START_CONNECT 调用connectToNetwork connectToNetwork 切到L2Connecting 注册回调 new WifiNetworkAgentCallback new register() registerNetworkAgent() alt [注册ConnectivityManager- 的Binder] 根据回调进入不同的接口,发出不同的handelr消息 切到L3ConnectedState transitionTo(mL3ConnectedState) sendNetworkChangeBroadcast(DetailedState.CONNECTED) 发送广播,通知到APP 收到广播 alt [收到CMD_IP_CONFIGURATION_SUCCESSFUL] [收到WifiMonitor.NETWORK_CONNECTION_EVENT事件] APP ClientModeImpl DisconnectedState ConnectableState wifiNative L2ConnectingState L2ConnectedState WifiNetworkAgentCallback NetworkAgent ConnectivityManager L3ConnectedState

相关推荐
雨白2 小时前
Jetpack系列(二):Lifecycle与LiveData结合,打造响应式UI
android·android jetpack
kk爱闹3 小时前
【挑战14天学完python和pytorch】- day01
android·pytorch·python
每次的天空5 小时前
Android-自定义View的实战学习总结
android·学习·kotlin·音视频
恋猫de小郭5 小时前
Flutter Widget Preview 功能已合并到 master,提前在体验毛坯的预览支持
android·flutter·ios
断剑重铸之日6 小时前
Android自定义相机开发(类似OCR扫描相机)
android
随心最为安6 小时前
Android Library Maven 发布完整流程指南
android
岁月玲珑7 小时前
【使用Android Studio调试手机app时候手机老掉线问题】
android·ide·android studio
还鮟11 小时前
CTF Web的数组巧用
android
小蜜蜂嗡嗡12 小时前
Android Studio flutter项目运行、打包时间太长
android·flutter·android studio
aqi0012 小时前
FFmpeg开发笔记(七十一)使用国产的QPlayer2实现双播放器观看视频
android·ffmpeg·音视频·流媒体