能够缓和客户未有荧屏而不可能操作WIFI的主题素材,Android平台下的WIFI模块

V/WifiMonitor( 1201): Event [CTRL-EVENT-STATE-CHANGE id=0 state=7]

仿照效法原版的书文:http://cache.baiducontent.com
/c?m=9f65cb4a8c8507ed4fece7631046893b4c4380146d96864968d4e414c42246100024b8ed7a66471980853a3c50f11e41bca770216c5d61aa9bc98b4addb9922b3bcd7a742613d51742c419de8a1c729f7e875a98ea42b3e1&p=8b2a975bcd8711a052eedb2f4a4c&newp=8b2a971f81822dec08e29e7d495d92695c02dc3051dcd14f2895ff0b&user=baidu&fm=sc&query=adb+shell+wifi&qid=&p1=4

1
扫描的入口函数是WifiService的startScan,它实在也正是往wpa_supplicant发送SCAN命令。

不可收入态表明该服务端已经在运作了(也说不定是可输入状态,只要后边的wpa_cali可三翻五次就行)。-i
-D -c的参数意义可径直在Help中查询,具体有些参数恐怕因平台分化而有差别。

在三弟大内部存款和储蓄器的/etc/wpa_supplicant.conf中大家能够一向看出WIFI援救的网络项目,每种类型都有例子,举个例子:

V/WifiStateTracker( 1201): Changing supplicant state: SCANNING ==>
INACTIVE

3.2 下行接口

Wpa_supplicant提供的下水接口首要用于和kernel(driver)进行通讯,下发命令和获取音信。

Wpa_supplicant下行接口首要归纳两种主要的接口:

1.    PF_INET socket接口,首要用来向kernel 发送ioctl命令,调节并收获相应音讯。

2.    PF_NETLINK socket接口,首要用来吸收接纳kernel发送上来的event 事件。

3.    PF_PACKET socket接口,主要用来向driver传递802.1X报文。

 

入眼涉及到的文件包蕴:“driver.h”,“drivers.c”,“driver_wext.h”,“driver_wext.c”,“l2_packet.h”和
“l2_packet_linux.c”。其中“driver.h”,“drivers.c”,“driver_wext.h”和
“driver_wext.c”实现PF_INET socket接口和PF_NETLINK socket接口;“l2_packet.h”和“l2_packet_linux.c”实现PF_PACKET socket接口。

 

(1)“driver.h”,“drivers.c”
首要用以封装底层差距对外突显四个均等的wpa_driver_ops接口。Wpa_supplicant可辅助atmel,
Broadcom, ipw, madwifi, ndis, nl80211, wext等各类驱动。

里头三个最注重的数据结构为wpa_driver_ops, 其定义了driver相关的各类操作接口。

 

(2)“driver_wext.h”,“driver_wext.c”实现了wext形式的wpa_driver_ops,并成立了PF_INET socket接口和PF_NETLINK socket接口,然后通过那四个接口达成与kernel的音讯交互。

 

Wext提供的三个重中之重数据结构为:

struct wpa_driver_wext_data {

       void *ctx;

       int event_sock;

       int ioctl_sock;

       int mlme_sock;

       char ifname[IFNAMSIZ + 1];

       int ifindex;

       int ifindex2;

       int if_removed;

       u8 *assoc_req_ies;

       size_t assoc_req_ies_len;

       u8 *assoc_resp_ies;

       size_t assoc_resp_ies_len;

       struct wpa_driver_capa capa;

       int has_capability;

       int we_version_compiled;

 

       /* for set_auth_alg fallback */

       int use_crypt;

       int auth_alg_fallback;

 

       int operstate;

 

       char mlmedev[IFNAMSIZ + 1];

 

       int scan_complete_events;

};

其中event_sock 为PF_NETLINK socket接口,ioctl_sock为PF_INET socket借口。

 

Driver_wext.c完结了大气底层管理函数用于落到实处wpa_driver_ops操作参数,在那之中相当主要的有:

void * wpa_driver_wext_init(void *ctx, const char *ifname);

/* 初始化wpa_driver_wext_data 数据结构,并创设PF_NETLINK socket和 PF_INET socket 接口 */

 

void wpa_driver_wext_deinit(void *priv);

/* 销毁wpa_driver_wext_data 数据结构,PF_NETLINK socket和 PF_INET socket 接口 */

 

static void wpa_driver_wext_event_receive(int sock, void
*eloop_ctx,

                                     void *sock_ctx);

/* 处理kernel主动发送的event事件的 callback 函数 */

 

末段,将促成的操作函数映射到七个大局的wpa_driver_ops类型数据结构 wpa_driver_wext_ops中。

 

const struct wpa_driver_ops wpa_driver_wext_ops = {

       .name = “wext”,

       .desc = “Linux wireless extensions (generic)”,

       .get_bssid = wpa_driver_wext_get_bssid,

       .get_ssid = wpa_driver_wext_get_ssid,

       .set_wpa = wpa_driver_wext_set_wpa,

       .set_key = wpa_driver_wext_set_key,

       .set_countermeasures = wpa_driver_wext_set_countermeasures,

       .set_drop_unencrypted =
wpa_driver_wext_set_drop_unencrypted,

       .scan = wpa_driver_wext_scan,

       .get_scan_results2 = wpa_driver_wext_get_scan_results,

       .deauthenticate = wpa_driver_wext_deauthenticate,

       .disassociate = wpa_driver_wext_disassociate,

       .set_mode = wpa_driver_wext_set_mode,

       .associate = wpa_driver_wext_associate,

       .set_auth_alg = wpa_driver_wext_set_auth_alg,

       .init = wpa_driver_wext_init,

       .deinit = wpa_driver_wext_deinit,

       .add_pmkid = wpa_driver_wext_add_pmkid,

       .remove_pmkid = wpa_driver_wext_remove_pmkid,

       .flush_pmkid = wpa_driver_wext_flush_pmkid,

       .get_capa = wpa_driver_wext_get_capa,

       .set_operstate = wpa_driver_wext_set_operstate,

};

 

(3)“l2_packet.h”和“l2_packet_linux.c”首要用以落实PF_PACKET socket接口,通过该接口,wpa_supplicant能够间接将802.1X
packet发送到L2层,而不经过TCP/IP协议栈。

 

里面重大的职能函数为:

struct l2_packet_data * l2_packet_init(

       const char *ifname, const u8 *own_addr, unsigned short
protocol,

       void (*rx_callback)(void *ctx, const u8 *src_addr,

                         const u8 *buf, size_t len),

       void *rx_callback_ctx, int l2_hdr);

/* 创制并早先化PF_PACKET socket接口,其中rx_callback 为从L2接收到的packet 管理callback函数 */

 

void l2_packet_deinit(struct l2_packet_data *l2);

/* 销毁 PF_PACKET socket接口 */

 

int l2_packet_send(struct l2_packet_data *l2, const u8 *dst_addr,
u16 proto,

                 const u8 *buf, size_t len);

/* L2层packet发送函数,wpa_supplicant用此发送L2层 802.1X packet  */

 

static void l2_packet_receive(int sock, void *eloop_ctx, void
*sock_ctx);

/*  L2层packet接收函数,接收来自L2层数据后,将其发送到上层  */

1
客户端程序,满含wpa_cli命令行或java图形界面程序,通过unix本地socket与wpa_supplicant
daemon服务通讯,发送命令并收到结果。

