RSSI в BLE — что это, индикатор сигнала и оценка расстояния

Автор: IT Sectr Опубликовано: 2026-07-16 Время чтения: 10 мин

RSSI (Received Signal Strength Indicator) — это числовая метрика, измеряющая мощность сигнала BLE-устройства в dBm на приёмной стороне. Значение RSSI варьируется от -30 dBm (устройство рядом) до -100 dBm (на границе обнаружения). Bluetooth Core Specification 5.4 (2023) определяет RSSI как опциональный параметр, доступный в каждом рекламном пакете и пакете данных. RSSI используется для оценки расстояния (range estimation) и фильтрации устройств по уровню сигнала, но является неточным индикатором: на него влияют препятствия, многолучевое распространение и тип антенны. Для точного позиционирования применяются триангуляция и Kalman-фильтрация.

Главное

  • RSSI — уровень мощности BLE-сигнала в dBm, измеряемый на приёмной стороне при получении пакета.
  • Диапазон RSSI: от -30 dBm (очень сильный сигнал) до -100 dBm (предел обнаружения).
  • RSSI используется для оценки расстояния по модели Path Loss, но точность составляет ±2–5 м в реальных условиях.
  • На RSSI влияют: препятствия (стены, люди), многолучевое распространение и ориентация антенны.
  • Для улучшения точности применяются Kalman-фильтрация, скользящее среднее и триангуляция с нескольких сканеров.

Что такое RSSI в BLE?

RSSI (Received Signal Strength Indicator) — это измерение мощности радиосигнала, полученное приёмником BLE в момент приёма пакета. В BLE RSSI измеряется для каждого рекламного пакета (advertising) и каждого пакета данных после подключения. Значение RSSI — это логарифмическая шкала, где каждый шаг в 1 dBm примерно соответствует изменению мощности сигнала в 1.26 раз.

RSSI — это аппаратно-зависимый показатель: разные чипы BLE (nRF, TI, Dialog, Broadcom) и разные антенны могут показывать разные значения RSSI для одного и того же сигнала. Поэтому сравнение RSSI между разными устройствами — некорректно. Даже два одинаковых смартфона на одной ОС могут показывать разницу в 2–5 dBm для одного маячка.

В рекламном пакете RSSI измеряется для каждого из трёх каналов (37, 38, 39). Значения могут отличаться на 3–10 dBm между каналами из-за частотных помех. Современные стеки BLE сообщают усреднённое RSSI по всем каналам или RSSI для каждого пакета отдельно. iOS Core Bluetooth предоставляет среднее RSSI, Android — RSSI последнего пакета.

Диапазон значений RSSI

Типичный диапазон RSSI для BLE — от -30 dBm до -100 dBm. Значения выходят за эти границы крайне редко: -20 dBm означает, что устройство буквально касается антенны сканера, а -105 dBm — полное отсутствие сигнала. Производители чипов могут ограничивать диапазон: например, nRF52832 сообщает RSSI от -40 до -105 dBm.

RSSI (dBm)Качество сигналаПримерное расстояниеРекомендация
-30 – -50Отличное0–1 мУстройство рядом
-51 – -70Хорошее1–5 мВ пределах комнаты
-71 – -85Среднее5–15 мПриемлемо для маячков
-86 – -95Слабое15–30 мНенадёжное подключение
Ниже -95Критическое30+ мНа границе обнаружения

TX Power Level — мощность передатчика, которая указывается в advertising-пакете (AD Type 0x0A) и позволяет корректировать оценку. RSSI -70 dBm от устройства с TX Power +4 dBm означает, что сигнал ослаб на 74 dB. Если TX Power неизвестен, точная оценка расстояния невозможна. iBeacon включает TX Power (1 байт) в структуру Manufacturer Data для калибровки расстояния.

Зависимость RSSI от расстояния

Модель Path Loss (потери распространения) используется для оценки расстояния по RSSI. Базовая формула: RSSI = TX_Power - 10 × n × log10(d), где n — коэффициент затухания (2.0 для свободного пространства, 3.0–4.5 для помещений с препятствиями), d — расстояние в метрах. На практике точность оценки ±2–5 м в реальных условиях.

