可以缓解客户没有呈现屏而不能操作WIFI的题材,WIFI模块的基本效率

老是管理服务:改变WIFI连接状态:正在连接/正在连接

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的开行过程,在功效运行中也会输出相应的日记消息,下面就来详细摸底一下。(请留心,WIFI开启后会更改电池状态等其它状
态。关闭WIFI时,android的政策是卸载驱动来省电。如有缺失就是问题。不过下文删去了与WIFI无关的LOG!)

 

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

 

2、wpa_supplicant

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

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

接下来ps|grep wpa看看有没有起来,在wifi工作进程中,这么些过程要平昔都在的。

二:Android平台下的WIFI模块

(2)在wpa_cli交互格局下得以推行很多发令,列表如下:

2
WifiMonitor再调用WifiStateTracker的notifyStateChange,WifiStateTracker则随即会往自己发送EVENT_DHCP_START音讯来启动DHCP去赢得IP地址。

 

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

 

连日来管理服务:抛出WIFI

公海赌船网址 1

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

   
Android系统中对于WIFI的安装集成到了“设置”中,其实跟手动设置差不多。这里介绍下怎么手动连接WIFI,以有益以后调试WIFI。

由来停止,整个连接过程做到。

启动

本节介绍启动wpa_supplicant的常用方法,接纳一个最契合你的。

wpa_supplicant发出事件通报:已和1c:bd:b9:f6:a7:9f郎才女貌

cd /system/bin

wpa_supplicant发出事件通报:

       
第一步要做的就是要加载WIFI模块驱动了。当然要是您的WIFI是编译到基础里面的,就不需要的。我们的WIFI芯片用的是BCM4330,编译为模块。

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

> add_net
3
> set_net 3 ssid “Dept_driver”
OK

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

 

2
当wpa_supplicant处理完SCAN命令后,它会向控制通道发送事件通报扫描完成,从而wifi_wait_for_event函数会接收到该事件,由此WifiMonitor中的MonitorThread会被执行来出来这些事件。

另请参阅

 

 

 

现阶段得以应用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”

 

 

 

 

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

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

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

 

WifiMonitor接收wpa_supplicant事件

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

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

动作脚本

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

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-63个字符:

> set_network 0 psk "passkey"
OK
>

使能:

> enable_network 0
OK
>

将修改写入配置文件:

> save_config
OK
>

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

公海赌船网址 2

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

回显如下表明正常并处在交互形式:

网络状态跟踪:更新突显为裁判中

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的通信。

 

【初始化】

手动

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

  • -B – 在后台执行
  • -c 文件名 -路径配置文件
  • -i 接口 – 监听的接口

至于全部的参数列表,参考 man 8 wpa_supplicant。例如,常见的用法是:

# wpa_supplicant -B -i interface -c configuration_file

对应上述社团,基于Android的无绳电话机中的WiFi控制分为三大组件:

        B,运行echo 1 >
/dev/wmtWifi,启动WIFI驱动。不过这些使能不会呈现在安卓界面上层,默认是要在开行安卓时开启WIFI模块的,也即设置中的WIFI要默认ON。

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

3.1 上行接口

Wpa_supplicant提供二种办法的上行接口。一种基于传统dbus机制实现与此外进程间的IPC通信;另一种通过Unix
domain socket机制实现进程间的IPC通信。

wpa_supplicant发出事件通报:

上述过程就证实联网OK,可以上网了。

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

如此那般就成功了。可以上网了。

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

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

WIFI状态跟踪:更改请求状态:搜索中->匹配中

Dept_driver的加密方法是WPA2-PSK

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

安装


法定软件仓库
中设置软件包 wpa_supplicant

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

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

随之举办查找wifi

//Need WifiConfiguration for the AP

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

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

     我自己的实验图如下:

wpa_supplicant发出事件通报:

(1)通过adb命令行,可以直接打开supplicant,从而运行wpa_cli,可以缓解客户没有呈现屏而望洋兴叹操作WIFI的题材,还足以避免UI的题材带到driver。进一步来说,可以用在重重从未有过键盘输入和LCD输出的安卓终端产品的操作上。

WIFI状态跟踪:连接请求确认,状态=搜索

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

接受到广播:WIFI已经打开

 

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

 

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

     
  wpa_supplicant包含三个关键的可举行工具:wpa_supplicant和wpa_cli。wpa_supplicant是基本程序,
它和wpa_cli的涉及就是劳动和客户端的涉及:后台运行wpa_supplicant,使用wpa_cli来搜寻、设置、和连接网络。

2
ADD_NETWORK命令会重回一个ID,WifiLayer再用这些重返的ID作为参数向wpa_supplicant发送ENABLE_NETWORK命令,从而让wpa_supplicant去老是该AP。

3. Wpa_supplicant提供的接口

