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 використовується для оцінки відстані та фільтрації пристроїв за рівнем сигналу, але є неточним індикатором: на нього впливають перешкоди, багатопроменеве поширення та тип антени. Для точного позиціонування застосовуються тріангуляція та 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 вимірюється для кожного рекламного пакета та кожного пакета даних після підключення. Значення 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-фільтр для 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
    }
}

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

Отримання 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

        // Застосувати Kalman-фільтр
        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 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.

Обговорити проект

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