4. Control interface commands

       PING

       MIB

       STATUS

       STATUS-VERBOSE

       PMKSA

       SET <variable> <valus>

       LOGON

       LOGOFF

       REASSOCIATE

       RECONNECT

       PREAUTH <BSSID>

       ATTACH

       DETACH

       LEVEL <debug level>

       RECONFIGURE

       TERMINATE

       BSSID <network id> <BSSID>

       LIST_NETWORKS

       DISCONNECT

       SCAN

       SCAN_RESULTS

       BSS

       SELECT_NETWORK <network id>

       ENABLE_NETWORK <network id>

       DISABLE_NETWORK <network id>

       ADD_NETWORK

       REMOVE_NETWORK <network id>

       SET_NETWORK <network id> <variable> <value>

       GET_NETWORK <network id> <variable>

       SAVE_CONFIG

正文译至:https://wiki.archlinux.org/index.php/WPA_Supplicant_%28%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87%29

wpa_supplicant 是跨平台的
WPAsupplicant,支持
WEP, WPA 和 WPA2 (IEEE
802.11i
/ XC90SN (罗布ust Secure
Network)). 能够在桌面、台式机以致嵌入式系统中动用。

wpa_supplicant 是在客户端应用的 IEEE 802.1X/WPA 组件, 辅助与 WPA
Authenticator 的互相,调控漫游和无线驱动的 IEEE 802.11 验证和涉嫌。 

……

dhcpcd

dhcpcd包蕴了二个钩子(默许为启用)来机关运转相应有线接口的wpa_supplicant。它只在如下情形下运营:

  • 没有wpa_supplicant进度在该接口在监听。
  • 留存贰个wpa_supplicant的布局文件。dhcpcd 暗许检查
    /etc/wpa_supplicant.conf 和
    /etc/wpa_supplicant/wpa_supplicant.conf,但足以因此在/etc/dhcpcd.conf设置env
    wpa_supplicant_conf=configuration_file_path来增添自定义路线。

D/NetworkStateTracker( 1201): setDetailed state, ld =IDLE and new
state=SCANNING

        C,踏入/system/bin目录,首先运营服务端wpa_supplicant。

【连接AP】

公海赌船网址 1

E/wpa_supplicant( 2490): wpa_driver_priv_driver_cmd RSSI len = 4, 4

1. 开行命令

wpa
supplicant 在运营时,运维命令能够分包比很多参数,近日大家的运营命令如下:

wpa_supplicant /system/bin/wpa_supplicant -Dwext -ieth0
-c/data/wifi/wpa_supplicant.conf -f/data/wifi/wpa_log.txt

 

wpa_supplicant对于运维命令带的参数,用了三个数据结构来保存,

一个是 wpa_params, 另二个是wpa_interface.

那主假使惦念到wpa_supplicant是能够并且援助多少个互连网接口的。

wpa_params数据结构首要记录与互联网接口毫无干系的局地参数设置。

而每多个网络接口就用三个wpa_interface数据结构来记录。

在起步命令行中,能够用-N来钦定将在描述一个新的网络接口,对于一个新的网络接口,能够用上边多个参数描述:

-i<ifname> : 互连网接口名称

-c<conf>: 配置文件名称

-C<ctrl_intf>: 调整接口名称

-D<driver>: 驱动类型

-p<driver_param>: 驱动参数

-b<br_ifname>: 桥接口名称

 

吸取到广播:WIFI正在开启
D/WifiService( 1201): ACTION_BATTERY_CHANGED pluggedType: 2

 

WIFI状态追踪:更换央浼状态:找寻中->不移步

        D,另开启三个ADB SHELL,作客户端运维wpa_cali。如下:

E/wpa_supplicant( 2490): wpa_driver_priv_driver_cmd SCAN-ACTIVE len
= 4096

> scan_result
bssid / frequency / signal level / flags / ssid
40:16:9f:67:0f:00       2462    -42    
[WPA-PSK-TKIP+CCMP][WPA2-PSK-TKIP+CCMP][WPS][ESS]      
HHCN-NET
b0:48:7a:49:44:68       2437    -58     [WPA2-PSK-CCMP][WPS][ESS]
      HHTech.Arch
e0:05:c5:97:d8:5a       2412    -71    
[WPA-PSK-CCMP][WPA2-PSK-CCMP-preauth][ESS]      1103-5
40:16:9f:67:0c:a6       2412    -74    
[WPA-PSK-TKIP+CCMP][WPA2-PSK-TKIP+CCMP][WPS][ESS]      
hardware
b0:48:7a:49:65:54       2437    -58    
[WPA-PSK-CCMP][WPA2-PSK-CCMP][WPS][ESS] Dept_driver

wpa_supplicant发出事件通报:尝试连接,(SSID=’LosAngeles’频段=2412 MHz)

2.1. main()函数:

在那个函数中,首要做了四件事。

a. 剖析命令行传进的参数。

b. 调用wpa_supplicant_init()函数,做wpa_supplicant的起首化工作。

c. 调用wpa_supplicant_add_iface()函数,扩充网络接口。

d. 调用wpa_supplicant_run()函数,让wpa_supplicant真正的run起来。

 

咱俩在上边已经清楚WIFI的启航进度,在职能运转中也会输出相应的日志音讯,上面就来详细精通一下。(请留神,WIFI开启后会改换电瓶状态等另外状
态。关闭WIFI时,android的陈设是卸载驱动来省电。如有缺点和失误就是主题素材。然而下文删去了与WIFI非亲非故的LOG!)

       
第一步要做的正是要加载WIFI模块驱动了。当然即使您的WIFI是编写翻译到根本里面包车型客车,就无需的。大家的WIFI芯片用的是BCM4330,编写翻译为模块。

当用户在WifiSettings分界面上选拔了八个AP后,会显得配置AP参数的叁个对话框。

那样,就都安装好了,接着用dhcpd分配多个IP地址

V/WifiStateTracker( 1201): Changing supplicant state:
FOUR_WAY_HANDSHAKE ==> GROUP_HANDSHAKE

其中/data/system/wpa_supplicant
是刚刚起步wpa_supplicant的时候创造的贰个套接字

E/wpa_supplicant( 2490): wpa_driver_priv_driver_cmd LINKSPEED len =
4096

翻看搜到的有哪些销路好

网络状态追踪:更新展现为正在连接状态

 

简单的讲介绍一下,WIFI模块的基本效率:

下一场ps|grep wpa看看有未有起来,在wifi工作进程中,那一个进度要始终都在的。

网络状态追踪:更新展现为评判中

内定驱动

你或者需求钦点三个使得来利用。关于支持的驱动程序的列表,请仿效wpa_supplicant
-h的出口结果。

  • nl80211 是当前的行业内部,但不是颇具的无线芯片的模块援助。
  • wext 近年来已不符合时机,但仍得到大范围援助。

使用 -D 开关来内定驱动:

# wpa_supplicant -B -i interface -c configuration_file -D driver

连日管理服务:抛出WIFI连接状态改造:已一连/剖断中

130|root@android:/ # wpa_cli -p/data/system/wpa_supplicant -iwlan0
wpa_cli v0.8.x
Copyright (c) 2004-2011, Jouni Malinen <j@w1.fi> and
contributors

公海赌船网址 2

