RSSI (Received Signal Strength Indicator) — je numerická metrika měřící výkon signálu BLE zařízení v dBm na přijímací straně. Hodnota RSSI se pohybuje od -30 dBm (zařízení v blízkosti) do -100 dBm (na hranici detekce). Bluetooth Core Specification 5.4 (2023) definuje RSSI jako volitelný parametr dostupný v každém reklamním paketu a datovém paketu. RSSI se používá pro odhad vzdálenosti (range estimation) a filtrování zařízení podle úrovně signálu, ale je nepřesným indikátorem: ovlivňují ho překážky, vícecestné šíření a typ antény. Pro přesné určení polohy se používá triangulace a Kalmanova filtrace.
Hlavní body
RSSI (Received Signal Strength Indicator) — je měření výkonu rádiového signálu přijatého BLE přijímačem v okamžiku příjmu paketu. V BLE se RSSI měří pro každý reklamní paket (advertising) a každý datový paket po připojení. Hodnota RSSI je logaritmická stupnice, kde každý krok 1 dBm odpovídá přibližně změně výkonu signálu 1,26krát.
RSSI je ukazatel závislý na hardwaru: různé BLE čipy (nRF, TI, Dialog, Broadcom) a různé antény mohou zobrazovat různé hodnoty RSSI pro stejný signál. Proto je srovnávání RSSI mezi různými zařízeními nesprávné. Dokonce i dva identické smartphony se stejným operačním systémem mohou vykazovat rozdíl 2–5 dBm pro stejný beacon.
V reklamním paketu se RSSI měří pro každý ze tří kanálů (37, 38, 39). Hodnoty se mohou lišit o 3–10 dBm mezi kanály kvůli frekvenčnímu rušení. Moderní BLE stacky hlásí průměrné RSSI na všech kanálech nebo RSSI pro každý paket zvlášť. iOS Core Bluetooth poskytuje průměrné RSSI, Android — RSSI posledního paketu.
Typický rozsah RSSI pro BLE je od -30 dBm do -100 dBm. Hodnoty mimo tyto hranice jsou extrémně vzácné: -20 dBm znamená, že zařízení doslova dotýká antény skeneru, a -105 dBm — úplná absence signálu. Výrobci čipů mohou rozsah omezovat: například nRF52832 hlásí RSSI od -40 do -105 dBm.
| RSSI (dBm) | Kvalita signálu | Přibližná vzdálenost | Doporučení |
|---|---|---|---|
| -30 – -50 | Vynikající | 0–1 m | Zařízení v blízkosti |
| -51 – -70 | Dobrá | 1–5 m | V místnosti |
| -71 – -85 | Střední | 5–15 m | Přijatelné pro beacon |
| -86 – -95 | Slabá | 15–30 m | Nespolehlivé připojení |
| Pod -95 | Kritická | 30+ m | Na hranici detekce |
TX Power Level — výkon vysílače, který je uveden v reklamním paketu (AD Type 0x0A) a umožňuje korekci odhadu. RSSI -70 dBm od zařízení s TX Power +4 dBm znamená, že signál zeslábl o 74 dB. Pokud TX Power není znám, přesný odhad vzdálenosti je nemožný. iBeacon obsahuje TX Power (1 bajt) ve struktuře Manufacturer Data pro kalibraci vzdálenosti.
Model Path Loss (ztráty šířením) se používá pro odhad vzdálenosti na základě RSSI. Základní vzorec: RSSI = TX_Power - 10 × n × log10(d), kde n — koeficient útlumu (2,0 pro volný prostor, 3,0–4,5 pro místnosti s překážkami), d — vzdálenost v metrech. V praxi je přesnost odhadu ±2–5 m v reálných podmínkách.
Pro kalibraci modelu je nutné změřit RSSI na známé vzdálenosti (obvykle 1 m) a vypočítat referenci TX Power. V iBeacon je tento parametr uložen v paketu. V Eddystone se používá podobný mechanismus. Po kalibraci lze vypočítat vzdálenost: d = 10 ^ ((TX_Power — RSSI) / (10 × n)).
Podle Apple Core Bluetooth Programming Guide (2024) je přesnost odhadu vzdálenosti pro iBeacon: immediate (<0,5 m) — když je RSSI vyšší než kalibrační hodnota, near (0,5–3 m) — když je RSSI v rozsahu 3–6 dB od kalibrační hodnoty, far (>3 m) — při slabém signálu. Žádný matematický model neposkytuje přesnost lepší než ±1 m bez dodatečného zpracování.
RSSI je šumový ukazatel a jeho přesnost závisí na mnoha faktorech. Hlavní zdroje chyb: překážky (zdi, nábytek, lidé) zeslabují signál o 3–15 dB každá, vícecestné šíření (odrazy od zdí) může signál v některých bodech zesilovat a v jiných zeslabovat, orientace antény mění RSSI o 3–10 dB při otáčení zařízení.
Lidské tělo je jedním z nejsilnějších absorbérů BLE signálu. Pokud je mezi beaconem a smartphonem osoba, RSSI může klesnout o 10–20 dB. Voda v lidském těle účinně pohlcuje rádiové záření na frekvenci 2,4 GHz. Proto beacony na dveřích obchodů mohou zobrazovat různý RSSI pro zákazníky různé výšky a postavy.
Další faktory: rušení Wi-Fi na sousedních kanálech může snižovat RSSI o 3–5 dB, teplota BLE čipu ovlivňuje přesnost měření RSSI (u některých čipů drift až 1 dB/°C), degradace baterie v beaconu snižuje TX Power, což vede k nižšímu RSSI na přijímači.
Syrové RSSI není vhodné pro přesné výpočty — obsahuje příliš mnoho šumu a odlehlých hodnot. Pro získání stabilního odhadu vzdálenosti se používají metody filtrace. Nejjednodušší — klouzavý průměr: bere se aritmetický průměr posledních N hodnot RSSI. N = 5–10 obvykle stačí k vyhlazení krátkodobých fluktuací.
// Kalmanův filtr pro 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 {
// Předpověď
errorCovariance += processNoise
// Aktualizace
val kalmanGain =
errorCovariance /
(errorCovariance + measurementNoise)
estimate = estimate +
kalmanGain * (rawRssi - estimate)
errorCovariance =
(1.0 - kalmanGain) * errorCovariance
return estimate
}
}
Kalmanův filtr — pokročilejší metoda, která zohledňuje dynamiku změn RSSI a dává menší zpoždění než klouzavý průměr. Pro stacionární beacony (nepohyblivé) poskytuje klouzavý průměr přijatelný výsledek. Pro pohyblivá zařízení je Kalmanův filtr vhodnější, protože se rychleji přizpůsobuje změnám. Doplňkově lze použít Mediánový filtr pro odstraňování odlehlých hodnot.
iOS Core Bluetooth poskytuje RSSI prostřednictvím vlastnosti peripheral.rssi (NSNumber) po dokončení čtení RSSI. Pro získání RSSI reklamního paketu použijte advertisementData[CBAdvertisementDataRSSIKey]. iOS vrací RSSI jako průměrnou hodnotu na třech kanálech. Pro nepřetržité sledování RSSI volejte readRSSI s intervalem ne častěji než 1krát za sekundu.
// Získat RSSI na iOS
func centralManager(
_ central: CBCentralManager,
didDiscover peripheral: CBPeripheral,
advertisementData: [String: Any],
rssi RSSI: NSNumber
) {
let signalStrength = Int(truncating: RSSI)
// Filtrovat slabé signály
guard signalStrength > -90 else {
return
}
print("Zařízení " +
"\(peripheral.name ?? "unknown") " +
"RSSI: \(signalStrength) dBm")
}
Android poskytuje RSSI prostřednictvím callbacku onScanResult: result.getRssi(). Hodnota RSSI je RSSI posledního reklamního paketu (ne průměr). Pro stabilní odečty je nutné shromáždit více hodnot a aplikovat filtraci. Android také poskytuje TX Power Level prostřednictvím result.getScanRecord().getTxPowerLevel(), pokud je přenášen v reklamním paketu.
// Získat 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
// Aplikovat Kalmanův filtr
val filtered = kalmanFilter.
filter(rssi.toDouble())
Log.d("BLEScanner",
"RSSI: $rssi, " +
"Filtered: $filtered, " +
"TX: $txPower")
}
}
Při vývoji aplikací používajících RSSI pro určování polohy zohledněte: v iOS jsou hodnoty RSSI stabilnější díky hardwarové kalibraci, v Android — šumivější a závislé na výrobci zařízení. Pro multiplatformní projekty se doporučuje implementovat filtraci na straně aplikace s konfigurovatelnými parametry pro každou platformu.
Často kladené otázky
Ne, RSSI poskytuje pouze přibližný odhad vzdálenosti s přesností ±2–5 m v reálných podmínkách. Pro přesné určení polohy je vyžadována triangulace z několika skenerů, Kalmanova filtrace a zohlednění TX Power vysílače.
Kvůli vícecestnému šíření a fluktuacím rádiového signálu. Odrazy od zdí a předmětů vytvářejí interferenci, při které se signál střídavě zesiluje a zeslabuje. Změny RSSI o 5–10 dB na nehybném zařízení jsou normální jev.
iOS doporučuje volat readRSSI ne častěji než 1krát za sekundu. Příliš časté požadavky mohou vést ke ztrátě datových paketů. Pro sledování RSSI během skenování použijte CBAdvertisementDataRSSIKey, který je k dispozici pro každý reklamní paket.
TX Power Level — výkon vysílače v dBm uvedený v reklamním paketu. RSSI + TX Power = celkový útlum signálu na cestě od vysílače k přijímači. Se znalostí TX Power lze přesněji odhadnout vzdálenost: RSSI - TX Power = Path Loss (ztráty na trase).
Pro stacionární beacony — klouzavý průměr s oknem 5–10 hodnot. Pro pohyblivá zařízení — Kalmanův filtr s malým šumem procesu (0,01–0,05). Pro odstraňování odlehlých hodnot přidejte Mediánový filtr, který odřezává hodnoty mimo 2 směrodatné odchylky.
Shrnutí
Vyvineme mobilní aplikaci na klíč
IT Sectr vytváří aplikace pro iOS a Android pro startupy a podniky od roku 2017. Poradíme vám a navrhneme nejlepší řešení.
Přečtěte si také