RSSI (Received Signal Strength Indicator) — este o metrică numerică care măsoară puterea semnalului unui dispozitiv BLE în dBm la partea receptoare. Valoarea RSSI variază de la -30 dBm (dispozitiv în apropiere) până la -100 dBm (la limita de detectare). Bluetooth Core Specification 5.4 (2023) definește RSSI ca un parametru opțional disponibil în fiecare pachet de publicitate și pachet de date. RSSI este utilizat pentru estimarea distanței (range estimation) și filtrarea dispozitivelor după nivelul semnalului, dar este un indicator inexact: îl influențează obstacolele, propagarea pe mai multe căi și tipul antenei. Pentru poziționare precisă se aplică triangularea și filtrarea Kalman.
Principalele puncte
RSSI (Received Signal Strength Indicator) — este măsurarea puterii semnalului radio primit de receptorul BLE în momentul primirii pachetului. În BLE, RSSI se măsoară pentru fiecare pachet de publicitate (advertising) și pentru fiecare pachet de date după conectare. Valoarea RSSI este o scară logaritmică, unde fiecare pas de 1 dBm corespunde aproximativ unei modificări a puterii semnalului de 1,26 ori.
RSSI este un indicator dependent de hardware: diferite cipuri BLE (nRF, TI, Dialog, Broadcom) și diferite antene pot afișa valori RSSI diferite pentru același semnal. Prin urmare, compararea RSSI între diferite dispozitive este incorectă. Chiar și două smartphone-uri identice cu același sistem de operare pot prezenta o diferență de 2–5 dBm pentru același beacon.
În pachetul de publicitate, RSSI se măsoară pentru fiecare dintre cele trei canale (37, 38, 39). Valorile pot difera cu 3–10 dBm între canale din cauza interferențelor de frecvență. Stivele moderne BLE raportează RSSI mediat pe toate canalele sau RSSI pentru fiecare pachet separat. iOS Core Bluetooth furnizează RSSI mediu, Android — RSSI al ultimului pachet.
Intervalul tipic RSSI pentru BLE este de la -30 dBm la -100 dBm. Valorile în afara acestor limite sunt extrem de rare: -20 dBm înseamnă că dispozitivul atinge literalmente antena scanerului, iar -105 dBm — absența completă a semnalului. Producătorii de cipuri pot limita intervalul: de exemplu, nRF52832 raportează RSSI de la -40 la -105 dBm.
| RSSI (dBm) | Calitatea semnalului | Distanța aproximativă | Recomandare |
|---|---|---|---|
| -30 – -50 | Excelentă | 0–1 m | Dispozitiv în apropiere |
| -51 – -70 | Bună | 1–5 m | În interiorul camerei |
| -71 – -85 | Medie | 5–15 m | Acceptabil pentru beacon-uri |
| -86 – -95 | Slabă | 15–30 m | Conexiune nesigură |
| Sub -95 | Critică | 30+ m | La limita de detectare |
TX Power Level — puterea emitătorului, care este indicată în pachetul de publicitate (AD Type 0x0A) și permite corectarea estimării. RSSI -70 dBm de la un dispozitiv cu TX Power +4 dBm înseamnă că semnalul s-a atenuat cu 74 dB. Dacă TX Power este necunoscut, estimarea exactă a distanței este imposibilă. iBeacon include TX Power (1 octet) în structura Manufacturer Data pentru calibrarea distanței.
Modelul Path Loss (pierderi de propagare) este utilizat pentru estimarea distanței pe baza RSSI. Formula de bază: RSSI = TX_Power - 10 × n × log10(d), unde n — coeficientul de atenuare (2,0 pentru spațiu liber, 3,0–4,5 pentru încăperi cu obstacole), d — distanța în metri. În practică, acuratețea estimării este de ±2–5 m în condiții reale.
Pentru calibrarea modelului, este necesar să se măsoare RSSI la o distanță cunoscută (de obicei 1 m) și să se calculeze referința TX Power. În iBeacon, acest parametru este stocat în pachet. În Eddystone se utilizează un mecanism similar. După calibrare, se poate calcula distanța: d = 10 ^ ((TX_Power — RSSI) / (10 × n)).
Conform Apple Core Bluetooth Programming Guide (2024), acuratețea estimării distanței pentru iBeacon este: immediate (<0,5 m) — când RSSI este peste valoarea de calibrare, near (0,5–3 m) — când RSSI este în intervalul 3–6 dB de la valoarea de calibrare, far (>3 m) — la semnal slab. Niciun model matematic nu oferă o precizie mai bună de ±1 m fără procesare suplimentară.
RSSI este un indicator zgomotos, iar acuratețea sa depinde de mai mulți factori. Principalele surse de eroare: obstacolele (pereți, mobilă, oameni) atenuează semnalul cu 3–15 dB fiecare, propagarea pe mai multe căi (reflexii de pe pereți) poate amplifica semnalul în unele puncte și atenua în altele, orientarea antenei modifică RSSI cu 3–10 dB la rotirea dispozitivului.
Corpul uman este unul dintre cei mai puternici absorbanți ai semnalului BLE. Dacă între beacon și smartphone se află o persoană, RSSI poate scădea cu 10–20 dB. Apa din corpul uman absoarbe eficient radiațiile radio la frecvența de 2,4 GHz. De aceea, beacon-urile de pe ușile magazinelor pot afișa RSSI diferit pentru clienți cu înălțime și constituție diferite.
Factori suplimentari: interferențele Wi-Fi pe canalele adiacente pot reduce RSSI cu 3–5 dB, temperatura cipului BLE influențează acuratețea măsurării RSSI (la unele cipuri derivă de până la 1 dB/°C), degradarea bateriei în beacon reduce TX Power, ceea ce duce la un RSSI subestimat la receptor.
RSSI brut nu este potrivit pentru calcule precise — conține prea mult zgomot și valori aberante. Pentru a obține o estimare stabilă a distanței se aplică metode de filtrare. Cea mai simplă — media mobilă: se calculează media aritmetică a ultimelor N valori RSSI. N = 5–10 este de obicei suficient pentru netezirea fluctuațiilor de scurtă durată.
// Filtrul Kalman pentru 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 {
// Prezice
errorCovariance += processNoise
// Actualizează
val kalmanGain =
errorCovariance /
(errorCovariance + measurementNoise)
estimate = estimate +
kalmanGain * (rawRssi - estimate)
errorCovariance =
(1.0 - kalmanGain) * errorCovariance
return estimate
}
}
Filtrul Kalman — o metodă mai avansată care ia în considerare dinamica modificărilor RSSI și oferă o întârziere mai mică decât media mobilă. Pentru beacon-uri staționare (imobile), media mobilă oferă un rezultat acceptabil. Pentru dispozitive în mișcare, filtrul Kalman este preferabil, deoarece se adaptează mai rapid la modificări. Suplimentar, se poate utiliza filtrul Median pentru eliminarea valorilor aberante.
iOS Core Bluetooth furnizează RSSI prin proprietatea peripheral.rssi (NSNumber) după finalizarea citirii RSSI. Pentru a obține RSSI al pachetului de publicitate, utilizați advertisementData[CBAdvertisementDataRSSIKey]. iOS returnează RSSI ca valoare medie pe trei canale. Pentru monitorizarea continuă a RSSI, apelați readRSSI cu un interval de cel mult 1 dată pe secundă.
// Obține RSSI pe iOS
func centralManager(
_ central: CBCentralManager,
didDiscover peripheral: CBPeripheral,
advertisementData: [String: Any],
rssi RSSI: NSNumber
) {
let signalStrength = Int(truncating: RSSI)
// Filtrează semnalele slabe
guard signalStrength > -90 else {
return
}
print("Dispozitiv " +
"\(peripheral.name ?? "unknown") " +
"RSSI: \(signalStrength) dBm")
}
Android furnizează RSSI prin callback-ul onScanResult: result.getRssi(). Valoarea RSSI este RSSI al ultimului pachet de publicitate (nu media). Pentru citiri stabile, este necesar să se acumuleze mai multe valori și să se aplice filtrarea. Android oferă, de asemenea, TX Power Level prin result.getScanRecord().getTxPowerLevel(), dacă este transmis în pachetul de publicitate.
// Obține RSSI pe Android
private val scanCallback = object : ScanCallback() {
override fun onScanResult(
callbackType: Int,
result: ScanResult
) {
val rssi = result.rssi
val txPower = result.scanRecord?.
txPowerLevel ?: -128
// Aplică filtrul Kalman
val filtered = kalmanFilter.
filter(rssi.toDouble())
Log.d("BLEScanner",
"RSSI: $rssi, " +
"Filtered: $filtered, " +
"TX: $txPower")
}
}
La dezvoltarea aplicațiilor care utilizează RSSI pentru poziționare, luați în considerare: în iOS valorile RSSI sunt mai stabile datorită calibrării hardware, în Android — mai zgomotoase și dependente de producătorul dispozitivului. Pentru proiecte cross-platform, se recomandă implementarea filtrării la nivelul aplicației cu parametri configurabili pentru fiecare platformă.
Întrebări frecvente
Nu, RSSI oferă doar o estimare aproximativă a distanței cu o precizie de ±2–5 m în condiții reale. Pentru poziționare precisă este necesară triangularea cu mai multe scanere, filtrarea Kalman și luarea în considerare a TX Power a emițătorului.
Din cauza propagării pe mai multe căi și a fluctuațiilor semnalului radio. Reflexiile de pe pereți și obiecte creează interferențe, în care semnalul fie se amplifică, fie se atenuează. Modificările RSSI de 5–10 dB pe un dispozitiv staționar sunt un fenomen normal.
iOS recomandă apelarea readRSSI de cel mult 1 dată pe secundă. Solicitările prea frecvente pot duce la pierderea pachetelor de date. Pentru monitorizarea RSSI în timpul scanării, utilizați CBAdvertisementDataRSSIKey, care este disponibil pentru fiecare pachet de publicitate.
TX Power Level — puterea emițătorului în dBm specificată în pachetul de publicitate. RSSI + TX Power = atenuarea totală a semnalului pe calea de la emițător la receptor. Cunoscând TX Power, se poate estima mai precis distanța: RSSI - TX Power = Path Loss (pierderi pe traseu).
Pentru beacon-uri staționare — media mobilă cu o fereastră de 5–10 valori. Pentru dispozitive în mișcare — filtrul Kalman cu zgomot de proces mic (0,01–0,05). Pentru eliminarea valorilor aberante, adăugați un filtru Median care elimină valorile în afara a 2 abateri standard.
Rezumat
Vom dezvolta o aplicație mobilă la cheie
IT Sectr creează aplicații iOS și Android pentru startup-uri și afaceri din 2017. Vă vom consilia și vă vom propune cea mai bună soluție.
Citiți și