当前我正在与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 ...
}
});
}
请帮忙!我感谢每个主意。
您可以在此处看到我在本机Swift代码中执行此操作的答案:Swift查找rssi
的最接近信标这是该快速代码的直接翻译为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
}