Android Wifi工作流程_第1頁(yè)
Android Wifi工作流程_第2頁(yè)
Android Wifi工作流程_第3頁(yè)
Android Wifi工作流程_第4頁(yè)
Android Wifi工作流程_第5頁(yè)
已閱讀5頁(yè),還剩62頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、Android Wifi的工作流程一、WIFI工作相關(guān)部分Wifi 網(wǎng)卡狀態(tài)1.    WIFI_STATE_DISABLED: WIFI網(wǎng)卡不可用2.    WIFI_STATE_DISABLING: WIFI正在關(guān)閉3.    WIFI_STATE_ENABLED:WIFI網(wǎng)卡可用4.    WIFI_STATE_ENABLING:WIFI網(wǎng)卡正在打開(kāi)5.    WIFI_STATE

2、_UNKNOWN:未知網(wǎng)卡狀態(tài) WIFI 訪問(wèn)網(wǎng)絡(luò)需要的權(quán)限"android.permission.CHANGE_NETWORK_STATE">修改網(wǎng)絡(luò)狀態(tài)的權(quán)限 android:name="android.permission.CHANGE_WIFI_STATE">修改WIFI狀態(tài)的權(quán)限"android.permission.ACCESS_NETWORK_STATE">訪問(wèn)網(wǎng)絡(luò)權(quán)限"android.permission.ACCESS_WIFI_STATE">訪問(wèn)WIFI

3、權(quán)限 WIFI 核心模塊n  WifiService由SystemServer啟動(dòng)的時(shí)候生成的ConnecttivityService創(chuàng)建,負(fù)責(zé)啟動(dòng)關(guān)閉wpa_supplicant,啟動(dòng)和關(guān)閉WifiMonitor線程,把命令下發(fā)給wpa_supplicant以及跟新WIFI的狀態(tài)n  WifiMonitor  負(fù)責(zé)從wpa_supplicant接收事件通知n  Wpa_supplicant1、讀取配置文件2、初始化配置參數(shù),驅(qū)動(dòng)函數(shù)3、讓驅(qū)動(dòng)scan當(dāng)前所有的bssid4、檢查掃描的參數(shù)是否和用戶設(shè)置的

4、想否5、如果相符,通知驅(qū)動(dòng)進(jìn)行權(quán)限 認(rèn)證操作6、連上APn  Wifi驅(qū)動(dòng)模塊廠商提供的source,主要進(jìn)行l(wèi)oad firmware和kernel的wireless進(jìn)行通信n  Wifi電源管理模塊主要控制硬件的GPIO和上下電,讓CPU和Wifi模組之間通過(guò)sdio接口通信 二、Wifi工作步驟1  Wifi模塊初期化2  Wifi啟動(dòng)3  查找熱點(diǎn)(AP)4  配置AP5   配置AP參數(shù)6   Wifi連接7  &#

5、160;IP地址配置三、WIFI的架構(gòu)和流程1、WIFI的基本架構(gòu)   1、wifi用戶空間的程序和庫(kù):         external/wpa_supplicant/       生成庫(kù)libwpaclient.so和守護(hù)進(jìn)程wpa_supplicant   2、hardware/libhardware_legary/wifi/是wifi管理庫(kù)  

6、60;3、JNI部分:         frameworks/base/core/jni/android_net_wifi_Wifi.cpp   4、JAVA部分:         frameworks/base/services/java/com/android/server/         f

7、rameworks/base/wifi/java/android/net/wifi/   5、WIFI Settings應(yīng)用程序位于:       packages/apps/Settings/src/com/android/settings/wifi/   6、WIFI 驅(qū)動(dòng)模塊  wlan.ko        wpa_supplicant通過(guò)wireless_ext 接口和

8、驅(qū)動(dòng)通信   7、WIFI 硬件模塊 2、WIFI在Android中如何工作       Android使用一個(gè)修改版wpa_supplicant作為daemon來(lái)控制WIFI,代碼位于external/wpa_supplicant。wpa_supplicant是通過(guò)socket與hardware/libhardware_legacy/wifi/wifi.c通信。UI通過(guò).wifi package(frameworks/base/wifi/java/android/net/wifi/)

