Как получить ближайший beaon в Ionic 3 - PullRequest
0 голосов
/ 25 апреля 2018

В настоящее время я работаю с iBeacons и на сегодняшний день мне удалось отсканировать и отобразить их на экране.Но затем мне сказали сканировать и отображать только для ближайшего (самого близкого) и игнорировать все остальные.Может ли кто-нибудь дать мне приблизительное представление о том, как получить ближайший маяк среди множества имеющихся у меня маяков?

Я считаю, что в этом случае я не могу использовать Близость и Точность, поскольку они часто колеблются.

В принципе, я не понял, как работать с логикой:

onBeaconsDiscovered() {
    this.delegate.didRangeBeaconsInRegion().subscribe( data => {

      if (data.beacons !== null) {
        let nearestBeacon = // { code for detecting the nearest beacon }

        // then show up a notification / alert / toast ...
      }
    });

  }

Пожалуйста, помогите!Я ценю каждую идею.

1 Ответ

0 голосов
/ 25 апреля 2018

Мой ответ о том, как это сделать в нативном коде Swift, вы можете найти здесь: Swift найти ближайший маяк по rssi

Вот прямой перевод этого кода Swift на JavaScript:

 var closestBeacon = null;
 for (var beacon in data.beacons) {
   if (beacon.rssi < 0 && closestBeacon != null && beacon.rssi > closestBeacon.rssi) {
     closestBeacon = beacon;
   }
 }

Имейте в виду, что обратный вызов this.delegate.didRangeBeaconsInRegion().subscribe( data => { будет происходить раз в секунду. Поэтому, если вы хотите выдать оповещение на основе ближайшего маяка, вам также следует позаботиться о том, чтобы не выдавать новые оповещения каждую секунду.

Если вы хотите отслеживать уже обработанные маяки, вы можете объявить новый объект в некоторой глобальной области видимости вне обратного вызова:

  var triggeredBeacons = {};

Затем, прежде чем выполнять какую-либо обработку маяка, создайте строковый ключ на основе ваших идентификаторов маяка и убедитесь, что он не сработал раньше:

  var beaconIdentifiers = beacon.uuid + " " + beacon.major + " " + beacon.minor;
  if (triggeredBeacons[beaconIdentifiers] == true) {
    // beacon has already triggered.  Ignore it
  }
  else {
    triggeredBeacons[beaconIdentifiers] = true;
    // Put your beacon processing here
  }
...