Для калибровки модели необходимо измерить RSSI на известном расстоянии (обычно 1 м) и вычислить TX Power reference. В iBeacon этот параметр хранится в пакете. В Eddystone используется аналогичный механизм. После калибровки можно вычислять расстояние: d = 10 ^ ((TX_Power — RSSI) / (10 × n)).

По данным Apple Core Bluetooth Programming Guide (2024), точность оценки расстояния для iBeacon составляет: immediate (<0.5 м) — при RSSI выше калибровочного, near (0.5–3 м) — при RSSI в диапазоне 3–6 dB от калибровочного, far (>3 м) — при слабом сигнале. Никакая математическая модель не даёт точности лучше ±1 м без дополнительной обработки.

Факторы, влияющие на точность RSSI

RSSI — шумный показатель, и его точность зависит от множества факторов. Основные источники погрешности: препятствия (стены, мебель, люди) ослабляют сигнал на 3–15 dB каждый, многолучевое распространение (отражения от стен) может усиливать сигнал в одних точках и ослаблять в других, ориентация антенны меняет RSSI на 3–10 dB при повороте устройства.

Человеческое тело — один из сильнейших поглотителей BLE-сигнала. Если между маячком и смартфоном находится человек, RSSI может упасть на 10–20 dB. Вода в теле человека эффективно поглощает радиоизлучение на частоте 2.4 ГГц. Поэтому маячки на дверях магазинов могут показывать разный RSSI для покупателей разного роста и комплекции.

Дополнительные факторы: Wi-Fi помехи на соседних каналах могут снижать RSSI на 3–5 dB, температура BLE-чипа влияет на точность измерения RSSI (у некоторых чипов дрейф до 1 dB/°C), деградация батареи на маячке снижает TX Power, что приводит к заниженному RSSI на приёмнике.

Фильтрация и сглаживание RSSI

Raw RSSI непригоден для точных вычислений — он содержит слишком много шума и выбросов. Для получения стабильной оценки расстояния применяются методы фильтрации. Самый простой — скользящее среднее: берётся среднее арифметическое последних N значений RSSI. N = 5–10 обычно достаточно для сглаживания кратковременных флуктуаций.

kotlin
// Kalman filter for RSSI
class RssiKalmanFilter(
    private val processNoise: Double = 0.01,
    private val measurementNoise: Double = 1.0
) {

    private var estimate: Double = 0.0
    private var errorCovariance: Double = 1.0

    fun filter(rawRssi: Double): Double {
        // Predict
        errorCovariance += processNoise

        // Update
        val kalmanGain =
            errorCovariance /
            (errorCovariance + measurementNoise)

        estimate = estimate +
            kalmanGain * (rawRssi - estimate)

        errorCovariance =
            (1.0 - kalmanGain) * errorCovariance

        return estimate
    }
}

Kalman-фильтр — более продвинутый метод, который учитывает динамику изменения RSSI и даёт меньшую задержку, чем скользящее среднее. Для стационарных маячков (неподвижных) скользящее среднее даёт приемлемый результат. Для движущихся устройств Kalman-фильтр предпочтительнее, так как он быстрее адаптируется к изменениям. Дополнительно можно использовать Median-фильтр для отбрасывания выбросов.

Получение RSSI в iOS и Android

iOS Core Bluetooth предоставляет RSSI через свойство peripheral.rssi (NSNumber) после завершения чтения RSSI. Для получения RSSI рекламного пакета используйте advertisementData[CBAdvertisementDataRSSIKey]. iOS возвращает RSSI как среднее значение по трём каналам. Для непрерывного мониторинга RSSI вызывайте readRSSI с интервалом не чаще 1 раза в секунду.

swift
// Get RSSI on iOS
func centralManager(
    _ central: CBCentralManager,
    didDiscover peripheral: CBPeripheral,
    advertisementData: [String: Any],
    rssi RSSI: NSNumber
) {
    let signalStrength = Int(truncating: RSSI)

    // Filter weak signals
    guard signalStrength > -90 else {
        return
    }

    print("Device " +
          "\(peripheral.name ?? "unknown") " +
          "RSSI: \(signalStrength) dBm")
}

