AndroidWiFi工作原理_第1頁(yè)
AndroidWiFi工作原理_第2頁(yè)
AndroidWiFi工作原理_第3頁(yè)
AndroidWiFi工作原理_第4頁(yè)
AndroidWiFi工作原理_第5頁(yè)
已閱讀5頁(yè),還剩4頁(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、 AndroidWi-Fi 工作原理 劉洋 第一局部 Android 概述 在介紹 Wi-Fi 之前,先簡(jiǎn)要介紹一下 Android 系統(tǒng),主要分析一下 Android 的 按層實(shí)現(xiàn)的原理。 Android 層次結(jié)構(gòu)是整個(gè) Android 體系中所有應(yīng)用實(shí)現(xiàn)的根底 框架,而 Android 源代碼結(jié)構(gòu)那么與 Wi-Fi 的實(shí)現(xiàn)細(xì)節(jié)有關(guān)。 1.1 根底知識(shí) Android 是一款當(dāng)前最為流行的 操作系統(tǒng),它本身的開(kāi)放性加上 Google 公司的大力推廣, 使其獲得了大量 生產(chǎn)廠商、 科研院校、 軟件公司以及個(gè)人 開(kāi)發(fā)者的青睞, 它屬于一個(gè)全開(kāi)放的平臺(tái), 因此開(kāi)發(fā)者可以得到整個(gè)系統(tǒng)的源代 碼,并能

2、對(duì)其進(jìn)行修改,修改的結(jié)果可以通過(guò)互聯(lián)網(wǎng)上傳到 Android 官方網(wǎng)站, 倘假設(shè)被審核通過(guò),就能參加到 Android 的源代碼中,這絕對(duì)是一件令人興奮的事 情。 1.2 Android 層次結(jié)構(gòu) Android系統(tǒng)是在Linux系統(tǒng)的根底上,經(jīng)過(guò)了層層封裝,最終提供應(yīng)開(kāi)發(fā)者 的是大量的Java APJ在這里被叫做Android API,于是,開(kāi)發(fā)者就可以像開(kāi)發(fā)一 般的Java程序那樣開(kāi)發(fā)Android應(yīng)用程序,這樣的設(shè)計(jì)不僅降低了開(kāi)發(fā) Android 應(yīng)用程序的難度,還增加了 Android 系統(tǒng)的界面友好度。 和一般的操作系統(tǒng)一樣, Android 也是對(duì)硬件進(jìn)行了多層的封裝,使得應(yīng)用 程

3、序的開(kāi)發(fā)者和用戶能輕松地操作硬件,完成他們所希望完成的事情。 Android 所針對(duì)的硬件就是 , 這里主要指智能 , 這種智能 與傳統(tǒng)的 相比 功能被弱化,而更偏向于一臺(tái)筆記本電腦,因此它的 CPU內(nèi)存等硬件配置 要比傳統(tǒng)的 高。它需要提供應(yīng)用戶一些電腦所擁有的功能,比方說(shuō) Wi-Fi 上 網(wǎng)、鼠標(biāo)或觸屏控制的界面、收發(fā)電子郵件、玩大型游戲等,但同時(shí)又必須擁有 傳統(tǒng) 所支持的 、攝像頭、藍(lán)牙等功,這些挑戰(zhàn)都增加了 Android的設(shè)計(jì) 難度。 Android從下至上可以分為這樣幾個(gè)層次: (1) Linux內(nèi)核及驅(qū)動(dòng)層(C實(shí)現(xiàn)); (2)本地庫(kù)(C庫(kù)和C+航)和Java運(yùn)行時(shí)環(huán)境層(主要由

4、C C+位現(xiàn)); (3) Java框架層(主要由Java實(shí)現(xiàn)); (4) Java應(yīng)用程序?qū)?Java實(shí)現(xiàn))。 第3層和第4層之間就是上文所說(shuō)的 Android API,這也是Android提供應(yīng)應(yīng) 用程序開(kāi)發(fā)人員的接口,我們只要熟悉了這些 API,就可以進(jìn)行Android應(yīng)用程 序的開(kāi)發(fā)工作了。 Android 中所有的額應(yīng)用程序,包括核心應(yīng)用程序和用戶開(kāi)發(fā)的應(yīng)用程 序,它們都屬于第4層次,用戶可以得到系統(tǒng)自帶的所有程序的源代碼, 比方初 始界面管理程序、短信程序、日歷、聯(lián)系人管理程序等,并能隨意修改這些程序, 甚至還可以刪除其中的一兩個(gè), 然后重新編譯源代碼, 這樣便生成了自己定制的 An