> set_net 3 psk “password”
OK
> select_net 3
OK
<3>CTRL-EVENT-STATE-CHANGE id=0 state=0 BSSID=00:00:00:00:0[
2752.332061] dhd_aoe_hostip_clr failed code -23
0:00
<3>CTR[ 2752.337768]公海赌船网址, dhd_aoe_arp_clr failed code 1
L-EVENT-STATE-CHANGE id=-1 state=3 BSSID=00:00:00:00:00:00
<3>CTRL-EVENT-DISCONNECTED bssid=00:00:00:00:00:00 reason=0
<3>CTRL-EVENT-STATE-CHANGE id=-1 state=0 BSSID=00:00:00:00:00:00
<3>CTRL-EVENT-STATE-CHANGE id=-1 state=3 BSSID=00:00:00:00:00:00
<3>CTRL-EVENT-SCAN-RESULTS 
<3>WPS-AP-AVAILABLE 
<3>Trying to associate with b0:48:7a:49:65:54 (SSID=’Dept_driver’
freq=2437 MHz)
<3>CTRL-EVENT-STATE-CHANGE id=-1 state=5 BSSID=b0:48:7a:49:65:54
[ 2753.153717] wl_iw_set_essid: join SSID=Dept_driver ch=6
<3>CTRL-EVENT-STATE-CHANGE id=3 state=6 BSSID=b0:48:7a:49:65:54
<3>Associated with b0:48:7a:49:65:54
<3>CTRL-EVENT-STATE-CHANGE id=3 state=7 BSSID=00:00:00:00:00:00
<3>CTRL-EVENT-STATE-CHANGE id=3 state=8 BSSID=00:00:00:00:00:00
<3>WPA: Key negotiation completed with b0:48:7a:49:65:54
[PTK=CCMP GTK=CCMP]
<3>CTRL-EVENT-CONNECTED – Connection to b0:48:7a:49:65:54
completed (reauth) [id=3 id_str=]
<3>CTRL-EVENT-STATE-CHANGE id=3 state=9 BSSID=00:00:00:00:00:00

V/WifiStateTracker( 1201): Changing supplicant state: ASSOCIATED ==>
FOUR_WAY_HANDSHAKE

另请参阅

 

 

 

此时此刻得以选择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连接?

Step by 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并非可施行程序,而是个调整套接字。

那儿会进去相互情势。当中交互格局的指令如下表:

Full command

Short command

Description

status

stat

displays the current connection status

disconnect

disc

prevents wpa_supplicant from connecting to any access point

quit

q

exits wpa_cli

terminate

term

kills wpa_supplicant

reconfigure

recon

reloads wpa_supplicant with the configuration file supplied (-c parameter)

scan

scan

scans for available access points (only scans it, doesn’t display anything)

scan_result

scan_r

displays the results of the last scan

list_networks

list_n

displays a list of configured networks and their status (active or not, enabled or disabled)

select_network

select_n

select a network among those defined to initiate a connection (ie select_network 0)

enable_network

enable_n

makes a configured network available for selection (ie enable_network 0)

disable_network

disable_n

makes a configured network unavailable for selection (ie disable_network 0)

remove_network

remove_n

removes a network and its configuration from the list (ie remove_network 0)

add_network

add_n

adds a new network to the list. Its id will be created automatically

set_network

set_n

shows a very short list of available options to configure a network when supplied with no parameters.

See next section for a list of extremely useful parameters to be used with set_network and get_network.

get_network

get_n

displays the required parameter for the specified network. See next section for a list of parameters

save_config

save_c

saves the configuration

 

设置互联网的着力格式:set_network <network id> <key>
<parameter> [<parameter>]

展现网络新闻的大旨格式:get_network <network id>
<key>

对应的参数如下表:

Key

Description

Parameters

ssid

Access point name

string

id_str

String identifying the network

string

priority

Connection priority over other APs

number (0 being the default low priority)

bssid

Mac address of the access point

mac address

scan_ssid

Enable/disbale ssid scan

0, 1, 2

key_mgmt

Type of key management

WPA-PSK, WPA_EAP, None

pairwise

Pairwise ciphers for WPA

CCMP, TKIP

group=TKIP

Group ciphers for WPA

CCMP, TKIP, WEP104, WEP40

psk

Pre-Shared Key (clear or encrypted)

string

wep_key0

WEP key (up to 4: wep_key[0123])

string

eap

Extensible Authentication Protocol

MD5, MSCHAPV2, OTP, GTC, TLS, PEAP, TTLS

identity

EAP identity string

string

password

EAP password

string

ca_cert

Pathname to CA certificate file

/full/path/to/certificate

client_cert

Pathname to client certificate

/full/path/to/certificate (PEM/DER)

private_key

Pathname to 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_network 0 ssid “666”

>set_network 0 key_mgmt
NONE

>enable_network 0

>quit

eg.2、连接WEP加密AP

>add_network (assume return
1)

>set_network 1 ssid “666”

>set_network 1 key_mgmt
NONE

>set_network 1 wep_key0 “your ap
password”

>enable_network 1

eg.3、连接WPA-PSK/WPA2-PSK加密的AP

>add_network (assume return
2)

>set_network 2 ssid “666”

>set_network 2 psk “your pre-shared
key”

>enable_network 2

到此,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_supplicant
GROUP=system update_config=1

