RSSI (Received Signal Strength Indicator) — to numeryczna metryka mierząca moc sygnału urządzenia BLE w dBm po stronie odbiorczej. Wartość RSSI waha się od -30 dBm (urządzenie w pobliżu) do -100 dBm (na granicy wykrywalności). Bluetooth Core Specification 5.4 (2023) definiuje RSSI jako opcjonalny parametr dostępny w każdym pakiecie reklamowym i pakiecie danych. RSSI jest używane do szacowania odległości (range estimation) i filtrowania urządzeń według poziomu sygnału, ale jest niedokładnym wskaźnikiem: wpływają na nie przeszkody, propagacja wielościeżkowa i typ anteny. Do precyzyjnego pozycjonowania stosuje się triangulację i filtrację Kalmana.
Najważniejsze
RSSI (Received Signal Strength Indicator) — to pomiar mocy sygnału radiowego odebranego przez odbiornik BLE w momencie odbioru pakietu. W BLE RSSI jest mierzone dla każdego pakietu reklamowego (advertising) i każdego pakietu danych po nawiązaniu połączenia. Wartość RSSI to skala logarytmiczna, gdzie każdy krok o 1 dBm odpowiada w przybliżeniu zmianie mocy sygnału o 1,26 raza.
RSSI to wskaźnik zależny od sprzętu: różne układy BLE (nRF, TI, Dialog, Broadcom) i różne anteny mogą pokazywać różne wartości RSSI dla tego samego sygnału. Dlatego porównywanie RSSI między różnymi urządzeniami jest nieprawidłowe. Nawet dwa identyczne smartfony z tym samym systemem operacyjnym mogą wykazywać różnicę 2–5 dBm dla tego samego beaconu.
W pakiecie reklamowym RSSI jest mierzone dla każdego z trzech kanałów (37, 38, 39). Wartości mogą różnić się o 3–10 dBm między kanałami z powodu zakłóceń częstotliwościowych. Nowoczesne stosy BLE raportują uśrednione RSSI dla wszystkich kanałów lub RSSI dla każdego pakietu osobno. iOS Core Bluetooth udostępnia średnie RSSI, Android — RSSI ostatniego pakietu.
Typowy zakres RSSI dla BLE wynosi od -30 dBm do -100 dBm. Wartości wykraczające poza te granice zdarzają się niezwykle rzadko: -20 dBm oznacza, że urządzenie dosłownie dotyka anteny skanera, a -105 dBm — całkowity brak sygnału. Producenci układów mogą ograniczać zakres: na przykład nRF52832 raportuje RSSI od -40 do -105 dBm.
| RSSI (dBm) | Jakość sygnału | Przybliżona odległość | Zalecenie |
|---|---|---|---|
| -30 – -50 | Doskonała | 0–1 m | Urządzenie w pobliżu |
| -51 – -70 | Dobra | 1–5 m | W obrębie pokoju |
| -71 – -85 | Średnia | 5–15 m | Akceptowalne dla beaconów |
| -86 – -95 | Słaba | 15–30 m | Niezawodne połączenie |
| Poniżej -95 | Krytyczna | 30+ m | Na granicy wykrywalności |
TX Power Level — moc nadajnika, która jest podawana w pakiecie advertisingowym (AD Type 0x0A) i umożliwia korektę oszacowania. RSSI -70 dBm od urządzenia z TX Power +4 dBm oznacza, że sygnał osłabł o 74 dB. Jeśli TX Power jest nieznane, dokładne oszacowanie odległości jest niemożliwe. iBeacon zawiera TX Power (1 bajt) w strukturze Manufacturer Data do kalibracji odległości.
Model Path Loss (straty propagacji) jest używany do szacowania odległości na podstawie RSSI. Podstawowy wzór: RSSI = TX_Power - 10 × n × log10(d), gdzie n — współczynnik tłumienia (2,0 dla wolnej przestrzeni, 3,0–4,5 dla pomieszczeń z przeszkodami), d — odległość w metrach. W praktyce dokładność oszacowania wynosi ±2–5 m w rzeczywistych warunkach.
Do kalibracji modelu należy zmierzyć RSSI w znanej odległości (zwykle 1 m) i obliczyć referencję TX Power. W iBeacon ten parametr jest przechowywany w pakiecie. W Eddystone stosuje się podobny mechanizm. Po kalibracji można obliczać odległość: d = 10 ^ ((TX_Power — RSSI) / (10 × n)).
Według Apple Core Bluetooth Programming Guide (2024), dokładność oszacowania odległości dla iBeacon wynosi: immediate (<0,5 m) — gdy RSSI jest wyższe od kalibracyjnego, near (0,5–3 m) — gdy RSSI w zakresie 3–6 dB od kalibracyjnego, far (>3 m) — przy słabym sygnale. Żaden model matematyczny nie zapewnia dokładności lepszej niż ±1 m bez dodatkowego przetwarzania.
RSSI to szumny wskaźnik, a jego dokładność zależy od wielu czynników. Główne źródła błędów: przeszkody (ściany, meble, ludzie) osłabiają sygnał o 3–15 dB każda, propagacja wielościeżkowa (odbicia od ścian) może wzmacniać sygnał w niektórych punktach i osłabiać w innych, orientacja anteny zmienia RSSI o 3–10 dB przy obrocie urządzenia.
Ludzkie ciało jest jednym z najsilniejszych absorberów sygnału BLE. Jeśli między beaconem a smartfonem znajduje się człowiek, RSSI może spaść o 10–20 dB. Woda w ludzkim ciele skutecznie pochłania promieniowanie radiowe na częstotliwości 2,4 GHz. Dlatego beacony na drzwiach sklepów mogą pokazywać różne RSSI dla klientów o różnym wzroście i budowie ciała.
Dodatkowe czynniki: zakłócenia Wi-Fi na sąsiednich kanałach mogą obniżać RSSI o 3–5 dB, temperatura układu BLE wpływa na dokładność pomiaru RSSI (u niektórych układów dryf do 1 dB/°C), degradacja baterii w beaconie obniża TX Power, co prowadzi do zaniżonego RSSI po stronie odbiorczej.
Surowe RSSI nie nadaje się do dokładnych obliczeń — zawiera zbyt dużo szumu i wartości odstających. Aby uzyskać stabilne oszacowanie odległości, stosuje się metody filtracji. Najprostszą jest średnia ruchoma: oblicza się średnią arytmetyczną ostatnich N wartości RSSI. N = 5–10 zwykle wystarcza do wygładzenia krótkotrwałych fluktuacji.
// Filtr Kalmana dla 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 {
// Prognozuj
errorCovariance += processNoise
// Aktualizuj
val kalmanGain =
errorCovariance /
(errorCovariance + measurementNoise)
estimate = estimate +
kalmanGain * (rawRssi - estimate)
errorCovariance =
(1.0 - kalmanGain) * errorCovariance
return estimate
}
}
Filtr Kalmana — bardziej zaawansowana metoda, która uwzględnia dynamikę zmian RSSI i daje mniejsze opóźnienie niż średnia ruchoma. Dla stacjonarnych beaconów (nieruchomych) średnia ruchoma daje akceptowalny wynik. Dla ruchomych urządzeń filtr Kalmana jest lepszy, ponieważ szybciej dostosowuje się do zmian. Dodatkowo można zastosować filtr Medianowy do odrzucania wartości odstających.
iOS Core Bluetooth udostępnia RSSI przez właściwość peripheral.rssi (NSNumber) po zakończeniu odczytu RSSI. Aby uzyskać RSSI pakietu reklamowego, użyj advertisementData[CBAdvertisementDataRSSIKey]. iOS zwraca RSSI jako średnią wartość z trzech kanałów. Do ciągłego monitorowania RSSI wywołuj readRSSI w odstępach nie częstszych niż 1 raz na sekundę.
// Pobierz RSSI na iOS
func centralManager(
_ central: CBCentralManager,
didDiscover peripheral: CBPeripheral,
advertisementData: [String: Any],
rssi RSSI: NSNumber
) {
let signalStrength = Int(truncating: RSSI)
// Odfiltruj słabe sygnały
guard signalStrength > -90 else {
return
}
print("Urządzenie " +
"\(peripheral.name ?? "unknown") " +
"RSSI: \(signalStrength) dBm")
}
Android udostępnia RSSI przez callback onScanResult: result.getRssi(). Wartość RSSI to RSSI ostatniego pakietu reklamowego (nie średnia). Aby uzyskać stabilne odczyty, należy gromadzić wiele wartości i stosować filtrację. Android udostępnia również TX Power Level przez result.getScanRecord().getTxPowerLevel(), jeśli jest przesyłany w pakiecie reklamowym.
// Pobierz RSSI na Android
private val scanCallback = object : ScanCallback() {
override fun onScanResult(
callbackType: Int,
result: ScanResult
) {
val rssi = result.rssi
val txPower = result.scanRecord?.
txPowerLevel ?: -128
// Zastosuj filtr Kalmana
val filtered = kalmanFilter.
filter(rssi.toDouble())
Log.d("BLEScanner",
"RSSI: $rssi, " +
"Filtered: $filtered, " +
"TX: $txPower")
}
}
Podczas tworzenia aplikacji wykorzystujących RSSI do pozycjonowania, należy uwzględnić: w iOS wartości RSSI są bardziej stabilne dzięki kalibracji sprzętowej, w Android — bardziej szumne i zależne od producenta urządzenia. W projektach wieloplatformowych zaleca się implementację filtracji po stronie aplikacji z konfigurowalnymi parametrami dla każdej platformy.
Często zadawane pytania
Nie, RSSI daje jedynie przybliżone oszacowanie odległości z dokładnością ±2–5 m w rzeczywistych warunkach. Do precyzyjnego pozycjonowania wymagana jest triangulacja z kilku skanerów, filtracja Kalmana i uwzględnienie TX Power nadajnika.
Z powodu propagacji wielościeżkowej i fluktuacji sygnału radiowego. Odbicia od ścian i przedmiotów tworzą interferencję, przy której sygnał to wzmacnia się, to słabnie. Zmiany RSSI o 5–10 dB na nieruchomym urządzeniu to normalne zjawisko.
iOS zaleca wywoływanie readRSSI nie częściej niż 1 raz na sekundę. Zbyt częste zapytania mogą prowadzić do pomijania pakietów danych. Do monitorowania RSSI podczas skanowania używaj CBAdvertisementDataRSSIKey, który jest dostępny dla każdego pakietu reklamowego.
TX Power Level — moc nadajnika w dBm podana w pakiecie reklamowym. RSSI + TX Power = całkowite tłumienie sygnału na drodze od nadajnika do odbiornika. Znając TX Power, można dokładniej oszacować odległość: RSSI - TX Power = Path Loss (straty na trasie).
Dla stacjonarnych beaconów — średnia ruchoma z oknem 5–10 wartości. Dla ruchomych urządzeń — filtr Kalmana z małym szumem procesu (0,01–0,05). Do odrzucania wartości odstających dodaj filtr Medianowy, który odcina wartości poza 2 odchyleniami standardowymi.
Podsumowanie
Opracujemy aplikację mobilną pod klucz
IT Sectr tworzy aplikacje na iOS i Androida dla startupów i firm od 2017 roku. Doradzimy Ci i zaproponujemy najlepsze rozwiązanie.
Przeczytaj również