wifi-wap_supplicant

2018-09-27  本文已影响0人  ylliu3788

wpa_supplicant 学习

wpa_supplicant软件架构

1 命令介绍

WPAS对外通过控制模块与客户端通信。在android平台中,WPAS的客户端是位于framework中的wifiservice。用户在settings界面进行的wifi相关的操作最终都会经由wifiservice通过发送命令的方式转交给wpa_supplicant去执行。
WPAS常用命令:

wpa_supplicant: wlan0: Control interface command 'ADD_NETWORK'  
wpa_supplicant: CTRL_IFACE: ADD_NETWORK
wpa_supplicant: wlan0: Control interface command 'SET_NETWORK [REMOVED]'
wpa_supplicant: CTRL_IFACE: SET_NETWORK id=1 name='ssid'
wpa_supplicant: wlan0: Control interface command 'SET_NETWORK [REMOVED]'
wpa_supplicant: CTRL_IFACE: SET_NETWORK id=1 name='id_str'
wpa_supplicant: wlan0: Control interface command 'SET_NETWORK [REMOVED]'
wpa_supplicant: CTRL_IFACE: SET_NETWORK id=1 name='key_mgmt'
wpa_supplicant: wlan0: Control interface command 'SET_NETWORK [REMOVED]'
wpa_supplicant: CTRL_IFACE: SET_NETWORK id=1 name='psk'
wpa_supplicant: wlan0: Control interface command 'SET_NETWORK [REMOVED]'
wpa_supplicant: CTRL_IFACE: SET_NETWORK id=1 name='pairwise'
wpa_supplicant: wlan0: Control interface command 'SET_NETWORK [REMOVED]'
wpa_supplicant: CTRL_IFACE: SET_NETWORK id=1 name='group'
wpa_supplicant: wlan0: Control interface command 'SET_NETWORK [REMOVED]'
wpa_supplicant: CTRL_IFACE: SET_NETWORK id=1 name='priority'

除了接收来自Client的命令外,WPAS也会主动给client发送命令。如要求输入无线网络的密码等。这类命令称之为Interactive Request.

wpa_supplicant: wlan0: CTRL-EVENT-TERMINATING 
wpa_supplicant: p2p0: CTRL-EVENT-TERMINATING 
wpa_supplicant: wlan0: CTRL-EVENT-SUBNET-STATUS-UPDATE status=0
wpa_supplicant: wlan0: CTRL-EVENT-CONNECTED - Connection to d4:a1:48:ea:66:18 completed [id=1 id_str=%7B%22creatorUid%22%3A%221000%22%2C%22configKey%22%3A%22%5C%22HW-WQN4K9%5C%22WPA_PSK%22%7D]

2 控制API介绍

wifiservice是WPAS的客户端,它和WPAS交互时必须使用wpa_supplicant提供的API。这些API声明于wpa_ctrl.h中。
创建和销毁控制对象wpa_ctrl

//ctrl_path代表unix域socket的位置
struct wpa_ctrl* wpa_ctrl_open(const char* ctrl_path);
void wpa_ctrl_close(struct wpa_strl *ctrl);

发送命令给WPAS 回复的消息保存在reply中, msg_cb是回调。

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));

wpa_supplicant 规定只有打开通知事件监听功能的wpa_ctrl对象才能在wpa_ctrl_request中通过msg_cb获取通知事件。

//打开通知事件监听功能
int wpa_ctrl_attach(struct wpa_ctrl *ctrl);
//打开通知事件功能的wpa_ctrl对象能直接调用下面的函数来接收unsolicited event
int wpa_ctrl_recv(struct wpa_ctrl *ctrl, char* reply, size_t* reply_len);

使用wpa_supplicant连接无线网络

使用命令行的方式发送命令出发wpa_supplicant进行相关工作,是手机加入一个网络。

adb root
adb shell
cd /vendor/bin
wpa_cli -i wlan0 //该命令执行后,将进入 wpa_cli 进程
ADD_NETWORK //该命令执行后会返回新的网络配置项编号 0
SET_NETWORK 0 ssid "test" //设置0号网络的SSID为“test”
SET_NETWORK 0 key_mgmt WPA-PSK //设置0号网络的key_mgmt为“WPA-PSK”
SET_NETWORK 0 psk "12345678" //设置0号网络的psk为“12345678”
ENABLE_NETWORK 0 //使能0号网络,它将触发wpa_supplicant扫描关联等一系列操作直到加入无线网络“test”
ctrl+c //退出
dhcpcd wlan0 //启动DHCPD。获取IP地址。

来自客户端的命令都由wpa_supplicant_ctrl_iface_receive函数处理,然后再调用wpa_supplicant_ctrl_iface_process处理。
ADD_NETWORK 的真正处理在 wpa_supplicant_ctrl_iface_add_network 函数

wpa_states的取值

wpa_states的取值如下。

上一篇 下一篇

猜你喜欢

热点阅读