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


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相关的服务了

推荐阅读