Wpa_gui程序分析(一)
很久没写blog了,在忙于一个非常大的项目,虽然充满了激情在做,但是劳累之余,技术的总结少了很多。
最近对于Wi-Fi上层的应用开发获取了很多知识,并且有部分和Qt产生了一定的联系,其中Wpa_gui就是其中之一。
Wpa_gui是一个基于Wpa_supplicant的无线连接管理工具,可以简单的认为是由wpa_supplicant+Qt的一个小型软件,它可以运行在linux,Windows及Unix操作系统下,作为配置连接无线网络使用。目前,在最新的Ubuntu系统下面,已经自动集成了该软件。
其中具体界面可以查看:http://hostap.epitest.fi/wpa_supplicant/wpa_gui.html
如果要获取该软件,可以去网站http://hostap.epitest.fi/wpa_supplicant/,获取wpa_supplicant的源码包,在源码包里就包含了wpa_gui的源码,并且包含了分别由Qt3和Qt4完成界面,以供不同的Qt环境使用。
获取源码包后,解压,可以获得wpa_supplicant-0.x.x目录,Wpa_gui的Qt4源码目录位于其中的wpa_supplicant/wpa_gui-qt4下,可以使用Qt Creator打开对应的工程文件wpa_gui.pro,方便阅读分析。
该工具的本质其实就是为wpa_supplicant提供了一个友好的用户界面,交互的操作由Qt4提供,而实际的功能则由底层的wpa_supplicant完成。在wpa_gui源码中,可以发现,整个源码由以下几个类构成:
AddInterface类:用于增加硬件的驱动接口
EventListModel类:用来构成事件的模型
EventHistory类:用来记录事件
NetworkConfig类:用来配置无线连接的参数
Peers类:显示搜索到的无线路由
ScanResults类:用来处理得到的扫描结果
StringQuery类:处理字符串询问
UserDataRequest类:处理用户的数据请求
WpaGui类:最核心的类,整合其他所有类,并且与wpa_supplicant进行数据报文的交换
WpaMsg类:简单的存储消息
可以说,整个源代码的类很少,代码量也不大,但是通过对其研究,却可以初步帮助我们学下Qt4作为前台界面,后台程序实现功能的一种模式。在这个程序类里面,最主要的的类就是WpaGui类,是整个程序的核心,并且该类里实现了与wpa_supplicant交互的功能,因此主要的分析就是围绕WpaGui类进行。
首先要知道怎么样与后台的wpa_supplicant进行交互,wpa_supplicant本身就提供了一套C/C++的接口,供外面程序调用,接口的头文件为wpa_ctrl.h,在WpaGui类的cpp文件中,可以清楚的看见include的头文件里,有#include “common/wpa_ctrl.h”。
在wpa_ctrl.h头文件中,包含一组宏定义的事件消息和8个函数接口。由于wpa_supplicant交互的方式是基于数据报文的,通过向外界发送事先定义好的事件消息,而外面这根据这些事件消息来确定下步要执行的动作。
譬如:#define WPA_EVENT_CONNECTED “CTRL-EVENT-CONNECTED ”
当Wpa_gui程序从wpa_supplicant获得这个宏定义消息后,就可以确定已经连接上确定的Wifi网络了,而在获得消息后,外面程序则可以使用8个函数接口来操作wpa_supplicant的行为。
而这些函数接口为:
struct wpa_ctrl * wpa_ctrl_open(const char *ctrl_path);
void wpa_ctrl_close(struct wpa_ctrl *ctrl);
int wpa_ctrl_request(struct wpa_ctrl *ctrl, const char *cmd, size_t cmd_len,
char *reply, size_t *reply_len,
void (*msg_cb)(char *msg, size_t len));
int wpa_ctrl_attach(struct wpa_ctrl *ctrl);
int wpa_ctrl_detach(struct wpa_ctrl *ctrl);
int wpa_ctrl_recv(struct wpa_ctrl *ctrl, char *reply, size_t *reply_len);
int wpa_ctrl_pending(struct wpa_ctrl *ctrl);
int wpa_ctrl_get_fd(struct wpa_ctrl *ctrl);
wpa_ctrl_open接口用来打开wpa_supplicant的控制接口,在UNIX系统里使用UNIX domain sockets,而在Windows里则是使用UDP sockets,当然接口的路径并不是固定的,可以根据配置文件内的路径设置来改变。
wpa_ctrl_close接口自然是用于关闭控制接口。
wpa_ctrl_request接口是用来发送控制命令至wpa_supplicant,并且会接受命令成功执行与否的反馈消息。这是一个堵塞的动作,一般会至少等待2秒钟用来接受反馈的回复消息。如果有未经主动请求的消息接受,堵塞的时间则会更长。
wpa_ctrl_attach接口是为控制接口注册一个事件监视,但注册成功后就可以开始接口事件消息。
wpa_ctrl_detach接口则是取消控制接口的事件监视。
wpa_ctrl_recv接口是在控制接口的事件监视注册成功后,用来接受事件消息,这是一个堵塞的操作,当没有可用的消息时,就会一直堵塞。
wpa_ctrl_pending接口是用来检测是否有即将到来的事件消息。
wpa_ctrl_get_fd接口则是来获得控制接口的文件描述符号。
了解了以上这些,就可以为全面深入Wpa_gui作一个铺垫。
Tags: wpa_supplicant
This entry was posted
on Saturday, May 15th, 2010 at 5:47 PM and is filed under C++, Linux技术, Qt技术.
You can follow any responses to this entry through the RSS 2.0 feed.
You can leave a response, or trackback from your own site.
q胖胖研究的东西真偏门阿真偏门
。。。wifi的上层开发啊,哪里偏门了啊。。