9、發(fā)送命令給wifi.c。相應(yīng)的JNI實(shí)現(xiàn)位于frameworks/base/core/jni/android_net_wifi_Wifi.cpp。更高一級(jí)的網(wǎng)絡(luò)管理位于frameworks/base/core/java/android/net。3、配置Android支持WIFI   在BoardConfig.mk中添加:      BOARD_HAVE_WIFI := true      BOARD_WPA_SUPPLICANT_DRIVER :

10、= WEXT   這將在external/wpa_supplicant/Android.mk設(shè)置WPA_BUILD_SUPPLICANT為true,默認(rèn)使用驅(qū)動(dòng)driver_wext.c。   如果使用定制的wpa_supplicant驅(qū)動(dòng)(例如 wlan0),可以設(shè)置:       BOARD_WPA_SUPPLICANT_DRIVER := wlan04、使能wpa_supplicant調(diào)試信息   默認(rèn)wpa_supplicant

11、設(shè)置為MSG_INFO,為了輸出更多信息,可修改:   1、在common.c中設(shè)置wpa_debug_level = MSG_DEBUG;   2、在common.c中把#define wpa_printf宏中的      if (level) >= MSG_INFO)      改為      if (level) >= MSG_DEBUG)

12、5、配置wpa_supplicant.conf   wpa_supplicant是通過(guò)wpa_supplicant.conf中的ctrl_interface=來(lái)指定控制socket的,應(yīng)該在 AndroidBoard.mk中配置好復(fù)制到$(TARGET_OUT_ETC)/wifi(也就是/system/etc/wifi/wpa_supplicant.conf)這個(gè)位置會(huì)在init.rc中再次檢測(cè)的。   一般的wpa_supplicant.conf配置為:      ctrl

13、_interface=DIR=/data/system/wpa_supplicant GROUP=wifi      update_config=1      fast_reauth=1     有時(shí),驅(qū)動(dòng)需要增加:      ap_scan=1   如果遇到AP連接問(wèn)題,需要修改ap_scan=0來(lái)讓驅(qū)動(dòng)連接,代替wpa_supplicant。&

14、#160;  如果要連接到non-WPA or open wireless networks,要增加:      network=              key_mgmt=NONE      6、配置路徑和權(quán)限   Google修改的wpa_supplicant要運(yùn)行在wifi用戶和組

15、下的。代碼可見(jiàn)wpa_supplicant/os_unix.c   中的os_program_init()函數(shù)。     如果配置不對(duì),會(huì)出現(xiàn)下面錯(cuò)誤:      E/WifiHW  (  ): Unable to open connection to supplicant on      "/data/system/wpa_supplicant/wlan0"

16、;: No such file or directory will appear.   確認(rèn)init.rc中有如下配置:       mkdir /system/etc/wifi 0770 wifi wifi       chmod 0770 /system/etc/wifi       chmod 0660 /system/etc/wifi/wpa_sup

17、plicant.conf       chown wifi wifi /system/etc/wifi/wpa_supplicant.conf       # wpa_supplicant socket       mkdir /data/system/wpa_supplicant 0771 wifi wifi      

18、60;chmod 0771 /data/system/wpa_supplicant       #wpa_supplicant control socket for android wifi.c       mkdir /data/misc/wifi 0770 wifi wifi       mkdir /data/misc/wifi/sockets 0770 wifi wifi

19、0;      chmod 0770 /data/misc/wifi       chmod 0660 /data/misc/wifi/wpa_supplicant.conf   如果系統(tǒng)的/system目錄為只讀,那應(yīng)該使用路徑/data/misc/wifi/wpa_supplicant.conf。7、運(yùn)行wpa_supplicant和dhcpcd   在init.rc中確保有如下語(yǔ)句: 

20、60;    service wpa_supplicant /system/bin/logwrapper /system/bin/wpa_supplicant -dd                   -Dwext -iwlan0 -c /data/misc/wifi/wpa_supplicant.conf     

