Расстояние маяка показывает неправильные значения с Eddystone - PullRequest
0 голосов
/ 24 октября 2018

Я получаю неправильное расстояние, когда выбираю протокол 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
}

1 Ответ

0 голосов
/ 24 октября 2018

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

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

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

...