我正在尝试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]
}
}
答案 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
}
}