1. 程式人生 > >wifi技術從瞭解到熟悉1----概念、802.11協議簡述及四種主要物理元件、wifi適配層、wap_supplicant和wap_cli

wifi技術從瞭解到熟悉1----概念、802.11協議簡述及四種主要物理元件、wifi適配層、wap_supplicant和wap_cli

1        WLAN技術

WLAN是英文WirelessLAN的縮寫,就是無線區域網的意思。無線乙太網技術是一種基於無線傳輸的區域網技術,與有線網路技術相比,具有靈活、建網迅速、個人化等特點。將這一技術應用於電信網的接入網領域,能夠方便、靈活地為使用者提供網路接入,適合於使用者流動性較大、有資料業務需求的公共場所、高階的企業及家庭使用者、需要臨時建網的場合以及難以採用有線接入方式的環境等。

作為全球公認的區域網權威,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協議主要工作在OSI協議的最低兩層上(OSI七層模型參考http://blog.csdn.net/qingkongyeyue/article/details/52123478),並在物理層上進行了一些改動,加入了高速數字傳輸的特性和連線的穩定性。

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

構建網路的主要目的是為了在工作站間傳送資料。所謂工作站,是指配備無線網路介面的計算裝置(也就是配有無線網絡卡的計算裝置)

802.11網路所使用的幀必須經過轉換,方能被傳遞至其他不同型別的網路。具備無線至有線的橋接功能的裝置稱為接入點,接入點的功能不僅於此,但橋接最為重要。


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


當幾個接入點串聯以覆蓋較大區域時,彼此之間必須相互通訊以掌握移動式工作站的行蹤。分散式系統屬於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的啟動,連線,關閉函式

四是驅動的載入和解除安裝函式

定義了兩類套接字和一個管道,並分別實現了和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)就是他們之間的橋樑


wpa_supplicant本是開源專案原始碼,被谷歌修改後加入Android移動平臺,它主要是用來支援WEP,WPA/WPA2和WAPI無線協議和加密認證的,而實際上的工作內容是通過socket(不管是wpa_supplicant與上層還是wpa_supplicant與驅動都採用socket通訊)與驅動互動上報資料給使用者,而使用者可以通過socket傳送命令給wpa_supplicant調動驅動來對WiFi晶片操作。 簡單的說,wpa_supplicant就是WiFi驅動和使用者的中轉站外加對協議和加密認證的支援。

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(檔案描述符)類似。

使用下面命令啟動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      示例

             >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。dhcp : 使得WIFI網絡卡動態獲取IP

             >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上。

             >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應該道理一樣。