當前位置:首頁 » 網路連接 » STA連接後網路不馬上通
擴展閱讀
遠郊無線網路 2025-01-03 08:31:45
孝感無線網路覆蓋供應 2025-01-03 08:21:14
無線網路跑步 2025-01-03 08:10:41

STA連接後網路不馬上通

發布時間: 2024-12-31 11:17:50

Ⅰ 深入理解Wi-Fi P2P

介紹Wi-Fi聯盟推出的另外一項重要技術規范wifi P2P。 該規范的商品名為Wi-Fi Direct, 它支持多個Wi-Fi設備在沒有AP的情況下相互連接.
在Android平台的Wi-Fi相關模塊中, P2P的功能點主要集中在:
· Android Framework中的WifiP2pService, 其功能和WifiService類似, 用於處理
和P2P相關的工作。
· wpa_supplicant中的P2P模塊。

Wi-Fi P2P技術是Wi-Fi Display 的基礎。
http://blog.csdn.net/innost/article/details/8474683

P2P架構中定義了三個組件, 筆者將其稱為「 一個設備, 兩種角色」 , 分別如下
P2P Device : 它是P2P架構中角色的實體, 可把它當做一個Wi-Fi設備
P2P Group Owner : Group Owner( GO) 是一種角色, 其作用類似於Infrastructure BSS中的AP
P2P Client : 另外一種角色, 其作用類似於Infrastructure BSS中的STA

組建P2P Group( 即P2P Network) 之前, 智能終端都是一個一個的
P2P Device。 當這些P2P Device設備之間完成P2P協商後, 其中將有一個並且只能有一個Device來扮演GO的角色( 即充當AP) , 而其他Device來扮演Client的角色

P2P Discovery的作用很簡單, 就是使多個P2P Device能夠互相發現並構建一個
Group。 根據規范, 它包括四個主要技術子項
·** Device Discovery : 用於P2P設備搜索周圍其他支持P2P的設備。
· Service Discovery
: 該Device Discovery基礎上, P2P還支持搜索指定的服務。 這
部分功能屬於可選項。
· Group Formation : 用於決定兩個P2P Device誰來扮演GO, 誰來扮演Client。
· P2P Invitation**: 用於激活一個Persistent Group( 見下文解釋) , 或者用於邀請一個Client加入一個當前已存在的Group

P2P Device Discovery雖然也是利用802.11中的Probe Request和Probe Response
幀來搜索周圍的P2P設備
為了加快搜索速度, P2P為Device Discovery定義了兩個狀態和兩個階段。
( 1) Device Discovery工作流程
先來看兩個狀態, 分別如下。
· Search State: 在該狀態中, P2P Device將在2.4GHz的1, 6, 11頻段上分別發送Probe Request幀。 這幾個頻段稱為Social Channels。 為了區別非P2P的Probe Request幀, P2P Device Discovery要求必須在Probe Request幀中包含P2P IE。
· Listen State: 在該狀態中, P2P Device將隨機選擇在1, 6, 11頻段中的一個頻段( 被選中的頻段稱為Listen Channel) 監聽Probe Request幀並回復Probe Response幀。 值得指出的是, Listen Channel一旦選擇好後, 在整個P2P Discovery階段就不能更改。 另外, 在這個階段中, P2P Device只處理包含P2P IE信息的Probe Request幀

再來看兩個階段, 分別如下。
·** Scan Phase**: 掃描階段。 這一階段和前面章節介紹的無線網路掃描一樣, P2P
Device會在各個頻段上發送Probe Request幀( 主動掃描) 。 P2P Device在這一階段中不會處理來自其他設備的Probe Request幀。 這一階段過後, P2P Device將進入下一個階段, 即Find Phase。
· Find Phase : 雖然從中文翻譯來看, Scan和Find意思比較接近, 但P2P的Find
Phase卻和Scan Phase大不相同。 在這一階段中, P2P Device將在Search State和ListenState之間來回切換。 Search State中, P2P Device將發送Probe Request幀, 而ListenState中, 它將接收其他設備的Probe Request幀並回復Probe Response幀

兩個P2P Device的Discovery流程:
· Discovery啟動後, Device首先進入Scan Phase。 在這一階段, P2P設備在其支持的所有頻段上都會發送Probe Request幀。
· Scan Phase完成後, Device進入Find Phase。 在這一階段中, Device將在Listen和Search State中切換。

當Device處於Find Phase中的Search State時, 它將在1、 6、 11頻段上發送Probe
Request幀。 注意, 只有當兩個設備處於同一頻段時, 一方發送的幀才能被對方接收到

