二 AndroidO WiFi Enable


版权声明:本文为博主原创文章,未经博主允许不得转载。

太极最高境界是忘我,代码最高境界是简单
技术分享最高境界是接地气大白话行里行外人都能看明白听懂
本文也是基于以上,将技术简单朴实化(望起到提纲挈领作用)。

流程图

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)。

说了这么多,来一张(一目了然)
Enable 流程图

其中关于自动连接(这里后面专门开一遍好好讲讲,这里面涉及较为复杂网络算法,通过该算法来实现选择最好的网络连接)

关键环节代码

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 有疑问的,私信联系我(详细给你讲一遍~~)

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值