2012-12-14 5 views
9

私は現在WiFiポジショニングのマスター論文をやり遂げており、アルゴリズムをテストするためにいくつかのデータを収集する必要がありました。AndroidでWiFiスキャン間隔を明示的に制御する方法はありますか?

これを行うには、Androidの簡単で簡単なプログラムを作成しました。各プログラムは、各スキャンで見つかった利用可能なすべてのアクセスポイントのRSSIを単純に収集し、ファイルに保存します。私は、イベントWifiManager.SCAN_RESULTS_AVAILABLE_ACTIONでリッスンBroadcastReceiverを設定していると私はTimerを使用し、ここでは次のように無線LANと呼ばれ、WifiManagerでスキャンを開始するために、ティムと呼ばれる:

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

私は今が午前問題は、ということです開始されたスキャンは、私がそれらを開始することに成功しても毎秒起こるようには見えないし、他のアプリケーションから開始された他のスキャンも記録されます。

設定された間隔で簡単にスキャンして、他のアプリからスキャンを受信しないようにする方法はありますか?

アプリ全体はhttps://github.com/while/RSSIMinerにありますが、それが何らかの形で役立ちます。

答えて

4

設定した間隔で簡単にスキャンする方法はありますか?

これがうまくいかない場合は、恐れ入りますが、私の経験から、 "ハードウェアに関連した"メソッドは、その定義のように正確に動作しないことがあります。たとえば、私は一度、あなたの位置をX分ごとに記録する小さなアプリを作成しました。そこでrequestLocationUpdatesにはminTimeというパラメータが付いています。しかし私の携帯電話は単にminTimeの値を無視しています。私が望んでいないものがあれば、すぐにGPSからアップデートを入手できます。私はここでそれについての質問を投稿し、それが今、似たようなことがありそう我々はゼリービーンに先立って、デバイスは、単にこの値を無視することを学び、そこからthis答え、...

を得ました。私はこのコードを最新のAndroidバージョンで実行しようとしています。そして、私はWifiでそれほど理解していませんが、スキャンの間隔が1秒余りではありませんか?おそらく、システムはスキャン要求を無視しないので(それはtrueを返します)、ハードウェアはどうしますか?

他のアプリからスキャンを無視することはできますか?

私が知る限り、ここでも否定的です。 SCAN_RESULTS_AVAILABLE_ACTIONブロードキャストにエキストラは含まれていないので、どのアプリがスキャンを開始したのかわからない。

最高の解決策は、要件を無視することです。 ScanResult.timestampを使用して、この結果を使用するかどうかを判断できます。たとえば、毎秒各アクセスポイントのRSSIを取得しようとしている場合、現在のBSSIDと以前のBSSIDを比較できます。現在のBSSIDが1秒前のスキャン結果に含まれていた場合、無視することができます。それで、結果がいくつあるかは関係ありません。

さらに簡単な解決策は、scanInitiatedというブール値を作成し、スキャンを開始するときにtrueに設定することです。ブローキャストを受け取ったら、scanInitiatedtrueの場合にのみデータを使用し、falseに設定します。インターバルが短い場合はこれはあまり信頼できませんが、長いインターバルの場合はうまく動作します。

+1

それは素晴らしいニュースではありませんが、応答してくれてありがとう。私はこれが事実であると恐れた。私はギャラクシーネクサスとネクサス7の両方でアプリを試してみましたが、どちらも運行していませんでした。問題は私のモデルが定期的な間隔を取るので、私はそれが非均質なスキャン間隔を扱うためにそれを変更しなければならないと思うということです。 – while

+1

奇妙なことは、500msに設定すると約1秒の間隔でどこかをスキャンすることです。ハードウェアをサポートする必要があるからです。 – while

+0

そうです、私は最初の解決策で提案したように、必要な結果だけを選んで使用しなければなりません。これは、両方の問題を解決するのに役立ちます。 – Jong