network={

ssid=”my access point”

proto=WPA

key_mgmt=WPA-PSK

psk=”you pass words”

 

 

 

 

wpa_supplicant发出事件通报:驱动命令行.主动寻找.LEN

for AP that doesn`t have encryption
>add_network (It will display a network id for you, assume it
returns 0)
>set_network 0 ssid “666”
>set_network 0 key_mgmt NONE
>enable_network 0
>quit

V/WifiMonitor( 1201): Event [Associated with 1c:bd:b9:f6:a7:9f]

配置

wpa_supplicant提供了一个参谋布局文件/etc/wpa_supplicant/wpa_supplicant.conf,当中带有
了具有可用的精选及其用法和例子的详细文书档案。思索先把它备份起来,因为上面描述的机动抬高互连网布置到wpa_supplicant.conf的方式下删除
了文本中的全部注释。

在其最简易的样式中,叁个布局文件,只必要二个网络布局块。举例:

/etc/wpa_supplicant/foobar.conf

network={
    ssid="..."
}

设若你有一个配备文件,如前节所述,就足以运转wpa_supplicant守护进程,并使用一个静态IP或DHCP连接到有线互联网。

当用户在AcessPointDialog中甄选好加密方法和输入密钥之后,再点击连接按键,Android就能够去老是这么些AP。

启动

本节介绍运行wpa_supplicant的常用方法,选用三个最符合你的。

一:什么是WIFI

(2)在wpa_cli交互形式下得以实行非常多命令,列表如下:

2 wpa_supplicant
daemon服务,对应上述中间有个别,功效是“上传下达”。全数客户端通过它决定硬件网卡,通过发送字符串命令调整是还是不是扫描AP,提取扫描结果和是还是不是涉及
AP等操作,同期将使得的实行景况发送给用户。该服务是统一计划支撑各个有线网卡芯片,由此各种商家联合提供了多个通用接口给wpa_supplicant调
用。

2.4. wpa_supplicant_run()函数:

早先化完毕之后,让wpa_supplicant的main event loop run起来。

在wpa_supplicant中,有广大与外面通讯的socket,它们都是索要注册 到eloop
event模块中的,具体地说,正是在eloop_sock_table中加进一项记录,在那之中囊括了sock_fd,
handle, eloop_data, user_data。

eloop
event模块正是将那几个socket组织起来,统一保管,然后在eloop_run中选择select机制来保管socket的通讯。

 

2
ADD_NETWO路虎极光K命令会回去一个ID,WifiLayer再用那些再次来到的ID作为参数向wpa_supplicant发送ENABLE_NETWORK命令,从而让wpa_supplicant去老是该AP。

wpa_passphrase

互连网布局能够运用wpa_passphrase工具自动生成并增多到配置文件中。那在三番五次到供给密码的平安互连网时是实用的。比如:

$ wpa_passphrase essid passphrase

network={
    ssid="essid"
    #psk="passphrase"
    psk=f5d1c49e15e679bebe385c37648d4141bc5c9297796a8a185d7bc5ac62f954e3
}

一些不胜复杂的口令恐怕供给从文件输入:

$ wpa_passphrase essid < passphrase.txt

提示:wpa_supplicant和wpa_passphrase能够结合起来关联到大致全部的WPA2(个人)网络:

# wpa_supplicant -B -i interface -c <(wpa_passphrase essid passphrase)

D/NetworkStateTracker( 1201): setDetailed state, ld =SCANNING and new
state=CONNECTING

手动

wpa_supplicant接受多个命令行参数,特别是:

  • -B – 在后台实践
  • -c 文件名 -路线配置文件
  • -i 接口 – 监听的接口

关于全部的参数列表,参谋 man 8 wpa_supplicant。举个例子,常见的用法是:

# wpa_supplicant -B -i interface -c configuration_file

D/ConnectivityService( 1201): ConnectivityChange for WIFI:
CONNECTING/CONNECTING

动作脚本

wpa_cli能够在后台形式下运营,并施行基于wpa_supplicant事件的钦赐脚本。能够帮衬两类事件:连接和断开。一些情状变量可用于脚本,细节请参见man
8wpa_cli。

上边包车型地铁例子将应用桌面通告,布告有关事件的用户:

#!/bin/bash

case "$2" in
    CONNECTED)
        notify-send "WPA supplicant: connection established";
        ;;
    DISCONNECTED)
        notify-send "WPA supplicant: connection lost";
        ;;
esac

难忘修改剧本为可试行,然后采用-a来传递脚本路线给wpa_cli:

$ wpa_cli -a path_to_script

【连接】

systemd

wpa_supplicant提供多样劳务的文件:

  • wpa_supplicant.service
    使用 D-Bus,
    推荐 NetworkManager 的用户.
  • wpa_supplicant@.service
    接受接口名作为参数,并为该接口运转wpa_supplicant守护进度。它读取/etc/wpa_supplicant/wpa_supplicant-interface.conf的配置文件
  • wpa_supplicant-nl80211@.service
     也是接口特定的,但眼看强制nl80211使得程序 (见下文).
    配置文件路线是/etc/wpa_supplicant/wpa_supplicant-nl80211-interface.conf
  • wpa_supplicant-wired@.service – 也是接口特定的, 使用 wired 驱动.
    配置文件路线是/etc/wpa_supplicant/wpa_supplicant-wired-interface.conf

I/wpa_supplicant( 2490): CTRL-EVENT-SCAN-RESULTS Ready

> enable_net 3
OK
> q

E/wpa_supplicant( 2490): wpa_driver_priv_driver_cmd SCAN-PASSIVE
len = 0, 12

 

wpa_supplicant发出事件通报:驱动命令行.MAC地址

 

收到广播,WIFI状态正在张开
E/WifiHW(1201):==JOHNDEBUG==:moduleaddress:4b938008
filename:/system/lib/modules/dhd.ko
args:firmware_path=/system/wlan/broadcom/rtecdc.bin
nvram_path=/system/wlan/broadcom/nvram.txt

安装


合法软件饭店
中装置软件包 wpa_supplicant

另外软件包 wpa_supplicant_gui
提供了图形分界面wpa_gui。 

I/wpa_supplicant( 2490): Associated with 1c:bd:b9:f6:a7:9f

 

  1. 开关WIFI
    除了那一个之外在WIFI设置分界面能够开关WIFI,还可能有其余的措施能够安装,要查看那些按键状态是或不是同样。还应该有即是航航空模型式对WIFI开关的影响,由于WIFI开和关都有一个光阴经过,而飞行格局的按键须臾间实现,所以偶尔会冒出争执。

  2. 按钮新可用互联网提示
    新可用网络的概念是自WIFI模块开启后,从未开掘过的,为加密的网络。唯有满足了新可用互连网的概念,才会有提醒。

  3. 接连断开网络
    连天断开各样区别加密类型的互联网(具体品种下文有详解)

  4. 手动加多网络
    要求路由器关闭SIID广播。可手动输入SIID,网络加密类型,密码。对于OPAL手提式有线话机来讲,路由器遮掩了SSID,手动加多的互联网是无可奈何连接的。

  5. 追寻互联网
    手动点击寻觅开关能够寻找网络,也能够等待WIFI模块自动寻觅互连网。

  6. 休眠设置
    是因为WIFI模块是用电大户,全部为了省电,Android的WIFI加了叁个休眠计策,能够设置永世持续开,充电时再三开和锁屏时断开。要测量检验休眠设置
    是或不是可行,能够在路由器上PING手提式有线电话机的IP,PING通就是三翻五次景况。OPAL手提式有线电话机的休眠攻略属于完全失效,今后的意况是不管选哪些都会一贯维持延续,
    锁屏后15分钟再休眠。

  7. 安装静态IP
    Android系统里对IP设置的输入限制很有题目,作者直接认为那是经营不善的限量。寻常IP的限量在0-255时期,android对IP输入的限定是整数0到整数255中间,也正是说0000.000200.001.001那样二个IP都能官方输入。

2. wpa_supplicant 早先化流程

WIFI状态追踪:退换乞请状态:已拾叁分->TCP中断连接

     
  wpa_supplicant包罗五个第一的可实行工具:wpa_supplicant和wpa_cli。wpa_supplicant是中央程序,
它和wpa_cli的涉嫌便是劳动和客户端的涉嫌:后台运转wpa_supplicant,使用wpa_cli来搜索、设置、和连接网络。

WifiConfiguration config = findConfiguredNetwork(state);

2.3. wpa_supplicant_add_iface()函数:

该函数根据运行命令行中带有的参数扩大互联网接口, 有多少个就充实多少个。

a. 因为wpa_supplicant是与网络接口对应的主要性的数据结构,所以,首先分配三个wpa_supplicant数据结构的内部存款和储蓄器。

b. 调用wpa_supplicant_init_iface() 函数来做网络接口的发端职业,首要归纳:

设置驱动类型,默许是wext;

读取配置文件,并将当中的新闻设置到wpa_supplicant数据结构中的conf 指针指向的数据结构,它是贰个wpa_config类型;

命令行设置的调节接口ctrl_interface和驱动参数driver_param覆盖配置文件里设置,命令行中的优先;

拷贝互连网接口名称和桥接口名称到wpa_config数据结构;

对此网络安排块有三个链表描述它,多个是 config->ssid,它依照安插文件中的顺序依次挂载在那个链表上,还应该有一个是pssid,它是二个二级指针,指向三个指南针数组,该指针数组依照事先级从高到底的顺序依次保存
wpa_ssid指针,相同优先级的在同一链表中挂载。

c. 调用wpa_supplicant_init_iface2() 函数,首要不外乎:

调用wpa_supplicant_init_eapol()函数来先导化eapol;

调用相应类别的driver的init()函数;

设置driver的param参数;

调用wpa_drv_get_ifname()函数得到互连网接口的名称,对于wext类型的driver,未有那一个接口函数;

调用wpa_supplicant_init_wpa()函数来初步化wpa,并做相应的开始化职业;

调用wpa_supplicant_driver_init()函数,来开首化driver接口参数;在该函数的末段,会

wpa_s->prev_scan_ssid = BROADCAST_SSID_SCAN;

wpa_supplicant_req_scan(wpa_s, interface_count, 100000);

来主动发起scan,

调用wpa_supplicant_ctrl_iface_init()函数,来初步化调节接口;对于UNIX
SOCKET这种措施,其地面socket文件是由布置文件里的ctrl_interface参数钦赐的门路加上互连网接口名称;

 

I/wpa_supplicant( 2490): CTRL-EVENT-STATE-CHANGE id=0 state=7

Full command

Short command

Description

status

stat

displays the current connection status

disconnect

disc

prevents wpa_supplicant from connecting to any access point

quit

q

exits wpa_cli

terminate

term

kills wpa_supplicant

reconfigure

recon

reloads wpa_supplicant with the configuration file supplied (-c parameter)

scan

scan

scans for available access points (only scans it, doesn’t display anything)

scan_result

scan_r

displays the results of the last scan

list_networks

list_n

displays a list of configured networks and their status (active or not, enabled or disabled)

select_network

select_n

select a network among those defined to initiate a connection (ie select_network 0)

enable_network

enable_n

makes a configured network available for selection (ie enable_network 0)

disable_network

disable_n

makes a configured network unavailable for selection (ie disable_network 0)

remove_network

remove_n

removes a network and its configuration from the list (ie remove_network 0)

add_network

add_n

adds a new network to the list. Its id will be created automatically

set_network

set_n

shows a very short list of available options to configure a network when supplied with no parameters.

See next section for a list of extremely useful parameters to be used with set_network and get_network.

get_network

get_n

displays the required parameter for the specified network. See next section for a list of parameters

save_config

save_c

saves the configuration

3 网卡驱动。

环视可用网络,在>提醒符之后输入“scan”。在围观达成后将展现通知:

> scan
OK
<3>CTRL-EVENT-SCAN-RESULTS
>

接下来输入 “scan_results” 来突显结果:

> scan_results
bssid / frequency / signal level / flags / ssid
00:00:00:00:00:00 2462 -49 [WPA2-PSK-CCMP][ESS] MYSSID
11:11:11:11:11:11 2437 -64 [WPA2-PSK-CCMP][ESS] ANOTHERSSID
>

为了与MYSSID相关联,需求告诉wpa_supplicant。在配置文件中的各种网络是以零起来按数值举办索引。若是您加多了八个新的网络,它会被相应地分配叁个新数字。

> add_network
0
>

使用那些数字来钦命你的装置使用到哪些互连网。对于三个新的互联网,在引号里安装其SSID:

> set_network 0 ssid "MYSSID"
OK
>

不畏你的有线接入点未有被爱护,cli也显式地供给三个PSK,同样在引号内。密码必须是8-61个字符:

> set_network 0 psk "passkey"
OK
>

使能:

> enable_network 0
OK
>

将修改写入配置文件:

> save_config
OK
>

由来结束,整个连接进度一鼓作气。

for AP that has WEP
>add_network (assume returns 1)
>set_network 1 ssid “666”
>set_network 1 key_mgmt NONE
>set_network 1 wep_key0 “your ap passwork”(if usting ASCII, it
need
double quotation marks, if using hex, then don`t need the double
quotation
marks)
>set_network 1 wep_tx_keyidx 0
>select_network 1 (optional, remember, if you are connecting with
another
AP, you should select it to disable the another)
>enable_network 1

