go语言p2p原理 go语言详解( 三 )


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将收到一个

推荐阅读