一、基本概念
目前可以使用 wireless-tools 或 wpa_supplicant 工具来连接、配置WIFI。它主要包含wpa_supplicant与wpa_cli两个程序. 可以通过wpa_cli来进行WIFI的配置与连接,前提要保证wpa_supplicant正常启动;请记住重要的一点是,对无线网络的配置是全局性的,而非针对具体的接口。
wpa_supplicant是一个较好的选择,但缺点是它不支持所有的驱动。请浏览wpa_supplicant网站获得它所支持的驱动列表。另外,wpa_supplicant目前只能连接到那些你已经配置好ESSID的无线网络,它可以让您连接到那些使用WPA的AP。wireless-tools支持几乎所有的无线网卡和驱动,但它不能连接到那些只支持WPA的AP。
wpa_supplicant是一个开源项目,已经被移植到Linux,Windows以及很多嵌入式系统上。它是WPA的应用层认证客户端,负责完成认证相关的登录、加密等工作。
wpa_supplicant是一个独立运行的 守护进程,其核心是一个消息循环,在消息循环中处理WPA状态机、控制命令、驱动事件、配置信息等。
经过编译后 的 wpa_supplicant源程序可以看到两个主要的可执行工具:wpa_supplicant 和 wpa_cli。wpa_supplicant是核心程序,它和wpa_cli的关系就是服务和客户端的关系:后台运行wpa_supplicant,使用wpa_cli来搜索、设置、和连接网络。
【注】WPA全名为Wi-Fi Protected Access,有WPA和WPA2两个标准,是一种保护无线电脑网络(Wi-Fi)安全的系统,它是应研究者在前一代的系统有线等效加密(WEP)中找到的几个严重的弱点而产生的。WPA实作了IEEE 802.11i标准的大部分,是在802.11i完备之前替代WEP的过渡方案。WPA的设计可以用在所有的无线网卡上,但未必能用在第一代的无线取用点上。WPA2具备完整的标准体系,但其不能被应用在某些老旧型号的网卡上。
二、Android wpa_supplicant
Android使用一个修改版wpa_supplicant作为daemon来控制WIFI,它是一个安全中间件,代码位于external/wpa_supplicant,为各种无线网卡提供统一的安全机制,wpa_supplicant是通过socket与hardware/libhardware_legacy/wifi/wifi.c通信,如下图1所示:
图 1 : Android 平台 WiFi 框架
对应上述结构,基于Android 的WiFi控制分为三大组件:
1)客户端程序,包括wpa_cli命令行或java图形界面程序,通过unix本地socket与wpa_supplicant daemon服务通信,发送命令 并 接收结果;
2)wpa_supplicant daemon服务,对应上述中间部分,功能是“上传下达”。所有客户端通过它 控制硬件网卡,通过发送字符串命令 控制 是否扫描AP,提取扫描结果和是否关联 AP等操作,同时将驱动的执行状态发送给用户。该服务是设计支持多种无线网卡芯片,因此各个厂商共同提供了一个通用接口给wpa_supplicant调用;
3)网卡驱动;
------------------------------
Wpa_supplicant作用:
1、读取配置文件
2、初始化配置参数,驱动函数
3、让驱动scan当前所有的bssid
4、检查扫描的参数是否和用户设置的想否
5、如果相符,通知驱动进行权限 认证操作
6、连上AP
三、wpa_supplicant 命令:
参数描述:
-i :网络接口名称 wlan0
-c:配置文件名称
-C: 控制接口名称
-D:驱动类型名称 (可以是:nl80211,wext)
-p: 驱动参数
-b: 桥接口名称
1、sdio wifi 模块
wpa_supplicant -D nl80211 -c /etc/wpa_supplicant.conf -i wlan0 &
wpa_supplicant -D wext -c /etc/wpa_supplicant.conf -i wlan0 &
【注】WEXT和NL80211区别
WEXT和NL80211是 无线网卡驱动主要的两个“标准”
WEXT(Wireless Extension):使用WEXT的工具通过ioctl和驱动通信,典型工具ifconfig等;
NL80211(Netlink 80211):使用NL80211的工具通过一个特殊的socket和驱动打通信,典型工具包括IW、iwconfig等。
这里的NL80211仅仅是netlink工具在无线驱动方面的一个应用,其实它的应用很广泛,也很基础。Netlink提供了一种通信方式,通信双方可以是用户态或内核态,关于这方面的介绍,直接看libnl(netlink的一个实现)的网站(http://www.infradead.org/~tgr/libnl/),讲解的很详细。目前使用netlink主要是通过libnl来做,当然也可以自己拼凑和解析消息。
【注】部分内容参考 :
https://blog.csdn.net/zm19930923zm/article/details/88743533
https://blog.csdn.net/weixin_38503885/article/details/83116977
https://www.cnblogs.com/klcf0220/p/11121238.html
https://www.cnblogs.com/klcf0220/p/11121238.html