P2P規范中對Probe Request幀的要求
· SSID IE必須設置為P2P Wildcard SSID, 即"DIRECT-"。
· 必須包含P2P IE。
· 802.11 MAC幀頭的地址域① 中, Destination Address域( Address1) 必須為廣播
地址( FF: FF: FF: FF: FF: FF) 或者為目標設備的P2P Device Address , BSSID域( Address3) 必須為廣播地址

(P2P規范定義了兩種類型的地址, 一種是P2P Device Address, 另外一種
是P2P Interface Address。 一個P2P Device在加入P2P Group前, 將使用Device Address開展Device Discovery等工作。 對一個P2P Device而言, 其P2P Device Address是唯一的( 作用等同於MAC地址) 。 而當P2P Device加入P2P Group後, 它和Group中其他成員交互時將使用P2P Interface Address。 另外, 由於一個P2P Device可同時加入多個P2P Group, 所以在每個P2P Group中, 該設備必須使用不同的P2P Interface Address。 最後, 當一個Group結束後, Device在該Group中使用的P2PInterface Address也就相應作廢了)
Probe Response幀
P2P Probe Response幀包含WSC IE和P2P IE

當P2P Device A通過Device Discovery找到周圍的一個P2P Device B後, Device A
就可以開展Group Formation流程以准備構造一個P2P Group。 Group Formation也包含
兩個階段, 分別如下。
· GO Negotiation : 在這一階段中, 兩個Device要協商好由誰來做GO。
· Provisioning : GO和Client角色確定後, 兩個Device要藉助WSC來交換安全配置
信息。 此後, Client就可以利用安全配置信息關聯上GO。

GO Negotiation過程中P2P設備會利用一種名為P2P Public Action類型的幀交換信

( 1) P2P Public Action幀
GO Negotiation流程, 包含三次P2P Public Action幀交換
GO Negotiation( 以後簡稱GON) 流程包括GON Request、 GON
Response和GON Confirmation三次幀交換。 這三次幀交換並不涉及什麼復雜的計算, 只
是雙方交換一些信息, 從而誰來扮演GO

P2P Public Action幀中還存在著"Provision Discovery Request/Response"類型的幀,P2P規范定義了Provision Discovery( PD) 流程, 該流程就是為了確定交互雙方使用的WSC方法

WifiP2pSettings是Settings應用中負責處理P2P相關UI/UE邏輯的主要類, 與之交互
的則是位於SystemServer進程中的WifiP2pService

WifiService處理和WLAN網路連接相關的工作, 而WifiP2pService則專門負責處理和Wi-Fi P2P相關的工作
#######P2pStateMachine是WifiP2pService的核心

1.CMD_ENABLE_P2P處理流程
1.1WifiStateMachine將創建一個名為mWifiP2pChannel的AsyncChannel對象用於向P2pStateMachine發送消息
1.2在Android平台中, 如果用戶打開Wi-Fi功能, P2pStateMachine就會收到第一個消息CMD_ENABLE_P2P。 該消息是WifiStateMachine進入DriverStartedState後, 在其EA中藉助mWifiP2pChannel向P2pStateMachine發送的.(P2pDisabledState: enter)
1.3處理完CMD_ENABLE_P2P消息後, P2pStateMachine將創建一個WifiMonitor用於接收來自wpa_supplicant的消息, 同時狀態機將轉入P2pEnablingState.
1.4WifiMonitor連接wpa_supplicant之後, WifiMonitor會發送一個SUP_CONNECTION_EVENT給P2pStateMachine。 該消息將由P2pEnablingState處理
2.SUP_CONNECTION_EVENT處理流程
WifiP2pService.java: : P2pEnablingState: processMessage
2.1.當狀態機轉入InactiveState後, 首先執行的是其父狀態P2pEnabledState的EA, 然後才是InactiveState自己的EA.
WifiP2pService.java: : P2pEnabledState: enter
2.2.P2pStateMachine就算初始化完畢, 接下來的工作就是處理用戶發起的操作
3.DISCOVER_PEERS處理流程
用戶在界面中進行操作以搜索周圍的設備,WifiP2pSettings中WifiP2pManager的discoverPeers函數, 它將發送DISCOVER_PEERS消息給P2pStateMachine
3.1.P2pStateMachine當前處於InactiveState, 不過DISCOVER_PEERS消息卻是由其父狀態P2pEnabledState來處理的
3.2.當WPAS搜索到周圍的P2P Device後, 將發送以下格式的消息給WifiMonitor。

