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) и филтриране на устройства по ниво на сигнала, но е неточен индикатор: влияят му препятствия, многопътно разпространение и тип антена. За точно позициониране се прилагат триангулация и калманова филтрация.

Основни точки

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

Какво е 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 за един и същ beacon.

В рекламния пакет 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 mУстройство наблизо
-51 – -70Добро1–5 mВ рамките на стаята
-71 – -85Средно5–15 mПриемливо за beacon
-86 – -95Слабо15–30 mНенадеждна връзка
Под -95Критично30+ mНа границата на откриване

TX Power Level — мощност на предавателя, която се посочва в рекламния пакет (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 m в реални условия.

За калибриране на модела е необходимо да се измери RSSI на известно разстояние (обикновено 1 m) и да се изчисли референтната стойност на TX Power. В iBeacon този параметър се съхранява в пакета. В Eddystone се използва подобен механизъм. След калибриране може да се изчисли разстоянието: d = 10 ^ ((TX_Power — RSSI) / (10 × n)).

Според Apple Core Bluetooth Programming Guide (2024), точността на оценка на разстояние за iBeacon е: immediate (<0,5 m) — когато RSSI е по-високо от калибрационната стойност, near (0,5–3 m) — когато RSSI е в диапазона 3–6 dB от калибрационната стойност, far (>3 m) — при слаб сигнал. Никой математически модел не дава точност, по-добра от ±1 m, без допълнителна обработка.

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

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

Човешкото тяло е един от най-силните абсорбатори на BLE сигнал. Ако между beacon и смартфон има човек, RSSI може да падне с 10–20 dB. Водата в човешкото тяло ефективно абсорбира радиоизлъчването на честота 2,4 GHz. Затова beacon на вратите на магазини могат да показват различен RSSI за клиенти с различен ръст и телосложение.

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

Филтрация и изглаждане на RSSI

Суровият RSSI не е подходящ за точни изчисления — съдържа твърде много шум и отклоняващи се стойности. За получаване на стабилна оценка на разстояние се прилагат методи за филтрация. Най-простият — плъзгаща се средна стойност: взима се средноаритметичното на последните N RSSI стойности. N = 5–10 обикновено е достатъчно за изглаждане на краткотрайни флуктуации.

kotlin
// Калманов филтър за 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 {
        // Прогнозирай
        errorCovariance += processNoise

        // Актуализирай
        val kalmanGain =
            errorCovariance /
            (errorCovariance + measurementNoise)

        estimate = estimate +
            kalmanGain * (rawRssi - estimate)

        errorCovariance =
            (1.0 - kalmanGain) * errorCovariance

        return estimate
    }
}

Калманов филтър — по-напреднал метод, който отчита динамиката на промените в RSSI и дава по-малко закъснение от плъзгащата се средна стойност. За стационарни beacon (неподвижни) плъзгащата се средна стойност дава приемлив резултат. За движещи се устройства калмановият филтър е за предпочитане, тъй като се адаптира по-бързо към промените. Допълнително може да се използва Медианен филтър за отстраняване на отклоняващи се стойности.

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

iOS Core Bluetooth предоставя RSSI чрез свойството peripheral.rssi (NSNumber) след завършване на четенето на RSSI. За получаване на RSSI на рекламния пакет използвайте advertisementData[CBAdvertisementDataRSSIKey]. iOS връща RSSI като средна стойност за трите канала. За непрекъснато наблюдение на RSSI извиквайте readRSSI с интервал не по-често от 1 път в секунда.

swift
// Получи RSSI на iOS
func centralManager(
    _ central: CBCentralManager,
    didDiscover peripheral: CBPeripheral,
    advertisementData: [String: Any],
    rssi RSSI: NSNumber
) {
    let signalStrength = Int(truncating: RSSI)

    // Филтрирай слаби сигнали
    guard signalStrength > -90 else {
        return
    }

    print("Устройство " +
          "\(peripheral.name ?? "unknown") " +
          "RSSI: \(signalStrength) dBm")
}

Android предоставя RSSI чрез callback onScanResult: result.getRssi(). Стойността на RSSI е RSSI на последния рекламен пакет (не средна стойност). За стабилни показания е необходимо да се натрупат няколко стойности и да се приложи филтрация. Android също така предоставя TX Power Level чрез result.getScanRecord().getTxPowerLevel(), ако се предава в рекламния пакет.

kotlin
// Получи RSSI на Android
private val scanCallback = object : ScanCallback() {

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

        // Приложи калманов филтър
        val filtered = kalmanFilter.
            filter(rssi.toDouble())

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

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

Често задавани въпроси

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

Не, RSSI дава само приблизителна оценка на разстоянието с точност ±2–5 m в реални условия. За точно позициониране се изисква триангулация от няколко скенера, калманова филтрация и отчитане на 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 е най-добър за beacon?

За стационарни beacon — плъзгаща се средна стойност с прозорец от 5–10 стойности. За движещи се устройства — калманов филтър с малък шум на процеса (0,01–0,05). За отстраняване на отклоняващи се стойности добавете Медианен филтър, който отрязва стойности извън 2 стандартни отклонения.

Обобщение

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

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

IT Sectr създава iOS и Android приложения за стартъпи и бизнеси от 2017 г. Ще ви консултираме и ще предложим най-доброто решение.

Обсъдете проекта

Прочетете също