Расстояние маяка показывает неправильные значения с Eddystone

Я получаю неправильное расстояние, когда выбираю протокол Eddystone для своего маяка Kontakt.

Для 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

Почему при использовании Eddystone все расстояния такие большие, а при использовании iBeacon все работает нормально?

Вот пример моего кода:

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
}

person Greg    schedule 24.10.2018    source источник
comment
Просто дикая догадка... какие калиброванные значения Rssi вы получаете в обоих случаях и как вы их получаете? Я просто думаю о случае, когда калиброванный Rssi уже пересчитан на @ 1 м для Eddystone (по используемой вами библиотеке), и вы делаете это снова   -  person Dietatko    schedule 24.10.2018
comment
Я получаю калиброванный Rssi из второго байта кадра UID.   -  person Greg    schedule 24.10.2018
comment
Еще одна дикая догадка. Вы уверены, что для Eddystone в getCalibratedRssiAtOneMeter выбрана правильная ветвь if? Разве -62 не добавлено вместо -41 из-за ошибки кодирования где-то еще?   -  person Dietatko    schedule 24.10.2018
comment
Да, я проверяю   -  person Greg    schedule 25.10.2018


Ответы (1)


Я не уверен, что логика в методе getCalibratedRssiAtOneMeter предназначена для выполнения - это должно быть фиксированное значение для каждого маяка, основанное на силе его передатчика в месте, где он установлен. Вы должны на самом деле измерить это, а не использовать справочную таблицу производителя, потому что оно может меняться из-за отражений (некоторые близлежащие объекты действуют как «объединительная панель» и усиливают сигнал), а некоторые другие ослабляют его.

Ключевым моментом для Eddystone является то, что он кодирует калиброванный RSSI внутри пакета маяка как эталонное значение 0 м вместо эталонного значения iBeacon 1 м. Фактически это означает, что после чтения константы из пакета Eddystone вы должны добавить -41 к константе, прежде чем вставлять ее в свою формулу. Это преобразует опорное значение 0 м в опорное значение 1 м.

Если вы не сделаете это преобразование, оценки расстояния на Eddystone будут отображаться слишком далеко.

person davidgyoung    schedule 24.10.2018
comment
getCalibratedRssiAtOneMeter() сделайте точно так, как вы упомянули в последнем абзаце, он добавляет -41 к Eddystone и принимает такое же значение для iBeacon. Итак, вы говорите мне, что если я это сделаю, расстояние будет близко к расстоянию, рассчитанному, когда это маяк? - person Greg; 24.10.2018
comment
Опять же, я не понимаю всей логики в getCalibraredRssiAtOneMeter. Похоже, там больше кода, чем нужно просто для настройки любого откалиброванного eddystone rssi на -41, поэтому я обеспокоен тем, что он может не делать того, что вы ожидаете. Но, да, вам нужно сделать эту настройку. - person davidgyoung; 24.10.2018