Android4.4 wpa_supplicant深入分析之初识wpa_supplicant

来源:互联网 发布:java 压力测试工具 编辑:程序博客网 时间:2024/04/30 03:25

本文主要分析wpa_supplicant_8,主要有三个子目录:

hostapd:当手机进入Soft AP模式时,手机将扮演AP的角色,需要hostapd来提供AP的功能。这就是wifi热点的实现。

wpa_supplicant:Station模式,也叫Managed模式。这是正常使用wifi连接AP的情况。

src:hostapd和wpa_supplicant中都包含一些通用的数据结构和处理方法,这些内容都放在此src目录中。注意,hostapd/src和wpa_supplicant/src子目录均连接到此src目录。

     wpa_supplicant是Android用户空间中无线网络部分的核心模块,所以framework层中和Wi-Fi相关的操作最终都将借由wpa_supplicant来完成。

下图是wpa_supplicant软件架构,去除加密部分的流程框图:

如图的软甲框架包括如下重要模块:

1、wpa_supplicant所有工作都围绕时间(event loop模块)展开。它是基于事件驱动的。wpa_supplicant没有使用多线程编程,所有时间处理都在主线程中完成。

2、位于event loop米快下的driver i/f接口模块用于隔离和底层驱动直接交互的那些driver控制模块。这些driver wrapper和平台以及芯片所使用的驱动相关。由于driver i/f的隔离作用,wpa_supplicant其他模块将能最大程度保持平台以及驱动的无关性。

3、driver wrapper经常要返回一些信息给上层。这些信息通过driver events的方式反馈给wpa_supplicant其他模块进行处理。

4、wpa_supplicant支持较多的配置参数,这些参数的处理由configuration模块完成。

wpa_supplicant命令和控制API

wpa_supplicant对外通过控制接口模块与客户端通信。在Android平台中,wpa_supplicant的客户端是位于framework中的WifiService。用户在Settings界面进行WiFi相关的操作最终都会经由WiFiService通过发送命令的方式转交给wpa_supplicant去执行。

5、命令

wpa_supplicant定义了许多命令,常见命令如下:

(1)PING:心跳检测命令。客户端(android应该是WifiService)用它判断wpa_supplicant是否工作正常。wpa_supplicant收到“PING”命令后需要回复“PONG”.

(2)MIB(Management Information Base,管理信息库):客户端用该命令来获取设备的MIB信息。

(3)STATUS:客户端用该命令来获取wpa_supplicant的工作状态。

(4)ADD_NETWORK:为wpa_supplicant添加一个新的无线网络。它将返回此无线网络的ID(从0开始)。注意,此network ID非常重要,客户端后续将通过它来知名自己想操作的无线网络。

(5)SET_NETWORK<network id><variable><value>:network id是无线网络的ID。此命令用于设置指定无线网络的信息。其中variable为参数,vablue为参数的值。

(6)ENABLE_NETWORK<network id>:使能某个无线网络。此命令最终将促使wpa_supplicant发起一系列操作以加入该无线网络。

6、控制API

Android平台WiFiService是wpa_supplicant的客户端,它和wpa_supplicant交互时必须使用wpa_supplicant提供的API。这些API声明于wpa_ctrl.h中。

客户端使用wpa_ctrl时首先要分配控制对象。下面两个API用于创建和销毁控制对象wpa_ctrl。

//创建一个wpa控制端对象wpa_ctrl。Android平台中,参数ctrl_path代表unix域socket的位置

[cpp] view plain copy
print?在CODE上查看代码片派生到我的代码片
  1. struct wpa_ctrl * wpa_ctrl_open(const char *ctrl_path);  
[cpp] view plain copy
print?在CODE上查看代码片派生到我的代码片
  1. void wpa_ctrl_close(struct wpa_ctrl *ctrl);  
下面这个函数用于发送命令给wpa_supplicant。

[cpp] view plain copy
print?在CODE上查看代码片派生到我的代码片
  1. int wpa_ctrl_request(struct wpa_ctrl *ctrl, const char *cmd, size_t cmd_len,  
  2.              char *reply, size_t *reply_len,  
  3.              void (<strong>*msg_cb</strong>)(char *msg, size_t len));  
msg_cb是一个回调函数,该参数的设置和wpa_supplicant中C/S通信机制的设计有关。

wpa_supplicant规定只有打开通知事件监听功能的wpa_ctrl对象,才能在wpa_ctrl_request中通过msg_cb获取通知对象。而打开通知事件监听功能相关的API如下:

//打开通知事件监听功能

[cpp] view plain copy
print?在CODE上查看代码片派生到我的代码片
  1. int wpa_ctrl_attach(struct wpa_ctrl *ctrl);  
//打开通知事件监听功能的wpa_ctrl对象能直接调用下面的函数来接收unsolicited event

[cpp] view plain copy
print?在CODE上查看代码片派生到我的代码片
  1. int wpa_ctrl_recv(struct wpa_ctrl *ctrl, char *reply, size_t *reply_len);  

如果客户端并不发送命令,而只是想接收unsolicited event,可通过wpa_ctrl_recv函数来达到此目的。

第二篇将正式开始wpa_supplicant的代码分析。





0 0
原创粉丝点击