21、    user root         group wifi inet      socket wpa_wlan0 dgram 660 wifi wifi         oneshot      service dhcpcd /system/bin/lo

22、gwrapper /system/bin/dhcpcd -d -B wlan0         disabled         oneshot   根據(jù)所用的WIFI驅(qū)動(dòng)名字,修改wlan0為自己驅(qū)動(dòng)的名字。8、編譯WIFI驅(qū)動(dòng)為module或kernel built in   1、編譯為module    

23、0; 在BoardConfig.mk中添加:         WIFI_DRIVER_MODULE_PATH := "/system/lib/modules/xxxx.ko"         WIFI_DRIVER_MODULE_ARG := ""  #for example nohwcrypt     &#

24、160;   WIFI_DRIVER_MODULE_NAME := "xxxx"  #for example wlan0          WIFI_FIRMWARE_LOADER := ""            2、編譯為kernel built in     &#

25、160; 1)在hardware/libhardware_legacy/wifi/wifi.c要修改interface名字,     2)在init.rc中添加:        setprop erface "wlan0"     3)在hardware/libhardware_legacy/wifi/wifi.c中當(dāng)insmod/rmmod時(shí),  &

26、#160;     直接return 0。9、WIFI需要的firmware   Android不使用標(biāo)準(zhǔn)的hotplug binary,WIFI需要的firmware要復(fù)制到/etc/firmware。   或者復(fù)制到WIFI驅(qū)動(dòng)指定的位置,然后WIFI驅(qū)動(dòng)會(huì)自動(dòng)加載。10、修改WIFI驅(qū)動(dòng)適合Android   Google修改的wpa_supplicant要求SIOCSIWPRIV ioctl發(fā)送命令到驅(qū)動(dòng),及接收信息,例如signal streng

27、th, mac address of the AP, link speed等。所以要正確實(shí)現(xiàn)WIFI驅(qū)動(dòng),需要從SIOCSIWPRIV ioctl返回RSSI (signal strength)和MACADDR信息。    如果沒(méi)實(shí)現(xiàn)這個(gè)ioctl,會(huì)出現(xiàn)如下錯(cuò)誤:     E/wpa_supplicant(  ): wpa_driver_priv_driver_cmd failed         

28、60;                     wpa_driver_priv_driver_cmd RSSI len = 4096      E/wpa_supplicant(  ): wpa_driver_priv_driver_cmd failed     

29、60;D/wpa_supplicant(  ): wpa_driver_priv_driver_cmd LINKSPEED len = 4096     E/wpa_supplicant(  ): wpa_driver_priv_driver_cmd failed      I/wpa_supplicant(  ): CTRL-EVENT-DRIVER-STATE HANGED10、設(shè)置dhcpcd.conf   一般/sys

30、tem/etc/dhcpcd/dhcpcd.conf的配置為:      interface wlan0      option subnet_mask, routers, domain_name_server四、WIFI模塊分析Wifi模塊學(xué)習(xí)流程最近研究Wifi模塊,查了不少的相關(guān)資料,但發(fā)現(xiàn)基本上是基于android2.0版本的的分析,而現(xiàn)在研發(fā)的android移動(dòng)平臺(tái)基本上都是2.3的版本,跟2.0版本的差別,在Wifi模塊上也是顯而易見(jiàn)的。2.3版本W(wǎng)ifi模塊沒(méi)有

31、了WifiLayer,之前的WifiLayer主要負(fù)責(zé)一些復(fù)雜的Wifi功能,如AP選擇等以提供給用戶自定義,而新的版本里面的這塊內(nèi)容基本上被WifiSettings所代替本文就是基于android2.3版本的Wifi分析,主要分為兩部分來(lái)分別說(shuō)明:(a)    Wifi的啟動(dòng)流程(有代碼供參考分析)(b)    Wifi模塊相關(guān)文件的解析(c)    Wpa_supplicant解析Awifi的基本運(yùn)行流程(針對(duì)代碼而言)首先給一張我網(wǎng)上down下來(lái)的圖,針對(duì)2.3版本之前

