2012-12-14 9 views
9

Sto facendo la mia tesi di Master al momento sul posizionamento WiFi e per testare i miei algoritmi avevo bisogno di raccogliere alcuni dati.Esiste un modo per controllare esplicitamente gli intervalli di scansione WiFi in Android?

Per fare ciò ho scritto un programma breve e molto semplice per Android che raccoglie semplicemente l'RSSI per tutti i punti di accesso disponibili trovati da ciascuna scansione e li salva in un file. Ho creato un BroadcastReceiver che ascolta l'evento WifiManager.SCAN_RESULTS_AVAILABLE_ACTION e io uso un Timer, che qui si chiama Tim, per avviare scansioni con un WifiManager, chiamato wifi come segue:

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

Il problema che sto avendo ora è che il le scansioni avviate non sembrano accadere ogni secondo anche se riesco ad iniziarle e ogni tanto ci sono altre scansioni avviate da qualche altra app che viene registrata anche.

C'è un modo semplice per scansionare su un intervallo impostato e non ricevere le scansioni avviate da qualche altra app?

L'intera app può essere trovata su https://github.com/while/RSSIMiner se aiuta in qualche modo.

risposta

4

C'è un modo semplice per eseguire la scansione su un intervallo impostato?

Se questo non funziona bene, ho paura di no. Dalla mia esperienza, i metodi "correlati all'hardware" potrebbero non funzionare esattamente come dice la loro definizione. Ad esempio, una volta ho creato una piccola app che registra la tua posizione ogni X minuti. Quindi chiamo requestLocationUpdates con qualche parametro minTime. Ma il mio telefono ignora semplicemente il valore minTime e ottengo gli aggiornamenti dal GPS non appena sono disponibili, che non è quello che volevo. Ho postato una domanda su di esso qui, ed ho ottenuto this risposta, da cui si apprende che prima del fagiolo di gelatina, i dispositivi possono semplicemente ignorare questo valore ...

Così può essere qualcosa di simile ora. Proverò a eseguire questo codice sull'ultima versione di Android. E non capisco molto in Wifi, ma non è 1 secondo un intervallo troppo frequente per le scansioni? Forse il sistema non ignora la richiesta di scansione (Quindi restituisce true) ma l'hardware funziona?

Possiamo ignorare le scansioni avviate da qualche altra app?

Per quanto ne so, anche qui è negativo. Non ci sono extra contenuti nella trasmissione SCAN_RESULTS_AVAILABLE_ACTION, quindi non puoi sapere quale applicazione ha avviato la scansione.

La soluzione migliore sarà quella di soddisfare le vostre esigenze. È possibile utilizzare ScanResult.timestamp per determinare se è necessario utilizzare questo risultato oppure no. Ad esempio, se si sta tentando di ottenere l'RSSI per ciascun punto di accesso ogni secondo, è possibile confrontare il BSSID corrente con i BSSID precedenti. Se il BSSID corrente è stato incluso in un risultato di scansione dell'ultimo secondo, puoi semplicemente ignorarlo. Quindi, non importa quanti risultati ottieni.

Un'altra soluzione molto più semplice sarà creare un booleano chiamato scanInitiated e impostarlo su true all'avvio di una scansione. Quando si riceve il broast, utilizzare i dati solo se scanInitiated è true e quindi impostare su false. Questo non è così affidabile quando gli intervalli sono brevi, ma per lunghi intervalli funzionerà alla grande.

+1

Grazie per la risposta, anche se non è stata una grande notizia. Temevo che fosse così. Ho provato l'app in un Galaxy nexus e un Nexus 7 entrambi in esecuzione jellybean (+), quindi senza fortuna neanche lì. Il problema è che il mio modello assume intervalli regolari, quindi suppongo che dovrò cambiarlo per gestire intervalli di scansione non omogenei. – while

+1

La cosa strana è che riesce a scansionare da qualche parte intorno agli intervalli di 1 sec se è impostato su 500ms, quindi deve supportarlo hardware. – while

+0

Sì, come ho suggerito nella prima soluzione: dovresti scegliere e utilizzare solo i risultati richiesti, non tutti i risultati ottenuti. Questo ti aiuterà a risolvere entrambi i problemi. – Jong

Problemi correlati