版权声明:本文为博主原创文章,未经博主允许不得转载。
太极最高境界是忘我,代码最高境界是简单
技术分享最高境界是接地气大白话行里行外人都能看明白听懂
本文也是基于以上,将技术简单朴实化(望起到提纲挈领作用)。
流程图
Android O 版本WiFi整体框架见 Android O WiFi 框架变化。
当在WiFi菜单栏上点击小开关(Button)之后,过一小会儿
- 那些熟悉热点名字整齐的排在了列表中,
- 之前保存的热点刷的自动连上,而且连接到信号最好的。
这一过程中,系统后台干了那些事儿呢,可以得到上面神奇效果呢?本章为你揭秘上面的面纱。
以上主要涉及到三个主要过程:
- Settings通过wifiManager将启动wifi的cmd(CMD_WIFI_TOGGLED)给到WifiStateMachine;
- WifiStateMachine关门在内部中完成对state的转换,最后吐出后CMD_START_SUPPLICANT给自家小弟进一步处理,其又会将任务转移给到wifiNative;
- wifiNative是连接Wifi Hal层中间重要代理商,将上头老板(wifiStateMachine)交代的事情好好传达给到Hal + WifiCond层,然后又将来自WifiCond+Hal层的Callback如实上报给到上层(wifiService+WifiMonitor+WifiStateMachine)。
说了这么多,来一张图(一目了然)
其中关于自动连接(这里后面专门开一遍好好讲讲,这里面涉及较为复杂网络算法,通过该算法来实现选择最好的网络连接)
关键环节代码
1. //通过WiFiManager获取WifiService
mWifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
2. enable wifi
mWifiManager.setWifiEnabled(mbool); //jump to WifiManager --(Uid + PackageName)--> wifiService --> WifiServiceImpl.java
3. send CMD_WIFI_TOGGLED
mWifiController.sendMessage(CMD_WIFI_TOGGLED); // jump to WifiController.java ---- >WifiStateMachine
4. transitionTo ApStaDisabledState -> StaDisabledWithScanState --> DeviceActiveState
又 InitialState 继承 StaDisabledWithScanState
case CMD_WIFI_TOGGLED -- > case CMD_START_SUPPLICANT
5. wifiStateMachine ----> call Native
case CMD_START_SUPPLICANT:
a. mWifiNative.setupForClientMode(); //jump to wifinative server/wifi/WifiNative.java -- load drv
b. mWifiNative.enableSupplicant() ;// start wpa_supplicant service + thread
6. native ----> hal via hidl (load drv + start wpa_supplicant)
IClientInterface iClientInterface = mWificondControl.setupDriverForClientMode(); //
a. mWifiVendorHal.startVendorHal(isStaMode);
b. mWifi = getWifiServiceMockable(); // call back IWifi.getService();
c. WifiStatus status = mWifi.start(); // seee Wifi::start(start_cb hidl_status_cb) ---> &Wifi::startInternal -- hal层
d. driver_tool_->LoadDriver(); // if fail Failed to load WiFi driver
e. bool SupplicantManager::StartSupplicant()
property_set("ctl.start", kSupplicantServiceName);
对以上关键flow 有疑问的,私信联系我(详细给你讲一遍~~)