2016-11-18 7 views
4

に接続した後、私は私は、彼らが彼を見つけたら、ピアが手動でグループの所有者に接続したい手動アンドロイドWifip2p:なぜグループの情報がnullであるグループの所有者

を選択し、グループの所有者に複数のデバイスを接続しようとしています

私は3台の携帯電話(無エミュレータ)を持っているが、それぞれにあなたは私がrequestGroupInfoを行う参照し、それを印刷しているリスナーを渡すことができるように、このクリックハンドラー

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) { 

     } 
    }); 

} 

でボタン「グループを作成」がありますログ内の次の行:

groupFormed: true isGroupOwner: true groupOwnerAddress: /192.168.49.1 
だから私はそれは私も BroadCastReceiver呼び出しが WIFI_P2P_PEERS_CHANGED_ACTION行動の意図を受信する MyPeerListenerクラスを持っている

に成功したと仮定します。

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 successToastが、接続が私にこのラインを示した直後にrequestConnectionInfo取得

groupFormed: false isGroupOwner: false groupOwnerAddress: null 

requestGroupInfoへの呼び出しも示しています

group is null 

は、これは非常に多くの場合、時間の約80%を発生します。場合によってはデフォルトグループIP 192.168.49.1が表示されます。しかし、両方の "スレーブ"の電話機が正しいグループ情報を持っている場合、私は運が良いでしょう。

グループ情報がnullのときに所有者にソケットを接続しようとすると、destination host unreachableで失敗します。しかし、グループ情報が正しい場合は、データを正しく接続して送信することができます。

なぜこのようなことが起こっていますか?接続が成功する可能性はありますが、グループはnullですか?

+0

Wi-Fi Directには奇妙な問題がたくさんあります。私はしばらくそれを使って、役立つリソースや問題のリストを作成しました:https://groups.google.com/forum/#!フォーラム/ wi-fi-direct – Brendan

+0

実際に@Brendan、それはかなり矛盾しているようです。 – vlatkozelka

+0

私はそれが類似のデバイスを接続し、近くにほとんどネットワーク活動がないときに最もうまくいくことを発見しました。このWi-Fi Directハンドラライブラリは、学習しているときに役立ちます:https://github.com/Crash-Test-Buddies/WiFi-Buddyこれは、多くの情報を記録します。グループ接続の管理方法を参照してください – Brendan

答えて

1

Iプロジェクト全体を再行なったし、唯一のミス

私は

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){ 

} 

}); 

は、だから私は BroadcastReceiverを拡張 MyWifiDirectBroadcastReceiverconnect()onSuccess()コールバックの内側とそれアウトから requestConnectionInfo()を取り除いていたを発見しました

@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 t彼の変更、私は問題なくリスナーが提供するIPに接続します。

関連する問題