android wifi工作流程

Android中上层java模块和下层c协议处理模块之间的交互不外乎这样的一个方式:上层发送命令(一般是一个消息或者)给c模块(一般是一个守护进程,开机就有监听消息的循环)执行,立即起一个定时器等待反馈,如果规定时间内没有反馈,则当失败处理。执行完成OK(有时是打通了一个socket通道,即建立起了链接),发送消息给上层,上层更新状态,执行失败,发消息也给上层以提示。当然,发送命令的这一过程还可以在一个线程中去做。

做完之后自己wait()。当下层的消息通知发到上层的时候,上层调用notify(),这就是同步处理。

以电话部分为例:主要包括Modem(语言和数据传输),RIL AT命令的发送和接收,解析等,一般做成一个守护进程RILD)其一般做法就是:接受参数->打开功能库,à建立事件循环线程à初始化处理à注册事件回调。(Init.rc中要配置其使用的设备节点,这里使用的节点有AT命令传输和数据传输两个,由于采用socket通讯。即两个socket节点。)

下面即是下层的响应:响应分:主动上报和请求回报。

3G时代的数据连接流程:第一步,通过AT命令激活PDP连接,第二步:pppd数据端完成拨号连接。

下面学习wifi部分:从下到上的层次来分:内核驱动层-wpa_supplicant->HAL适配层-JNI接口-java 框架-》应用层。

从应用层来看:wifiNative.java包装JNI,wifimanager 作为wifiServicewifi核心部分,处理驱动加载,扫描,连接,断开)的客户端,wifiService中使用两个handler,一个handler处理客户端的命令和底层上报的事件,即广播。另一个Handles interaction with WifiStateMachine 即和WifiStateMachine同步状态。注册wifi状态改变的广播。接收到广播的处理。是谁发出的广播呢?

   回到启动的时候,SystemServer启动的时候,会生成一个 ConnectivityService 的实例。

ConnectivityService 类中privateConnectivityService(Context context) 构造函数创建
WifiService
WifiStateTracker对象,代码如下:

  1. case     ConnectivityManager.TYPE_WIFI:
  2.  
  3. if (DBG)     Slog.v(TAG, "Starting Wifi Service.");
  4.  
  5. WifiStateTracker wst = new WifiStateTracker(context, mHandler);
  6.  
  7. WifiService     wifiService = new WifiService(context, wst);
  8.  
  9. ServiceManager.addService(Context.WIFI_SERVICE,     wifiService);
  10.  
  11. wifiService.startWifi();    
  12.  
  13. mNetTrackers[ConnectivityManager.TYPE_WIFI]     = wst;
  14. //开始监听下层的上报。WifiMonitor     用来接收来自底层的事件,WifiService WifiMonitor 是整个模块的核心。
  15. wst.startMonitoring();
  16.  
  17. break;

WifiMonitor
开始运行线程,会请求连接wpa_supplicant,通过调用WifiStateTracker函数connectToSupplicant然后通过wifi.cwifi_connect_to_supplicant,接着向wpa_ctrlwpa_ctrl_open。然后通过CreateFile函数向wpa_supplicant读取数据。连接成功后会发送EVENT_SUPPLICANT_CONNECTION消息启动获取DHCP地址线程阻塞调用(当连接上AP的时候,该线程会被执行起来获取IP地址),并记录自己的MAC地址(因为MAC地址不会改变
所以请求一次即可)接着开启一个死循环处理wpa_supplicant发送的事件。

当用户点击Wi-Fi按钮的时候WifiEnabler中的onPreferenceChange函数会被调用,再由该函数调用WifiManagersetWifiEnabled函数,它先引用AIDL经由IWifiManager通过Binder机制调用WifiService setWifiEnabled设置Wifi开启状态。同时WifiService会发送MESSAGE_ENABLE_WIFI消息,由WifiServicesetWifiEnabledBlocking函数响应该消息,负责Wifi可用的需要工作。首先他会加载驱动loadDriver(),然后开启wpa_supplicant( 配置文件硬编码为"/data/misc/wifi/wpa_supplicant.conf")再注册广播消息,而后通过 WifiStateTracker 来启动 WifiMonitor 中的监视线程。以上工作使能成功后,会调用setWifiEnabledState最后广播WIFI_STATE_CHANGED_ACTION 这个Intent,至此Wifi能动开启。接下来是扫描AP

