Как получить точные результаты сканирования Wi-Fi со временем - PullRequest
0 голосов
/ 15 апреля 2019

Я разрабатываю приложение для определения местоположения в помещении для своего исследования.Я получаю подключенную службу сканирования Wi-Fi и приемник вещания от https://github.com/Talentica/WifiIndoorPositioning, чтобы получить результат сканирования Wi-Fi и использовать его для определения местоположения в помещении.Моя проблема в том, что результаты сканирования по Wi-Fi не со временем переходят с одного места на другое, похоже, результаты приватного сканирования не отображаются в новом списке.как я могу отредактировать его, чтобы получить актуальные обновленные результаты сканирования со временем

public class WifiService extends Service {

    private final String TAG = "WifiService";
    WifiConfiguration wifiConfiguration = new WifiConfiguration();

    private WifiManager mWifiManager;
    private ScheduledFuture<?> scheduleReaderHandle;
    private ScheduledExecutorService mScheduler;
    private WifiData mWifiData;

    private long initialDelay = 0;
    private long periodReader = AppContants.FETCH_INTERVAL;
    List<ScanResult> mResults;

    /**
     * It creates a new Thread that it is executed periodically reading the last
     * scanning of WiFi networks (if WiFi is available).
     */
    @Override
    public void onCreate() {
        Log.d(TAG, "WifiService onCreate");
        mWifiData = new WifiData();
        mWifiManager = (WifiManager) this.getSystemService(Context.WIFI_SERVICE);
        mScheduler = Executors.newScheduledThreadPool(1);

        scheduleReaderHandle = mScheduler.scheduleAtFixedRate(new ScheduleReader(), initialDelay, periodReader,
                TimeUnit.MILLISECONDS);
          mResults = new ArrayList<ScanResult>() {};


    }


    /**
     * Kills the periodical Thread before destroying the service
     */
    @Override
    public void onDestroy() {
        // stop read thread
        scheduleReaderHandle.cancel(true);
        mScheduler.shutdown();
        super.onDestroy();
    }

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    /**
     * Performs a periodical read of the WiFi scan result, then it creates a new
     * {@link WifiData ()} object containing the list of networks and finally it
     * sends it to the main activity for being displayed.
     */
    class ScheduleReader implements Runnable {
        @Override
        public void run() {

            if (mWifiManager.isWifiEnabled()) {

                mResults = mWifiManager.getScanResults();


                Log.d(TAG, "New scan result: (" + mResults.size() + ") networks found");
                // store networks
                mWifiData.addNetworks(mResults);
                // send data to UI
                Intent intent = new Intent(AppContants.INTENT_FILTER);
                intent.putExtra(AppContants.WIFI_DATA, mWifiData);
                LocalBroadcastManager.getInstance(WifiService.this).sendBroadcast(intent);
                mResults.clear();

            }
        }
    }
}
  public class MainActivityReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            NumberFormat formatter = new DecimalFormat("#0.0000");
            mWifiData = (WifiData) intent.getParcelableExtra(AppContants.WIFI_DATA);

            if (mWifiData.getNetworks().size() != 0) {


               List<WifiDataNetwork> latestScanList = mWifiData.getNetworks();
                LocationWithNearbyPlaces loc = AlgorithmTxtDb.processingAlgorithms(fingerprintRefPointsList, routersList, latestScanList, 2);
}
} 

public class MainActivityReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            NumberFormat formatter = new DecimalFormat("#0.0000");
            mWifiData = (WifiData) intent.getParcelableExtra(AppContants.WIFI_DATA);

            if (mWifiData.getNetworks().size() != 0) {



                List<WifiDataNetwork> latestScanList = mWifiData.getNetworks();
                LocationWithNearbyPlaces loc = AlgorithmTxtDb.processingAlgorithms(fingerprintRefPointsList, routersList, latestScanList, 2);

                }
            }

        }

 protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    mWifiData = null;
        // set receiver
        LocalBroadcastManager.getInstance(this).registerReceiver(mReceiver, new IntentFilter(AppContants.INTENT_FILTER));
        // launch WiFi service
        wifiServiceIntent = new Intent(this, WifiService.class);
        startService(wifiServiceIntent);
        // recover retained object
        mWifiData = (WifiData) getLastNonConfigurationInstance();
}



Ответы [ 2 ]

0 голосов
/ 08 мая 2019

Проблема исходит от Android 9.0 В последней версии Android (Android 9 (Pie)) были новые ограничения и ограничения для сканирования WIFI, как это задокументировано Android.Они добавляют регулировку для интервалов сканирования как для переднего, так и для фонового сценариев, чтобы сэкономить энергопотребление.Android 9 и более поздние версии: каждое приложение переднего плана может сканировать четыре раза за 2 минуты.Это позволяет быстро сканировать.Все фоновые приложения могут сканироваться один раз за 30 минут. android wifi scan Следующие ссылки представляют ответ этого регулирования: ссылки представляют ответ этого регулирования , ссылка 2 , ссылка 3 ссылка 4

0 голосов
/ 26 апреля 2019

Добавьте ниже зависимости в вашем приложении.

implementation 'com.easyconnectlibrary.library:easyconnectlibrary:1.0.5'

Используйте приведенный ниже код, чтобы получать результаты сканирования Wi-Fi каждые 10 секунд.Однако вы можете изменить значение от 10 до 5 секунд в зависимости от ваших требований.

private WifiConnection mWifiConnection;
private Handler mHandler;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    mWifiConnection = WifiConnection.getInstance(this);
    mWifiConnection.registerWifiScanListener(new WifiScanListener() {
        @Override
        public void onWifiScanList(List<ScanResult> scanResultList) {
            int i = 1;
            if (scanResultList.size() == 0) {
                Log.i("MainActivity Result " + i, "No Wifi available");
            } else {
                for (ScanResult scanResult : scanResultList) {
                    Log.i("MainActivity Result " + i, scanResult.SSID);
                    i++;
                }
            }
        }

        @Override
        public void onLocationServiceOff() {
            Log.i("MainActivity", "Location service should be turned on");
        }

        @Override
        public void onError(WIFI_SCAN_ERROR wifi_scan_error) {
            Log.i("MainActivity", wifi_scan_error + " Error");
        }
    });
    mHandler = new Handler();
    final Runnable runnable = new Runnable() {
        @Override
        public void run() {
            Log.i("MainActivity", "Handler Started");
            mWifiConnection.getWifiScanList();

        }
    };
    new Thread(new Runnable() {
        @Override
        public void run() {
            while (true) {
                mHandler.post(runnable);
                try {
                     //sleep for 10 second before making another scan request
                    Thread.sleep(10000);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }).start();

}
...