Swift通过rssi找到最接近的Beacon

时间:2015-08-05 13:57:39

标签: ios iphone ibeacon

我正在尝试iBeacon,我从Youtube学到了一些东西。这是通过接近找到最近的Beacon,但它不是很准确。所以我想通过rssi找到最接近的一个。我该如何修改代码? rssi的值总是负数,是否意味着rssi越大,最接近?

 func locationManager(manager: CLLocationManager, didRangeBeacons beacons: [CLBeacon], inRegion region: CLBeaconRegion) {
    //print(beacons)
    let knownBeacons = beacons.filter{ $0.proximity != CLProximity.Unknown }

    //print(knownBeacons)
    if(knownBeacons.count>0){
        let closestBeacon = knownBeacons[0] as CLBeacon
        self.showName.text = self.name[closestBeacon.minor.integerValue]
    }
}

1 个答案:

答案 0 :(得分:1)

RSSI的幅度越低,信号越强。换句话说,-49 dBm的RSSI表示比-59 dBm之一更强的信号(通常是更接近的信标)。

您当然可以使用RSSI计算最接近的信标,而不是使用CLBeacon精度属性,但您不会获得更一致的结果。这是因为在iOS上,RSSI的平均时间仅为1秒(使用在该时间段内检测到的数据包的所有测量值),而CLBeacon精度属性的平均值超过20秒。这意味着精度属性(以米为单位测量估计距离)更加稳定。

所以你可以试试这个:

var closestBeacon: CLBeacon? = nil
for beacon in beacons {
  if beacon.rssi < 0 && closestBeacon != nil && beacon.rssi > closestBeacon!.rssi {
    closestBeacon = beacon as? CLBeacon
  }
}

但是你会得到更稳定的结果:

var closestBeacon: CLBeacon? = nil
for beacon in beacons {
  if beacon.accuracy > 0 && closestBeacon != nil && beacon.accuracy < closestBeacon!.accuracy {
    closestBeacon = beacon as? CLBeacon
  }
}