2016-10-05 2 views
0

Я стараюсь использовать приложение для навигации на открытом воздухе с использованием маяков Estimote. Вот код, который я использовал для получения расстояния между устройством Android и маяками. Эти разделы кода работают примерно через каждые 1 секунду.Выполнять метод BEACON каждые 100 миллисекунд в Android

Мне нужно выполнить это каждые 100 миллисекунд.

beaconManager.setRangingListener(new BeaconManager.RangingListener() { 
    @Override public void onBeaconsDiscovered(Region region, final List<Beacon> beacons) { 
    runOnUiThread(new Runnable() { 
     @Override public void run() { 

     long time= System.currentTimeMillis(); 
     Log.i("###################### ", " #################"); 
     Log.i("Time Class ", " Time value in millisecinds "+time); 

     toolbar.setSubtitle("Found beacons: " + beacons.size()); 
     ArrayList<Beacon> newBeacons = new ArrayList<>(); 

     for (int x=0; x<beacons.size();x++) { 
      int major= beacons.get(x).getMajor(); 
      int minor = beacons.get(x).getMinor(); 

      if (major==3&&minor==3) { 
      newBeacons.add(beacons.get(x)); 
      Dsi[0] = Utils.computeAccuracy(beacons.get(x)); 
      } 
      else if (major==4&&minor==4) { 
      newBeacons.add(beacons.get(x)); 
      Dsi[1] = Utils.computeAccuracy(beacons.get(x)); 
      } 
      else if (major==2&&minor==2) { 
      newBeacons.add(beacons.get(x)); 
      Dsi[2] = Utils.computeAccuracy(beacons.get(x)); 
      } 
     } 

     double[][] positions = new double[][] { { -3.4, 0.8}, { 0, 7.5 }, { 6.7, 6.7 } }; 
     double[] distances = new double[] { Dsi[0], Dsi[1], Dsi[2] }; 

     TrilaterationFunction trilaterationFunction = new TrilaterationFunction(positions, distances); 
     LinearLeastSquaresSolver lSolver = new LinearLeastSquaresSolver(trilaterationFunction); 
     NonLinearLeastSquaresSolver nlSolver = new NonLinearLeastSquaresSolver(trilaterationFunction, new LevenbergMarquardtOptimizer()); 

     double[] expectedPosition = new double[] { 3.3, 15.0 }; 
     RealVector x = lSolver.solve(); 
     Optimum optimum = nlSolver.solve(); 
     testResults(expectedPosition, 1, optimum, x); 
     adapter.replaceWith(newBeacons); 

     time= System.currentTimeMillis(); 
     Log.i("Time Class ", " Time value in millisecinds "+time); 
     Log.i("###################### ", " #################"); 
     } 
    }); 
    } 
}); 

Как это сделать?

+1

Вы не показываете, что инициирует показанный код. Когда это выполняется? Почему в настоящее время он ограничен 1 секундой? – davidgyoung

+0

Отредактировано код. Я не знаю причину времени, ограниченного 1 секундой. Мне нужно выполнить этот код каждые 100 миллисекунд. –

+0

Видимо вы используете Android SDK Estimote. По-видимому, умные умы в Estimote пришли к выводу, что 1-секундный интервал сканирования является оптимальным, учитывая все различные факторы, такие как частота рекламы их маяков, люди обычно движутся всего на 1 метр в секунду и т. Д. По-видимому, их SDK доступен только как AAR, поэтому обратное проектирование это немного сложнее, но не невозможно. Но, вероятно, лицензия не позволяет «взломать» ее. Я не знаю. Вероятно, где-то в классе «BeaconManager» лежит секрет частоты сканирования. –

ответ

0

У меня есть ответ на эту проблему. Вот ответ и объяснение пользователям и любителям Estimote Beacon.

Существует метод, называемый setForegroundScanPeriod в Android SDK Estimote. Этот метод реализован в BeaconManager класс. Это можно использовать для увеличения или уменьшения времени сканирования.

Это определение метода

setForegroundScanPeriod(long scanPeriodMillis,long waitTimeMillis) 

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

setForegroundScanPeriod(200,5) 

Если вы назвали, как это, тогда секция кода выполняется каждые 200 миллисекунд с 5 мс интервала времени.

Значения по умолчанию метода равны 1 с для периода времени сканирования и 0 секунд для периода ожидания. 200 мс минимальный период сканирования и 0ms - минимальный период ожидания. (если вы уменьшаете период сканирования периода сканирования, интервал вещания вашего маяка оценки должен быть уменьшен. Интервал вещания должен быть меньше периода сканирования, а также минимальный интервал вещания составляет 100 мс)

Уменьшение интервала широковещательной передачи отрицательно влияет на срок службы батареи маяка и сокращает время сканирования отрицательно влияет на время работы аккумулятора Android-устройства.

Вот полный пример, который я использовал для сканирования маяков.

BeaconManager beaconManager = new BeaconManager(this); 

beaconManager.setForegroundScanPeriod(200,0); 

beaconManager.setRangingListener(new BeaconManager.RangingListener() { 
    @Override public void onBeaconsDiscovered(Region region, final List<Beacon> beacons) { 
    runOnUiThread(new Runnable() { 
     @Override public void run() { 

     toolbar.setSubtitle("Found beacons: " + beacons.size()); 

     ArrayList<Beacon> newBeacons = new ArrayList<>(); 

     for (int x=0; x<beacons.size();x++) { 
      int major= beacons.get(x).getMajor(); 
      int minor = beacons.get(x).getMinor(); 

      if (major==3&&minor==3) { 
      newBeacons.add(beacons.get(x)); 
      Dsi[0] = Utils.computeAccuracy(beacons.get(x)); 
      } 
      else if (major==4&&minor==4) { 
      newBeacons.add(beacons.get(x)); 
      Dsi[1] = Utils.computeAccuracy(beacons.get(x)); 
      } 
      else if (major==2&&minor==2) { 
      newBeacons.add(beacons.get(x)); 
      Dsi[2] = Utils.computeAccuracy(beacons.get(x)); 
      } 
     } 

     adapter.replaceWith(newBeacons); 
     } 
    }); 
    } 
}); 
Смежные вопросы