Есть ли способ явно контролировать интервалы сканирования WiFi в Android?

В настоящий момент я занимаюсь магистерской диссертацией по позиционированию WiFi и для проверки своих алгоритмов мне нужно собрать некоторые данные.

Для этого я написал короткую и очень простую программу для Android, которая просто собирает RSSI для всех доступных точек доступа, найденных при каждом сканировании, и сохраняет их в файл. Я настроил BroadcastReceiver который прослушивает событие WifiManager.SCAN_RESULTS_AVAILABLE_ACTION и я использую Timer , здесь называемый tim, для WifiManager сканирования с помощью WifiManager , называемого wifi следующим образом:

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

Проблема, с которой я сталкиваюсь сейчас, заключается в том, что инициированные проверки не кажутся каждый раз, даже если мне удастся инициировать их, и время от времени появляются другие сканы, инициированные из другого приложения, которое также записывается.

Есть ли простой способ сканирования по заданному интервалу и не получать сканирование, инициированное каким-либо другим приложением?

Все приложение можно найти на https://github.com/while/RSSIMiner, если оно помогает в любом случае.

Solutions Collecting From Web of "Есть ли способ явно контролировать интервалы сканирования WiFi в Android?"

Есть ли простой способ сканирования по заданному интервалу?

Если это не работает, я боюсь, что нет. По моему опыту, методы, связанные с оборудованием, могут работать не так, как указано в их определении. Например, однажды я создал небольшое приложение, которое записывает вашу позицию каждые X минут. Поэтому я вызываю requestLocationUpdates с некоторым параметром minTime . Но мой телефон просто игнорирует значение minTime , и я получаю обновления от GPS, как только они доступны, чего я не хотел. Я разместил здесь вопрос об этом, и получил этот ответ, из которого мы узнаем, что перед желеобразным компонентом устройства могут просто игнорировать это значение …

Так что теперь может быть что-то подобное. Я попытаюсь запустить этот код на последней версии Android. И я не так много понимаю в Wifi, но не на 1 секунду слишком частый интервал для сканирования? Возможно, система не игнорирует запрос на сканирование (So возвращает true ), но аппаратное обеспечение делает?

Можем ли мы игнорировать сканирование, инициированное каким-либо другим приложением?

Насколько я знаю, здесь тоже отрицательный. Нет никаких дополнений, содержащихся в SCAN_RESULTS_AVAILABLE_ACTION передаче SCAN_RESULTS_AVAILABLE_ACTION поэтому вы не можете знать, какое приложение инициировало сканирование.

Лучшим решением будет определение ваших требований. Вы можете использовать ScanResult.timestamp чтобы определить, следует ли использовать этот результат или нет. Например, если вы пытаетесь получить RSSI для каждой точки доступа каждую секунду, вы можете сравнить текущий BSSID с предыдущими BSSID. Если текущий BSSID был включен в результат сканирования с последней секунды, вы можете просто проигнорировать его. Тогда неважно, сколько результатов вы получите.

Другим, гораздо более простым решением будет создание логического типа scanInitiated и установка его true при запуске сканирования. При получении broacast используйте данные только в том случае, если scanInitiated true , а затем установите значение false . Это не так надежно, когда интервалы короткие, но с большими интервалами он будет работать отлично.