Android Wi-Fi Direct P2P 连接多个设备

Posted

技术标签:

【中文标题】Android Wi-Fi Direct P2P 连接多个设备【英文标题】:Android Wi-Fi Direct P2P connect to multiple devices 【发布时间】:2017-01-19 02:58:28 【问题描述】:

我在尝试连接到运行同一应用的多台设备时遇到问题。我的应用程序的工作流程是:

    一个设备调用发现对等点(参见代码 A) 一旦发现对等点,我会显示一个 AlertDialog,允许用户选择他们想要连接的对等点(参见代码 B) 一旦用户选择了他们想要连接的设备,我会尝试遍历 WifiP2pDeviceList 并在每个传入的设备上调用 connect 方法(我总是将当前设备的意图设置为组所有者)(请参阅代码 C) 一旦建立连接,我会传输一些数据....

问题:在第3步中,当我调用connect方法时,代码连接到第一个设备没有任何问题,但是当它到达第二个循环迭代时连接到第二个或第三个选择的设备 我遇到故障,原因代码为 2(忙)。为什么会这样?当我只连接一个设备时,一切正常,只有当我尝试连接多个设备时才会出现问题?我究竟做错了什么?我找不到任何有关如何连接到多个设备的示例...非常感谢任何帮助。

代码 A:(发现同行)

private WifiP2pManager mManager;    

mManager.discoverPeers(mChannel, new WifiP2pManager.ActionListener() 
                @Override
                public void onSuccess() 
                    onInitiateDiscovery();
                

                @Override
                public void onFailure(int reasonCode) 
                    Toast.makeText(getActivity(), "Discovery Failed: " + getReascodeText(reasonCode), Toast.LENGTH_SHORT).show();
                
            );

代码 B:(选择要连接的对等方)

public void onPeersAvailable(WifiP2pDeviceList peers) 
        final ArrayList<Integer> itemsSelected = new ArrayList<>();

        // Out with the old, in with the new.
        mPeers.clear();
        mPeers.addAll(peers.getDeviceList());
        CharSequence[] cs = StringUtils.getDeviceNames(mPeers);

        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
        builder.setTitle("Who do you want to share with?");
        builder.setMultiChoiceItems(cs, null, new DialogInterface.OnMultiChoiceClickListener() 
            public void onClick(DialogInterface dialog, int selectedItemId, boolean isChecked) 
                if (isChecked) 
                    itemsSelected.add(selectedItemId);
                 else if (itemsSelected.contains(selectedItemId)) 
                    itemsSelected.remove(Integer.valueOf(selectedItemId));
                
            
        ).setPositiveButton("Done!", new DialogInterface.OnClickListener() 
            @Override
            public void onClick(DialogInterface dialog, int id) 

                WifiP2pDevice wifiP2pDevice = mPeers.get(itemsSelected.get(0));
                List<WifiP2pDevice> devices = extractSelectedDevices(itemsSelected,mPeers);
                numConnections = devices.size();
                connect(devices);
            
        );

        mPeerSelectionDialog = builder.create();
        mPeerSelectionDialog.show();

代码 C:(连接到选定的设备)

public void connect(List<WifiP2pDevice>  devices) 

    for(WifiP2pDevice device: devices) 
        WifiP2pConfig config = new WifiP2pConfig();
        config.deviceAddress = device.deviceAddress;
        config.wps.setup = WpsInfo.PBC;
        config.groupOwnerIntent = 15;


        mManager.connect(mChannel, config, new WifiP2pManager.ActionListener() 

            @Override
            public void onSuccess() 
                // WiFiDirectBroadcastReceiver will notify us. Ignore for now.
                System.out.println("successfully connected!!");
                Log.d(MultiImageSelectorFragment.TAG, ">>>>>>>>>>>>>>>>>>>>>!!Successfully Connected!<<<<<<<<<<<");

            

            @Override
            public void onFailure(int reason) 

                Toast.makeText(getActivity(), "Connect failed. Retry.", Toast.LENGTH_SHORT).show();
                Log.d(MultiImageSelectorFragment.TAG, ">>>>>>>>>>>>>>>>>>>>>!!Failed connection, rasoncode:"+reason+" !<<<<<<<<<<<");
            
        );


【问题讨论】:

我遇到了同样的问题。您能否分享一下您解决问题的代码。提前谢谢你。 【参考方案1】:

没错,连接第一台设备后会出现连接失败的错误码。原因是您设备上的 WiFiP2P 尚未完成第一次设备连接过程(即使您已接受连接并已建立,但创建组和释放资源仍需要一些时间)。

要解决此问题,您可以启动另一个线程,但会有一些延迟(根据我的测试至少有 10-15 秒),以尝试连接到第二个设备。

祝你好运。

【讨论】:

请告诉我你的解决方案。

以上是关于Android Wi-Fi Direct P2P 连接多个设备的主要内容,如果未能解决你的问题,请参考以下文章

用于 P2P 的 AllJoyn 或 Wifi Direct?

32 - 如何克服 Android 中 Wi-Fi Direct 32 对凭据的限制?

32 - 如何克服 Android 中 Wi-Fi Direct 32 对凭据的限制?

在 Flutter 中使用 Wi-Fi Direct 创建 P2P 连接

使用 Wi-Fi 创建 P2P 连接:消息传递问题

Android:与联网设备建立“Wi-Fi Direct”连接