wpa_supplicant发出事件通报

(1)通过adb命令行,能够一向张开supplicant,进而运行wpa_cli,能够消除客户未有显示屏而高不可攀操作WIFI的难题,还是能防止UI的主题素材带到driver。进一步来讲,能够用在重重从未有过键盘输入和LCD输出的安卓终端产品的操作上。

如果wpa_supplicant未有那一个AP的配置新闻,则会向wpa_supplicant发送ADD_NETWOEnclaveK命令来加多该AP

公海赌船网址 3

四:对WIFI模块的LOG精通多一丝丝

 

1 在SystemServer运转的时候,会转移多少个ConnectivityService的实例。

如上进程就表明联网OK,能够上网了。

网络状态追踪:更新展现为正在连接状态

Alternatively, this software may be distributed under the terms of the
BSD license. See README and COPYING for more details.

D/SettingsWifiEnabler( 1321): Received wifi state changed from Enabling
to Enabled

cd /system/bin

接到到广播:WIFI已经拉开

wpa_supplicant软件架构剖析

2011年1月22日 ⁄ 综合 ⁄ 共
12345字 ⁄ 字号 小 中 大 ⁄
研商关闭

 

最初的文章地址:http://blog.csdn.net/fxfzz/article/details/6176414

2 ConnectivityService的协会函数会创立WifiService。

回显如下表明符合规律并处在交互形式:

V/WifiMonitor( 1201):Event[Trying to associate with 1c:bd:b9:f6:a7:9f
(SSID=’LosAngeles’ freq=2412 MHz)]

 

WIFI硬件:加载内核模块
E/WifiHW ( 1201): ==JOHN DEBUG==: return of insmod : ret = 0, Unknown
error: 0

   
Android系统中对于WIFI的安装集成到了“设置”中,其实跟手动设置大约。这里介绍下什么样手动连接WIFI,以有利于以往调节和测验WIFI。

加载驱动
D/SettingsWifiEnabler( 1321): Received wifi state changed from Disabled
to Enabling

Interactive mode

//Need WifiConfiguration for the AP

This program is free software. You can distribute it and/or modify it
under the terms of the GNU General Public License version 2.

一连管理服务:改动WIFI连接状态:正在连接/正在连接

root@android:/ # wpa_supplicant -Dwext -iwlan0
-C/data/system/wpa_supplicant -c/data/misc/wifi/wpa_supplicant.conf &
 

4
WifiLayer注册了接受NETWOPolestar 1K_STATE_CHANGED_ACTION那一个Intent,所以它的连鱿鱼理函数
handleNetworkStateChanged会被调用,当DHCP得到IP地址然后,会再发送EVENT_DHCP_SUCCEEDED消息。

参照原来的小说:http://blog.sina.com.cn/s/blog\_55465b470100l73l.html

wpa_supplicant发出事件通报:

scan

网络状态追踪:更新展现为寻找状态

scan_results

V/WifiStateTracker( 1201): New network state is CONNECTED

      E,实行一多元命令看看

wpa_supplicant发出事件通报:驱动命令行.被动找寻.LEN=0.12

 

2、点击连接&获取状态

        接着运维客户端wpa_cli进行布署并连接wifi火热

I/wpa_supplicant( 2490): Trying to associate with 1c:bd:b9:f6:a7:9f
(SSID=’LosAngeles’ freq=2412 MHz)

        F,连WIFI的命令行,有以下二种:

WifiMonitor接收wpa_supplicant的事件

       那样驱动模块加载后,供给运维wpa_supplicant