3.3.WifiMonitor將根據這些信息構建一個WifiP2pDevice對象, 然後發送
P2P_DEVICE_FOUND_EVENT給P2pStateMachine
4.P2P_DEVICE_FOUND_EVENT處理流程
P2P_DEVICE_FOUND_EVENT也由InactiveState的父狀態P2pEnabledState來處理
5.CONNECT處理流程
5.1.當用戶在WifiP2pSettings界面中選擇連接某個P2P Device後,WifiP2pManager的connect函數將發送CONNECT消息給P2pStateMachine, 該消息由InactiveState狀態自己來處理
WifiP2pSettings.java: : InactiveState: processMessage
WifiP2pService.java: : connect
5.2.connect將返回NEEDS_PROVISON_REQ, 所以P2pStateMachine將
轉入ProvisionDiscoveryState
WifiP2pService.java: : ProvisionDiscoveryState: enter
5.3.由於WSC配置方法為PBC, 所以對端設備的P2pStateMachine將收到一個
P2P_PROV_DISC_PBC_REQ_EVENT消息。 當對端設備處理完畢後, 將收到一個P2P_PROV_DISC_PBC_RSP_EVENT消息
6.P2P_PROV_DISC_PBC_RSP_EVENT處理流程
6.1.P2pStateMachine當前處於ProvisionDiscoveryState
WifiP2pService.java: : ProvisionDiscoveryState: processMessage
6.2.P2pStateMachine通過p2pConnectWithPinDisplay向對端發起Group
Negotiation Request請求。 接下來的工作就由WPAS來處理。 當Group Formation結束後, P2pStateMachine將收到一個P2P_GROUP_STARTED_EVENT消息以通知Group建立完畢
7.P2P_GROUP_STARTED_EVENT處理流程
7.1.P2P_GROUP_STARTED_EVENT消息由GroupNegotiationState處理
WifiP2pService.java: : GroupNegotiationState: processMessage
7.2.P2pStateMachine將轉入GroupCreatedState
WifiP2pService.java: : GroupCreatedState: enter
8.AP_STA_CONNECTED_EVENT處理流程
8.1.當對端P2P設備成功關聯到本機後, WifiMonitor又將發送一個名為
AP_STA_CONNECTED_EVENT的消息
WifiP2pService.java: : GroupCreatedState: processMessage
8.2.至此, 一個P2P Device( 扮演Client) 就成功關聯上本機的P2P Device( 扮演GO)

wpa_supplicant進程由WifiStateMachine啟動.
手機廠商會為WifiService和WifiP2pService各創建一個wpa_supplicant進程, 使得它們能各司其職而互不幹擾。 WifiService將和wpa_supplicant進程交互, 而WifiP2pService將和一個名為p2p_supplicant
p2p_supplicant使用的配置文件名為/data/misc/wifi/p2p_supplicant.conf
p2p_supplicant對應的ctrl_iface路徑為/data/misc/wifi/sockets。 所以, 如果要使用wpa_cli和p2p_supplicant交互, 必須指定正確的ctrl_iface路徑

p2p_supplicant.c: : wpas_p2p_init
· 初始化一個p2p_config對象, 然後根據p2p_supplicant.conf文件的信息來設置其中的內容, 同時還需要為P2P模塊設置一些回調函數。
· 調用p2p_init函數以初始化P2P模塊
1.Driver Flags和重要數據結構
drv_flags變數, WPAS中, Wi-Fi驅動對P2P功能的支持情況就是由它來表達的
· p2p_config定義了20個回調函數。 這些回調函數定義了P2P模塊和外界交互的介面。 在wpas_p2p_init中, 這些回調函數均指向p2p_supplicant.c中對應的函數, 例如p2p_scan指向wpas_p2p_scan, dev_lost指向wpas_dev_lost
· p2p_data指向一個p2p_config對象。
· p2p_device代表一個P2P設備。 其中設備名、 Device CapabilityBitmap等信息保存在一個類型為p2p_peer_info的對象中。
· p2p_group代表一個P2P Group的信息, 其內部包含一個p2p_group_config對象和一個p2p_group_member鏈表。 p2p_group_config表示該Group的配置信
息, p2p_group_member代表Group Member即P2P Client的信息
2.p2p_init函數
p2p.c: : p2p_init
3.注冊Action幀監聽事件
driver_nl80211.c: : wpa_driver_nl80211_set_mode
3.1nl80211_mgmt_subscribte_non_ap將注冊對Action幀的監聽事件, 其作用就是當設備收到Action幀後, Wi-Fi驅動將發送對應的netlink消息給WPAS
driver_nl80211.c: : nl80211_mgmt_subscribte_non_ap
3.2.注冊了兩種類型的幀監
聽事件。
· P2P Public Action幀監聽事件: 根據P2P規范, 目前使用的均是802.11 PublicAction幀, 即Category的值為0x04。 目前GON、 P2P Invitation、 Provision Discovery以及Device Discoverability使用P2P Public Action幀。
· P2P Action幀監聽事件: 這種類型的幀屬於802.11 Action幀的一種, 其Category取值為0x7F, OUI指定為WFA的OUI( 即50-6F-9A) , 而OUI-Type指定為P2P( 取值為0x09) 。 目前Notice of Absence、 P2P Presence、 GO Discoverability使用P2PAction幀。
上述注冊的Action幀監聽事件對應的處理函數是process_bss_event
3.3.至此, P2P模塊以及Action幀監聽事件注冊等工作都已完成, WPAS馬上可為WifiP2pService提供P2P相關的服務了