5、droid 系統(tǒng)。 1.3 Android 源代碼結(jié)構(gòu) 雖然只看API就可以編寫Android的應(yīng)用程序了,但是無(wú)論對(duì)Android系統(tǒng)的 研究人員還是應(yīng)用程序的開(kāi)發(fā)者來(lái)說(shuō),Android的源代碼都是一筆值得好好研究 的財(cái)富。 Android的源代碼可以從其官方網(wǎng)站上下載到,在此之前,本機(jī)上需要裝Linux 系統(tǒng),然后根據(jù)官網(wǎng)上的步驟逐步執(zhí)行,包括初始化系統(tǒng)環(huán)境、下載源碼、編譯 源碼,就可以在本機(jī)上下載并編譯整個(gè) Android系統(tǒng)的源代碼。講述如何下載并 編譯 Android 源代碼的 官 網(wǎng)地址如下 : :source.android /source/initializing.html 。

6、 縱觀整個(gè)Android源碼的結(jié)構(gòu),在其根目錄下有大約10多個(gè)文件夾,其中可 以大致分為以下三局部: (1)關(guān)鍵局部 這局部的實(shí)現(xiàn)代碼位于根目錄下除了 external和package之外的所有文件夾 中,這些代碼實(shí)現(xiàn)了 Linux內(nèi)核kernel文件夾、核心驅(qū)動(dòng)、Android驅(qū)動(dòng)、Android 系統(tǒng)的建立build文件夾、Dalvik虛擬機(jī)dalvik文件夾、C和C+陣地庫(kù)bionic 文件夾、硬件抽象、無(wú)線硬件接口 hardware/ril文件夾、Java運(yùn)行環(huán)境的支持 等功能,是整個(gè) Android 系統(tǒng)的啟動(dòng)和運(yùn)行所必須的。 ( 2) 擴(kuò)展局部 這局部的實(shí)現(xiàn)代碼位于 externa

7、l 文件夾中, 這里邊存放著許多其他開(kāi)源工程, 這些工程都已經(jīng)過(guò)修改而融入到 Android 系統(tǒng)中。 ( 3) 應(yīng)用程序包 這局部代碼位于package文件夾中,由應(yīng)用程序apps、提供器providers、 輸入法input methods三局部組成。 Android 自帶的應(yīng)用程序就位于./package/apps中, 這里有 Browser 瀏 覽器, AlarmClock 鬧鐘,Camera 照相機(jī),Contacts 聯(lián)系人,Settings 設(shè)置,Launcher 初始界面等,還有一些,在此不再一一羅列。 第二局部 Wi-Fi 層次結(jié)構(gòu) Android 中 Wi-Fi 驅(qū)動(dòng)程序被編

8、譯成內(nèi)核的模塊, 通過(guò)應(yīng)用程序設(shè)置開(kāi)關(guān)進(jìn)行 加載和卸載, 具體來(lái)說(shuō)就是 Settings - Wireless & networks - Wi-F。 i 同時(shí), 要使 Wi-Fi 正常工作,驅(qū)動(dòng)中還需要實(shí)現(xiàn)燒寫固件程序和配置信息到 Wi-Fi 的芯片中。 2.1 Wi-Fi 程序模塊 在Android的源代碼中,有多處地方涉及到 Wi-Fi,跨越了前文中所說(shuō)的1、 2.1.1 3、 4 層。下面介紹幾個(gè)與實(shí)現(xiàn) Wi-Fi 功能密切相關(guān)的程序模塊。 2.1.2 開(kāi)源庫(kù) wpa_supplicant 它是一個(gè)開(kāi)源的庫(kù),參加到 Android 源碼中,經(jīng)過(guò)修改后成為 Android 實(shí)現(xiàn) W

