wifi连接有一些阶段:但是还没了解他们的具体协议内容。
1、AP定期发送beacon数据包,使无线终端更新自己的无线网络列表。2、无线终端在每个信道(1-13)广播ProbeRequest(非隐藏类型的WiFi含ESSID,隐藏类型的WiFi不含ESSID)。
3、每个信道的AP回应,ProbeResponse,包含ESSID,及RSN信息。
4、无线终端给目标AP发送AUTH包。AUTH认证类型有两种,0为开放式、1为共享式(WPA/WPA2必须是开放式)。
5、AP回应网卡AUTH包。
6、无线终端给AP发送关联请求包associationrequest数据包。
7、AP给无线终端发送关联响应包associationresponse数据包。
8、EAPOL四次握手进行认证(握手包是破解的关键)。
9、完成认证可以上网。
4次握手如下:1、当一个无线客户端与一个无线AP连接时,先发出连接认证请求(握手申请:你好!)
2、无线AP收到请求以后,将一段随机信息发送给无线客户端(你是?)AP发送一个随机数组给AP
3、无线客户端将接收到的这段随机信息进行加密之后再发送给无线AP (这是我的名片)STA用PSK将数据进行加密发送给STA。PSK通过AP的SSID和PASSWORD生成的。
4、无线AP检查加密的结果是否正确,如果正确则同意连接 (哦~ 原来是自己人呀!)AP判断加密是否正确。
关于wpa_supplicant的P2P功能:http://w1.fi/wpa_supplicant/devel/p2p.html
wpa_supplicant就是用来扫面AP和连接AP的。
参考:http://blog.sina.com.cn/s/blog_55465b470100l73l.html
启动服务器:
/sbin/wpa_supplicant -B -P /run/sendsigs.omit.d/wpasupplicant.pid -u -s -O /var/run/wpa_supplicant
源码有解析:-B后台运行,-P将pid(进程ID)写到指定文件,-u启动DBus控制接口,-s将log写到syslog,-O通讯文件/var/run/wpa_supplicant,目录有个wlan0。-i指定网卡。
/sbin/wpa_supplicant -B -P /run/sendsigs.omit.d/wpasupplicant.pid -u -s -iwlan0 -c/var/run/wpa_supplicant/con.conf
-c指定配置文件。配置文件:
#这里等于-O /var/run/wpa_supplicant,wpa_cli需要用到,ctrl_interface=/var/run/wpa_supplicant是一个目录,然后wpa_supplicant_add_iface调用wpa_supplicant_init_iface调用wpa_supplicant_ctrl_iface_init调用wpas_ctrl_iface_open_sock,将会组合/var/run/wpa_supplicant/wlan0.wlan0是-i参数。/var/run/wpa_supplicant/wlan0用来与wpa_cli通讯SOCKET用的。
ctrl_interface=/var/run/wpa_supplicant/
update_config=1
WPA_SUPPLICANT简单理解:源码main.c是入口,假设用epoll,其实一般用的是select。
1.wpa_supplicant_init将运行时的参数配置进全局structor中,并调用eloop_init>>epoll_create1。
2.wpa_supplicant_add_iface添加interface,如wlan0数据。调用wpa_supplicant_init_iface-》wpa_config_read读取-c文件内容,->wpa_supplicant_ctrl_iface_init->wpas_ctrl_iface_open_sock->wpa_supplicant_ctrl_iface_path(获得通讯地址文件)建立unix socket(/var/run/wpa_supplicant/wlan0),eloop_register_read_sock调用epoll_ctrl注册通讯的读取事件。并注册回调函数wpa_supplicant_ctrl_iface_receive用以接收wpa_cli命令。wpa_msg_register_cb(wpa_supplicant_ctrl_iface_msg_cb);注册回调函数,用以发送msg到wpa_cli。
3. wpa_supplicant_run->eloop_run处理超时/读写/信号。其中 epoll_wait接收wpa_ctrl通讯(写事件),通过eloop_sock_table_dispatch回调函数wpa_supplicant_ctrl_iface_receive处理。最终处理函数一般进wpa_supplicant_ctrl_iface_process
启动客服端:
sudo wpa_cli -iwlan0 -p/var/run/wpa_supplicant
-p指定与wpa_supplicant通讯的文件。UNIX_SOCK.
1.扫描AP
sudo wpa_cli -iwlan0 -p/var/run/wpa_supplicant scan
2.打印扫描结果:6c:b0:ce:bd:d0:b3(mac) 2462(frequency) -43(signal) [WPS][ESS](加密方式) Ocean-2.4G(ssid)
加密方式有:open和[WPS][ESS]都可以用key_mgmt NONE来连接,
[WPA-PSK-CCMP+TKIP][WPA2-PSK-CCMP+TKIP].PSK:Pre-Shared Key (clear or encrypted)预共享秘钥。设置key_mgmt为WPA-PSK,pairwise(Pairwise ciphers for WPA)配置为CCMP TKIP
[WPA-EAP-CCMP+TKIP][WPA2-EAP-CCMP+TKIP][ESS].EAP扩展认证协议
sudo wpa_cli -iwlan0 -p/var/run/wpa_supplicant scan_result
3.添加网络接口。
sudo wpa_cli -iwlan0 -p/var/run/wpa_supplicant add_network
4.向网络接口0添加AP的SSID,用于连接。
sudo wpa_cli -iwlan0 -p/var/run/wpa_supplicant set_network 0 ssid '"Ocean-2.4G"' ###注意'""'
5.key_mgmt秘钥类型管理。
如果是OPEN:秘钥([WPS][ESS] Ocean-2.4G)。
WEP:模式key_mgmt NONE,有wep_key0设置密码。
WPA-PSK:就要key_mgmt WPA-PSK设置psk密码,
WPA-EAP:就要key_mgmt WPA-EAP可能还要选择加密类型eap(MD5, MSCHAPV2, OTP, GTC, TLS, PEAP, TTLS),EAP identity string和password.EAP用的比较少。
sudo wpa_cli -iwlan0 -p/var/run/wpa_supplicant set_network 0 key_mgmt NONE
6.启动接口0,去连接AP。
sudo wpa_cli -iwlan0 -p/var/run/wpa_supplicant enable_network 0
7.sudo wpa_cli -iwlan0 -p/var/run/wpa_supplicant status
查看状态结果:
bssid=6c:b0:ce:bd:d0:b3
ssid=Ocean-2.4G
id=0
mode=station
pairwise_cipher=NONE
group_cipher=NONE
key_mgmt=NONE
wpa_state=COMPLETED
ip_address=192.168.6.103
address=c4:85:08:8f:66:23
uuid=b9c45bd9-be63-5ec5-bc72-31a03d195410
8.sudo udhcpc -iwlan0
去AP网络dhcp服务器取得动态IP。
注:udhcpc分配IP成功了,该进程就没用了,可以kill掉。更多关于udhcpc用法参考:http://blog.csdn.net/hxchuan000/article/details/47810229
Sending discover...如果失败会一直discover。
Sending select for 192.168.43.180...成功分配IP。。。。
--------------sudo wpa_cli -iwlan0 -p/var/run/wpa_supplicant select_network 0
切换本地网络接口。
连接WPA_PSK网络:
1.sudo wpa_cli -iwlan0 -p/var/run/wpa_supplicant status
状态结果:
wpa_state=INTERFACE_DISABLED
ip_address=192.168.6.103
address=c4:85:08:8f:66:23
uuid=b9c45bd9-be63-5ec5-bc72-31a03d195410
2.sudo wpa_cli -iwlan0 -p/var/run/wpa_supplicant scan
OK
3.sudo wpa_cli -iwlan0 -p/var/run/wpa_supplicant scan_result
查看要连接的AP
76:04:2b:60:43:74 2442 -32 [WPA2-PSK-CCMP][WPS][ESS] Lenovo K50-T5
4.sudo wpa_cli -iwlan0 -p/var/run/wpa_supplicant add_network
添加网络接口。
5.sudo wpa_cli -iwlan0 -p/var/run/wpa_supplicant set_network 0 ssid '"Lenovo K50-T5"' ###注意'""'
添加AP的SSID
6.sudo wpa_cli -iwlan0 -p/var/run/wpa_supplicant set_network 0 key_mgmt WPA-PSK
加密方式WPA_PSK
7.sudo wpa_cli -iwlan0 -p/var/run/wpa_supplicant set_network 0 psk '"4da886c21a9c"'
添加psk密码。
8.sudo wpa_cli -iwlan0 -p/var/run/wpa_supplicant enable_network 0
使能网络。
9.sudo wpa_cli -iwlan0 -p/var/run/wpa_supplicant status
结果:
bssid=76:04:2b:60:43:74
ssid=Lenovo K50-T5
id=0
mode=station
pairwise_cipher=CCMP
group_cipher=CCMP
key_mgmt=WPA2-PSK
wpa_state=COMPLETED
address=c4:85:08:8f:66:23
uuid=b9c45bd9-be63-5ec5-bc72-31a03d195410
10.sudo udhcpc -iwlan0
去AP网络dhcp服务器取得动态IP。
Sending discover...如果失败会一直discover。
Sending select for 192.168.43.180...成功分配IP。。。。
这样就链接到AP了,可以通过他来连接到外网。udhcpc的用法之前有说过,用自己的脚本来实现ip配置。
而我们一般都是将这些配置写到wap_supplicant的配置文件里面:
ctrl_interface=DIR=/data/system/wpa_supplicant
GROUP=system
update_config=1
network={
ssid="AP ssid"
proto=WPA
key_mgmt=WPA-PSK
#psk="ap password"
psk=f161f2018e3b0f5dbe055360ea89eba0c0c014840b1e0091a99774222a61fa60
#psk是通过wpa_passphrase使用SSID和PASSWORD共同生成的
pairwise=CCMP TKIP(如果有的话,CCMP TKIP都是加密算法)
group=CCMP TKIP
}
启动wpa_supplicant就运行起来了。
=============================================================================
=============================================================================
分割线,参考资料:
=============================================================================
=============================================================================
目前可以使用wireless-tools或wpa_supplicant工具来配置无线网络。请记住重要的一点是,对无线网络的配置是全局性的,而非针对具体的接口。
wpa_supplicant是一个较好的选择,但缺点是它不支持所有的驱动。请浏览wpa_supplicant网站获得它所支持的驱动列表。另外,wpa_supplicant目前只能连接到那些你已经配置好ESSID的无线网络。wireless-tools支持几乎所有的无线网卡和驱动,但它不能连接到那些只支持WPA的AP。
经过编译后的wpa_supplicant源程序可以看到两个主要的可执行工具:wpa_supplicant和wpa_cli。wpa_supplicant是核心程序,它和wpa_cli的关系就是服务和客户端的关系:后台运行wpa_supplicant,使用wpa_cli来搜索、设置、和连接网络。
如何用wpa_supplicant使能一个wifi连接?
Stepby step:
1、运行wpa_supplicant程序;
执行:/system/bin/wpa_supplicant-d -Dwext -iwlan0 -c/data/misc/wifi/wpa_supplicant.conf
其中:
-d:增加调试信息
-Dwext:wext,驱动名称
-iwlan0:wlan0,网络接口名称
/system/bin/wpa_supplicant:wpa_supplicant可执行程序path
/data/misc/wifi/wpa_supplicant.conf:wpa_supplicant的配置文件path
2、运行命令行工具wpa_cli;
执行:wpa_cli-iwlan0 -p/data/system/wpa_supplicant
注,-p/data/system/wpa_supplicant中的wpa_supplicant并不是可执行程序,而是个控制套接字。
此时会进入交互模式。其中交互模式的命令如下表:
Fullcommand |
Shortcommand |
Description |
status |
stat |
displaysthe current connection status |
disconnect |
disc |
preventswpa_supplicant from connecting to any access point |
quit |
q |
exitswpa_cli |
terminate |
term |
killswpa_supplicant |
reconfigure |
recon |
reloadswpa_supplicant with the configuration file supplied (-c parameter) |
scan |
scan |
scansfor available access points (only scans it, doesn't displayanything) |
scan_result |
scan_r |
displaysthe results of the last scan |
list_networks |
list_n |
displaysa list of configured networks and their status (active or not,enabled or disabled) |
select_network |
select_n |
selecta network among those defined to initiate a connection (ieselect_network 0) |
enable_network |
enable_n |
makesa configured network available for selection (ie enable_network 0) |
disable_network |
disable_n |
makesa configured network unavailable for selection (ie disable_network0) |
remove_network |
remove_n |
removesa network and its configuration from the list (ie remove_network0) |
add_network |
add_n |
addsa new network to the list. Its id will be created automatically |
set_network |
set_n |
showsa very short list of available options to configure a network whensupplied with no parameters. Seenext section for a list of extremely useful parameters to be usedwith set_network and get_network. |
get_network |
get_n |
displaysthe required parameter for the specified network. See next sectionfor a list of parameters |
save_config |
save_c |
savesthe configuration |
设置网络的基本格式:set_network
显示网络信息的基本格式:get_network
相应的参数如下表:
Key |
Description |
Parameters |
ssid |
Accesspoint name |
string |
id_str |
Stringidentifying the network |
string |
priority |
Connectionpriority over other APs |
number(0 being the default low priority) |
bssid |
Macaddress of the access point |
macaddress |
scan_ssid |
Enable/disbalessid scan |
0,1, 2 |
key_mgmt |
Typeof key management |
WPA-PSK,WPA_EAP, None |
pairwise |
Pairwiseciphers for WPA |
CCMP,TKIP |
group=TKIP |
Groupciphers for WPA |
CCMP,TKIP, WEP104, WEP40 |
psk |
Pre-SharedKey (clear or encrypted) |
string |
wep_key0 |
WEPkey (up to 4: wep_key[0123]) |
string |
eap |
ExtensibleAuthentication Protocol |
MD5,MSCHAPV2, OTP, GTC, TLS, PEAP, TTLS |
identity |
EAPidentity string |
string |
password |
EAPpassword |
string |
ca_cert |
Pathnameto CA certificate file |
/full/path/to/certificate |
client_cert |
Pathnameto client certificate |
/full/path/to/certificate(PEM/DER) |
private_key |
Pathnameto a client private key file |
/full/path/to/private_key(PEM/DER/PFX) |
eg.1、连接无加密的AP
>add_network(It will display a network id for you, assume it returns 0)
>set_network0 ssid "666"
>set_network0 key_mgmt NONE
>enable_network0
>quit
eg.2、连接WEP加密AP
>add_network(assume return 1)
>set_network1 ssid "666"
>set_network1 key_mgmt NONE
>set_network1 wep_key0 "your ap password"
>enable_network1
eg.3、连接WPA-PSK/WPA2-PSK加密的AP
>add_network(assume return 2)
>set_network2 ssid "666"
>set_network2 psk "your pre-shared key"
>enable_network2
到此,wifi模块就能连接上AP了。
3、以上是通过命令行工具wpa_cli来实现wifi网络的连接。当然,也可以通过wpa_supplicant的配置文件来实现连接。
再回顾下运行wpa_supplicant时执行的命令:
/system/bin/wpa_supplicant-d -Dwext -iwlan0 -c/data/misc/wifi/wpa_supplicant.conf
我们在执行时加上了-c/data/misc/wifi/wpa_supplicant.conf,我们可以将我们要连接的AP的设置以一定的格式写入wpa_supplicant.conf配置文件中即可。
eg.
ctrl_interface=DIR=/data/system/wpa_supplicantGROUP=system update_config=1
network={
ssid="myaccess point"
proto=WPA
key_mgmt=WPA-PSK
psk="youpass words"
}