从通信层次上划分,wpa_supplicant提供发展的主宰接口 control
interface,用于与另外模块(如UI)进行通信,其他模块可以透过control
interface 来获取信息或下发命令。Wpa_supplicant通过socket通信机制落实下行接口,与基础举办通信,获取信息或下发命令。

 

WifiMonitor接收事件

参照原文:http://blog.sina.com.cn/s/blog\_55465b470100l73l.html

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

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来添加自定义路径。

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

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

Interactive mode

WifiMonitor接收wpa_supplicant的事件

wpa_cli -p /data/misc/wpa_supplicant

WIFI状态跟踪:更改请求状态:匹配中->已优秀

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

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

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 [Associated with 1c:bd:b9:f6:a7:9f]

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)

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

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

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

> 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

……

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发出事件通报:WPA:与1c:bd:b9:f6:a7:9f确定标志位

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,
布罗德(Broad)com, 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层数据后,将其发送到上层  */

网络状态跟踪:更新突显为寻找状态

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)

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

接着设置wifi,就连续Dept_driver这么些热点吧

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

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参数指定的门路加上网络接口名称;

 

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

2. wpa_supplicant 起头化流程

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

公海赌船网址 4

wpa_supplicant发出事件通报:驱动命令行.MAC地址.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

1、开启WIFI&自动检索

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

1
WifiLayer会先检测这一个AP是不是事先被布置过,这多少个是经过向wpa_supplicant发送LIST_NETWORK命令并且相比较再次来到值来促成的,

不得收入态声明该服务端已经在运转了(也恐怕是可输入状态,只要前边的wpa_cali可连续就行)。-i
-D -c的参数意义可向来在Help中查询,具体有些参数可能因平台不同而有差别。

wpa_supplicant发出事件通报:准备好最先摸索网络了

 

  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都能官方输入。

wpa_supplicant软件架构分析

二零一三年8月26日 ⁄ 综合 ⁄ 共
12345字 ⁄ 字号 小 中 大 ⁄
评论关闭

 

原文地址:http://blog.csdn.net/fxfzz/article/details/6176414

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

 

1 在SystemServer启动的时候,会变动一个ConnectivityService(Service)的实例。

如此这般,就都安装好了,接着用dhcpd分配一个IP地址

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

公海赌船网址 5

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

正常启动后的回显如下:

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

指定驱动

您可能需要指定一个驱动来使用。关于补助的驱动程序的列表,请参考wpa_supplicant
-h的输出结果。

  • nl80211 是当前的正儿八经,但不是有着的有线芯片的模块协助。
  • wext 最近已不合时宜,但仍赢得大面积辅助。

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

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

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

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
/ RSN (Robust Secure
Network)). 可以在桌面、笔记本甚至嵌入式系统中动用。

wpa_supplicant 是在客户端接纳的 IEEE 802.1X/WPA 组件, 襄助与 WPA
Authenticator 的相互,控制漫游和有线驱动的 IEEE 802.11 验证和事关。 

wpa_supplicant发出事件通报:连接形成

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

Android平台运用的WiFi控制框架是按照大名鼎鼎的wpa_supplicant,它是一个安全中间件,为各样无线网卡提供统一的平安机制,如下图所示:

WIFI是一种无线连接技术,可用以手机、电脑、PDA等终端。WIFI技术发生的目标是立异基于IEEE802.11标准的无线网络产品之间的互通性,也就是说WIFI是遵照802.11正经的,但WIFI不等同无线网络。

      E,执行一多级命令看看

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

(3)平台操作实例(仅限于MTK平台 且具ROOT权限)

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
补全和已形成命令的求证。

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

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

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

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

2.1. main()函数:

在这个函数中,重要做了四件事。

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

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

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

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

 

【查找AP】

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

【配置AP参数】

使用wpa_cli添加一个新的网络

当用户在WifiSettings界面上摘取了一个AP后,会显得配置AP参数的一个对话框。

参考原文:http://cache.baiducontent.com
/c?m=9f65cb4a8c8507ed4fece7631046893b4c4380146d96864968d4e414c42246100024b8ed7a66471980853a3c50f11e41bca770216c5d61aa9bc98b4addb9922b3bcd7a742613d51742c419de8a1c729f7e875a98ea42b3e1&p=8b2a975bcd8711a052eedb2f4a4c&newp=8b2a971f81822dec08e29e7d495d92695c02dc3051dcd14f2895ff0b&user=baidu&fm=sc&query=adb+shell+wifi&qid=&p1=4

网络状态跟踪:更新显示为正在连接状态

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命令的最底层处理函数。

 

