wifi詳解(一)

1        WLAN技術

WLAN是英文WirelessLAN的縮寫,就是無線局域網的意思。無線以太網技術是一種基於無線傳輸的局域網技術,與有線網絡技術相比,具備靈 活、建網迅速、我的化等特色。將這一技術應用於電信網的接入網領域,可以方便、靈活地爲用戶提供網絡接入,適合於用戶流動性較大、有數據業務需求的公共場 所、高端的企業及家庭用戶、須要臨時建網的場合以及難以採用有線接入方式的環境等。 android

2        802.11協議簡述

2.1.1       概述

做爲全球公認的局域網權威,IEEE802工做組創建的標準在過去二十年內在局域網領域獨領風騷。這些協議包括了802.3Ethernet協議、 802.5TokenRing協議、802.3z100BASE-T快速以太網協議。在1997年,通過了7年的工做之後,IEEE發佈了802.11協 議,這也是在無線局域網領域內的第一個國際上被承認的協議。 數組

在1999年9月,他們又提出了802.11b"HighRate"協議,用來對802.11協議進行補充,802.11b在802.11的 1Mbps和2Mbps速率下又增長了5.5Mbps和11Mbps兩個新的網絡吞吐速率。利用802.11b,移動用戶可以得到同Ethernet同樣 的性能、網絡吞吐率、可用性。這個基於標準的技術使得管理員能夠根據環境選擇合適的局域網技術來構造本身的網絡,知足他們的商業用戶和其餘用戶的需求。 802.11協議主要工做在ISO協議的最低兩層上,並在物理層上進行了一些改動,加入了高速數字傳輸的特性和鏈接的穩定性。 網絡

主要內容:
  1.802.11工做方式
  2.802.11物理層
  3.802.11b的加強物理層
  4.802.11數字鏈路層
  5.聯合結構、蜂窩結構和漫遊 數據結構

3        802.11四種主要物理組件

3.1      工做站(Station)

構建網絡的主要目的是爲了在工做站間傳送數據。所謂工做站,是指配備無線網絡接口的計算設備。 less

3.2      接入點(Access Point)

802.11網絡所使用的幀必須通過轉換,方能被傳遞至其餘不一樣類型的網絡。具有無線至有線的橋接功能的設備稱爲接入點,接入點的功能不只於此,但橋接最爲重要。 socket

3.3      無線媒介(Wireless Medium)

802.11標準以無線媒介在工做站之間傳遞幀。其所定義的物理層不僅是一種,802.11最初標準化了兩種射頻物理層以及一種紅外線物理層。 分佈式

3.4      分佈式系統(Distribution System)

當幾個接入點串聯以覆蓋較大區域時,彼此之間必須相互通訊以掌握移動式工做站的行蹤。分佈式系統屬於802.11的邏輯組件,負責將幀轉送至目的地。 函數

下圖爲802.11網絡的基本服務集(basic service set),其中包含了這四種物理組件。 工具


4        WIFI適配層

裏面定義不少字符串變量和適配層的接口實現,是對wpa_supplicant程序通訊的接口封裝,用來完成上層和wpa_supplicant的 通訊, 頭文件在libhardware/include/hardware下,這裏的函數用來向JNI的本地實現提供調用接口。 性能

這裏的函數,我把它們分爲四類函數:

一類是命令相關的(控制)函數,就是在JNI層android_XXX_Command()函數所調用 的Wifi_Command()函數,調用流程以下:

android_XXX_command()=>docommand()=>wifi_command()=>wifi_send_command()=>wpa_ctrl_require()。

二類是 監聽函數,即Wifi_wait_for_event()函數,調用流程以下:android_net_wifi_Waitforevent()=>wifi_wait_for_event()=>wpa_ctrl_recv()。

三就是WPA_SUPPLICANT的啓動,鏈接,關閉函數

四是驅動的加載和卸載函數

5        wpa_supplicant

5.1      wpa_ctrl的做用

定義了兩類套接字和一個管道,並分別實現了和wpa_supplicant的通訊,而在實際的實現中採用的都是套接字的方式,所以wpa_supplicant適配層和wpa_supplicant層 是經過socket通信的。

要是從wifi.c中真的很難看出它和wpa_supplicant有什麼關係,和它聯繫密切的就是 這個wpa_ctrl.h文件,這裏面定義了一個類wpa_ctrl,這個類中聲明瞭兩個Socket套接口,一個是本地一個是要鏈接的套接 口,wpa_ctrl與wpa_supplicant的通訊就須要socket來幫忙了,而wpa_supplicant就是經過調用 wpa_ctrl.h中定義的函數和wpa_supplicant進行通信的,wpa_ctrl類(實際上是其中的兩個socket)就是他們之間的橋樑。

5.2      WPA_SUPPLICANT

5.2.1       概念

