Swift iBeacon 使用准确性或 rssi 来保持距离

Swift iBeacon use accuracy or rssi for distancing

我有一个有 6 个 iBeacon 的房间,如果其中一个 iBeacon 距离设备不到 2.5 米,我会调用一个动作,但这并不是很好,因为经常有很大的干扰,导致错误的动作。 我的问题是,使用 rssi 值还是准确度对这些信标进行排序哪个更好?

在我用于 sorting/call 操作的代码下方:

if beacons.count > 0 {
        let sortedBeacons = beacons.sorted { (first, second) -> Bool in
            if first.accuracy == -1 || second.accuracy == -1 {
                return true
            }
            return first.accuracy < second.accuracy
        }
        let beacon = sortedBeacons[0]

        if beacon.major.intValue == helperMajorValue && beacon.accuracy < 2.5 {
            if beacon.accuracy != -1 {
                if triggeredMajor == 0 {
                    counter += 1
                } else if abs((helperMajorValue - triggeredMajor)) < 3 {
                    counter += 1
                }
            }
        } else {
            counter = 0
            helperMajorValue = beacon.major.intValue
        }
            if counter > 4 {
                counter = 0
                print("majorValue: \(beacon.major.intValue) distance: \(beacon.accuracy)")
                if beacon.accuracy < 2.5 {
                    startNavigation = true
                    majorValue = helperMajorValue
                    triggered = false
                }
            }

            if majorValue == 171 {
                //call action
            } else if majorValue == 170 {
                //call action
            } else if majorValue == 172 {
                //Call action
            }}

悲伤的答案是"none of the above"。 "accuracy" 读数是距信标距离的最佳来源,但它 非常 粗糙。在 phone 之上考虑远、中、近和右。试图比这更精细地评估距离是没有意义的,甚至是不确定的。无线电信号强度受许多与距离无关的变量影响,因此它不是一个非常准确的测量值。

使用 CLBeaconrssiaccuracy 字段对信标进行排序的最大区别在于可变性或数量和平均间隔。

准确度字段在大约 20 秒内取平均值,因此它实质上为您提供了设备在过去 20 秒内所处位置的估计距离。真正的优势是这个数字比 rssi噪声少得多,但是有明显的滞后

rssi 字段平均超过 1 秒,因此它使用的数据点要少得多。虽然它的时滞更少,但噪音更多。出于排序目的,如果使用 rssi,您会看到排序顺序跳跃得更多。

您必须根据@Duncan-C 在他的回答中描述的距离估计值,适当地设置您的期望值。但对于一些精度不重要的用例,它们可以很好地工作。