32、的,由于不怎么擅長(zhǎng)畫(huà)這些,大家也就將就點(diǎn),只要能助理解就可以了(一)初始化a.流程1.在SystemServer啟動(dòng)的時(shí)候會(huì)生成一個(gè)ConnectivityService的實(shí)例2.ConnectivityService的構(gòu)造函數(shù)會(huì)創(chuàng)建WifiService3.WifiStateTracker會(huì)創(chuàng)建WifiMonitor接受來(lái)自底層的事件,WifiService和WifiMonitor是整個(gè)wifi模塊的核心,WifiService負(fù)責(zé)啟動(dòng)和關(guān)閉wpa_supplicant,啟動(dòng)和關(guān)閉WifiMonitor監(jiān)視線程和把命令下方給wpa_supplicant,而WifiMonitor則負(fù)責(zé)從wpa

33、_supplicant接受事件通知b.代碼分析要想使用Wifi模塊,必須首先使能Wifi,當(dāng)你第一次按下Wifi使能按鈕時(shí),WirelessSettings會(huì)實(shí)例化一個(gè)WifiEnabler對(duì)象,實(shí)例化代碼如下:packages/apps/settings/src/com/android/settings/WirelessSettings.javajava view plaincopy1. protected void onCreate(Bundle savedInstanceState)   2.   

34、3.        super.onCreate(savedInstanceState);  4.   5.               CheckBoxPreferencewifi = (CheckBoxPreference) findPreference(KEY_TOGGLE_WIFI);  6

35、.   7.               mWifiEnabler= new WifiEnabler(this, wifi);  8.   9.   WifiEnabler類的定義大致如下,它實(shí)現(xiàn)了一個(gè)監(jiān)聽(tīng)接口,當(dāng)WifiEnabler對(duì)象被初始化后,它監(jiān)聽(tīng)到你按鍵的動(dòng)作,會(huì)調(diào)用響應(yīng)函數(shù) onPreferenceChange(),這個(gè)函數(shù)會(huì)調(diào)用Wi

36、fiManager的setWifiEnabled()函數(shù)。java view plaincopy1. public class WifiEnabler implementsPreference.OnPreferenceChangeListener    2.  3. public boolean onPreferenceChange(Preference preference,Object value)   4.    