WifiSettings
WifiEnabler 创建的时候就会向 Android 注册接收
WIFI_STATE_CHANGED_ACTION,因此他们都会收到WIFI_STATE_CHANGED_ACTION 这个IntentWifiEnabler负责使得图标加亮,WifiSettings负责使得开启扫描AP。经由WifiService startScan,再通过JNIandroid_net_wifi_scanCommand函数向wpa_supplicant发送扫描命令.wpa_supplicant 处理完 SCAN 命令后,它会向控制通道发送事件通知扫描完成,从而wifi_wait_for_event 函数会接收到该事件,由此 WifiMonitor 中的 MonitorThread 会被执行来处理接扫描结果事件。此线程通过WifiStateTracker 广播SCAN_RESULTS_AVAILABLE_ACTION这个Intent。而WifiSettings注册了接收此Intent,最终由其相应函数updateAccessPointsAP列表,以GUI的形式列出来。

.Settingsconnect函数响应连接,更新网络保存配置,更新设置当前选择的优先级最高,并保存。然后通过enableNetwork使得其他网络不可用来进行连接。最后调用WifiManagerreconnect函数连接当前选择的网络。
.WifiManagerreconnect函数通过AIDLBinder机制,调用WifiServicereconnect函数
.然后会调用 WifiStateTrackerreconnectCommand函数,通过JNIandroid_net_wifi_Wifi)android_net_wifi_reconnectCommand 函数向WPA_WPASUPPLICANT发送 RECONNECT命令。
. android_net_wifi_Wifi通过 doCommand(命令名,响应缓冲,响应缓存大小)调用wifi.c中的wifi_command函数来发送命令。
.最后通过 wpa_ctrlwpa_ctrl_request函数向控制通道发送连接命令。返回请求部分
.当连接上之后WPA_SUPPLICANT会向控制通道发送连接成功命令。wifi.c
wifi_wait_for_event函数阻塞调用并返回这个命令的字符串(CONNECTED.
.而后WifiMonitor会被执行来处理这个事件,WifiMonitor 再调用 WifiStateTracker
notifyStateChange,WifiStateTracker 则接着会往自身发送EVENT_DHCP_START 消息来启动
DHCP 去获取 IP 地址,然后广播NETWORK_STATE_CHANGED_ACTION消息,最后由
WifiSettings类来响应,改变状态和界面信息。
关键函数功能介绍
.connect函数功能
1.updateNetworkupdateNetwork(config)会将当前选择连接的AP配置信息
信息传递进去,配置信息有(网络ID等)。如果网络ID-1则重新添加网络配置,然后向
wpa_supplicant 发送SET_NETWORK命令(即通过这个网络ID设置其他一些相关信息,设置
SSID,密码等)如果网络配置不为-1则直接执行后面步骤即发送SET_NETWORK命令。
2.saveNetwork:告诉supplicant保存当前网络配置并更新列表。SaveNetwork会调用WifiServicesaveConfigurationwpa_supplicant发送SAVE_CONFIG命令保存当前网络配置信息,
如果返回false,则向wpa_supplicant重新发送RECONFIGURE命令获取配置信息,如果获取信息成功后,会Intent一个 NETWORK_IDS_CHANGED_ACTION事件WifiSettings会注册接受
这个时间并更新列表。
3.enableNetwork函数,向系统获取接口名并使得该接口有效。由于之前传递的disableOthers
true则向wpa_supplicant发送SELECT_NETWORK(如果传递的为false则发送ENABLE_NETWORK命令),
4.reconnect函数:连接AP
.reconnect函数功能:connect函数会调用WifiManagerreconnect然后通过Binder机制调用WifiServicereconnect,再由WifiStateTracke调用WifiNativewpa_supplicant发送
RECONNECT命令去连接网络,当连接上wpa_supplicant之后会向控制通道发送连接成功的令,wifi_wait_for_event函数阻塞等待该事件的发生,并返回这个命令的字符串(CONNECTED
.android_net_wifi_Wifi函数的doCommand函数会调用wifi.cwifi_command函数将上层的命令向wpa_supplicant发送。
.wifi_wait_for_event函数以阻塞的方式,等待控制通道传递的事件。当有事件传递过来的时候
该函数会通过wpa_ctrlwpa_ctrl_recv函数读取该事件,并以字符串形式返回该事件名。

.wpa_ctrl_request,通过socket方式向wpa_supplicant发送命令,以select模式阻塞在
wpa_supplicant发送和接收

.WifiMonitor维护一个监视线程分发处理底层返回上来的事件.

此时返回的事件是CONNECTED因此handleNetworkStateChange会被调用,验证一下BSSID,重新获得networkId,然后调用WifiStateTrackenotifyStateChange通知状态改变了的消息(EVENT_NETWORK_STATE_CHANGED)接着处理这个消息,会移除可用网络通告,然后通过 configureInterface()的动态获取IP地址。最后发送一个NETWORK_STATE_CHANGED_ACTION IntentWifiSetings注册了此Intent因此会响应该它。由updateConnectionState函数响应。
.updateConnectionState 获取连接信息,更新列表状态,设置为Connected,然后设置当前网络为可用状态

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值