Wifi direct/P2P的多种连接方式分析

P2P的链接方式概览

首次连接不进行描述,简单直接.

Wifi direct/P2P的多种连接方式分析

P2P整体状态切换如下图:

Wifi direct/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

流程差异:

Wifi direct/P2P的多种连接方式分析

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