9、i-Fi 功能的根底。它的代碼位于 ./external/wpa_supplicant 文件夾中,主要用 C 和C+1成,實(shí)現(xiàn)了從上層接到命令后,發(fā)送給硬件驅(qū)動(dòng)程序,接著操作硬件完 成需要的操作,這里是通過(guò) socket 來(lái)與硬件驅(qū)動(dòng)進(jìn)行通信的。下列圖 2-1 是 wpa_supplicant 的框架圖。 frvnil卻d cdfltiol m呵thm 圖2-1 wpa_supplicant開(kāi)源工程框架圖 2.1.3 硬件驅(qū)動(dòng)程序 前 文 所 說(shuō) 的 wpa_supplicant與 之 通 信 的 硬 件 驅(qū) 動(dòng) 的 代 碼 位 于./hardware/libhardware_legacy/w

10、ifi/wifi.c 中。 2.1.4 JNI 局部 首先簡(jiǎn)要介紹一下 JNI, JNI是Java Native Interface的縮寫,它實(shí)現(xiàn)了 Java代 碼與其他代碼進(jìn)行交互,使得在 Java虛擬機(jī)中運(yùn)行的Java代碼能夠與用其他語(yǔ) 言編寫的應(yīng)用程序和庫(kù)進(jìn)行交互。在 Android中,JNI可以讓Java程序調(diào)用C程 序。 與 Wi-Fi 相 關(guān) 的 JNI 代 碼 位 于./frameworks/base/core/jni/android_net_wifi_Wifi.cpp 中。 2.1.5 Wi-FiAPI 局部 這局部源代碼使用Java完成了對(duì)Wi-Fi API的封裝,使應(yīng)用程序

11、可以使用 Wi-Fi 功 能 , 它 們 位 于 frameworks/base/services/java/com/android/server/ 和 frameworks/base/wifi/java/android/net/wifi/ 中。 2.1.6 Wi-Fi Setting 的用程序局部 這是 Android 中自帶的一個(gè)應(yīng)用程序,在 的 Settings 中,它可以讓用戶 手動(dòng)翻開(kāi)或關(guān)閉 Wi-Fi 功能。當(dāng)用戶翻開(kāi) Wi-Fi 功能后,它會(huì)自動(dòng)搜索周圍的無(wú) 線網(wǎng)絡(luò), 并以列表的形式顯示, 供用戶選擇, 默認(rèn)會(huì)連接用戶上一次成功連接的 無(wú)線網(wǎng)絡(luò)。 這局部代碼位于 ./packag

12、es/apps/Settings/src/com/android/settings/wifi 中。 2.2 Wi-Fi 層次結(jié)構(gòu)關(guān)系 下列圖 2-2 就是 Android 中 Wi-Fi 的各模塊在整個(gè) Android 層次結(jié)構(gòu)中的位置, 以及它們之間的關(guān)系。 第三局部 Wi-Fi 執(zhí)行過(guò)程 Android中Wi-Fi是使用層次結(jié)構(gòu)設(shè)計(jì)的,因此執(zhí)行過(guò)程根本上是在接到用戶 命令后,先從上到下,再?gòu)南碌缴?,完成用戶與 是Wi-Fi功能的詳細(xì)執(zhí)行過(guò)程示意圖。Wi-Fi設(shè)備的交互。下列圖3-1就 圖2-2 Android中 Wi-Fi的層次結(jié)構(gòu)圖 wpa_s 叩 phcam 圖3-1 Wi-Fi執(zhí)行過(guò)

13、程示意圖 如上圖3-1所示,Wi-Fi的執(zhí)行過(guò)程主要有4個(gè),下文將對(duì)這幾個(gè)過(guò)程進(jìn)行詳 細(xì)介紹。 3.1 從 Settings 中啟動(dòng) Wi-Fi 當(dāng)用戶按下 Wi-Fi按鈕后,Android 會(huì)調(diào)用 WifiEnabler的 onPreferenceChange 再由 WifiEnabler 調(diào)用 WifiManager 的 setWifiEnabled接口函數(shù), 通過(guò) AIDL 實(shí)際 調(diào)用的是 WifiService的setWifiEnabled函數(shù),WifiService接著向自身發(fā)送一條 MESSAGE_ENABLE_WI雁息,在處理該消息的代碼中做真正的使能工作:首先 裝載 WIFI內(nèi)