4
WifiLayer注册了收到SCAN_RESULTS_AVAILABLE_ACTION这么些Intent,所以它的相干处理函数
handleScanResultsAvailable会被调用,在该函数中,先会去拿到SCAN的结果(最后是往wpa_supplicant发送
SCAN_RESULT命令并读取再次回到值来兑现的),List list =
mWifiManager.getScanResults();对每一个围观重回的AP,WifiLayer会调用WifiSettings的
onAccessPointSetChanged函数,从而最后把该AP加到GUI显示列表中。

 

3当使能打响后,会播放发送WIFI_STATE_CHANGED_ACTION这么些Intent通告外界WIFI已
经 成 功 使 能 了 。WifiEnabler创 建 的 时 候 就 会 向Android注 册 接
收WIFI_STATE_CHANGED_ACTION,因而它会收下该Intent,从而最先扫描。

> 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

接纳广播,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

查看搜到的有怎么着热点

WifiMonitor接收wpa_supplicant事件

scan

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

> enable_net 3
OK
> q

当用户在AcessPointDialog中甄选好加密方法和输入密钥之后,再点击连接按钮,Android就会去老是这一个AP。

配置

wpa_supplicant提供了一个参阅布局文件/etc/wpa_supplicant/wpa_supplicant.conf,其中蕴蓄
了有着可用的挑三拣四及其用法和例子的事无巨细文档。考虑先把它备份起来,因为下边描述的活动抬高网络部署到wpa_supplicant.conf的主意下删除
了文本中的所有注释。

在其最简便的情势中,一个布置文件,只需要一个网络部署块。例如:

/etc/wpa_supplicant/foobar.conf

network={
    ssid="..."
}

要是你有一个安排文件,如前节所述,就足以启动wpa_supplicant守护进程,并采用一个静态IP或DHCP连接到无线网络。

WifiMonitor从wpa_supplicant接收事件通报

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

1
扫描的入口函数是Wifi瑟维斯(Service)(Service)的startScan,它其实也就是往wpa_supplicant发送SCAN命令。

        接着启动客户端wpa_cli举办配置并一连wifi热点

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

       这样驱动模块加载后,需要启动wpa_supplicant

不等档次的网络,不同的参数等等,应有尽有。

 

1、WIFI的主旨运行流程

 

公海赌船网址 6

公海赌船网址 7

网络状态跟踪:更新显示为博得IP地址

 

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

【连接】

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

3
WifiStateTracker则跟着播放发送SCAN_RESULTS_AVAILABLE_ACTION这个Intent。

连天管理服务:抛出WIFI连接状态改变:已接连/鉴定中

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

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

wpa_supplicant发出事件通报:

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

4
WifiLayer注册了收纳NETWORK_STATE_公海赌船网址,CHANGED_ACTION这么些Intent,所以它的相关处理函数
handleNetworkStateChanged会被调用,当DHCP得到IP地址然后,会再发送EVENT_DHCP_SUCCEEDED消息。

一:什么是WIFI

WifiMonitor接收wpa_supplicant的事件

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

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

如果wpa_supplicant没有这么些AP的配备音信,则会向wpa_supplicant发送ADD_NETWORK命令来添加该AP

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

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

#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
#}

四:对WIFI模块的LOG了解多一点点

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

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

网络状态跟踪:更新展现为裁判中

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

2 wpa_supplicant
daemon服务,对应上述中间部分,效能是“上传下达”。所有客户端通过它控制硬件网卡,通过发送字符串命令控制是否扫描AP,提取扫描结果和是否涉及
AP等操作,同时将使得的推行情形发送给用户。该服务是设计支撑多种无线网卡芯片,由此各样厂商共同提供了一个通用接口给wpa_supplicant调
用。

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

WifiMonitor接收wpa_supplicant事件

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

简言之介绍一下,WIFI模块的基本功能:

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

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

2、点击连接&获取状态

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

showAccessPointDialog(state, AccessPointDialog.MODE_INFO);

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

wpa_supplicant发出事件通报

在堂弟大内存的/etc/wpa_supplicant.conf中大家得以一贯阅览WIFI襄助的网络项目,每体系型都有例子,比如:

wpa_supplicant发出事件通报:

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

2 ConnectivityService(Service)的结构函数会创立WifiService(Service)。

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

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

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

WifiConfiguration config = findConfiguredNetwork(state);

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

【连接AP】

网络状态跟踪:更新显示为正在连接状态

WIFI状态跟踪:更改请求状态:TCP中断连接->确认标志位

WIFI状态跟踪:更改请求状态:已配合->TCP中断连接

3
WifiStateTracker会创设WifiMonitor接收来自底层的轩然大波,WifiService(Service)和WifiMonitor是全体模块的主旨。
WifiService(Service)负责启动关闭wpa_supplicant、启动关闭WifiMonitor监视线程和把命令颁发给
wpa_supplicant,而WifiMonitor则负责从wpa_supplicant接收事件通报。

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

WIFI状态跟踪:更改请求状态:确认标志位->完成

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

【配置IP地址】

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

相关文章