概述
介紹Wi-Fi聯(lián)盟推出的另外一項(xiàng)重要技術(shù)規(guī)范WiFi P2P辟灰。 該規(guī)范的商品名為Wi-Fi Direct喂柒, 它支持多個(gè)Wi-Fi設(shè)備在沒(méi)有AP的情況下相互連接.
在Android平臺(tái)的Wi-Fi相關(guān)模塊中晋辆, P2P的功能點(diǎn)主要集中在:
· Android Framework中的WifiP2pService负饲, 其功能和WifiService類似叁熔, 用于處理
和P2P相關(guān)的工作。
· wpa_supplicant中的P2P模塊软族。
P2P基礎(chǔ)知識(shí)
Wi-Fi P2P技術(shù)是Wi-Fi Display 的基礎(chǔ)。
http://blog.csdn.net/innost/article/details/8474683
P2P架構(gòu)
P2P架構(gòu)中定義了三個(gè)組件残制, 筆者將其稱為“ 一個(gè)設(shè)備立砸, 兩種角色” , 分別如下
P2P Device: 它是P2P架構(gòu)中角色的實(shí)體初茶, 可把它當(dāng)做一個(gè)Wi-Fi設(shè)備
P2P Group Owner: Group Owner( GO) 是一種角色颗祝, 其作用類似于Infrastructure BSS中的AP
P2P Client: 另外一種角色, 其作用類似于Infrastructure BSS中的STA
組建P2P Group( 即P2P Network) 之前恼布, 智能終端都是一個(gè)一個(gè)的
P2P Device螺戳。 當(dāng)這些P2P Device設(shè)備之間完成P2P協(xié)商后, 其中將有一個(gè)并且只能有一個(gè)Device來(lái)扮演GO的角色( 即充當(dāng)AP) 折汞, 而其他Device來(lái)扮演Client的角色
P2P Discovery技術(shù)
P2P Discovery的作用很簡(jiǎn)單倔幼, 就是使多個(gè)P2P Device能夠互相發(fā)現(xiàn)并構(gòu)建一個(gè)
Group。 根據(jù)規(guī)范爽待, 它包括四個(gè)主要技術(shù)子項(xiàng)
·** Device Discovery: 用于P2P設(shè)備搜索周圍其他支持P2P的設(shè)備损同。
· Service Discovery: 該Device Discovery基礎(chǔ)上, P2P還支持搜索指定的服務(wù)鸟款。 這
部分功能屬于可選項(xiàng)膏燃。
· Group Formation: 用于決定兩個(gè)P2P Device誰(shuí)來(lái)扮演GO, 誰(shuí)來(lái)扮演Client何什。
· P2P Invitation**: 用于激活一個(gè)Persistent Group( 見(jiàn)下文解釋) 组哩, 或者用于邀請(qǐng)一個(gè)Client加入一個(gè)當(dāng)前已存在的Group
1.Device Discovery介紹
P2P Device Discovery雖然也是利用802.11中的Probe Request和Probe Response
幀來(lái)搜索周圍的P2P設(shè)備
為了加快搜索速度, P2P為Device Discovery定義了兩個(gè)狀態(tài)和兩個(gè)階段处渣。
( 1) Device Discovery工作流程
先來(lái)看兩個(gè)狀態(tài)禁炒, 分別如下。
· Search State: 在該狀態(tài)中霍比, P2P Device將在2.4GHz的1, 6暴备, 11頻段上分別發(fā)送Probe Request幀悠瞬。 這幾個(gè)頻段稱為Social Channels。 為了區(qū)別非P2P的Probe Request幀涯捻, P2P Device Discovery要求必須在Probe Request幀中包含P2P IE浅妆。
· Listen State: 在該狀態(tài)中, P2P Device將隨機(jī)選擇在1障癌, 6凌外, 11頻段中的一個(gè)頻段( 被選中的頻段稱為L(zhǎng)isten Channel) 監(jiān)聽(tīng)Probe Request幀并回復(fù)Probe Response幀。 值得指出的是涛浙, Listen Channel一旦選擇好后康辑, 在整個(gè)P2P Discovery階段就不能更改摄欲。 另外, 在這個(gè)階段中疮薇, P2P Device只處理包含P2P IE信息的Probe Request幀
再來(lái)看兩個(gè)階段胸墙, 分別如下。
·** Scan Phase**: 掃描階段按咒。 這一階段和前面章節(jié)介紹的無(wú)線網(wǎng)絡(luò)掃描一樣迟隅, P2P
Device會(huì)在各個(gè)頻段上發(fā)送Probe Request幀( 主動(dòng)掃描) 。 P2P Device在這一階段中不會(huì)處理來(lái)自其他設(shè)備的Probe Request幀励七。 這一階段過(guò)后智袭, P2P Device將進(jìn)入下一個(gè)階段, 即Find Phase掠抬。
· Find Phase: 雖然從中文翻譯來(lái)看吼野, Scan和Find意思比較接近, 但P2P的Find
Phase卻和Scan Phase大不相同剿另。 在這一階段中箫锤, P2P Device將在Search State和ListenState之間來(lái)回切換。 Search State中雨女, P2P Device將發(fā)送Probe Request幀谚攒, 而ListenState中, 它將接收其他設(shè)備的Probe Request幀并回復(fù)Probe Response幀
兩個(gè)P2P Device的Discovery流程:
· Discovery啟動(dòng)后氛堕, Device首先進(jìn)入Scan Phase馏臭。 在這一階段, P2P設(shè)備在其支持的所有頻段上都會(huì)發(fā)送Probe Request幀讼稚。
· Scan Phase完成后括儒, Device進(jìn)入Find Phase。 在這一階段中锐想, Device將在Listen和Search State中切換帮寻。
當(dāng)Device處于Find Phase中的Search State時(shí), 它將在1赠摇、 6固逗、 11頻段上發(fā)送Probe
Request幀。 注意藕帜, 只有當(dāng)兩個(gè)設(shè)備處于同一頻段時(shí)烫罩, 一方發(fā)送的幀才能被對(duì)方接收到
P2P規(guī)范中對(duì)Probe Request幀的要求
· SSID IE必須設(shè)置為P2P Wildcard SSID, 即"DIRECT-"洽故。
· 必須包含P2P IE贝攒。
· 802.11 MAC幀頭的地址域① 中, Destination Address域( Address1) 必須為廣播
地址( FF: FF: FF: FF: FF: FF) 或者為目標(biāo)設(shè)備的P2P Device Address 时甚, BSSID域( Address3) 必須為廣播地址
(P2P規(guī)范定義了兩種類型的地址隘弊, 一種是P2P Device Address哈踱, 另外一種
是P2P Interface Address。 一個(gè)P2P Device在加入P2P Group前长捧, 將使用Device Address開(kāi)展Device Discovery等工作嚣鄙。 對(duì)一個(gè)P2P Device而言, 其P2P Device Address是唯一的( 作用等同于MAC地址) 串结。 而當(dāng)P2P Device加入P2P Group后哑子, 它和Group中其他成員交互時(shí)將使用P2P Interface Address。 另外肌割, 由于一個(gè)P2P Device可同時(shí)加入多個(gè)P2P Group卧蜓, 所以在每個(gè)P2P Group中, 該設(shè)備必須使用不同的P2P Interface Address把敞。 最后弥奸, 當(dāng)一個(gè)Group結(jié)束后, Device在該Group中使用的P2PInterface Address也就相應(yīng)作廢了)
Probe Response幀
P2P Probe Response幀包含WSC IE和P2P IE
2.Group Formation介紹
當(dāng)P2P Device A通過(guò)Device Discovery找到周圍的一個(gè)P2P Device B后奋早, Device A
就可以開(kāi)展Group Formation流程以準(zhǔn)備構(gòu)造一個(gè)P2P Group盛霎。 Group Formation也包含
兩個(gè)階段, 分別如下耽装。
· GO Negotiation: 在這一階段中愤炸, 兩個(gè)Device要協(xié)商好由誰(shuí)來(lái)做GO。
· Provisioning: GO和Client角色確定后掉奄, 兩個(gè)Device要借助WSC來(lái)交換安全配置
信息规个。 此后, Client就可以利用安全配置信息關(guān)聯(lián)上GO姓建。
GO Negotiation過(guò)程中P2P設(shè)備會(huì)利用一種名為P2P Public Action類型的幀交換信
息
( 1) P2P Public Action幀
GO Negotiation流程诞仓, 包含三次P2P Public Action幀交換
GO Negotiation( 以后簡(jiǎn)稱GON) 流程包括GON Request、 GON
Response和GON Confirmation三次幀交換速兔。 這三次幀交換并不涉及什么復(fù)雜的計(jì)算墅拭, 只
是雙方交換一些信息, 從而誰(shuí)來(lái)扮演GO
P2P Public Action幀中還存在著"Provision Discovery Request/Response"類型的幀,P2P規(guī)范定義了Provision Discovery( PD) 流程涣狗, 該流程就是為了確定交互雙方使用的WSC方法
WifiP2pService介紹
WifiP2pSettings是Settings應(yīng)用中負(fù)責(zé)處理P2P相關(guān)UI/UE邏輯的主要類谍婉, 與之交互
的則是位于SystemServer進(jìn)程中的WifiP2pService
WifiP2pService工作流程
WifiService處理和WLAN網(wǎng)絡(luò)連接相關(guān)的工作, 而WifiP2pService則專門(mén)負(fù)責(zé)處理和Wi-Fi P2P相關(guān)的工作
#######P2pStateMachine是WifiP2pService的核心
1.CMD_ENABLE_P2P處理流程
1.1WifiStateMachine將創(chuàng)建一個(gè)名為mWifiP2pChannel的AsyncChannel對(duì)象用于向P2pStateMachine發(fā)送消息
1.2在Android平臺(tái)中屑柔, 如果用戶打開(kāi)Wi-Fi功能, P2pStateMachine就會(huì)收到第一個(gè)消息CMD_ENABLE_P2P珍剑。 該消息是WifiStateMachine進(jìn)入DriverStartedState后掸宛, 在其EA中借助mWifiP2pChannel向P2pStateMachine發(fā)送的.(P2pDisabledState: enter)
1.3處理完CMD_ENABLE_P2P消息后, P2pStateMachine將創(chuàng)建一個(gè)WifiMonitor用于接收來(lái)自wpa_supplicant的消息招拙, 同時(shí)狀態(tài)機(jī)將轉(zhuǎn)入P2pEnablingState.
1.4WifiMonitor連接wpa_supplicant之后唧瘾, WifiMonitor會(huì)發(fā)送一個(gè)SUP_CONNECTION_EVENT給P2pStateMachine措译。 該消息將由P2pEnablingState處理
2.SUP_CONNECTION_EVENT處理流程
WifiP2pService.java: : P2pEnablingState: processMessage
2.1.當(dāng)狀態(tài)機(jī)轉(zhuǎn)入InactiveState后, 首先執(zhí)行的是其父狀態(tài)P2pEnabledState的EA饰序, 然后才是InactiveState自己的EA.
WifiP2pService.java: : P2pEnabledState: enter
2.2.P2pStateMachine就算初始化完畢领虹, 接下來(lái)的工作就是處理用戶發(fā)起的操作
3.DISCOVER_PEERS處理流程
用戶在界面中進(jìn)行操作以搜索周圍的設(shè)備,WifiP2pSettings中WifiP2pManager的discoverPeers函數(shù), 它將發(fā)送DISCOVER_PEERS消息給P2pStateMachine
3.1.P2pStateMachine當(dāng)前處于InactiveState求豫, 不過(guò)DISCOVER_PEERS消息卻是由其父狀態(tài)P2pEnabledState來(lái)處理的
3.2.當(dāng)WPAS搜索到周圍的P2P Device后塌衰, 將發(fā)送以下格式的消息給WifiMonitor。
3.3.WifiMonitor將根據(jù)這些信息構(gòu)建一個(gè)WifiP2pDevice對(duì)象蝠嘉, 然后發(fā)送
P2P_DEVICE_FOUND_EVENT給P2pStateMachine
4.P2P_DEVICE_FOUND_EVENT處理流程
P2P_DEVICE_FOUND_EVENT也由InactiveState的父狀態(tài)P2pEnabledState來(lái)處理
5.CONNECT處理流程
5.1.當(dāng)用戶在WifiP2pSettings界面中選擇連接某個(gè)P2P Device后,WifiP2pManager的connect函數(shù)將發(fā)送CONNECT消息給P2pStateMachine最疆, 該消息由InactiveState狀態(tài)自己來(lái)處理
WifiP2pSettings.java: : InactiveState: processMessage
WifiP2pService.java: : connect
5.2.connect將返回NEEDS_PROVISON_REQ, 所以P2pStateMachine將
轉(zhuǎn)入ProvisionDiscoveryState
WifiP2pService.java: : ProvisionDiscoveryState: enter
5.3.由于WSC配置方法為PBC蚤告, 所以對(duì)端設(shè)備的P2pStateMachine將收到一個(gè)
P2P_PROV_DISC_PBC_REQ_EVENT消息努酸。 當(dāng)對(duì)端設(shè)備處理完畢后, 將收到一個(gè)P2P_PROV_DISC_PBC_RSP_EVENT消息
6.P2P_PROV_DISC_PBC_RSP_EVENT處理流程
6.1.P2pStateMachine當(dāng)前處于ProvisionDiscoveryState
WifiP2pService.java: : ProvisionDiscoveryState: processMessage
6.2.P2pStateMachine通過(guò)p2pConnectWithPinDisplay向?qū)Χ税l(fā)起Group
Negotiation Request請(qǐng)求杜恰。 接下來(lái)的工作就由WPAS來(lái)處理获诈。 當(dāng)Group Formation結(jié)束后, P2pStateMachine將收到一個(gè)P2P_GROUP_STARTED_EVENT消息以通知Group建立完畢
7.P2P_GROUP_STARTED_EVENT處理流程
7.1.P2P_GROUP_STARTED_EVENT消息由GroupNegotiationState處理
WifiP2pService.java: : GroupNegotiationState: processMessage
7.2.P2pStateMachine將轉(zhuǎn)入GroupCreatedState
WifiP2pService.java: : GroupCreatedState: enter
8.AP_STA_CONNECTED_EVENT處理流程
8.1.當(dāng)對(duì)端P2P設(shè)備成功關(guān)聯(lián)到本機(jī)后心褐, WifiMonitor又將發(fā)送一個(gè)名為
AP_STA_CONNECTED_EVENT的消息
WifiP2pService.java: : GroupCreatedState: processMessage
8.2.至此舔涎, 一個(gè)P2P Device( 扮演Client) 就成功關(guān)聯(lián)上本機(jī)的P2P Device( 扮演GO)
wpa_supplicant中的P2P
wpa_supplicant進(jìn)程由WifiStateMachine啟動(dòng).
手機(jī)廠商會(huì)為WifiService和WifiP2pService各創(chuàng)建一個(gè)wpa_supplicant進(jìn)程, 使得它們能各司其職而互不干擾檬寂。 WifiService將和wpa_supplicant進(jìn)程交互终抽, 而WifiP2pService將和一個(gè)名為p2p_supplicant
p2p_supplicant使用的配置文件名為/data/misc/wifi/p2p_supplicant.conf
p2p_supplicant對(duì)應(yīng)的ctrl_iface路徑為/data/misc/wifi/sockets。 所以桶至, 如果要使用wpa_cli和p2p_supplicant交互昼伴, 必須指定正確的ctrl_iface路徑
P2P模塊初始化
p2p_supplicant.c: : wpas_p2p_init
· 初始化一個(gè)p2p_config對(duì)象, 然后根據(jù)p2p_supplicant.conf文件的信息來(lái)設(shè)置其中的內(nèi)容镣屹, 同時(shí)還需要為P2P模塊設(shè)置一些回調(diào)函數(shù)圃郊。
· 調(diào)用p2p_init函數(shù)以初始化P2P模塊
1.Driver Flags和重要數(shù)據(jù)結(jié)構(gòu)
drv_flags變量, WPAS中, Wi-Fi驅(qū)動(dòng)對(duì)P2P功能的支持情況就是由它來(lái)表達(dá)的
· p2p_config定義了20個(gè)回調(diào)函數(shù)女蜈。 這些回調(diào)函數(shù)定義了P2P模塊和外界交互的接口持舆。 在wpas_p2p_init中, 這些回調(diào)函數(shù)均指向p2p_supplicant.c中對(duì)應(yīng)的函數(shù)伪窖, 例如p2p_scan指向wpas_p2p_scan逸寓, dev_lost指向wpas_dev_lost
· p2p_data指向一個(gè)p2p_config對(duì)象。
· p2p_device代表一個(gè)P2P設(shè)備覆山。 其中設(shè)備名竹伸、 Device CapabilityBitmap等信息保存在一個(gè)類型為p2p_peer_info的對(duì)象中。
· p2p_group代表一個(gè)P2P Group的信息簇宽, 其內(nèi)部包含一個(gè)p2p_group_config對(duì)象和一個(gè)p2p_group_member鏈表勋篓。 p2p_group_config表示該Group的配置信
息吧享, p2p_group_member代表Group Member即P2P Client的信息
2.p2p_init函數(shù)
p2p.c: : p2p_init
3.注冊(cè)Action幀監(jiān)聽(tīng)事件
driver_nl80211.c: : wpa_driver_nl80211_set_mode
3.1nl80211_mgmt_subscribte_non_ap將注冊(cè)對(duì)Action幀的監(jiān)聽(tīng)事件, 其作用就是當(dāng)設(shè)備收到Action幀后譬嚣, Wi-Fi驅(qū)動(dòng)將發(fā)送對(duì)應(yīng)的netlink消息給WPAS
driver_nl80211.c: : nl80211_mgmt_subscribte_non_ap
3.2.注冊(cè)了兩種類型的幀監(jiān)
聽(tīng)事件钢颂。
· P2P Public Action幀監(jiān)聽(tīng)事件: 根據(jù)P2P規(guī)范, 目前使用的均是802.11 PublicAction幀拜银, 即Category的值為0x04殊鞭。 目前GON、 P2P Invitation盐股、 Provision Discovery以及Device Discoverability使用P2P Public Action幀钱豁。
· P2P Action幀監(jiān)聽(tīng)事件: 這種類型的幀屬于802.11 Action幀的一種, 其Category取值為0x7F疯汁, OUI指定為WFA的OUI( 即50-6F-9A) 牲尺, 而OUI-Type指定為P2P( 取值為0x09) 。 目前Notice of Absence幌蚊、 P2P Presence谤碳、 GO Discoverability使用P2PAction幀。
上述注冊(cè)的Action幀監(jiān)聽(tīng)事件對(duì)應(yīng)的處理函數(shù)是process_bss_event
3.3.至此溢豆, P2P模塊以及Action幀監(jiān)聽(tīng)事件注冊(cè)等工作都已完成蜒简, WPAS馬上可為WifiP2pService提供P2P相關(guān)的服務(wù)了
P2P Device Discovery流程分析
P2pStateMachine將發(fā)送"P2P_FIND 120"命令給WPAS以觸發(fā)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: 默認(rèn)設(shè)置。 表示先掃描所有頻段漩仙, 然后再掃描social channels搓茬。 這種搜索方式如圖7-3所示。
· P2P_FIND_ONLY_SOCIAL: 只掃描social channels队他。 它將跳過(guò)“ 掃描所有頻段” 這一過(guò)程卷仑。 這種搜索方式能加快搜索的速度。
· P2P_FIND_PROGRESSIVE: 它和P2P_FIND_START_WITH_FULL類似麸折, 只不過(guò)在Search State階段將逐個(gè)掃描所有頻段
1.P2P設(shè)備掃描流程
P2P設(shè)備掃描流程從wpas_p2p_find開(kāi)始
p2p_supplicant.c: : wpas_p2p_find
p2p.c: : p2p_find
p2p_supplicant.c: : wpas_p2p_scan
2.P2P設(shè)備掃描結(jié)果處理流程
當(dāng)scan_res_handler不為空的時(shí)候锡凝, 掃描結(jié)果將交給scan_res_handler來(lái)處理
對(duì)P2P設(shè)備掃描時(shí)將設(shè)置scan_res_handler為wpas_p2p_scan_res_handler
p2p_supplicant.c: : wpas_p2p_scan_res_handler
Provision Discovery流程分析
P2pStateMachine的ProvisionDiscoveryState在其EA中將發(fā)送形如"P2P_PROV_DISC 8a: 32: 9b: 6c: d1: 80 pbc"的命令給WPAS 去執(zhí)行, 其核心處理函數(shù)是p2p_ctrl_prov_disc
1.PD Request幀發(fā)送流程
p2p.c: : p2p_prov_disc_req
p2p_pd.c: : p2p_send_prov_disc_req
2.Action幀接收流程
PD Response幀屬于Public Action幀的一種垢啼, 當(dāng)收到對(duì)端設(shè)備發(fā)來(lái)的PD Response幀后窜锯, process_bss_event函數(shù)將被調(diào)用
3.PD Response幀處理流程
p2p_pd.c: : p2p_process_prov_disc_resp
p2p_supplicant.c: : wpas_prov_disc_resp
wpa_msg將發(fā)送P2P_EVENT_PROV_DISC_PBC_RESP( 字符串, 值為"P2P-PROV-DISC-PBCRESP") 消息給客戶端
GO Negotiation流程分析
P2pStateMachine收到P2P_PROV_DISC_PBC_RSP_EVENT消息后芭析, 將在
ProvisionDiscoveryState中調(diào)用p2pConnectWithPinDisplay锚扎, 該函數(shù)內(nèi)部將發(fā)送P2P_CONNECT命令給WPAS
1.P2P_CONNECT處理流程
ctrl_iface.c: : p2p_ctrl_connect
p2p_supplicant.c: : wpas_p2p_connect
2.GON Request發(fā)送流程
p2p.c: : p2p_connect
p2p_go_neg.c: : p2p_connect_send
3.GON Response幀處理流程
p2p_go_neg.c: : p2p_process_go_neg_resp
當(dāng)GON Confirmation幀發(fā)送出去后, wifi driver將向WPAS發(fā)送一個(gè)NL80211_CMD_FRAME_TX_STATUS消息馁启, 而該消息將導(dǎo)致driver wrapper發(fā)送EVENT_TX_STATUS消息給WPAS
4.EVENT_TX_STATUS處理流程
在events.c中驾孔, 和P2P以及EVENT_TX_STATUS相關(guān)的處理函數(shù)是offchannel_send_action_tx_status
offchannel.c: : offchannel_send_action_tx_status
當(dāng)Group Negotiation完成后, WPAS將新創(chuàng)建一個(gè)wpa_supplicant對(duì)象, 它將用于管理和操作專門(mén)用于P2P Group的virtual interface
· 一個(gè)interface對(duì)應(yīng)一個(gè)wpa_supplicant對(duì)象助币。
· 此處新創(chuàng)建的wpa_supplicant對(duì)象用于GO, 即扮演AP的角色螟碎, 專門(mén)處理和P2PGroup相關(guān)的事情眉菱, 其MAC地址為P2P Interface Address。
· 之前使用的wpa_supplicant用于非P2P Group操作掉分, 其MAC地址為P2P DeviceAddress