2 当用户按下Wifi按键后,
Android会调用WifiEnabler的onPreferenceChange,再由WifiEnabler调用WifiManager的
setWifiEnabled接口函数,通过AIDL,实际调用的是WifiService的setWifiEnabled函数,WifiService接着向作者发送一条MESSAGE_ENABLE_WIFI音讯,在拍卖该音讯的代码中做确实的使能干活:首先装载WIFI内核模块(该模块的职位硬编码
为”/system/lib/modules/wlan.ko” ),然 后 启 动wpa_supplicant (配 置 文
件 硬 编 码
为”/data/misc/wifi/wpa_supplicant.conf”)再经过WifiStateTracker来运维WifiMonitor
中的监视界程。

./wpa_supplicant -iwlan0 -Dnl80211
-c/system/etc/wifi/wpa_supplicant.conf

【配置AP参数】

 

WifiMonitor接收wpa_supplicant事件

Dept_driver的加密方法是WPA2-PSK

E/WifiHW ( 1201): ==JOHN DEBUG==: [WIFI] Load Driver

wpa_cli -p /data/misc/wpa_supplicant

E/wpa_supplicant( 2490): wpa_driver_priv_driver_cmd SCAN-PASSIVE
len = 4096

> scan
OK
<3>CTRL-EVENT-SCAN-RESULTS 

电瓶状态退换
E/WifiHW(1201):==JOHNDEBUG==:moduleaddress:4b938008
filename:/system/lib/modules/dhd.ko
args:firmware_path=/system/wlan/broadcom/rtecdc.bin
nvram_path=/system/wlan/broadcom/nvram.txt

使用wpa_cli增加一个新的互联网

1
当wpa_supplicant成功总是上AP之后,它会向调控通道发送事件通报连接上AP了,进而wifi_wait_for_event函数会接收到该事件,由此WifiMonitor中的MonitorThread会被实施来出来这一个事件。

2.2. wpa_supplicant_init()函数:

a. 打开debug 文件。

b. 注册EAP peer方法。

c. 申请wpa_global内存,该数据结构作为统领其余数据结构的贰个基本, 主要富含四个部分:

wpa_supplicant
*ifaces   /*各样网络接口都有四个应和的wpa_supplicant数据结构,该指针指向最近加盟的三个,在wpa_supplicant数据结构中有指针指向next*/

wpa_params params   /*运维命令行中带的通用的参数*/

ctrl_iface_global_priv *ctrl_iface  /*global 的决定接口*/

ctrl_iface_dbus_priv *dbus_ctrl_iface  /*dbus 的主宰接口*/

d. 设置wpa_global中的wpa_params中的参数。

e. 调用eloop_init函数将全局变量eloop中的user_data指针指向wpa_global。

f. 调用wpa_supplicant_global_ctrl_iface_init函数开头化global 调整接口。

g. 调用wpa_supplicant_dbus_ctrl_iface_init函数开首化dbus 调整接口。

h. 将该daemon的pid写入pid_file中。

 

3
WifiStateTracker会创造WifiMonitor接收来自底层的事件,WifiService和WifiMonitor是整整模块的着力。
WifiService肩负运行关闭wpa_supplicant、运行关闭WifiMonitor监视界程和把命令颁发给
wpa_supplicant,而WifiMonitor则承担从wpa_supplicant接收事件通报。

公海赌船网址 4

WIFI硬件:重临装载模块报告:重回指令0,未知错误0

3. Wpa_supplicant提供的接口

从通讯档案的次序上划分,wpa_supplicant提供发展的操纵接口 control
interface,用于与任何模块(如UI)进行通讯,其余模块能够经过control
interface 来获撤除息或下发命令。Wpa_supplicant通过socket通讯机制落到实处下行接口,与根本举办通讯,获取音信或下发命令。

 

WifiMonitor接收wpa_supplicant事件

        A,首先保障ADB连入,且能运作adb
remount,那样制止系统文件只读。然后设置wpa_cli和wpa_supplicant有较强权限。

WIFI状态追踪:更动诉求状态:相配中->已相当

> add_net
3
> set_net 3 ssid “Dept_driver”
OK

E/wpa_supplicant( 2490): len = 28, 28

随后实行搜寻wifi

V/WifiStateTracker( 1201): Connection to supplicant established,
state=SCANNING

 

3 然后再广播发送NETWOHavalK_STATE_CHANGED_ACTION这个Intent。

健康运营后的回显如下:

WIFI状态跟踪:连接央浼确认,状态=寻找

        B,运维echo 1 >
/dev/wmtWifi,运维WIFI驱动。不过那几个使能不会显今后安卓分界面上层,私下认可是要在开行安卓时开启WIFI模块的,也即设置中的WIFI要私下认可ON。

4
WifiLayer注册了收取SCAN_RESULTS_AVAILABLE_ACTION那个Intent,所以它的相关管理函数
handleScanResultsAvailable会被调用,在该函数中,先会去获得SCAN的结果(最终是往wpa_supplicant发送
SCAN_RESULT命令并读取再次回到值来兑现的),List list =
mWifiManager.getScanResults();对每一个扫描重返的AP,WifiLayer会调用WifiSettings的
onAccessPointSetChanged函数,进而最后把该AP加到GUI突显列表中。

3.1 上行接口

Wpa_supplicant提供二种格局的上行接口。一种基于传统dbus机制实现与另外进程间的IPC通讯;另一种通过Unix
domain socket机制落到实处进度间的IPC通讯。

wpa_supplicant发出事件通报:已和1c:bd:b9:f6:a7:9f合作

insmod /system/lib/modules/kernel/drivers/net/wireless/bcm4330/bcm4330.ko firmware_path=/system/vendor/firmware/bcm4330.bin
\ nvram_path=/system/vendor/firmware/nvram.txt

wpa_supplicant发出事件通报:

(3)平台操作实例(只限于MediaTek平台 且具ROOT权限)

E/WifiHW ( 1201): ==JOHN DEBUG==: [WIFI] Load Driver

3.1.1 Dbus接口

该接口首要在文书“ctrl_iface_dbus.h”,“ctrl_iface_dbus.c”,“ctrl_iface_dbus_handler.h”和“ctrl_iface_dbus_handler.c”中落到实处,提供一些主干的决定方法。

 

DBusMessage * wpas_dbus_new_invalid_iface_error(DBusMessage
*message);

 

DBusMessage * wpas_dbus_global_add_interface(DBusMessage *message,

                                        struct wpa_global *global);

 

DBusMessage * wpas_dbus_global_remove_interface(DBusMessage
*message,

                                          struct wpa_global *global);

 

DBusMessage * wpas_dbus_global_get_interface(DBusMessage *message,

                                        struct wpa_global *global);

 

DBusMessage * wpas_dbus_global_set_debugparams(DBusMessage
*message,

                                          struct wpa_global *global);

 

DBusMessage * wpas_dbus_iface_scan(DBusMessage *message,

                               struct wpa_supplicant *wpa_s);

 

DBusMessage * wpas_dbus_iface_scan_results(DBusMessage *message,

                                      struct wpa_supplicant *wpa_s);

 

DBusMessage * wpas_dbus_bssid_properties(DBusMessage *message,

                                    struct wpa_supplicant *wpa_s,

                                    struct wpa_scan_res *res);

 