37、60;    booleanenable = (Boolean) value;    5.  6. if (mWifiManager.setWifiEnabled(enable)   7.                 mCheckBox.setEnabled(false); 

38、 8.   9.  10.  11.   我們都知道Wifimanager只是個(gè)服務(wù)代理,所以它會(huì)調(diào)用WifiService的setWifiEnabled()函數(shù),而這個(gè)函數(shù)會(huì)調(diào)用 sendEnableMessage()函數(shù),了解android消息處理機(jī)制的都知道,這個(gè)函數(shù)最終會(huì)給自己發(fā)送一個(gè) MESSAGE_ENABLE_WIFI的消息,被WifiService里面定義的handlermessage()函數(shù)處理,會(huì)調(diào)用 setWifiEnabledBlocking()函數(shù)。下面是調(diào)用流程:mWifiEnabler.onpr

39、eferencechange()=>mWifiManage.setWifienabled()=>mWifiService.setWifiEnabled()=>mWifiService.sendEnableMessage()=>mWifiService.handleMessage()=>mWifiService.setWifiEnabledBlocking().在setWifiEnabledBlocking()函數(shù)中主要做如下工作:加載Wifi驅(qū)動(dòng),啟動(dòng)wpa_supplicant,注冊(cè)廣播接收器,啟動(dòng)WifiThread監(jiān)聽(tīng)線程。代碼如下:1.  2.

40、if (enable)  3.            if (!mWifiStateTracker.loadDriver()   4.                Slog.e(TAG, "Failed toload Wi-Fi 

41、;driver.");  5.                setWifiEnabledState(WIFI_STATE_UNKNOWN, uid);   6.                 return false; 

42、60;7.              8.            if (!mWifiStateTracker.startSupplicant()   9.                &

43、#160;mWifiStateTracker.unloadDriver();  10.                 Slog.e(TAG, "Failed tostart supplicant daemon.");   11.          

44、      setWifiEnabledState(WIFI_STATE_UNKNOWN, uid);   12.                 return false;  13.              

45、;14.            registerForBroadcasts();  15.            mWifiStateTracker.startEventLoop();  16.   至此,Wifi使能(開(kāi)啟)結(jié)束,自動(dòng)進(jìn)入掃描階段。(二)掃描AP當(dāng)驅(qū)動(dòng)加載成功后,如果配置文件的AP_SCAN = 1,掃描會(huì)自動(dòng)開(kāi)始,Wi

46、fiMonitor將會(huì)從supplicant收到一個(gè)消息EVENT_DRIVER_STATE_CHANGED,調(diào)用 handleDriverEvent(),然后調(diào)用mWifiStateTracker.notifyDriverStarted(),該函數(shù)向消息隊(duì)列添加EVENT_DRIVER_STATE_CHANGED,handlermessage()函數(shù)處理消息時(shí)調(diào)用scan()函數(shù),并通過(guò) WifiNative將掃描命令發(fā)送到wpa_supplicant??创aFrameworks/base/wifi/java/android/net/wifi/WifiMonitor.javajava

47、0;view plaincopy1. private void handleDriverEvent(Stringstate)   2.            if (state = null)   3.                 re

48、turn;  4.              5.            if (state.equals("STOPPED")   6.               &

49、#160;mWifiStateTracker.notifyDriverStopped();  7.             else if (state.equals("STARTED")   8.                 mWifiStat

50、eTracker.notifyDriverStarted();  9.             else if (state.equals("HANGED")   10.                 mWifiStateTracker.notif

51、yDriverHung();  11.              12.   Frameworks/base/wifi/java/android/net/wifi/WifiStateTracker.javajava view plaincopy1. .  2. case EVENT_DRIVER_STATE_CHANGED:  3.      &#

52、160;          switch(msg.arg1)   4.                 case DRIVER_STARTED:  5.             &

53、#160;         6.                     setNumAllowedChannels();  7.               

54、     synchronized (this)   8.                        if (mRunState = RUN_STATE_STARTING)   9.     &#

55、160;                      mRunState = RUN_STATE_RUNNING;  10.                    

56、;        if (!mIsScanOnly)   11.                                 reconnectCommand();

57、 12.                             else   13.                  

58、;               / In somesituations, supplicant needs to be kickstarted to  14.                 

59、;                / start thebackground scanning  15.                        

60、0;        scan(true);  16.                              17.          &

61、#160;               18.                       19.             

62、60;      break;               20. .  上面是啟動(dòng)Wifi時(shí),自動(dòng)進(jìn)行的AP的掃描,用戶當(dāng)然也可以手動(dòng)掃描AP,這部分實(shí)現(xiàn)在WifiService里面,WifiService通過(guò)startScan()接口函數(shù)發(fā)送掃描命令到supplicant。看代碼:Frameworks/base/wifi/java/android/net/wifi

63、/WifiStateTracker.javajava view plaincopy1. public boolean startScan(booleanforceActive)   2.        enforceChangePermission();  3.        switch (mWifiStateTracker.getSupplicantState()  

64、60;4.            case DISCONNECTED:  5.            case INACTIVE:   6.            case SCANNING:  7.

65、            case DORMANT: 8.                 break;  9.            default:  10.  

66、60;             mWifiStateTracker.setScanResultHandling(  11.                        WifiStateTracker.SUPPL_SCAN_HA

67、NDLING_LIST_ONLY);  12.                 break;  13.          14.        return mWifiStateTracker.scan(forceActive);  15. 

68、0; 然后下面的流程同上面的自動(dòng)掃描,我們來(lái)分析一下手動(dòng)掃描從哪里開(kāi)始的。我們應(yīng)該知道手動(dòng)掃描是通過(guò)菜單鍵的掃描鍵來(lái)響應(yīng)的,而響應(yīng)該動(dòng)作的應(yīng)該是 WifiSettings類中Scanner類的handlerMessage()函數(shù),它調(diào)用WifiManager的 startScanActive(),這才調(diào)用WifiService的startScan()。如代碼:packages/apps/Settings/src/com/android/settings/wifiwifisettings.javajava view plaincopy1. public boolea

69、n onCreateOptionsMenu(Menu menu)   2.        menu.add(Menu.NONE, MENU_ID_SCAN, 0, R.string.wifi_menu_scan)  3.                .setIcon(R.drawable.ic_m

70、enu_scan_network);  4.        menu.add(Menu.NONE, MENU_ID_ADVANCED, 0, R.string.wifi_menu_advanced)  5.                .setIcon(android.R.drawable.ic_menu_manage); &

71、#160;6.        return super.onCreateOptionsMenu(menu);  7.   當(dāng)按下菜單鍵時(shí),WifiSettings就會(huì)調(diào)用這個(gè)函數(shù)繪制菜單。如果選擇掃描按鈕,WifiSettings會(huì)調(diào)用onOptionsItemSelected()。packages/apps/Settings/src/com/android/settings/wifiwifisettings.java1. public booleanonOptionsIte

72、mSelected(MenuItem item)   2.        switch (item.getItemId()   3.            case MENU_ID_SCAN:  4.            

73、60;    if(mWifiManager.isWifiEnabled()   5.                     mScanner.resume();  6.              

74、     7.                 return true;  8.            case MENU_ID_ADVANCED:  9.        

75、0;        startActivity(new Intent(this,AdvancedSettings.class);  10.                 return true;  11.          12. 

76、60;      return super.onOptionsItemSelected(item);  13.   Handler類:1. private class Scanner extends Handler    2.        private int mRetry = 0;   3.

77、       void resume()   4.            if (!hasMessages(0)     5.                 sendEmptyM

78、essage(0);  6.               7.          8.        void pause()   9.            mRetr

79、y = 0;  10.             mAccessPoints.setProgress(false);  11.            removeMessages(0);  12.          13.  

80、60;     Override  14.        public void handleMessage(Message message)   15.            if (mWifiManager.startScanActive()  16.   

81、;              mRetry = 0;  17.             else if (+mRetry >= 3)   18.         &

82、#160;       mRetry = 0;  19.                Toast.makeText(WifiSettings.this, R.string.wifi_fail_to_scan,  20.          

83、              Toast.LENGTH_LONG).show();  21.                 return;  22.            

84、;  23.            mAccessPoints.setProgress(mRetry != 0);  24.            sendEmptyMessageDelayed(0, 6000);  25.         

85、0;26.   這里的mWifiManager.startScanActive()就會(huì)調(diào)用WifiService里的startScan()函數(shù),下面的流程和上面的一樣,這里不贅述。當(dāng)supplicant完成了這個(gè)掃描命令后,它會(huì)發(fā)送一個(gè)消息給上層,提醒他們掃描已經(jīng)完成,WifiMonitor會(huì)接收到這消息,然后再發(fā)送給WifiStateTracker。Frameworks/base/wifi/java/android/net/wifi/WifiMonitor.java1. void handleEvent(int event, String&#

86、160;remainder)    2.             switch (event)   3.                 caseDISCONNECTED:  4.      

87、0;             handleNetworkStateChange(NetworkInfo.DetailedState.DISCONNECTED,remainder);  5.                     break;  6.

88、                 case CONNECTED:  7.                    handleNetworkStateChange(NetworkInfo.DetailedState.CONNECTE

89、D,remainder);  8.                     break;  9.                 case SCAN_RESULTS:  10.   

90、;                  mWifiStateTracker.notifyScanResultsAvailable();  11.                     break;  

91、12.                 case UNKNOWN:  13.                     break;  14.      

92、0;        15.   WifiStateTracker將會(huì)廣播SCAN_RESULTS_AVAILABLE_ACTION消息:代碼如:Frameworks/base/wifi/java/android/net/wifi/WifiStateTracker.java1. public voidhandleMessage(Message msg)   2.         Inten

93、t intent;  3.  4. case EVENT_SCAN_RESULTS_AVAILABLE:  5.                 if(ActivityManagerNative.isSystemReady()   6.           &

94、#160;         mContext.sendBroadcast(new Intent(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION);  7.                    8.       &

95、#160;         sendScanResultsAvailable();   9.                   10.               &#

96、160; setScanMode(false); 11.                 break;  12.  13.   由于WifiSettings類注冊(cè)了intent,能夠處理SCAN_RESULTS_AVAILABLE_ACTION消息,它會(huì)調(diào)用handleEvent(),調(diào)用流程如下所示。WifiSettings.handleEvent() =>W

97、ifiSettings.updateAccessPoints() => mWifiManager.getScanResults()=> mService.getScanResults()=>mWifiStateTracker.scanResults() => WifiNative.scanResultsCommand()將獲取AP列表的命令發(fā)送到supplicant,然后supplicant通過(guò)Socket發(fā)送掃描結(jié)果,由上層接收并顯示。這和前面的消息獲取流程基本相同。(三)配置,連接AP當(dāng)用戶選擇一個(gè)活躍的AP時(shí),Wi

98、fiSettings響應(yīng)打開(kāi)一個(gè)對(duì)話框來(lái)配置AP,比如加密方法和連接AP的驗(yàn)證模式。配置好AP后,WifiService添加或更新網(wǎng)絡(luò)連接到特定的AP。代碼如:packages/apps/settings/src/com/android/settings/wifi/WifiSetttings.java1. public booleanonPreferenceTreeClick(PreferenceScreen screen, Preference preference)    2.   

99、0;    if (preference instanceof AccessPoint)   3.            mSelected = (AccessPoint) preference;  4.            showDialog(

100、mSelected, false);  5.         else if (preference = mAddNetwork)   6.            mSelected = null;  7.        

101、;    showDialog(null, true);  8.         else if (preference = mNotifyOpenNetworks)   9.            Secure.putInt(getContentResolver(), 

102、0; 10.                    Secure.WIFI_NETWORKS_AVAILABLE_NOTIFICATION_ON,  11.                    mN

103、otifyOpenNetworks.isChecked() ? 1 : 0);  12.         else   13.            return super.onPreferenceTreeClick(screen, preference);  14.    &

104、#160;     15.        return true;  16.   配置好以后,當(dāng)按下“Connect Press”時(shí),WifiSettings通過(guò)發(fā)送LIST_NETWORK命令到supplicant來(lái)檢查該網(wǎng)絡(luò)是否配置。如果沒(méi)有該網(wǎng)絡(luò)或沒(méi)有配置它,WifiService調(diào)用addorUpdateNetwork()函數(shù)來(lái)添加或更新網(wǎng)絡(luò),然后發(fā)送命令給supplicant,連接到這個(gè)網(wǎng)絡(luò)。下面是從響應(yīng)連接按鈕到WifiService

105、發(fā)送連接命令的代碼:packages/apps/settings/src/com/android/settings/wifi/WifiSetttings.javajava view plaincopy1. public void onClick(DialogInterfacedialogInterface, int button)   2.        if (button = WifiDialog.BUTTON_FORGE

106、T && mSelected != null)   3.            forget(mSworkId);  4.         else if (button = WifiDialog.BUTTON_SUBMIT && mDialog&

107、#160;!=null)   5.            WifiConfiguration config = mDialog.getConfig();  6.            if (config = null)   7.    &

108、#160;            if (mSelected != null&& !requireKeyStore(mSelected.getConfig()   8.                    

109、60;connect(mSworkId);  9.                   10.             else if (workId != -1)   11.      &

110、#160;          if (mSelected != null)   12.                     mWifiManager.updateNetwork(config);  13.  

111、0;14.                     saveNetworks();  15.                   16.        

112、;     else   17.                 int networkId =mWifiManager.addNetwork(config);  18.               

113、  if (networkId != -1)   19.                    mWifiManager.enableNetwork(networkId, false);    20.         &

114、#160;           workId =networkId;   21.                     if (mDialog.edit | requireKeyStore(config)  22.              

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論