简介
wpa_supplicant 是 Linux BSD, Mac OSX 和 Windows 的 WPA 的服务, 支持 WPA 和 WPA2(IEEE 802.11i/RSN), 它适用于台式机 / 笔记本和嵌入式系统, Supplicant 是在客户端站中使用的 IEEE 802.1X/WPA 组件, 它使用 WPA 身份验证器实现秘钥协商, 并控制漫游和 IEEEE802.11 认证 / 关联的 WLAN 驱动程序
wpa_supplicant 被设计成一个在后台运行的 "守护进程" 程序, 并作为控制无线连接的后端组件, wpa_supplicant 支持单独的前端程序, 包含基于文本的前端 (wpa_cli) 和 GUI(wpa_gui)
wpa_supplicant 使用灵活的构建配置, 可用于选择包含哪些功能. 允许最小代码大小(WPA/WPA2-Personal 50kb 130kb 的 WPA/WPA2-Enterprise 中没有调试代码, 450kb 大小具有大多数功能和全面的调试支持, 这些示例大小来自 X86 平台的构建)
编译安装
Installation Environment : Ubuntu 16.04
Download (HTTP): https://w1.fi/releases/wpa_supplicant-2.6.tar.gz
Download MD5 sum: 091569eb4440b7d7f2b4276dbfc03c3c
Download size: 2.6 MB
Estimated disk space required: 36 MB
Estimated build time: 0.4 SBU (includes optional gui)
如图所示 wpa_supplicant 的迭代版本 , 最新的版本为 2016 年 10 月的 2.6 版本
versions.png
绿色背景 = 稳定版本
白色背景 = 开发版本
版本后的字母(发布中包含的内容)
- d = Host AP driver
- u = Host AP driver utilities
- h = hostapd
- w = wpa_supplicant
第三方依赖
wpa_supplicant 依赖于 openssl , libnl , 需要提前进行安装. 安装方法自行百度
配置
由于 wpa_supplicant 已经许久不更新, 配置的方式和通用的开源库不一样.
wpa_supplicant 目录中 cp defconfig .config 拷贝生成编译配置,
配置文件中可以针对功能进行裁剪, 适应更多的平台, 如指定 openssl 库的路径, 配置 libnl 的版本
- # Uncomment following two lines and fix the paths if you have installed OpenSSL
- # or GnuTLS in non-default location
- #CFLAGS += -I/usr/local/openssl/include
- #LIBS += -L/usr/local/openssl/lib
- # Use libnl v2.0 (or 3.0) libraries.
- #CONFIG_LIBNL20=y
- # Use libnl 3.2 libraries (if this is selected, CONFIG_LIBNL20 is ignored)
- #CONFIG_LIBNL32=y
指定编译器, 默认的编译器为 GCC, 如需要交叉编译需要修改 Makefile
CC=arm-linux-gnueabihf-gcc
指定安装路径, 默认的安装路径为 / usr/local / 目录下, 交叉编译的时候需要指定路径来存放, 方便打包制作文件系统, 同时也不会影响系统, 指定路径需要修改 Makefile 中
- export LIBDIR ?= /usr/local/lib/
- export INCDIR ?= /usr/local/include/
- export BINDIR ?= /usr/local/sbin/
安装
前面的配置完成之后, 执行 make 编译, make install 进行安装
最终生成的二进制可执行文件: wpa_supplicant 和 wpa_cli .
常用操作
wpa_supplicant 是一个连接, 配置 WiFi 的工具, 它主要包含 wpa_supplicant 与 wpa_cli 两个程序. 可以通过 wpa_cli 来进行 WiFi 的配置与连接, 前提要保证 wpa_supplicant 正常启动.
相当于 wpa_supplicant 是服务端, wpa_cli 是客户端.
启动 wpa_supplicant 应用
wpa_supplicant -D nl80211 -i wlan0 -c /etc/wpa_supplicant.conf -B
-D 驱动程序名称(可以是多个驱动程序: nl80211,wext)
-i 接口名称
-c 配置文件
-B 在后台运行守护进程
配置文件 /etc/wpa_supplicant.conf https://w1.fi/cgit/hostap/plain/wpa_supplicant/wpa_supplicant.conf 文件里, 添加下面代码:
- ctrl_interface=/var/run/wpa_supplicant //
- update_config=1 // 强制更新覆盖配置
ctrl_interface 指向的是一个目录, 在这个目录中默认会生成一个文件 / var/run/wpa_supplicant/wlan0, 这是 local socket address, 相当于 UNIX Domain Socket https://blog.csdn.net/z2066411585/article/details/78966434/ , 程序和后台程序 wpa_supplicant 进行通信(其实是 wpa_supplicant 作为后台服务程序是通过本地 socket 和客户端进行通信的)
update_config = 1 时会在 (客户端发送 SAVE_CONFIG 命令) 更新这个配置文件.
启动 wpa_cli 应用
wpa_cli 有命令和交互的方式进行操作
- wpa_cli -i wlan0 scan // 搜索附件 wifi 热点
- wpa_cli -i wlan0 scan_result // 显示搜索 wifi 热点
- wpa_cli -i wlan0 status // 当前 WPA/EAPOL/EAP 通讯状态
- wpa_cli -i wlan0 ping //pings wpa_supplicant
添加新的连接
- wpa_cli -i wlan0 add_network // 添加一个网络连接, 会返回 < network id>
- wpa_cli set_network <network id> ssid '"name"' //ssid 名称
- wpa_cli set_network <network id> psk '"psk"' // 密码
- wpa_cli set_network <network id> scan_ssid 1
- wpa_cli set_network <network id> priority 1 // 优先级
保存连接
wpa_cli -i wlan0 save_config // 信息保存到默认的配置文件中, 前面提到的 / etc/wpa_supplicant.conf
断开连接
wpa_cli -i wlan0 disable_network <network id>
连接已有连接
- wpa_cli -i wlan0 list_network // 列举保存过得连接
- wpa_cli -i wlan0 select_network <network id> // 连接指定的 ssid
- wpa_cli -i wlan0 enable_network <network id> // 使能制定的 ssid
网络连接成功的配置文件示例
- ctrl_interface=/var/run/wpa_supplicant/
- ap_scan=1
- network={
- scan_ssid=1
- ssid="xxxx"
- psk="xxxx"
- bssid=
- priority=2
- }
参考
wpa_supplicant 安装 http://www.linuxfromscratch.org/blfs/view/svn/basicnet/wpa_supplicant.html
来源: http://www.jianshu.com/p/f640eb36301a