9

私は現在WiFiポジショニングについて修士論文を書いています。アルゴリズムをテストするために、いくつかのデータを収集する必要がありました。

これを行うために、各スキャンで検出されたすべての利用可能なアクセスポイントのRSSIを収集し、それらをファイルに保存する、Android用の短くて非常に単純なプログラムを作成しました。BroadcastReceiverイベントをリッスンするを設定しました。ここではtimと呼ばれるWifiManager.SCAN_RESULTS_AVAILABLE_ACTIONを使用して、wifiと呼ばれるでスキャンを次のように開始します。TimerWifiManager

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

私が今抱えている問題は、開始に成功したとしても、開始されたスキャンが毎秒発生しないように見えることです。また、他のアプリから開始された他のスキャンも記録されることがあります。

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

アプリ全体が何らかの形で役立つ場合は、 https://github.com/while/RSSIMinerで見つけることができます。

4

1 に答える 1

4

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

これがうまくいかない場合、私は恐れていません。私の経験から、「ハードウェア関連」のメソッドは、その定義が示すとおりに機能しない可能性があります。たとえば、私はかつてX分ごとにあなたの位置を記録する小さなアプリを作成しました。だから私requestLocationUpdatesはいくつかのminTimeパラメータで呼び出します。しかし、私の電話は単に値を無視しminTime、GPSが利用可能になるとすぐに更新を取得しますが、それは私が望んでいたものではありません。私はそれについての質問をここに投稿し、この答えを得ました。それから、ジェリービーンズの前に、デバイスは単にこの値を無視する可能性があることがわかりました...

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

他のアプリによって開始されたスキャンを無視できますか?

私の知る限り、ここでもネガティブです。ブロードキャストには追加機能が含まれてSCAN_RESULTS_AVAILABLE_ACTIONいないため、どのアプリがスキャンを開始したかを知ることはできません。

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

もう1つの、はるかに簡単な解決策は、と呼ばれるブール値を作成し、スキャンを開始するときにscanInitiatedそれを設定することです。ブローキャストを受信するときはtrue、がの場合にのみデータを使用し、に設定してください。間隔が短い場合、これはそれほど信頼できませんが、間隔が長い場合はうまく機能します。scanInitiatedtruefalse

于 2012-12-14T21:27:12.833 に答える