Android Wifip2p:为啥连接到组所有者后组信息为空

Posted

技术标签:

【中文标题】Android Wifip2p:为啥连接到组所有者后组信息为空【英文标题】:Android Wifip2p: Why is group info null after connecting to group ownerAndroid Wifip2p:为什么连接到组所有者后组信息为空 【发布时间】:2016-11-18 14:10:25 【问题描述】:

我正在尝试将多个设备连接到我手动选择的群组所有者

我希望同伴在找到组所有者后手动连接到组所有者

我有 3 部手机(没有模拟器),每部手机都有一个带有此点击处理程序的“创建组”按钮

public void createWifiGroup(View view) 

    mManager.createGroup(mChannel, new WifiP2pManager.ActionListener() 
        @Override
        public void onSuccess() 

            mManager.requestGroupInfo(mChannel,new MyGroupInfoListener(MainActivity.this));

        

        @Override
        public void onFailure(int reason) 

        
    );


如您所见,我执行requestGroupInfo 并将其传递给在日志中打印以下行的侦听器:

groupFormed: true isGroupOwner: true groupOwnerAddress: /192.168.49.1

所以我想它成功了

我还有一个MyPeerListener 类,当收到WIFI_P2P_PEERS_CHANGED_ACTION 操作意图时BroadCastReceiver 调用该类。

MyPeerListener 将遍历对等节点并在找到组所有者时连接

 @Override
    public void onPeersAvailable(WifiP2pDeviceList wifiP2pDeviceList) 
        this.wifiP2pDeviceList = wifiP2pDeviceList;
        //Toast toast = Toast.makeText(receiver.mActivity, "I found some peers", Toast.LENGTH_LONG);
        // toast.show();
        Iterator<WifiP2pDevice> deviceListIterator = wifiP2pDeviceList.getDeviceList().iterator();
        boolean foundGroup = false;
        while (deviceListIterator.hasNext()) 
            final WifiP2pDevice device = deviceListIterator.next();
            if (!foundGroup && device.isGroupOwner() && !MainActivity.connected) 

                //MainActivity.mManager.removeGroup(MainActivity.mChannel, null);

                foundGroup = true;

                final WifiP2pConfig config = new WifiP2pConfig();
                //config.wps.setup = WpsInfo.PBC;
                config.groupOwnerIntent = 0;
                config.deviceAddress = device.deviceAddress;

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

                    @Override
                    public void onSuccess() 
                        //success logic
                        Toast toast = Toast.makeText(receiver.mActivity, "connect success", Toast.LENGTH_SHORT);
                        toast.show();
                        MainActivity.connected = true;
                        MainActivity.mManager.requestGroupInfo(MainActivity.mChannel, new MyGroupInfoListener(receiver.mActivity));
                        MainActivity.mManager.requestConnectionInfo(MainActivity.mChannel, new MyConnectionInfoListener(receiver));


                    

                    @Override
                    public void onFailure(int reason) 
                        //failure logic
                        //MainActivity.connected = false;
                        Toast toast = Toast.makeText(receiver.mActivity, "connect fail, reason: " + reason, Toast.LENGTH_LONG);
                        toast.show();
                    

                );
            
            ListView list = (ListView) receiver.mActivity.findViewById(R.id.device_list_view);
            list.setAdapter(new DeviceListViewAdapter(this, receiver.mActivity));
        

        


    

(我知道静态变量的使用和整体糟糕的设计,但这是一个快速学习的原型)

现在我得到一个 connect success Toast 但连接后的 requestConnectionInfo 向我显示了这条线

groupFormed: false isGroupOwner: false groupOwnerAddress: null

对 requestGroupInfo 的调用也显示:

group is null

这种情况经常发生,大约有 80% 的时间。有时它会显示默认组 IP 192.168.49.1 。但是,如果两个“从属”电话都具有正确的组信息,我会很幸运。

当我尝试在组信息为空时将套接字连接到所有者时,它会失败并显示destination host unreachable。但是当组信息正确时,我可以正确连接和发送数据。

那么为什么会这样呢?连接成功但组为空怎么可能?

【问题讨论】:

Wi-Fi Direct 存在很多奇怪的问题。我使用了一段时间,并列出了您可能会发现有用的资源和问题:groups.google.com/forum/#!forum/wi-fi-direct @Brendan 确实,有时看起来很不一致 我发现它在连接类似设备时效果最好,并且附近几乎没有网络活动。如果您正在学习,您可能还会发现这个 Wi-Fi Direct 处理程序库很有用:github.com/Crash-Test-Buddies/WiFi-Buddy 它记录了很多信息,您可以查看源代码并了解它如何管理组连接 【参考方案1】:

我重新做了整个项目,发现只有一个错误

我在做

mManager.connect(...,new ActionListener()
@Override
onSuccess()
    //Here I called requestConnectionInfo right after the pairing happens
    mManager.requestConnectionInfo(myConnectionInfoListener);
    Socket socket = new Socket();
    // try to connect and send data....



@Override
onFailure(int reason)



);

所以我从connect()onSuccess() 回调中删除了requestConnectionInfo(),并在扩展BroadcastReceiverMyWifiDirectBroadcastReceiver 中删除了它

@Override
public void onReceive(Context context, Intent intent) 
    String action = intent.getAction();

    if (WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION.equals(action)) 
        // Check to see if Wi-Fi is enabled and notify appropriate activity
     else if (WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION.equals(action)) 
        // Call WifiP2pManager.requestPeers() to get a list of current peers
     else if (WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION.equals(action)) 
        //Here is where the request for connection info should happen
        //As sometimes the pairing can happen but the devices 
        //might still be negotiating group owner for example
        mManager.requestConnectionInfo(myConnectionInfoListener());
     else if (WifiP2pManager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION.equals(action)) 
        // Respond to this device's wifi state changing
    

MyConnectionInfoListener在此更改后从不返回空信息,并且我连接到侦听器提供的IP没有任何问题。

【讨论】:

以上是关于Android Wifip2p:为啥连接到组所有者后组信息为空的主要内容,如果未能解决你的问题,请参考以下文章