DBusMessage * wpas_dbus_iface_capabilities(DBusMessage *message,

                                      struct wpa_supplicant *wpa_s);

 

DBusMessage * wpas_dbus_iface_add_network(DBusMessage *message,

                                     struct wpa_supplicant *wpa_s);

 

DBusMessage * wpas_dbus_iface_remove_network(DBusMessage *message,

                                        struct wpa_supplicant
*wpa_s);

 

DBusMessage * wpas_dbus_iface_set_network(DBusMessage *message,

                                     struct wpa_supplicant *wpa_s,

                                     struct wpa_ssid *ssid);

 

DBusMessage * wpas_dbus_iface_enable_network(DBusMessage *message,

                                        struct wpa_supplicant *wpa_s,

                                        struct wpa_ssid *ssid);

 

DBusMessage * wpas_dbus_iface_disable_network(DBusMessage
*message,

                                         struct wpa_supplicant
*wpa_s,

                                         struct wpa_ssid *ssid);

 

DBusMessage * wpas_dbus_iface_select_network(DBusMessage *message,

                                             struct wpa_supplicant
*wpa_s);

 

DBusMessage * wpas_dbus_iface_disconnect(DBusMessage *message,

                                    struct wpa_supplicant *wpa_s);

 

DBusMessage * wpas_dbus_iface_set_ap_scan(DBusMessage *message,

                                          struct wpa_supplicant
*wpa_s);

 

DBusMessage * wpas_dbus_iface_set_smartcard_modules(

       DBusMessage *message, struct wpa_supplicant *wpa_s);

 

DBusMessage * wpas_dbus_iface_get_state(DBusMessage *message,

                                   struct wpa_supplicant *wpa_s);

 

DBusMessage * wpas_dbus_iface_get_scanning(DBusMessage *message,

                                      struct wpa_supplicant *wpa_s);

 

DBusMessage * wpas_dbus_iface_set_blobs(DBusMessage *message,

                                    struct wpa_supplicant *wpa_s);

 

DBusMessage * wpas_dbus_iface_remove_blobs(DBusMessage *message,

                                      struct wpa_supplicant *wpa_s);

 

WifiMonitor从wpa_supplicant接收事件通报

 

wpa_supplicant发出事件通报:

root@android:/ # dhcpcd wlan0                                          
       
