wifi詳解(一)
1 WLAN技術
WLAN是英文WirelessLAN的縮寫,就是無線局域網的意思。無線以太網技術是一種基于無線傳輸的局域網技術,與有線網絡技術相比,具有靈活、建網迅速、個人化等特點。將這一技術應用于電信網的接入網領域,能夠方便、靈活地為用戶提供網絡接入,適合于用戶流動性較大、有數據業務需求的公共場所、高端的企業及家庭用戶、需要臨時建網的場合以及難以采用有線接入方式的環境等。
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)
構建網絡的主要目的是為了在工作站間傳送數據。所謂工作站,是指配備無線網絡接口的計算設備。
3.2 接入點(Access Point)
802.11網絡所使用的幀必須經過轉換,方能被傳遞至其他不同類型的網絡。具備無線至有線的橋接功能的設備稱為接入點,接入點的功能不僅于此,但橋接最為重要。
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應該道理一樣。
RFID管理系統集成商 RFID中間件 條碼系統中間層 物聯網軟件集成