RSSI (Received Signal Strength Indicator) — это числовая метрика, измеряющая мощность сигнала BLE-устройства в dBm на приёмной стороне. Значение RSSI варьируется от -30 dBm (устройство рядом) до -100 dBm (на границе обнаружения). Bluetooth Core Specification 5.4 (2023) определяет RSSI как опциональный параметр, доступный в каждом рекламном пакете и пакете данных. RSSI используется для оценки расстояния (range estimation) и фильтрации устройств по уровню сигнала, но является неточным индикатором: на него влияют препятствия, многолучевое распространение и тип антенны. Для точного позиционирования применяются триангуляция и Kalman-фильтрация.
Главное
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 для одного маячка.
В рекламном пакете 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 м | Устройство рядом |
| -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 для калибровки расстояния.
Модель 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 — шумный показатель, и его точность зависит от множества факторов. Основные источники погрешности: препятствия (стены, мебель, люди) ослабляют сигнал на 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 на приёмнике.
Raw RSSI непригоден для точных вычислений — он содержит слишком много шума и выбросов. Для получения стабильной оценки расстояния применяются методы фильтрации. Самый простой — скользящее среднее: берётся среднее арифметическое последних N значений RSSI. N = 5–10 обычно достаточно для сглаживания кратковременных флуктуаций.
// Kalman filter for 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 {
// Predict
errorCovariance += processNoise
// Update
val kalmanGain =
errorCovariance /
(errorCovariance + measurementNoise)
estimate = estimate +
kalmanGain * (rawRssi - estimate)
errorCovariance =
(1.0 - kalmanGain) * errorCovariance
return estimate
}
}
Kalman-фильтр — более продвинутый метод, который учитывает динамику изменения RSSI и даёт меньшую задержку, чем скользящее среднее. Для стационарных маячков (неподвижных) скользящее среднее даёт приемлемый результат. Для движущихся устройств Kalman-фильтр предпочтительнее, так как он быстрее адаптируется к изменениям. Дополнительно можно использовать Median-фильтр для отбрасывания выбросов.
iOS Core Bluetooth предоставляет RSSI через свойство peripheral.rssi (NSNumber) после завершения чтения RSSI. Для получения RSSI рекламного пакета используйте advertisementData[CBAdvertisementDataRSSIKey]. iOS возвращает RSSI как среднее значение по трём каналам. Для непрерывного мониторинга RSSI вызывайте readRSSI с интервалом не чаще 1 раза в секунду.
// Get RSSI on iOS
func centralManager(
_ central: CBCentralManager,
didDiscover peripheral: CBPeripheral,
advertisementData: [String: Any],
rssi RSSI: NSNumber
) {
let signalStrength = Int(truncating: RSSI)
// Filter weak signals
guard signalStrength > -90 else {
return
}
print("Device " +
"\(peripheral.name ?? "unknown") " +
"RSSI: \(signalStrength) dBm")
}
Android предоставляет RSSI через callback onScanResult: result.getRssi(). Значение RSSI — это RSSI последнего рекламного пакета (не среднее). Для стабильных показаний необходимо накапливать несколько значений и применять фильтрацию. Android также предоставляет TX Power Level через result.getScanRecord().getTxPowerLevel(), если он передаётся в рекламном пакете.
// Get RSSI on Android
private val scanCallback = object : ScanCallback() {
override fun onScanResult(
callbackType: Int,
result: ScanResult
) {
val rssi = result.rssi
val txPower = result.scanRecord?.
txPowerLevel ?: -128
// Apply Kalman filter
val filtered = kalmanFilter.
filter(rssi.toDouble())
Log.d("BLEScanner",
"RSSI: $rssi, " +
"Filtered: $filtered, " +
"TX: $txPower")
}
}
При разработке приложений, использующих RSSI для позиционирования, учитывайте: в iOS значения RSSI более стабильны благодаря аппаратной калибровке, в Android — более шумные и зависят от производителя устройства. Для кросс-платформенных проектов рекомендуется реализовать фильтрацию на стороне приложения с настраиваемыми параметрами для каждой платформы.
Часто задаваемые вопросы
Нет, RSSI даёт лишь приблизительную оценку расстояния с точностью ±2–5 м в реальных условиях. Для точного позиционирования требуется триангуляция с нескольких сканеров, Kalman-фильтрация и учёт 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 (потери на трассе).
Для стационарных маячков — скользящее среднее с окном 5–10 значений. Для движущихся устройств — Kalman-фильтр с малым process noise (0.01–0.05). Для отбрасывания выбросов добавьте Median-фильтр, который отсекает значения за пределами 2 стандартных отклонений.
Итоги
Мы разработаем мобильное приложение под ключ
IT Sectr создаёт приложения для iOS и Android для стартапов и бизнеса с 2017 года. Мы проконсультируем вас и предложим наилучшее решение.
Читайте также