wpa_supplicant本是開源項目源碼,被谷歌修改後加入android移動平臺,它主要是用來支持WEP,WPA/WPA2和WAPI無 線協議和加密認證的,而實際上的工做內容是經過socket(不論是wpa_supplicant與上層仍是wpa_supplicant與驅動都採用 socket通信)與驅動交互上報數據給用戶,而用戶能夠經過socket發送命令給wpa_supplicant調動驅動來對WiFi芯片操做。 簡單的說,wpa_supplicant就是WiFi驅動和用戶的中轉站外加對協議和加密認證的支持。

5.2.2       Wpa_supplicant與驅動的交互

5.2.2.1        wpa_supplicant.c

首先定義一個驅動操做數組externstructwpa_driver_ops *wpa_supplicant_drivers[],而後是系列wpa_supplicant_XXX()函數,不少函數裏面調用 wpa_drv_XXX()函數,這些函數是wpa_supplicant_i.h中實現的函數。幾乎每一個函數都須要一個wpa_supplicant結 構,對其進行全部的控制和通訊操做。

5.2.2.2        Wpa_supplicant_i.h

其中定義了一個重要數據結構wpa_supplicant,其中有一個重要的driver成 員,它是wpa_driver_ops類型,能夠被用來調用抽象層的接口。接下來是系列函數聲明,這些函數聲明在wpa_supplicant.c中實 現,而後就是wpa_drv_XXX函數,這些函數就是在 wpa_supplicant.c中被wpa_supplicant_xxx函數調用的,而這些wpa_drv_xxx函數也都有一個 wpa_supplicant結構的變量指針,用來調用封裝的抽象接口,而這些抽象接口的實如今driver_wext.c中(若是使用的漢斯WEXT驅 動)。

這裏要注意的是:在wpa_suppliant.c文件中定義的不少函數是在該頭文件中聲明的,而不是在wpa_supplicant.h中聲明的。

5.2.2.3        Driver_wext.c

對wpa_drvier_ops的個函數的具體實現,該結構指針在wpa_supplicant註冊一個網絡接口時會被初始化賦予指定的操做指 針,wpa_supplicant.c中的wpa_supplicant_xxx函數經過wpa_supplicant結構中的該操做指針調用WEXT的 實現接口。

就是在該文件中,建立了三個socket:ioctrl_socket,event_socket和mlme_socket,它們分別有本身的用 途,如ioctrl_socket用於發送控制命令,event_socket用於監聽驅動傳來的event事件等。Wpa_supplicant經過這 三個socket與wifi驅動關聯,這裏的socket同fd(文件描述符)相似。

6        Wpa_cli調試工具

6.1      啓動wpa_supplicant

使用下面命令啓動wpa_supplicant:

       wpa_supplicant-Dwext -iwlan0 -C/data/system/wpa_supplicant-c/data/misc/wifi/wpa_supplicant.conf

 爲了確保wpa_supplicant真的啓動起來了,使用「ps」命令查看。

6.2        鏈接wpa_cli到wpa_supplicant

       wpa_cli-p/data/system/wpa_supplicant -iwlan0

      而後,就可使用wpa_cli調試工具進行wifi調試了,下面列出了一些經常使用的調試命令:

      >scan                            //掃描周圍的AP

      >scan_results        //顯示掃描結果

      >status                   //顯示當前的鏈接狀態信息

      >terminate             //終止wpa_supplicant

      >quit                        //退出wpa_cli

      >add_network       //返回可用network id

      >set_network<network id> <variable> <value> //設置網絡

      >select_network<network id>          //選擇網絡,禁用其它網絡

      >disable_network<network id>  //禁用網絡

      >enable_network<network id>        //啓用網絡

6.3      示例

6.3.1       無密鑰認證AP

             >add_network      (返回可用networkid, 假定返回0)

             >set_network 0 ssid 「666」

             >set_network 0 key_mgmt NONE

             >enable_network 0

             >quit

若是上面的操做正確,咱們會鏈接到一個AP,它的SSID爲「666」,如今須要一個IP來訪問internet:

             dhcpcd wlan0

成功獲取IP後,便可連上internet。

6.3.2       WEP認證AP

             >add_network      (假設返回1)

             >set_network 1 ssid 「666」

             >set_network 1 key_mgmt NONE

             >set_network 1 wep_key0 「ap passwork」

             >set_network 1 wep_tx_keyidx 0

             >select_network 1     (若是你已經連上了其它的AP,那麼就須要這個命令來禁用其它的網絡)

             >enable_network 1

       而後同上獲取IP,鏈接到internet上。

6.3.3       WPA-PSK/WPA2-PSK認證AP

             >add_network      (假定返回2)

             >set_network 2 ssid 「666」

             >set_network 2 psk 「your pre-shared key」

             >select_network 2 

             >enable_network 2

還有其它的命令進一步設置網絡,不過wpa_supplicant已經給了咱們一些默認的配置。

6.3.4        隱藏藏AP

原則上應該只要在上面的基礎上去set_network netid scan_ssid 1便可,測試過無加密的Hidden AP,WEP/WPA/WPA2應該道理同樣。

相關文章
相關標籤/搜索