本章主要內容:
- 介紹Wi-Fi P2P相關知識;
- 介紹Android中WifiP2pService、wpa_supplicant的相關代碼。
7.1 概述
承接第6章介紹的WSC,本章將繼續介紹Wi-Fi Alliance(Wi-Fi聯盟)推出的另外一項重要技術規範Wi-Fi P2P。該規範的商品名為Wi-Fi Direct,它支持多個Wi-Fi設備在沒有AP的情況下相互連接。
在Android平台的Wi-Fi相關模塊中,P2P的功能點主要集中在:
- Android Framework中的WifiP2pService,其功能和WifiService類似,用於處理和P2P相關的工作。
- wpa_supplicant中的P2P模塊。
- 首先將介紹P2P所涉及的基礎知識。
- 然後再分析和P2P相關的模塊,包括Settings、WifiP2pService以及WPAS。
7.2 P2P基礎知識介紹 WFA定義的P2P協議文檔全名為「Wi-Fi Peer-to-Peer(P2P)Technical Specification」,目前的版本為1.1,全長160頁。P2P技術使得多個Wi-Fi設備在沒有AP的情況下也能構成一個網絡(P2P Network,也被稱之為P2P Group)並相互通信。
Wi-Fi P2P技術是Wi-Fi Display(也稱之為Miracast,詳情請參考作者的一篇博文)的基礎。在Miracast應用場景中,一台支持P2P的智慧型手機可直接連接上一台支持P2P的智能電視,智慧型手機隨後將自己的螢幕,或者媒體資源傳送給電視機去顯示或播放。顯然,藉助P2P技術,Wi-Fi設備之間的直接相連將極大拓展Wi-Fi技術的使用場景。
注意:根據筆者自己的判斷,隨著支持越來越多的設備支持P2P和Miracast,智能終端設備之間的多屏共享和互動功能將很快得以實現。另外,恰逢本章撰寫之際,Google發布了Android
4.3。在這次發布盛會上,Google推出了ChromeCast設備。目前,ChromeCast的技術實現細節還不清楚,據說有可能是Google自己定義的Google
cast協議(可參考developers.google.com/cast)。
下面先簡單介紹一下P2P的架構。7.2.1 P2P架構介紹[1]
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協商後,那麼其中將有一個並且只能有一個[1]Device來扮演GO的角色(即充當AP),而其他Device來扮演Client的角色。
圖7-1 P2P Group示意圖
圖7-1展示了一個典型P2P Group的構成,其中:
- 和一個Infrastructure BSS類似,一個P2P Group中只能有一個GO。一個GO可以支持1個或多個(即圖中的1:n)Clients連接。
- 由於GO的功能類似於AP,所以周圍那些不支持P2P功能的STA也能發現並關聯到GO。這些STA被稱之為Legacy Clients。
通過上述介紹讀者會進一步發現P2P Group和Infrastructure BSS的相似性:
- P2P Device在構建P2P Group時,它將首先通過WSC來獲取安全信息。
- 然後,Client將利用協商好的安全設置信息去關聯[2]GO(即P2P Group中的AP)。
圖7-2 P2P及其依賴的技術項
- 為了保證一定的傳輸速率,P2P要求P2P Device必須支持802.11g及以上的規範。其中,安全部分必須支持WPA2。由於P2P技術一個主要的應用場景就是設備之間共享媒體數據(例如前面提到的Miracast應用場景),所以P2P Device還必須支持WMM(Wi-Fi Multimedia的縮寫,它是一種源自802.11e的QoS服務,主要針對實時視音頻數據的傳輸)。
- P2P Client關聯到GO之前,需要先通過WSC來協商安全信息,所以WSC也是P2P的依賴技術項。
- 在上述技術基礎上,P2P規範定義了一些特有的技術項,圖7-2列出了其中三種必須實現的技術項,它們分別是P2P Discovery、P2P Group Operation以及P2P PowerManagerment。除了這三個必選技術項外,P2P規範還定義了一個可選技術項,名為Managed P2P Device Operation(該技術項定義了如何在企業級環境中由對應的IT部門來統一配置和管理P2P設備)。
提示:
1、P2P Group Operation講得是GO如何管理一個Group,也就是GO的工作職責。這部分內容請讀者自行學習參考資料[2]一節。
2、P2P PowerManagement和P2P設備的電源管理有關,用於節省不必要的電力損耗。由於篇幅關係,本章不擬討論它。請感興趣的讀者自行學習參考資料[3]。
7.2.2 P2P Discovery介紹[4]
P2P Discovery的目的很簡單,就是使得多個P2P Device能夠互相發現並構建一個Group。根據規範,它包括四個主要技術子項:- Device Discovery:用於P2P設備搜索周圍其他支持P2P的設備。
- Service Discovery:該Device Discovery基礎上,P2P還支持搜索指定的服務。這部分功能屬於可選項,筆者覺得它和第二章2.2.5.1「Apple Bonjour技術介紹」中提到的Bonjour類似。
- Group Formation:用於決定兩個P2P Device誰來扮演GO,誰來扮演Client。
- P2P Invitation:用於激活一個Persistent Group(見下文解釋),或者用於邀請一個Client加入一個當前已存在的Group。
Temporary Group:當你有份文件要傳給一個同事時,雙方打開手機的Wi-Fi P2P功能,建立一個Group,然後傳輸文件,最後關閉Wi-Fi P2P。在這個過程中,GO和Client的角色分配由Group Formation來決定,這一次的GO可能是你的設備,下一次則可能是其他人的設備。對於這種Group,在建立Group過程中所涉及的安全配置信息以及和Group相關的信息(以後我們會見到它)都是臨時的,即下一次再組建Group時,這些安全配置信息都將發生變化。
Persistent Group:在這種Group中,GO由指定設備來扮演,而且安全配置信息及Group相關信息一旦生成,後續就不會再發生變化(除非用戶重新設置)。Persistent Group中的GO多見於固定用途的設備,例如印表機等。如此,除了第一次通過P2P連接到印表機時相對麻煩一點(需要利用WSC協商安全配置信息)外,後續使用的話,由於P2P設備將保存這些安全信息,所以下一次再使用印表機時就能利用這些信息直接和印表機進行關聯了。
由於篇幅關係,本章將僅介紹上述四個知識點中最為基礎的Device Discovery和Group Formation,而Service Discovery和P2P Invitation的內容請讀者學習完本章後再仔細研讀P2P規範。
1. P2P Device Discovery介紹
P2P Device Discovery雖然也是利用802.11中的Probe Request和Probe Response幀來搜索周圍的P2P設備,但其步驟卻比Infrastructure BSS中的無線網絡搜索要複雜。舉一個簡單的例子,一個P2P Device除了自己要發送Probe Request幀外,還得接收來自其他設備的Probe Request幀並回復Probe Response幀。而在Infrastructure BSS中,只有AP會發送Probe Response幀。為了加快搜索速度,P2P為Device Discovery定義了兩個狀態和兩個階段。
(1) Device Discovery工作流程介紹 P2P 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和Listen State之間來回切換。Search State中,P2P Device將發送Probe Request幀,而Listen
State中,它將接收其他設備的Probe Request幀並回復Probe Response幀。
圖7-3所示為P2P Device Discovery的流程示意圖。圖7-3 P2P Device Discovery流程示意圖
圖7-3所示為兩個P2P Device的Discovery流程,其中:
Discovery啟動後,Device首先進入Scan Phase。在這一階段,P2P設備在其支持的所有頻段上都會發送Probe Request幀。
Scan Phase完成後,DeviceFind Phase。在這一階段中,Device將在Listen和Search State中切換。根據前面的介紹,每一個設備的Listen
Channel在Discovery開始前就已確定。例如,圖7-3中Device 1的Listen Channel是1,而Device 2的Listen
Channel是6。
在Find Phase中,P2P規範對Device處於Listen
State的時間也有所規定,其時間是100TU的整數倍,倍數值是一個隨機數,位於minDiscoverableInterval和maxDiscoverableInterval之間。這兩個值默認為1和3,而廠商可以修改。選擇隨機倍數的原因是為了防止兩個Device進入所謂的Lock-Step怪圈,即兩個Device同時進入Listen
State,等待相同的時間後又同時進入Search State。如此,雙方都無法處理對方的Probe Request信息(Search State中,Device只發送Probe
Request)。圖7-3中,Device 1第一次在Listen State中待了2個100TU,而第二次在Listen
State中待了1個100TU。
當Device處於Find Phase中的Search State時,它將在1,6,11頻段上發送Probe Request幀。注意,只有當兩個設備處於同一頻段時,一方發送的幀才能被對方接收到。
提示:P2P規範對兩個狀態及兩個階段的描述非常細緻,甚至於對每個狀態能幹什麼和不能幹什麼都有詳細說明。不過,從如何快速掌握P2P框架的角度來看,筆者覺得這些內容過於囉嗦。了解了Device Discovery的大體工作流程後,下面我們將通過實例來看看P2P使用到的Probe Request和Probe Response幀。
[2]注意,此處的關聯指得是RSNA,其工作流程包括包括4-WayHandshake。
略略略略略略略略==========7.4 wpa_supplicant中的P2P介紹 在第5章5.2.3中「WifiNative介紹」一節中曾介紹了wpa_supplicant的啟動,在那一節中,讀者會發現wpa_supplicant進程由WifiStateMachine啟動。在Android官方代碼中,雖然Java層有WifiService和WifiP2pService兩個幾乎完全不同的Wifi服務,但二者都只和Native層的唯一一個wpa_supplicant進程交互。簡單點說,Android原生代碼中,一個wpa_supplicant進程將同時支持WifiService和WifiP2pService。
上述這種設計方法使得wpa_supplicant負擔較重,所以,一些手機廠商會為WifiService和WifiP2pService各創建一個wpa_supplicant進程,使得它們能各司其職而互不干擾。以筆者的Galaxy Note2為例,它的,WifiService將和wpa_supplicant進程交互,而WifiP2pService將和一個名為p2p_supplicant(經過筆者測試,p2p_supplicant實際上就是wpa_supplicant,只不過名字不同罷了)的進程交互。
圖7-26所示為Galaxy Note2 init配置文件中關於p2p_supplicant服務的示意圖:
圖7-26 Galaxy Note2中p2p_supplicant服務配置項
由圖7-26可知:
- init配置文件定義了一個名為p2p_supplicant的服務,該服務啟動的進程為p2p_supplicant。根據筆者的測試,p2p_supplicant其實就是wpa_supplicant,只不過換了一個名字而已。
- p2p_supplicant使用的配置文件名為/data/misc/wifi/p2p_supplicant.conf文件,其內容如圖7-27所示。
圖7-27 p2p_supplicant.conf內容
提示:關於init配置文件中wpa_supplicant服務的說明,請讀者參考第4章4.3「wpa_supplicant初始化流程分析」一節。
圖7-27中,p2p_supplicant對於的ctrl_iface路徑為/data/misc/wifi/sockets。所以,如果要使用wpa_cli和p2p_supplicant交互的話,必須指定正確的ctrl_iface路徑。圖7-28所示為筆者用wpa_cli測試p2p_supplicant時的示例截圖:
圖7-28 wpa_cli和p2p_supplicant交互
下面來分析wpa_supplicant中和P2P相關的代碼。
注意:以Galaxy Note2為例,p2p_supplicant就是wpa_supplicant,只是編譯時打開了P2P相關的選項。下面的分析將以wpa_supplicant中和P2P相關的代碼及工作流程為主。
7.4.1 P2P模塊初始化
首先來看WPAS中P2P相關模塊的初始化。該初始化工作我們在第4章4.3.4中「wpa_supplicant_init_iface分析之五」曾提到過,其對應的函數wpas_p2p_init,馬上來看它[p2p_supplicant.c::wpas_p2p_init]
int wpas_p2p_init(struct wpa_global *global, struct wpa_supplicant *wpa_s)
{
structp2p_configp2p; //p2p變量指向一個p2p_config對象,代表P2P模塊的配置信息
unsigned int r; int i;
//①WPA_DRIVER_FLAGS_P2P_CAPABLE:代表Wifi驅動對P2P支持的能力,詳情見下文解釋
if (!(wpa_s->drv_flags&WPA_DRIVER_FLAGS_P2P_CAPABLE)) return 0;
if (global->p2p) return 0;
//如果wifi driver能完成P2P功能,就不用勞駕WPAS了
if (wpa_s->drv_flags &WPA_DRIVER_FLAGS_P2P_MGMT) {......}
//②初始化並設置p2p_config對象
os_memset(&p2p, 0, sizeof(p2p));
p2p.msg_ctx= wpa_s; p2p.cb_ctx= wpa_s;
p2p.p2p_scan=wpas_p2p_scan; //P2P對應的掃描函數
.......//設置一些回調函數
p2p.get_noa = wpas_get_noa; p2p.go_connected = wpas_go_connected;
//設置P2P Device address。
os_memcpy(wpa_s->global->p2p_dev_addr, wpa_s->own_addr, ETH_ALEN);
os_memcpy(p2p.dev_addr, wpa_s->global->p2p_dev_addr, ETH_ALEN);
//設置P2P模塊配置信息,包括device name,model name,uuid等
p2p.dev_name = wpa_s->conf->device_name;
p2p.manufacturer = wpa_s->conf->manufacturer;
p2p.model_name = wpa_s->conf->model_name;
p2p.model_number = wpa_s->conf->model_number;
p2p.serial_number = wpa_s->conf->serial_number;
if (wpa_s->wps) {
os_memcpy(p2p.uuid, wpa_s->wps->uuid, 16);
p2p.config_methods = wpa_s->wps->config_methods;
}
//設置Operation Channel信息和listen channel信息
if (wpa_s->conf->p2p_listen_reg_class &&
wpa_s->conf->p2p_listen_channel) {
p2p.reg_class = wpa_s->conf->p2p_listen_reg_class;
p2p.channel = wpa_s->conf->p2p_listen_channel;
} else {......//設置默認值}
......
//設置國家碼
if (wpa_s->conf->country[0] && wpa_s->conf->country[1]) {
os_memcpy(p2p.country, wpa_s->conf->country, 2);
p2p.country[2] = 0x04;
} else//配置文件中沒有設置國家,所以取值為"XX\x04"
os_memcpy(p2p.country, "XX\x04", 3);//讀者可回顧圖7-7
//判斷wifi 驅動是否支持配置文件中設置的operationg channel和listen channel
if (wpas_p2p_setup_channels(wpa_s, &p2p.channels)) {......}
os_memcpy(p2p.pri_dev_type, wpa_s->conf->device_type,WPS_DEV_TYPE_LEN);
p2p.num_sec_dev_types = wpa_s->conf->num_sec_device_types;
os_memcpy(p2p.sec_dev_type, wpa_s->conf->sec_device_type,
p2p.num_sec_dev_types * WPS_DEV_TYPE_LEN);
//是否支持concurrent operation
p2p.concurrent_operations = !!(wpa_s->drv_flags&WPA_DRIVER_FLAGS_P2P_CONCURRENT);
p2p.max_peers = 100;//最多能保存100個對端P2P Device信息
//配置文件中沒有設置p2p_ssid_postfix,但P2pStateMachine在initializeP2pSettings函數中
//將設置P2P SSID後綴。以筆者的Galaxy Note2為例,其P2P SSID後綴為「Android_4aa9」
if (wpa_s->conf->p2p_ssid_postfix) {......}
p2p.p2p_intra_bss = wpa_s->conf->p2p_intra_bss;
//③global->p2p指向一個p2p_data結構體,它是WPAS中P2P模塊的代表
global->p2p =p2p_init(&p2p);
......
for (i = 0; i < MAX_WPS_VENDOR_EXT; i++) {//拷貝vendor廠商特定的WSC屬性信息
if (wpa_s->conf->wps_vendor_ext[i] == NULL) continue;
p2p_add_wps_vendor_extension(global->p2p, wpa_s->conf->wps_vendor_ext[i]);
}
return 0;
}
由上述代碼可知,wpas_p2p_init的工作非常簡單,主要內容包括:
- 初始化一個p2p_config對象,然後根據p2p_supplicant.conf文件的信息來設置其中的內容,同時還需要為P2P模塊設置一些回調函數。
- 調用p2p_init函數以初始化P2P模塊。
1. Driver Flags和重要數據結構介紹
先來看上述代碼中提到的drv_flags變量。WPAS中,Wifi驅動對P2P功能的支持情況就是由它來表達的。筆者的Galaxy Note2中該變量取值為0x2EAC0,其表達的含義如下:[-->driver.h]
#define WPA_DRIVER_FLAGS_AP 0x00000040 //Wifi driver支持AP。它使得P2P設備能扮演GO
/*
標誌標明association成功後,kernel driver需要設置WEP key
這個標誌出現的原因是由於kernel API發生了變動,使得只能在關聯成功後才能設置key
*/
#define WPA_DRIVER_FLAGS_SET_KEYS_AFTER_ASSOC_DONE 0x00000080
#define WPA_DRIVER_FLAGS_P2P_CONCURRENT 0x00000200 //Wifi驅動支持STA和P2P的並發運行
#define WPA_DRIVER_FLAGS_P2P_CAPABLE 0x00000800 //Wifi驅動支持P2P
/*
7.2.2.1.2「Probe Request幀設置」一節曾提到過說P2P包含Device Address和Interface Address
兩種類型的地址。在實際實現過程中,這兩個地址分別代表兩個virtual interface。顯然,P2P中第一個和一直
存在的是擁有Device Address的vitural interface。下面這個標誌表示該virtual interface可以參與
P2P管理(除P2P Group Operation之外的工作)工作以及非P2P相關的工作(例如利用這個virtual
interface 加入到一個BSS)
*/
#define WPA_DRIVER_FLAGS_P2P_MGMT_AND_NON_P2P 0x00002000
/*
該標誌主要針對associate操作。當關聯操作失敗後,如果driver支持該選項,則表明driver能處理失敗之
後的各種收尾工作(Key、timeout等工作)。否則,WPAS需要自己處理這些事情
*/
#define WPA_DRIVER_FLAGS_SANE_ERROR_CODES 0x00004000
//下面這個標誌和off channel機制有關。讀者可參考第4章4.3.4中「capability介紹」一節。當802.11
//MAC幀通過off channel發送的話,下面這個標誌表示driver會反饋一個發送情況(TX Report)消息給WPAS
#define WPA_DRIVER_FLAGS_OFFCHANNEL_TX 0x00008000
//下面這兩個標誌表示kernel中的driver是否能反饋Deauthentication/Disassociation幀
//發送情況(TX Report)
#define WPA_DRIVER_FLAGS_DEAUTH_TX_STATUS 0x00020000
下面來看wpas_p2p_init中出現的幾個重要數據結構,首先是p2p_config和p2p_data,它們的成員如圖7-29所示:/*
標誌標明association成功後,kernel driver需要設置WEP key
這個標誌出現的原因是由於kernel API發生了變動,使得只能在關聯成功後才能設置key
*/
#define WPA_DRIVER_FLAGS_SET_KEYS_AFTER_ASSOC_DONE 0x00000080
#define WPA_DRIVER_FLAGS_P2P_CONCURRENT 0x00000200 //Wifi驅動支持STA和P2P的並發運行
#define WPA_DRIVER_FLAGS_P2P_CAPABLE 0x00000800 //Wifi驅動支持P2P
/*
7.2.2.1.2「Probe Request幀設置」一節曾提到過說P2P包含Device Address和Interface Address
兩種類型的地址。在實際實現過程中,這兩個地址分別代表兩個virtual interface。顯然,P2P中第一個和一直
存在的是擁有Device Address的vitural interface。下面這個標誌表示該virtual interface可以參與
P2P管理(除P2P Group Operation之外的工作)工作以及非P2P相關的工作(例如利用這個virtual
interface 加入到一個BSS)
*/
#define WPA_DRIVER_FLAGS_P2P_MGMT_AND_NON_P2P 0x00002000
/*
該標誌主要針對associate操作。當關聯操作失敗後,如果driver支持該選項,則表明driver能處理失敗之
後的各種收尾工作(Key、timeout等工作)。否則,WPAS需要自己處理這些事情
*/
#define WPA_DRIVER_FLAGS_SANE_ERROR_CODES 0x00004000
//下面這個標誌和off channel機制有關。讀者可參考第4章4.3.4中「capability介紹」一節。當802.11
//MAC幀通過off channel發送的話,下面這個標誌表示driver會反饋一個發送情況(TX Report)消息給WPAS
#define WPA_DRIVER_FLAGS_OFFCHANNEL_TX 0x00008000
//下面這兩個標誌表示kernel中的driver是否能反饋Deauthentication/Disassociation幀
//發送情況(TX Report)
#define WPA_DRIVER_FLAGS_DEAUTH_TX_STATUS 0x00020000
圖7-29 p2p_config和p2p_data結構示意圖
圖7-29展示了p2p_config和p2p_data兩個數據結構中一些重要的成員。其中:
- p2p_config定義了20個回調函數。這些回調函數定義了P2P模塊和外界交互的接口。在wpas_p2p_init中,這些回調函數均指向p2p_supplicant.c中對應的函數,例如p2p_scan指向wpas_p2p_scan,dev_lost指向wpas_dev_lost。另外,由於回調函數的參數比較複雜,所以圖中均省略了參數信息。
- p2p_data指向一個p2p_config對象。
圖7-30 p2p_device及其他數據結構示意圖
圖7-30展示了五種數據結構,其中:
- 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的信息。
7.5 本章總結和參考資料說明
7.5.1 本章總結
本章對Wi-Fi P2P進行了詳細介紹,主要內容包括:- P2P理論知識。從完整性來說,本章介紹的內容只是P2P規範中最基礎的部分。但對於初學者而言,這部分的難度也不算小。就筆者自己的學習經歷而言,這部分內容需要反覆琢磨和研究,有時候還需要結合代碼分析才能真正掌握其精髓。
- 在學習完P2P理論知識後,我們對WifiP2pSettings以及WifiP2pService進行了介紹。這部分內容比較簡單,讀者可輕鬆掌握相關知識。
- 最後,我們對WPAS中的P2P模塊及運行機制進行了介紹。就所涉及到的知識而言,這些內容並不複雜,但由於P2P以及和wifi driver在具體實現時有諸多考慮(例如off channel的情況,TX Report的處理),所以其工作流程反倒顯得比較繁瑣。
- 通讀P2P規範,了解Group Operation、Invitation、Device Discoverability以及P2P Power Management相關知識。
- 繼續研究wpas_start_wps_go代碼,掌握WPAS中WSC Registrar以及AP的工作流程。
7.5.2 參考資料說明
P2P基礎知識介紹
本章參考資料主要是Wifi P2P規範1.1版,讀者可從上下載協議全文。P2P架構介紹
[1] WiFi P2P第2節「Architectural Overview」[2] WiFi P2P第3.2節「P2P Group Operation」
[3] WiFi P2P第3.3節「P2P Power Management」
P2P Device Discovery和Group Formation
[4] WiFi P2P第3.1節「P2P Discovery」[5] Part11:Wireless LAN Medium Access Control(MAC) and Phsyical Layer(PHY) Specifications附錄J「Country information element and regulatory classes」
該文檔下載地址為。附錄J詳細描述了國家碼和管制信息方面的內容
[6] WiFi P2P第4.2節「Management Frames」
[7] 802.11-2012第8.4.1.11節「Action Field」
該節介紹了Action幀Category欄位的取值情況
[8] WiFi P2P第4.1節「P2P Information Elements」
[9] WiFi P2P附錄A「P2P State Machine」