2011-01-27 5 views
3

Je suis en train de planifier un balayage wifi toutes les 1 seconde que le délai actuel de 6 secondes entre chaque résultat de balayage est trop long pour moi. Je pense que cela fonctionne, mais je comprends à peine le fonctionnement ou le résultat. Voici le code de base indiquant à la minuterie de commencer wifiMgr.startScan(); toutes les 1000 ms.résultat inattendu en utilisant minuterie pour wifi scan android

private void startNetworkScan() { 
    mTimer = new Timer(); 
    mTimer.schedule(new TimerTask() { 
     @Override 
     public void run() { 
      TimerMethod(); 
     } 
    }, 0, 1000); 
} 

private void TimerMethod() { 
    this.runOnUiThread(rTimer); 
} 

private Runnable rTimer = new Runnable() { 
    public void run() { 
     wifiMgr.startScan(); 
     Bundle bb = wifiScanReceiver.getResultExtras(true); 
     txtList.append("Result " + bb.getString("scanresult") + "\n"); 
    } 
}; 

Voici le code de la classe BroadcastReceiver. Je viens d'afficher l'horodatage et les informations connexes à partir du point d'accès.

private void handleScanResultsAvailable() { 
    List<ScanResult> results = wifiMgr.getScanResults(); 

    String currentTimeStr = new SimpleDateFormat("HH:mm:ss").format(new Date()); 
    Bundle b = new Bundle(); 
    StringBuilder sb = new StringBuilder(); 
    sb.append(i + ": " + currentTimeStr); 
    for (ScanResult result : results) { 
     sb.append(String.format(" SSID: %s, RSSI: %s dBm ", result.SSID, result.level)); 
    } 
    b.putString("scanresult", sb.toString()); 
    setResultExtras(b); 
    i++; 
} 

Et voici un extrait du résultat:

Result 1: 10:04:12 SSID: XXXXX, RSSI: -88 dBm 
Result 1: 10:04:12 SSID: XXXXX, RSSI: -88 dBm 
Result 2: 10:04:14 SSID: XXXXX, RSSI: -87 dBm 
Result 2: 10:04:14 SSID: XXXXX, RSSI: -87 dBm 

La plupart du temps chaque résultat est affiché tous les 1-2 secondes, ce qui est tout à fait bonne. Ce que je ne comprends pas, c'est que pour chaque résultat, j'ai toujours deux lignes avec la même valeur. Je pense effectivement qu'il devrait y avoir des résultats qui se chevauchent, car wifiMgr.startScan() est pas arrêté à chaque exécution par la minuterie, comme ceci:

// there are ca. 6-7 lines for every record 
// as the wifi scanresult delay is 6 secs 
Result 1: 10:03:40 SSID: XXXXX, RSSI: -85 dBm 
Result 1: 10:03:41 SSID: XXXXX, RSSI: -85 dBm 
Result 1: 10:03:42 SSID: XXXXX, RSSI: -85 dBm 
Result 1: 10:03:43 SSID: XXXXX, RSSI: -85 dBm 
Result 1: 10:03:44 SSID: XXXXX, RSSI: -85 dBm 
Result 1: 10:03:45 SSID: XXXXX, RSSI: -85 dBm 
Result 2: 10:03:45 SSID: XXXXX, RSSI: -85 dBm 
Result 1: 10:03:46 SSID: XXXXX, RSSI: -85 dBm 
Result 2: 10:03:46 SSID: XXXXX, RSSI: -85 dBm 
Result 1: 10:03:47 SSID: XXXXX, RSSI: -85 dBm 
Result 2: 10:03:47 SSID: XXXXX, RSSI: -85 dBm 
Result 1: 10:03:48 SSID: XXXXX, RSSI: -85 dBm 
Result 2: 10:03:48 SSID: XXXXX, RSSI: -85 dBm 

Quelqu'un peut-il faire la lumière? - Le code est-il correct, le résultat est-il correct? Apprécierait toute explication sur la logique derrière cela.

Mise à jour: Voici le reste du code BroadcastReceiver.

@Override 
public void onReceive(Context context, Intent intent) { 
    if (intent.getAction().equalsIgnoreCase(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)) { 
     handleScanResultsAvailable(); 
    } 
} 

Répondre

0

Votre sb est initialisée en dehors de votre boucle, de sorte que si les résultats contiennent plus d'un résultat, il produirait une sortie comme:

Result 1: 10:04:12 SSID: XXXXX, RSSI: -88 dBm SSID: XXXXX, RSSI: -85 dBm 

Par conséquent, la sortie de ligne en double est probablement dans le code qui sort les résultats.

Dans votre code d'exécution rTimer, vous appelez wifiMgr.startScan() pour démarrer l'analyse, mais cela retournera immédiatement pour que la ligne suivante n'obtienne pas les données attendues.

Votre récepteur reçoit probablement android.net.wifi.SCAN_RESULTS. Il devrait vérifier cela et afficher les résultats là-bas.

Fondamentalement, vos demandes de données et les retours de données ne sont pas synchronisés. Vous demandez les données, mais essayez de les afficher avant qu'elles ne soient retournées

Pouvez-vous vous connecter pour voir ce qui se passe? Avant wifiMgr.startScan():

/*DEBUG*/Log.d(this.getClass().getName(), "run: Started"); 

et au début de handleScanResultsAvailable:

/*DEBUG*/Log.d(this.getClass().getName(), "handleScanResultsAvailable: Started"); 
+0

Oui, il affichera plus d'un SSID dans une ligne de résultat. Le résultat ci-dessus montre un seul SSID car l'application n'a détecté qu'un seul SSID quand je l'ai testé. Auparavant sans temporisateur, je produisais les résultats dans handleScanResultsAvailable, mais il affiche une sortie normale comme si je n'utilisais pas de temporisateur. Je poste la sortie du journal ici, http://pastebin.com/zFjfuL7t Merci d'avoir pris le temps! – springrolls

+0

1. Ces résultats sont-ils les plus récents depuis le début de l'activité, car ils semblent tous les deux montrer que les données sont reçues avant que l'appel ne soit demandé? 2. Pourriez-vous coller plus de votre code de récepteur de diffusion. 3. Existe-t-il une routine onReceive? Quelle est l'action passée dans l'intention? 4.Savez-vous combien de temps il faut entre l'appel de startscan et la réception des résultats de scan? Autant de questions :-) – FrinkTheBrave

+0

Oui, ce sont des résultats du début de l'activité. Les premières lignes montrant null ou rien sont quand il n'y a aucun résultat d'analyse disponible pour le moment. Je suppose que cela prend environ 5 secondes. Fondamentalement, je viens de fusionner le code entre BroadcastReceiver pour 'SCAN_RESULTS_AVAILABLE_ACTION' et Timer (en utilisant [ce] tutoriel (http://steve.odyfamily.com/?p=12)). Quand je clique sur un bouton, il démarre une minuterie qui exécute 'startScan()' toutes les 1 s. – springrolls

Questions connexes