简体   繁体   English

信标距离与Eddystone显示错误的值

[英]Beacon distance shows wrong values with Eddystone

I am getting wrong distance when I choose Eddystone protocol to my Kontakt beacon. 当我向Kontakt信标选择Eddystone协议时,我走错了距离。

For Kontakt there is different values of RSSI : 对于Kontakt,有RSSI的不同值:

Tx Power            RSSI for ibeacon @ 1m             RSSI for Eddystone @ 0m

0 (-30dBm)                -115                           -74
1 (-20dBm)                -84                            -43
2 (-16dBm)                -81                            -40
3 (-12dBm)                -77                            -36
4 (-8dBm)                 -72                            -31
5 (-4dBm)                 -69                            -28
6 (0dBm)                  -65                            -24
7 (4dBm)                  -59                            -18

Why all the distances are so far when using Eddystone and when i use iBeacon everything works fine? 为什么当使用Eddystone时所有距离都这么远,而当我使用iBeacon时一切正常?

Here is an example of my code : 这是我的代码的示例:

public static let signalLossAtOneMeter: Int = -41

public static func calculateDistance(rssi: Float, calibratedRssi: Float, calibratedDistance: Float, pathLossParameter: Float) -> Float {
    return calculateDistance(rssi: rssi,
                             calibratedRssi: getCalibratedRssiAtOneMeter(calibratedRssi: calibratedRssi, calibratedDistance: calibratedDistance),
        pathLossParameter: BeaconDistanceCalculator.pathLossParameter)
}

public static func getCalibratedRssiAtOneMeter(calibratedRssi: Float, calibratedDistance: Float) -> Float {
    let calibratedRssiAtOneMeter: Float

    if calibratedDistance == IBeacon.calibrationDistanceDefault {
        calibratedRssiAtOneMeter = calibratedRssi
    } else if calibratedDistance == Eddystone.calibrationDistanceDefault {
        calibratedRssiAtOneMeter = calibratedRssi + Float(BeaconDistanceCalculator.signalLossAtOneMeter)
    } else {
        calibratedRssiAtOneMeter = -62
    }

    return calibratedRssiAtOneMeter
}

public static func calculateDistance(rssi: Float, calibratedRssi: Float, pathLossParameter: Float) -> Float {
    return pow(10, (calibratedRssi - rssi) / (10 * pathLossParameter)) as Float
}

I'm not sure what the logic in the getCalibratedRssiAtOneMeter method is intending to accomplish -- this should be a fixed value for each beacon based on the strength of its transmitter in the location it is in installed. 我不确定getCalibratedRssiAtOneMeter方法中的逻辑打算完成什么-根据每个信标的发射器在安装位置的强度,这应该是一个固定值。 You should actually measure this rather than use a manufacturer's lookup table, because it might vary due to reflections (some nearby objects act as a "backplane" and strengthen the signal) and some others attenuate it. 实际上,您应该测量它而不是使用制造商的查找表,因为它可能由于反射而变化(一些附近的物体充当“背板”并增强信号),而另一些衰减它。

The key thing for Eddystone is that it encodes is calibrated RSSI inside the beacon packet as a 0m reference value instead of iBeacon's 1m reference value. Eddystone的关键在于,它将信标数据包中经过校准的RSSI编码为0m参考值,而不是iBeacon的1m参考值。 This effectively means that after reading the constant out of the Eddystone packet, you must add -41 to the constant before plugging it into your formula. 这实际上意味着在从Eddystone数据包中读取常数之后,必须在常数之前添加-41才能将其插入公式中。 This will convert a 0m reference value into a 1m reference value. 这会将0m参考值转换为1m参考值。

If you don't do this conversion, the distance estimates will appear way too far on Eddystone. 如果不进行此转换,则距离估算值在Eddystone上显得太远了。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM