




版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 海洋健康旅游產(chǎn)品策劃
- 房票轉(zhuǎn)讓協(xié)議書(shū)范本
- 醫(yī)院管理集團(tuán)
- 別墅拆除追責(zé)方案
- 鋼板切口防銹措施方案
- 工廠路面標(biāo)識(shí)規(guī)劃方案
- 船舶工程營(yíng)銷方案模板
- 水田改造措施方案
- 醫(yī)院環(huán)境分級(jí)管理方案
- 車間整齊規(guī)范管理方案
- DB32∕T 186-2015 建筑消防設(shè)施檢測(cè)技術(shù)規(guī)程
- XX公司“十四五”戰(zhàn)略發(fā)展規(guī)劃及年度評(píng)價(jià)報(bào)告(模板)
- Q∕GDW 12104-2021 電力物聯(lián)網(wǎng)數(shù)據(jù)中臺(tái)技術(shù)和功能規(guī)范
- 機(jī)關(guān)檔案管理工作培訓(xùn)PPT課件
- 三寶四口及臨邊防護(hù)安全培訓(xùn)講義
- 油輪、化學(xué)品船的基本知識(shí)
- (高清正版)T_CAGHP 054—2019 地質(zhì)災(zāi)害治理工程質(zhì)量檢驗(yàn)評(píng)定標(biāo)準(zhǔn)(試行)
- 25T汽車吊檢驗(yàn)報(bào)告
- 變頻空調(diào)中的永磁電機(jī)電感分析
- 高考??颊Z(yǔ)法填空詞性轉(zhuǎn)換匯總
- AOI自動(dòng)光學(xué)檢測(cè)設(shè)備程序編寫(xiě)
評(píng)論
0/150
提交評(píng)論