Android предоставляет RSSI через callback onScanResult: result.getRssi(). Значение RSSI — это RSSI последнего рекламного пакета (не среднее). Для стабильных показаний необходимо накапливать несколько значений и применять фильтрацию. Android также предоставляет TX Power Level через result.getScanRecord().getTxPowerLevel(), если он передаётся в рекламном пакете.

kotlin
// Get RSSI on Android
private val scanCallback = object : ScanCallback() {

    override fun onScanResult(
        callbackType: Int,
        result: ScanResult
    ) {
        val rssi = result.rssi
        val txPower = result.scanRecord?.
            txPowerLevel ?: -128

        // Apply Kalman filter
        val filtered = kalmanFilter.
            filter(rssi.toDouble())

        Log.d("BLEScanner",
            "RSSI: $rssi, " +
            "Filtered: $filtered, " +
            "TX: $txPower")
    }
}

При разработке приложений, использующих RSSI для позиционирования, учитывайте: в iOS значения RSSI более стабильны благодаря аппаратной калибровке, в Android — более шумные и зависят от производителя устройства. Для кросс-платформенных проектов рекомендуется реализовать фильтрацию на стороне приложения с настраиваемыми параметрами для каждой платформы.

Часто задаваемые вопросы

Можно ли точно определить расстояние по RSSI?

Нет, RSSI даёт лишь приблизительную оценку расстояния с точностью ±2–5 м в реальных условиях. Для точного позиционирования требуется триангуляция с нескольких сканеров, Kalman-фильтрация и учёт TX Power передатчика.

Почему RSSI меняется, даже если устройство не двигается?

Из-за многолучевого распространения и флуктуаций радиосигнала. Отражения от стен и предметов создают интерференцию, при которой сигнал то усиливается, то ослабляется. Изменения RSSI на 5–10 dB на неподвижном устройстве — нормальное явление.

Как часто можно читать RSSI на iOS?

iOS рекомендует вызывать readRSSI не чаще 1 раза в секунду. Слишком частые запросы могут привести к пропуску пакетов данных. Для мониторинга RSSI при сканировании используйте CBAdvertisementDataRSSIKey, который доступен для каждого рекламного пакета.

Что такое TX Power Level и как он связан с RSSI?

TX Power Level — мощность передатчика в dBm, указанная в рекламном пакете. RSSI + TX Power = суммарное затухание сигнала на пути от передатчика к приёмнику. Зная TX Power, можно точнее оценить расстояние: RSSI - TX Power = Path Loss (потери на трассе).

Какой метод фильтрации RSSI лучше для маячков?

Для стационарных маячков — скользящее среднее с окном 5–10 значений. Для движущихся устройств — Kalman-фильтр с малым process noise (0.01–0.05). Для отбрасывания выбросов добавьте Median-фильтр, который отсекает значения за пределами 2 стандартных отклонений.

Итоги

  • RSSI — индикатор мощности сигнала BLE в dBm, измеряемый на приёмной стороне при получении каждого пакета.
  • Диапазон значений: от -30 dBm (отличный сигнал) до -100 dBm (слабый сигнал на границе обнаружения).
  • RSSI позволяет грубо оценить расстояние с точностью ±2–5 м, но не является точным дальномером из-за шумов и помех.
  • Основные источники погрешности: препятствия (стены, люди), многолучевое распространение, ориентация антенны и Wi-Fi помехи.
  • Для стабильной оценки расстояния применяются Kalman-фильтрация, скользящее среднее и Median-фильтр для отбрасывания выбросов.
  • В iOS RSSI — среднее по трём каналам, в Android — значение последнего пакета, что требует фильтрации на стороне приложения.
  • TX Power Level в рекламном пакете вместе с RSSI даёт Path Loss — суммарное затухание сигнала для более точной оценки расстояния.

Мы разработаем мобильное приложение под ключ

IT Sectr создаёт приложения для iOS и Android для стартапов и бизнеса с 2017 года. Мы проконсультируем вас и предложим наилучшее решение.

Обсудить проект

Читайте также