14、核模塊該模塊的位置硬編 W AccessPunilCialij Socket 碼為 /system/lib/modules/wlan.ko, 然后啟動(dòng) wpa_supplicant 配置文件硬編碼為 /data/misc/wifi/wpa_supplicant.conf , 再 通 過(guò) WifiStateTracker 來(lái) 啟 動(dòng) WifiMonitor 中的監(jiān)視線程。 當(dāng)使能成功后,會(huì)播送發(fā)送 WIFI_STATE_CHANGED_ACTION Intent通知 外界Wi-Fi已 經(jīng) 成 功 使 能 了 。WifiEnabler創(chuàng) 立 的 時(shí) 候 就 會(huì) 向Android注 冊(cè) 接 收 WI

15、FI_STATE_CHANGED_ACT|ON止匕它會(huì)收至ij該Intent,從而開(kāi)始掃描。 3.2 查找 Access Point AP 掃描的入口函數(shù)是 WfiService的startScan,它其實(shí)也就是往 wpa_supplicant 發(fā)送SCAN命令。當(dāng)wpa_supplicant處理完SCAN命令后,它會(huì)向控制通道發(fā)送 事件通知掃描完成,從而 wifi_wait_for_event 函數(shù)會(huì)接收到該事件,由此 WifiMonitor中的MonitorThread會(huì)被執(zhí)行來(lái)出來(lái)這個(gè)事件,WfiStateTracker那么接 著播送發(fā) SCAN_RESULTS_AVAILABLE_AC

16、TION Intent, WifiLayer 注冊(cè)了接收 SCAN_RESULTS_AVAILABLE_ACTJON Intent ,所以它的相關(guān)處理函數(shù) handleScanResultsAvailabl會(huì)被調(diào)用,在該函數(shù)中,先會(huì)去拿到SCAN的結(jié)果最 終是往wpa_supplicant發(fā)送SCAN_RESUL命令并讀取返回值來(lái)實(shí)現(xiàn)的。 對(duì) 每 一 個(gè) 掃 描 返 回 的 AP , WifiLayer 會(huì) 調(diào) 用 WifiSettings 的 onAccessPointSetChangedS數(shù),從而最終把該 AP加到GUI顯示列表中。 3.3 連接 AP 當(dāng)用戶在 AcessPointDia

17、log 中選擇好加密方式和輸入密鑰之后,再點(diǎn)擊連接 按鈕, Android 就會(huì)去連接這個(gè) AP。 WifiLayer 會(huì) 先 檢 測(cè) 這 個(gè) AP 是 不 是 之 前 被 配 置 過(guò) , 這 個(gè) 是 通 過(guò) 向 wpa_supplicant 發(fā)送 LIST_NETWORK 命令并且比擬返回值來(lái)實(shí)現(xiàn)的,如果 wpa_supplicant 沒(méi) 有 這 個(gè) AP 的 配 置 信 息 , 那么 會(huì) 向 wpa_supplicant 發(fā) 送 ADD_NETWORK 命令來(lái)添加該 AP, ADD_NETWORK 命令會(huì)返回一個(gè) ID , WifiLayer 再 用 這 個(gè) 返 回 的 ID 作 為 參

18、數(shù) 向 wpa_supplicant 發(fā) 送 ENABLE_NETWORK 命令,從而讓 wpa_supplicant去連接該 AP。 3.4 配置 IP 地址 當(dāng) wpa_supplicant 成功連接上 AP 之后,它會(huì)向控制通道發(fā)送事件通知連接 上 AP 了, 從而 wifi_wait_for_event 函數(shù)會(huì)接收到該事件, 由此 WifiMonitor 中的 MonitorThread會(huì)被執(zhí)行來(lái)處理這個(gè)事件,WifiMonitor再調(diào)用WfiStateTracker的 notifyStateChange, WifiStateTracker貝U接著會(huì)往自身發(fā)送 EVENT_DHCP_START 息 來(lái) 啟 動(dòng) DHCP 去 獲 取 IP 地 址 , 然 后 再 廣 播 發(fā) 送 NETWO

溫馨提示

  • 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)論