Wifi direct/P2P的多种连接方式分析
P2P的链接方式概览
首次连接不进行描述,简单直接.
P2P整体状态切换如下图:
加入已存在的组
当P2P client尝试加入已经存在的组,client需要提供设备名称,设备类型以及p2p info在association 帧中 对应的状态变化如下: go found ->wsc provisioning enroll -> joined group 这里直接跳过了group formation的三帧交互阶段所以相比第一次连接速度有所提升,并且go的group所处信道是固定的进而跳过了p2p第一次发现设备的scan阶段,oppo的oshare就是采用此种快捷方式进行p2p连接的。
WifiNative::p2pGroupAdd
->P2pIface::addGroup_1_2
->p2p_iface::pending_scan_res_join_callback
->p2p_iface::joinGroup
->p2p_supplicant::wpas_p2p_group_add_persistent
-> p2p_supplicant::wpas_start_p2p_client
->wpa_supplicant::wpa_supplicant_select_network
go邀请进组&gc邀请进组
go发出 invitation request frame,需要携带信道信息并且go timeout属性为0,group bssid, groupid。 gc恢复invitation response framework,并且携带status作为结果信息,而后继续进行连接 状态变化如下: invite request-> invite response -> wsc enroll -> completed 在已经构建成组的p2p设备邀请其他设备作为gc时,直接跳过group formation过程直接进入wsc阶段,完成连接
gc发出 invitation request frame,需要携带信道信息并且go timeout属性为0 状态变化与go邀请类似 即便是代码流程也没有太多差异,如下:
WifiP2pNative::p2pInvite
->p2p_supplicant::wpas_p2p_invite_group
->p2p_invitation::p2p_invite
->p2p_invitation::p2p_invite_send
流程差异:
go&gc唤醒永久组
go在搜索并尝试连接已存在永久组的go时,通过invitation exchange来唤醒永久组。当invitation exchange结束p2p连接随即完成。 由于是永久组中的go重连gc,之前协商的配置信息已经被保存下来,所以无需go协商和wsc安全校验.
gc在搜索并尝试连接已存在永久组的go时,通过invitation exchange来唤醒永久组。当invitation exchange结束p2p连接随即完成。 由于是永久组中的gc重连go,之前协商的配置信息已经被保存下来,所以无需go协商和wsc安全校验。
WifiP2pServiceImpl::reinvokePersistentGroup
->p2p_iface::reinvokeInternal
->p2p_supplicant::wpas_p2p_invite
->p2p_invitation::p2p_invite
->p2p_invitation::p2p_invite_send