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:为啥连接到组所有者后组信息为空的主要内容,如果未能解决你的问题,请参考以下文章

检查android wifip2p连接是不是成功?

带频道的 wifi p2p 网络

为啥 Office 365 连接到 office 按钮不再适用于新的 Microsoft Teams 组?

为啥我的 android 设备无法连接到 charles 代理,但在我连接到 Fiddler 代理时可以工作?

为啥从Android中的本机程序连接到LocalServerSocket时连接被拒绝

为啥在 Android 中将 autoConnect 设置为 true 时,App 不会重新连接到 BLE 设备?