wpa_cli是什么
官方定义:
“wpa_cli is a text-based frontend program for interacting with wpa_supplicant”
wpa_cli是一个用于和WPAS交互的基于文本的前台程序。
我们可以这样理解,wpa_cli是一个无线网络配置工具。
它可以用于查询状态、更改配置、触发事件(scan/authentication/association)等。
wpa_cli的工作原理
简单来说,就是利用socket实现和WPAS的本地进程间通讯。
wpa_cli的语法
wpa_cli [option...] [command]
wpa_cli的命令行选项option
wpa_cli [-p<path to ctrl sockets>] [-i<ifname>] [-hvB] [command..]
-h = 显示帮助信息
-v = 显示wpa_cli的版本信息
-B = 作为一个daemon在后台运行
-p = 指定控制socket的路径:/data/misc/wifi/sockets/
-i = 指定接口名,一般均为wlan0
关于socket路径和接口名的信息,请看下图:
(1)p2p0和wlan0是WPAS端创建的socket接口;
(2)wpa_ctrl_1050-2/3是在开启wifi过程中由Framework层客户端程序创建出的socket接口;
(3)其中一个用于向WPAS发送命令并接受WPAS的回复,另一个用于监听WPAS返回上来的unsolicited event。
wpa_cli的常用命令command
Command | Description |
status | 显示WPA/EAPOL/EAP的当前状态 |
ping | 心跳检测命令,wpa_cli通过它检测WPAS是否正常工作;WPAS收到“PING”后,会回复“PONG” |
mid | 显示设备MIB信息(dot1x, dot11) |
scan | 请求一次SCAN操作,仅仅扫描,并不显示扫描结果 |
scan_results | 显示最新的SCAN结果 |
scan_interval <value> | 设置scan间隔,单位为秒 |
log_level <level> | 设置WPAS的log级别,常设为DEBUG即可 |
get_capability <eap/pairwise/group/key_mgmt/channels> | 获取性能 |
get/set country CN/JP/US | 获取/设置国家码 |
sava_config | 保存当前的配置 |
add_network | 添加一个新的网络,会返回该新无线网络的id(从0开始) |
remove_network <id> | 移除一个网络 |
enable_network <id> | 使能某个无线网络,最终WPAS将通过一系列操作加入该无线网络 |
disable_network <id> | 禁止一个网络 |
get_network <id> <variable> | 获取网络的某一变量值 |
set_network <id> <variable> <value> | 设置指定无线网络的信息 |
identity <id> <identity> | 配置某一网络的identity |
Password <id> <password> | 配置某一网络的password |
termimate | 终止WPAS |
quit(简写q) | 退出wpa_cli |
wpa_cli的工作模式
1. 交互模式:
先启动wpa_cli,进入交互模式,在提示符“>”后输入命令;
2. 命令行模式:
启动wpa_cli的时候,同时输入命令作为wpa_cli的参数。
这两种模式下的命令集是相同的;
不同之处在于,在交互模式下,可以访问到unsolicited messages(不请自来的消息),
例如WPAS返回的事件,用户名/密码请求(CTRL-REQ-IDENTITY/PASSWORD-<id>:<text>)等。
注:id--->当前网络的唯一标示符;text--->关于该请求的描述。
wpa_cli交互模式实例
Client端API介绍
1. 创建与WPAS通信的控制对象(即socket文件)
struct wpa_ctrl * wpa_ctrl_open(const char *ctrl_path);
API的实现:socket()--->bind()
2. 销毁控制对象
void wpa_ctrl_close(struct wpa_ctrl *ctrl);
API的实现:close()
3. 发送命令(command)给WPAS并接收WPAS的回复(reply)
int wpa_ctrl_request(……);
API的实现:send()--->select()--->recv()
4. 打开控制对象的通知事件监听功能(即:将control socket注册为monitor socket)
int wpa_ctrl_attach(struct wpa_ctrl *ctrl);
5. 关闭控制对象的通知事件监听功能(即:将monitor socket还原为control socket)
int wpa_ctrl_detach(struct wpa_ctrl *ctrl);
6. 接收WPAS的unsolicited event
int wpa_ctrl_recv(struct wpa_crtl *ctrl, char *reply, size_t reply_len);
API的实现:recv()
Server端API介绍
1. 接收Client端发送的命令,进行处理,并进行回复
void wpa_supplicant_ctrl_iface_receive(int sock, void *eloop_ctx, void *sock_ctx);
API的实现:recvfrom()--->wpa_supplicant_ctrl_iface_process()--->sendto()
2. 向Client端发送unsolicited event
void wpa_supplicant_ctrl_iface_send(……);
API实现:sendmsg()