P2pStateMachine將發送"P2P_FIND 120"命令給WPAS以觸發P2P Device Discovery流程
ctrl_iface.c: : wpa_supplicant_ctrl_iface_process
ctrl_iface.c: : p2p_ctrl_find
P2P_FIND支持三種不同的Discovery Type
· P2P_FIND_START_WITH_FULL: 默認設置。 表示先掃描所有頻段, 然後再掃描social channels。 這種搜索方式如圖7-3所示。
· P2P_FIND_ONLY_SOCIAL: 只掃描social channels。 它將跳過「 掃描所有頻段」 這一過程。 這種搜索方式能加快搜索的速度。
· P2P_FIND_PROGRESSIVE: 它和P2P_FIND_START_WITH_FULL類似, 只不過在Search State階段將逐個掃描所有頻段
1.P2P設備掃描流程
P2P設備掃描流程從wpas_p2p_find開始
p2p_supplicant.c: : wpas_p2p_find
p2p.c: : p2p_find
p2p_supplicant.c: : wpas_p2p_scan

2.P2P設備掃描結果處理流程
當scan_res_handler不為空的時候, 掃描結果將交給scan_res_handler來處理
對P2P設備掃描時將設置scan_res_handler為wpas_p2p_scan_res_handler
p2p_supplicant.c: : wpas_p2p_scan_res_handler

P2pStateMachine的ProvisionDiscoveryState在其EA中將發送形如"P2P_PROV_DISC 8a: 32: 9b: 6c: d1: 80 pbc"的命令給WPAS 去執行, 其核心處理函數是p2p_ctrl_prov_disc
1.PD Request幀發送流程
p2p.c: : p2p_prov_disc_req
p2p_pd.c: : p2p_send_prov_disc_req

2.Action幀接收流程
PD Response幀屬於Public Action幀的一種, 當收到對端設備發來的PD Response幀後, process_bss_event函數將被調用

3.PD Response幀處理流程
p2p_pd.c: : p2p_process_prov_disc_resp
p2p_supplicant.c: : wpas_prov_disc_resp
wpa_msg將發送P2P_EVENT_PROV_DISC_PBC_RESP( 字元串, 值為"P2P-PROV-DISC-PBCRESP") 消息給客戶端

P2pStateMachine收到P2P_PROV_DISC_PBC_RSP_EVENT消息後, 將在
ProvisionDiscoveryState中調用p2pConnectWithPinDisplay, 該函數內部將發送P2P_CONNECT命令給WPAS
1.P2P_CONNECT處理流程
ctrl_iface.c: : p2p_ctrl_connect
p2p_supplicant.c: : wpas_p2p_connect
2.GON Request發送流程
p2p.c: : p2p_connect
p2p_go_neg.c: : p2p_connect_send

3.GON Response幀處理流程
p2p_go_neg.c: : p2p_process_go_neg_resp
當GON Confirmation幀發送出去後, wifi driver將向WPAS發送一個NL80211_CMD_FRAME_TX_STATUS消息, 而該消息將導致driver wrapper發送EVENT_TX_STATUS消息給WPAS
4.EVENT_TX_STATUS處理流程
在events.c中, 和P2P以及EVENT_TX_STATUS相關的處理函數是offchannel_send_action_tx_status
offchannel.c: : offchannel_send_action_tx_status

當Group Negotiation完成後, WPAS將新創建一個wpa_supplicant對象, 它將用於管理和操作專門用於P2P Group的virtual interface
· 一個interface對應一個wpa_supplicant對象。
· 此處新創建的wpa_supplicant對象用於GO, 即扮演AP的角色, 專門處理和P2PGroup相關的事情, 其MAC地址為P2P Interface Address。
· 之前使用的wpa_supplicant用於非P2P Group操作, 其MAC地址為P2P DeviceAddress