dhcpcd[3940]: version 5.2.10 starting
dhcpcd[3940]: host does not support a monotonic clock – timing can
skew
dhcpcd[3940]: wlan0: rebinding lease of 192.168.1.216
dhcpcd[3940]: wlan0: acknowledged 192.168.1.216 from 192.168.1.1
`�’
dhcpcd[3940]: wlan0: leased 192.168.1.216 for 7200 seconds
dhcpcd[3940]: forked to background, child pid 3971
root@android:/ # busybox ifconfig wlan0                                
       
wlan0     Link encap:Ethernet  HWaddr AC:E8:7B:89:D3:C0  
          inet addr:192.168.1.216  Bcast:255.255.255.255
 Mask:255.255.255.0
          inet6 addr: fe80::aee8:7bff:fe89:d3c0/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:6637 errors:0 dropped:25 overruns:0 frame:0
          TX packets:4357 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:3825961 (3.6 MiB)  TX bytes:704832 (688.3 KiB)

三:对WIFI模块深刻摸底一丝丝

随即设置wifi,就接连Dept_driver这些销路广吧

WIFI状态追踪:更动须要状态:确认标记位->完结

 

WIFI状态追踪:改造须要状态:寻觅中->匹配中

3.1.2 Unix domain socket 接口

该接口重要在文件“wpa_ctrl.h”,“wpa_ctrl.c”,“ctrl_iface_unix.c”,“ctrl_iface.h”和“ctrl_iface.c”实现。

 

(1)“wpa_ctrl.h”,“wpa_ctrl.c” 达成对control
interface的包装,对外提供统一的接口。其主要性的干活是由此Unix domain
socket创设三个control
interface 的client结点,与作为server的wpa_supplicant结点通讯。

 

关键作用函数:

struct wpa_ctrl * wpa_ctrl_open(const char *ctrl_path);

/* 创立并初步化二个Unix domain
socket的client结点,并与作为server的wpa_supplicant结点绑定 */

void wpa_ctrl_close(struct wpa_ctrl *ctrl);

/* 撤废并销毁已确立的Unix domain socket的client结点 */

 

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发送命令并拿走所需消息

 * 能够发送的命令如附属类小部件1所示 */

Note:

       Wpa_supplicant 提供二种由外界模块获取音信的措施:一种是外表模块通过发送request 命令然后拿走response的问答情势,另一种是wpa_supplicant主动向外部发送event事件,由外界模块监听接收。

 

       一般的常用做法是表面模块通过调用wpa_ctrl_open()两遍,建设构造四个control
interface接口,三个为ctrl
interface,用于发送命令,获取音信,另一个为monitor interface,用于监听接收来自于wpa_supplicant的event时间。此举能够裁减通讯的耦合性,防止response和event的互相困扰。

 

int wpa_ctrl_attach(struct wpa_ctrl *ctrl);

/* 注册 某个 control interface 作为 monitor interface */

 

int wpa_ctrl_detach(struct wpa_ctrl *ctrl);

/* 撤销有些 monitor interface 为 普通的 control interface  */

 

int wpa_ctrl_pending(struct wpa_ctrl *ctrl);

/* 决断是不是有挂起的event 事件 */

 

int wpa_ctrl_recv(struct wpa_ctrl *ctrl, char *reply, size_t
*reply_len);

/* 获取挂起的event 事件 */

 

(2)“ctrl_iface_unix.c”实现wpa_supplicant的Unix domain
socket通讯机制中server结点,达成对client结点的响应。

       当中最关键的五个函数为:

static void wpa_supplicant_ctrl_iface_receive(int sock, void
*eloop_ctx,

                                         void *sock_ctx)

/* 接收并剖判client发送request命令,然后遵照不一样的一声令下调用底层分歧的管理函数;

 * 然后将获得response结果回馈到 client 结点。

 */

 

static void wpa_supplicant_ctrl_iface_send(struct
ctrl_iface_priv *priv,

                                      int level, const char *buf,

                                      size_t len)

/* 向注册的monitor interfaces 主动发送event事件 */

 

(3)“ctrl_iface.h”和“ctrl_iface.c”首要完成了各类request命令的最底层处理函数。

 

wpa_supplicant发出事件通报:计划好起来物色互连网了

     笔者本人的试验图如下:

E/wpa_supplicant( 2490): wpa_driver_priv_driver_cmd Macaddr =
44:A4:2D:27:25:BE

 

wpa_supplicant发出事件通报:

使用 wpa_cli

wpa_supplicant能够通过运用wpa_cli命令,在运行时手动进行支配。要启用wpa_cli,wpa_supplicant守护进度必须被陈设为经过在wpa_supplicant的安顿文件(暗中认可地方:/etc/wpa_supplicant
/wpa_supplicant.conf)设置ctrl_interface变量来创立二个“调节接口”(套接字)。

用户也将须要通过点名能够访谈它的组来获准访谈该套接字。五个新的组大概为此被创立,并且用户增加到它,或已存在的组能够行使

  • 通常是 wheel。

上边的安装将要/run/wpa_supplicant/中开创套接字并允许wheel组的成员开始展览寻访:

ctrl_interface=DIR=/run/wpa_supplicant GROUP=wheel

能够经过wpa_cli修改的wpa_supplicant配置文件自个儿。那在手动增添新的网络到布置文件,而不供给再次开动wpa_supplicant守护进程时是立见成效的。为了实现这一目的,在布局文件中设置update_config变量设置为1:

update_config=1

在wpa_cli初步以前,wpa_supplicant守护进度必须处于运维状态。(见#Starting掌握详细的情况)。然后运转

$ wpa_cli

它会搜索配置文件中加以地点的垄断套接字,地方也可以采纳p选项手动设置)。您能够运用-i选项配置的接口,不然的话将选拔wpa_supplicant所管理的第多个被找到的有线接口。

当wpa_cli被调用时,将应时而生交互式提示符(>)。提醒满含tab
补全和已成功命令的辨证。

WIFI硬件:加载内核模块
I/wpa_supplicant( 2490): CTRL-EVENT-STATE-CHANGE id=-1 state=2

那般就完了了。能够上网了。

【初始化】

公海赌船网址 5

V/WifiStateTracker( 1201): Changing supplicant state: SCANNING ==>
ASSOCIATING

for AP that has WPA-PSK/WPA2-PSK
>add_network (assume returns 2)
>set_network 2 ssid “666”
>set_network 2 psk “your pre-shared key”
>select_network 2 (optional, remember, if you are connecting with
another
AP, you should select it to disable the another)
>enable_network 2

V/WifiMonitor( 1201): Event [CTRL-EVENT-STATE-CHANGE id=-1 state=3]

公海赌船网址 6

【配置IP地址】

1
WifiLayer会先检查评定这一个AP是否事先被安排过,这么些是经过向wpa_supplicant发送LIST_NETWOCR-VK命令而且比较再次回到值来达成的,

2
当wpa_supplicant管理完SCAN命令后,它会向调控通道发送事件通报扫描达成,进而wifi_wait_for_event函数会接收到该事件,由此WifiMonitor中的MonitorThread会被实践来出来那么些事件。

网络状态跟踪:更新展现为考核评议中

公海赌船网址 7

Android平台利用的WiFi调节框架是基于深入人心的wpa_supplicant,它是贰个有惊无险中间件,为各个有线网卡提供联合的安全部制,如下图所示:

E/wpa_supplicant( 2490): wpa_driver_priv_driver_cmd SCAN-ACTIVE len
= 0, 11

WIFI状态追踪:新网络状态为已接连

1 WirelessSettings在开始化的时候配置了由WifiEnabler来管理Wifi按键。

WifiMonitor接收wpa_supplicant事件

D/NetworkStateTracker( 1201): setDetailed state, ld =AUTHENTICATING and
new state=OBTAINING_IPADDR

wpa_supplicant发出事件通报:WPA:与1c:bd:b9:f6:a7:9f规定标识位

5 WifiLayer处 理EVENT_DHCP_SUCCEEDED信息,会再次广播发送。

三番五次管理服务:抛出WIFI

V/WifiStateTracker( 1201): Changing supplicant state: ASSOCIATING ==>
ASSOCIATED

2
WifiMonitor再调用WifiStateTracker的notifyStateChange,WifiStateTracker则跟着会往自家发送EVENT_DHCP_START信息来运维DHCP去获得IP地址。

D/NetworkStateTracker( 1201): setDetailed state, ld =CONNECTING and new
state=CONNECTING

wpa_supplicant发出事件通报:连接产生

D/NetworkStateTracker( 1201): setDetailed state, ld =AUTHENTICATING and
new state=AUTHENTICATING

D/ConnectivityService( 1201): Dropping ConnectivityChange for WIFI:
CONNECTING/AUTHENTICATING

D/ConnectivityService( 1201): Dropping ConnectivityChange for WIFI:
CONNECTING/OBTAINING_IPADDR

wpa_supplicant发出事件通报:

WifiMonitor接收wpa_supplicant的事件

WIFI状态追踪:改变诉求状态:TCP中断连接->确认标记位

2、wpa_supplicant

E/wpa_supplicant( 2490): wpa_driver_priv_driver_cmd LinkSpeed 54
len = 12, 12

WifiMonitor接收事件

wpa_supplicant发出事件通报:驱动命令行.MAC地址.LEN

wpa_supplicant发出事件通报:驱动命令行.主动寻觅.LEN

1、WIFI的宗旨运作流程

互联网状态追踪:更新显示为获得IP地址

wpa_supplicant发出事件通报:驱动命令行.被动搜索.LEN

showAccessPointDialog(state, AccessPointDialog.MODE_INFO);

E/wpa_supplicant( 2490): wpa_driver_priv_driver_cmd RSSI len = 4096

I/wpa_supplicant( 2490): WPA: Key negotiation completed with
1c:bd:b9:f6:a7:9f [PTK=CCMP GTK=TKIP]

WIFI硬件:加载驱动
D/SettingsWifiEnabler( 1321): Received wifi state changed from Disabled
to Enabling

【查找AP】

I/wpa_supplicant( 2490): CTRL-EVENT-CONNECTED – Connection to
1c:bd:b9:f6:a7:9f completed (auth) [id=0 id_str=]

V/WifiMonitor( 1201): Event [WPA: Key negotiation completed with
1c:bd:b9:f6:a7:9f [PTK=CCMP GTK=TKIP]]

V/WifiStateTracker( 1201): Changing supplicant state: GROUP_HANDSHAKE
==> COMPLETED

1、开启WIFI&自动找出

分歧种类的互联网,差别的参数等等,一应俱全。

V/WifiMonitor( 1201): Event [CTRL-EVENT-CONNECTED – Connection to
1c:bd:b9:f6:a7:9f completed (auth) [id=0 id_str=]]

wpa_supplicant发出事件通报:

3
WifiStateTracker则随之播放发送SCAN_RESULTS_AVAILABLE_ACTION这个Intent。

二:Android平台下的WIFI模块

WIFI是一种有线连接才干,可用于手提式有线电话机、计算机、PDA等极端。WIFI才干爆发的指标是创新基于IEEE802.11标准的有线互连网产品里面包车型客车互通性,也正是说WIFI是依据802.11正式的,但WIFI不等同有线互联网。

对应上述协会,基于Android的手提式有线电话机中的WiFi调整分为三大组件:

#Both WPA-PSK and WPA-EAP is accepted. Only CCMP is accepted as
pairwise and
# group cipher.
#network={
# ssid=”example”
# bssid=00:11:22:33:44:55
# proto=WPA RSN
# key_mgmt=WPA-PSK WPA-EAP
# pairwise=CCMP
# group=CCMP
#
psk=06b4be19da289f475aa46a33cb793029d4ab3db7a23ee92382eb0106c72ac7bb
#}

D/NetworkStateTracker( 1201): setDetailed state, ld =CONNECTING and new
state=AUTHENTICATING

E/wpa_supplicant( 2490): wpa_driver_priv_driver_cmd MACADDR len =
4096

3当使能得逞后,会播放发送WIFI_STATE_CHANGED_ACTION这么些Intent布告外部WIFI已
经 成 功 使 能 了 。WifiEnabler创 建 的 时 候 就 会 向Android注 册 接
收WIFI_STATE_CHANGED_ACTION,因而它会吸收接纳该Intent,进而开首扫描。

V/WifiMonitor( 1201): Event [CTRL-EVENT-STATE-CHANGE id=-1 state=2]

相关文章