2012-12-14 10 views
9

Ich mache meine Masterarbeit im Moment über WiFi-Positionierung und um meine Algorithmen zu testen, musste ich einige Daten sammeln.Gibt es eine Möglichkeit, WLAN-Scan-Intervalle in Android explizit zu steuern?

Dazu habe ich ein kurzes und sehr einfaches Programm für Android geschrieben, das einfach den RSSI für alle bei jedem Scan verfügbaren Zugriffspunkte sammelt und in Datei speichert. Ich habe eine BroadcastReceiver einrichten, die auf den Fall hört WifiManager.SCAN_RESULTS_AVAILABLE_ACTION und ich verwende eine Timer, hier genannt tim, um Scans zu initiieren mit einem WifiManager, genannt wifi wie folgt:

tim.schedule(new TimerTask(){ 
     @Override 
     public void run(){ 
      wifi.startScan(); 
     } 
}, 0, 1000); 

Das Problem, das ich jetzt habe, ist, dass die Angestoßene Scans scheinen nicht jede Sekunde zu passieren, selbst wenn es mir gelingt, sie zu initiieren, und ab und zu gibt es andere Scans, die von einer anderen App initiiert werden, die ebenfalls aufgezeichnet wird.

Gibt es eine einfache Möglichkeit, in einem festgelegten Intervall zu scannen und die von einer anderen App initiierten Scans nicht zu erhalten?

Die ganze App kann auf https://github.com/while/RSSIMiner gefunden werden, wenn es in irgendeiner Weise hilft.

Antwort

4

Gibt es eine einfache Möglichkeit, nach einem festgelegten Intervall zu scannen?

Wenn dies nicht gut funktioniert, ich habe keine Angst. Aus meiner Erfahrung funktionieren "hardwarebezogene" Methoden möglicherweise nicht genau so, wie ihre Definition sagt. Zum Beispiel habe ich einmal eine kleine App erstellt, die alle X Minuten Ihre Position aufzeichnet. Also rufe ich requestLocationUpdates mit einigen minTime Parameter. Aber mein Telefon ignoriert einfach den minTime Wert, und ich bekomme Updates vom GPS, sobald sie verfügbar sind, was ich nicht wollte. Ich stellte eine Frage über es hier, und bekam this Antwort, von dem wir das Jelly Bean vor lernen, Geräte einfach diesen Wert ignorieren können ...

So es etwas ähnliches jetzt sein kann. Ich würde versuchen, diesen Code auf der neuesten Android-Version auszuführen. Und ich verstehe nicht so viel in Wifi, aber ist nicht 1 Sekunde ein zu häufiges Intervall für Scans? Vielleicht ignoriert das System die Scan-Anfrage nicht (also gibt es true zurück), aber die Hardware tut das?

Können wir die von einer anderen App initiierten Scans ignorieren?

Soweit ich weiß, ist es auch hier negativ. In der Sendung SCAN_RESULTS_AVAILABLE_ACTION sind keine Extras enthalten, sodass Sie nicht wissen können, von welcher App der Scan gestartet wurde.

Die beste Lösung wird sein, Ihre Anforderungen zu erfüllen. Sie können die ScanResult.timestamp verwenden, um festzustellen, ob Sie dieses Ergebnis verwenden sollten oder nicht. Wenn Sie beispielsweise versuchen, die RSSI für jeden Zugriffspunkt pro Sekunde zu ermitteln, können Sie die aktuelle BSSID mit früheren BSSIDs vergleichen. Wenn die aktuelle BSSID in einem Scanergebnis der letzten Sekunde enthalten war, können Sie sie einfach ignorieren. Dann ist es egal, wie viele Ergebnisse Sie erhalten.

Eine andere, viel einfachere Lösung wird sein, einen Boolean namens scanInitiated zu erstellen und beim Starten eines Scans auf true zu setzen. Verwenden Sie die Daten beim Empfang des Broacasts nur, wenn scanInitiatedtrue ist, und legen Sie sie dann auf false fest. Dies ist nicht so zuverlässig, wenn die Intervalle kurz sind, aber für lange Intervalle wird es gut funktionieren.

+1

Danke für die Antwort, obwohl es keine gute Nachricht war. Ich befürchtete, dass dies der Fall war. Ich habe die App in einem Galaxy Nexus und einem Nexus 7 sowohl mit laufender Jellybean (+) ausprobiert als auch kein Glück da. Das Problem ist, dass mein Modell regelmäßige Intervalle annimmt, also muss ich es ändern, um nicht homogene Scanintervalle zu verarbeiten. – while

+1

Das seltsame Ding ist, es schafft es, irgendwo um 1sec Intervalle zu scannen, wenn auf 500ms eingestellt, so dass es es hardwaretechnisch unterstützen muss. – while

+0

Ja, wie ich in der ersten Lösung vorgeschlagen habe - Sie sollten nur die gewünschten Ergebnisse auswählen und verwenden, nicht jedes Ergebnis, das Sie erhalten. Dies wird Ihnen helfen, beide Probleme zu beheben. – Jong

Verwandte Themen