RSSI (Received Signal Strength Indicator) — е числова метрика, която измерва мощността на сигнала на BLE устройство в dBm от приемащата страна. Стойността на RSSI варира от -30 dBm (устройство наблизо) до -100 dBm (на границата на откриване). Bluetooth Core Specification 5.4 (2023) определя RSSI като опционален параметър, достъпен във всеки рекламен пакет и пакет с данни. RSSI се използва за оценка на разстояние (range estimation) и филтриране на устройства по ниво на сигнала, но е неточен индикатор: влияят му препятствия, многопътно разпространение и тип антена. За точно позициониране се прилагат триангулация и калманова филтрация.
Основни точки
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 за 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 за калибриране на разстояние.
Моделът 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 е шумен показател и неговата точност зависи от много фактори. Основните източници на грешка: препятствия (стени, мебели, хора) отслабват сигнала с 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 не е подходящ за точни изчисления — съдържа твърде много шум и отклоняващи се стойности. За получаване на стабилна оценка на разстояние се прилагат методи за филтрация. Най-простият — плъзгаща се средна стойност: взима се средноаритметичното на последните N RSSI стойности. N = 5–10 обикновено е достатъчно за изглаждане на краткотрайни флуктуации.
// Калманов филтър за 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 (неподвижни) плъзгащата се средна стойност дава приемлив резултат. За движещи се устройства калмановият филтър е за предпочитане, тъй като се адаптира по-бързо към промените. Допълнително може да се използва Медианен филтър за отстраняване на отклоняващи се стойности.
iOS Core Bluetooth предоставя RSSI чрез свойството peripheral.rssi (NSNumber) след завършване на четенето на RSSI. За получаване на RSSI на рекламния пакет използвайте advertisementData[CBAdvertisementDataRSSIKey]. iOS връща RSSI като средна стойност за трите канала. За непрекъснато наблюдение на RSSI извиквайте readRSSI с интервал не по-често от 1 път в секунда.
// Получи 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(), ако се предава в рекламния пакет.
// Получи 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 дава само приблизителна оценка на разстоянието с точност ±2–5 m в реални условия. За точно позициониране се изисква триангулация от няколко скенера, калманова филтрация и отчитане на TX Power на предавателя.
Поради многопътно разпространение и флуктуации на радиосигнала. Отраженията от стени и предмети създават интерференция, при която сигналът ту се усилва, ту отслабва. Промените на RSSI с 5–10 dB на неподвижно устройство са нормално явление.
iOS препоръчва извикване на readRSSI не по-често от 1 път в секунда. Твърде честите заявки могат да доведат до пропускане на пакети с данни. За наблюдение на RSSI по време на сканиране използвайте CBAdvertisementDataRSSIKey, който е достъпен за всеки рекламен пакет.
TX Power Level — мощност на предавателя в dBm, посочена в рекламния пакет. RSSI + TX Power = общо затихване на сигнала по пътя от предавателя до приемника. Познавайки TX Power, може по-точно да се оцени разстоянието: RSSI - TX Power = Path Loss (загуби по трасето).
За стационарни beacon — плъзгаща се средна стойност с прозорец от 5–10 стойности. За движещи се устройства — калманов филтър с малък шум на процеса (0,01–0,05). За отстраняване на отклоняващи се стойности добавете Медианен филтър, който отрязва стойности извън 2 стандартни отклонения.
Обобщение
Ще разработим мобилно приложение под ключ
IT Sectr създава iOS и Android приложения за стартъпи и бизнеси от 2017 г. Ще ви консултираме и ще предложим най-доброто решение.
Прочетете също