2017-07-21 8 views
0

Je souhaite établir une connexion WiFi-Direct avec un autre périphérique analysé via NFC. Mes étapes sont les suivantes:android - Connexion à un périphérique WiFi P2P sans découvrir les pairs

Tout d'abord, le périphérique A reçoit sa propre adresse WiFiP2P et la transmet au périphérique B via NFC.

Ensuite, le périphérique B essaie d'établir une connexion avec le périphérique A en utilisant l'adresse fournie.

Comme vous pouvez le voir, je n'ai pas impliqué la découverte de pairs dans le processus. Mais quand le périphérique B essaye de se connecter, le résultat est toujours échoué (raison 0, cela devrait être ERROR).

Je pense que cela peut être lié à la visibilité de l'appareil, mais je ne sais pas et ne peux pas trouver de code pour rendre un appareil visible.

Voici mon code:

//NOTE: These code should be executed on Device B 
//Starting WiFi Direct Transmission 
//First we should establish a connection 
WifiP2pConfig config = new WifiP2pConfig(); 
config.deviceAddress = remoteWifiP2pDevice; 
//remoteWifiP2pDevice is the address of device A obtained from NFC 
config.wps.setup = WpsInfo.PBC; 
mManager.connect(mChannel, config, new WifiP2pManager.ActionListener() { 
     @Override 
     public void onSuccess() { 
      //success logic 
      Toast.makeText(MainActivity.this, "success", Toast.LENGTH_SHORT).show(); 
      if (!FILE_RECV) 
      { 
       new SendFilesTask().execute(""); 
      } 
     } 
     @Override 
     public void onFailure(int reason) { 
      //failure logic 
      Toast.makeText(MainActivity.this, "failed" + reason, Toast.LENGTH_SHORT).show(); 
     } 
    }); 

En OnCreate() Je

intentFilter.addAction(WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION); 
intentFilter.addAction(WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION); 
intentFilter.addAction(WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION); 
intentFilter.addAction(WifiP2pManager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION);   
mManager = (WifiP2pManager) getSystemService(Context.WIFI_P2P_SERVICE); 
mChannel = mManager.initialize(this, getMainLooper(), null); 
mReceiver = new WiFiDirectBroadcastReceiver(mManager, mChannel, this); 

Le WifiDirectBroadcastReceiver a le code que liés à l'obtention de l'adresse de l'appareil A et peut être considéré comme vide.

Alors, quel est le problème avec ceux-ci et comment puis-je le réparer? Merci d'avance.

P.S. Si je connecte les périphériques A et B manuellement et exécute à nouveau mon code, il renvoie le succès.

Répondre

0

J'ai découvert que retarder plusieurs secondes fera la réussite de la connexion. Je ne connais pas la raison, mais cela peut être utilisé comme une solution de contournement.

Alors, après tout, y a-t-il une meilleure solution à cela? Et pourquoi le retard fonctionne-t-il?

0
  • WiFI hypothèses directes:

Tous les appareils doivent être en découvrable (mode de balayage) simultanément. Les périphériques analysent pendant 30 sec et après cela il s'arrête par défaut. Il faut donc lancer l'analyse par programmation en utilisant la méthode discoverpeers.

Le plus important est l'affichage appareils à proximité est un appareil specific.ie parfois des dispositifs montrer wont les proches eventhough ils sont available.Thats pourquoi wifi directe n'est pas fiable et à cause de ceux-ci, il n'y aura pas beaucoup wifi applications directes jouer au magasin.