RSSI(Received Signal Strength Indicator)는 수신 측에서 BLE 장치의 신호 강도를 dBm 단위로 측정하는 숫자 지표입니다. RSSI 값은 -30 dBm(장치가 가까이 있음)에서 -100 dBm(감지 한계)까지 다양합니다. Bluetooth Core Specification 5.4(2023)는 RSSI를 각 광고 패킷 및 데이터 패킷에서 사용할 수 있는 선택적 매개변수로 정의합니다. RSSI는 거리 추정 및 신호 레벨별 장치 필터링에 사용되지만 부정확한 지표입니다: 장애물, 다중 경로 전파 및 안테나 유형의 영향을 받습니다. 정확한 위치 측정을 위해 삼각 측량 및 Kalman 필터링이 사용됩니다.
핵심 요점
RSSI(Received Signal Strength Indicator)는 패킷 수신 시 BLE 수신기가 수신한 무선 신호 강도의 측정값입니다. BLE에서 RSSI는 각 광고 패킷과 연결 후 각 데이터 패킷에 대해 측정됩니다. RSSI는 로그 스케일로, 1dBm의 각 단계는 신호 전력의 약 1.26배 변화에 해당합니다.
RSSI는 하드웨어 종속 지표입니다: 다른 BLE 칩(nRF, TI, Dialog, Broadcom)과 다른 안테나는 동일한 신호에 대해 다른 RSSI 값을 표시할 수 있습니다. 따라서 다른 장치 간의 RSSI 비교는 올바르지 않습니다. 동일한 OS를 사용하는 두 대의 동일한 스마트폰도 동일한 비콘에 대해 2–5dBm의 차이를 보일 수 있습니다.
광고 패킷에서 RSSI는 세 채널(37, 38, 39) 각각에 대해 측정됩니다. 주파수 간섭으로 인해 채널 간 값이 3–10dBm까지 다를 수 있습니다. 최신 BLE 스택은 모든 채널의 평균 RSSI 또는 각 패킷의 개별 RSSI를 보고합니다. iOS Core Bluetooth는 평균 RSSI를 제공하고 Android는 마지막 패킷의 RSSI를 제공합니다.
BLE의 일반적인 RSSI 범위는 -30dBm에서 -100dBm까지입니다. 이 범위를 벗어나는 값은 극히 드뭅니다: -20dBm은 장치가 스캐너 안테나에 물리적으로 닿고 있음을 의미하고 -105dBm은 신호가 완전히 없음을 의미합니다. 칩 제조업체는 범위를 제한할 수 있습니다: 예를 들어 nRF52832는 -40에서 -105dBm까지의 RSSI를 보고합니다.
| RSSI(dBm) | 신호 품질 | 대략적인 거리 | 권장 사항 |
|---|---|---|---|
| -30 – -50 | 우수 | 0–1m | 장치가 가까이 있음 |
| -51 – -70 | 좋음 | 1–5m | 방 내부 |
| -71 – -85 | 보통 | 5–15m | 비콘에 허용 가능 |
| -86 – -95 | 약함 | 15–30m | 신뢰할 수 없는 연결 |
| -95 미만 | 심각 | 30m 이상 | 감지 한계 |
TX Power Level은 광고 패킷(AD Type 0x0A)에 표시된 송신기 전력으로 추정치를 조정할 수 있게 합니다. TX Power +4dBm 장치의 RSSI -70dBm은 신호가 74dB 감쇠되었음을 의미합니다. TX Power를 모르면 정확한 거리 추정이 불가능합니다. iBeacon은 거리 보정을 위해 Manufacturer Data 구조에 TX Power(1바이트)를 포함합니다.
Path Loss 모델(전파 손실)은 RSSI로부터 거리를 추정하는 데 사용됩니다. 기본 공식: RSSI = TX_Power - 10 × n × log10(d). 여기서 n은 감쇠 계수(자유 공간 2.0, 장애물이 있는 실내 환경 3.0–4.5)이고 d는 미터 단위 거리입니다. 실제로 실전 조건에서 추정 정확도는 ±2–5m입니다.
모델을 보정하려면 알려진 거리(보통 1m)에서 RSSI를 측정하고 TX Power 기준값을 계산해야 합니다. iBeacon에서는 이 매개변수가 패킷에 저장됩니다. Eddystone은 유사한 메커니즘을 사용합니다. 보정 후 거리를 계산할 수 있습니다: d = 10 ^ ((TX_Power — RSSI) / (10 × n)).
Apple Core Bluetooth Programming Guide(2024)에 따르면 iBeacon의 거리 추정 정확도는 다음과 같습니다: immediate(0.5m 미만) — RSSI가 보정값보다 높은 경우, near(0.5–3m) — RSSI가 보정값의 3–6dB 이내인 경우, far(3m 초과) — 약한 신호의 경우. 추가 처리 없이 어떤 수학적 모델도 ±1m보다 나은 정확도를 제공하지 않습니다.
RSSI는 노이즈가 많은 지표이며 정확도는 여러 요소에 따라 달라집니다. 오류의 주요 원인: 장애물(벽, 가구, 사람)은 각각 신호를 3–15dB 감쇠시키고, 다중 경로 전파(벽 반사)는 일부 지점에서 신호를 증폭시키고 다른 지점에서 감쇠시킬 수 있으며, 안테나 방향은 장치를 회전할 때 RSSI를 3–10dB 변화시킵니다.
인체는 BLE 신호의 가장 강력한 흡수체 중 하나입니다. 비콘과 스마트폰 사이에 사람이 있으면 RSSI가 10–20dB까지 떨어질 수 있습니다. 인체의 수분은 2.4GHz 주파수의 무선 방사를 효과적으로 흡수합니다. 따라서 매장 문에 있는 비콘은 키와 체격이 다른 고객에게 다른 RSSI를 표시할 수 있습니다.
추가 요소: 인접 채널의 Wi-Fi 간섭은 RSSI를 3–5dB 감소시킬 수 있으며, BLE 칩의 온도는 RSSI 측정 정확도에 영향을 미치고(일부 칩은 최대 1dB/°C 드리프트), 비콘의 배터리 성능 저하는 TX Power를 감소시켜 수신기에서 RSSI가 낮아집니다.
원시 RSSI는 정확한 계산에 부적합합니다 — 노이즈와 이상값이 너무 많습니다. 안정적인 거리 추정을 위해 필터링 방법이 사용됩니다. 가장 간단한 것은 이동 평균입니다: 최근 N개의 RSSI 값의 산술 평균을 취합니다. 단기 변동을 평활화하려면 보통 N = 5–10이면 충분합니다.
// RSSI용 Kalman 필터
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
}
}
Kalman 필터는 RSSI 변화의 동역학을 고려하고 이동 평균보다 지연이 적은 고급 방법입니다. 고정 비콘의 경우 이동 평균이 허용 가능한 결과를 제공합니다. 움직이는 장치의 경우 Kalman 필터가 변화에 더 빠르게 적응하므로 선호됩니다. 추가적으로 이상값을 제거하기 위해 중앙값 필터를 사용할 수 있습니다.
iOS Core Bluetooth는 RSSI 읽기 완료 후 peripheral.rssi 속성(NSNumber)을 통해 RSSI를 제공합니다. 광고 패킷 RSSI를 얻으려면 advertisementData[CBAdvertisementDataRSSIKey]를 사용하세요. iOS는 세 채널의 평균값으로 RSSI를 반환합니다. 지속적인 RSSI 모니터링을 위해 1초에 한 번 이상의 간격으로 readRSSI를 호출하세요.
// iOS에서 RSSI 가져오기
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는 onScanResult 콜백을 통해 RSSI를 제공합니다: result.getRssi(). RSSI 값은 마지막 광고 패킷의 RSSI입니다(평균이 아님). 안정적인 판독값을 얻으려면 여러 값을 축적하고 필터링을 적용해야 합니다. Android는 광고 패킷에 포함된 경우 result.getScanRecord().getTxPowerLevel()을 통해 TX Power Level도 제공합니다.
// Android에서 RSSI 가져오기
private val scanCallback = object : ScanCallback() {
override fun onScanResult(
callbackType: Int,
result: ScanResult
) {
val rssi = result.rssi
val txPower = result.scanRecord?.
txPowerLevel ?: -128
// Kalman 필터 적용
val filtered = kalmanFilter.
filter(rssi.toDouble())
Log.d("BLEScanner",
"RSSI: $rssi, " +
"Filtered: $filtered, " +
"TX: $txPower")
}
}
위치 측정에 RSSI를 사용하는 애플리케이션을 개발할 때 다음 사항에 유의하세요: iOS에서는 하드웨어 보정 덕분에 RSSI 값이 더 안정적이고, Android에서는 노이즈가 더 많고 장치 제조업체에 따라 다릅니다. 크로스 플랫폼 프로젝트의 경우 각 플랫폼에 대한 구성 가능한 매개변수로 애플리케이션 측에서 필터링을 구현하는 것이 좋습니다.
자주 묻는 질문
아니요, RSSI는 실제 조건에서 ±2–5m 정확도의 대략적인 추정만 제공합니다. 정확한 위치 측정을 위해서는 여러 스캐너의 삼각 측량, Kalman 필터링 및 TX Power 고려가 필요합니다.
다중 경로 전파 및 무선 신호 변동 때문입니다. 벽과 물체의 반사가 간섭을 만들어 신호가 번갈아 강해졌다 약해집니다. 정지 장치에서 5–10dB의 RSSI 변화는 정상입니다.
iOS는 readRSSI를 초당 1회 이상 호출하지 않도록 권장합니다. 너무 빈번한 요청은 데이터 패킷 손실로 이어질 수 있습니다. 스캔 중 RSSI 모니터링에는 각 광고 패킷에 대해 사용 가능한 CBAdvertisementDataRSSIKey를 사용하세요.
TX Power Level은 광고 패킷에 표시된 dBm 단위의 송신기 전력입니다. RSSI + TX Power = 송신기에서 수신기까지의 총 신호 감쇠입니다. TX Power를 알면 더 정확한 거리 추정이 가능합니다: RSSI - TX Power = Path Loss(경로 손실).
고정 비콘의 경우 — 5–10개 값의 창을 가진 이동 평균. 움직이는 장치의 경우 — 낮은 프로세스 노이즈(0.01–0.05)의 Kalman 필터. 이상값을 제거하려면 2 표준 편차를 초과하는 값을 차단하는 중앙값 필터를 추가하세요.
요약
턴키 방식의 모바일 애플리케이션을 개발해 드립니다
IT Sectr는 2017년부터 스타트업과 기업을 위한 iOS 및 Android 애플리케이션을 만듭니다. 저희가 상담해 드리고 최적의 솔루션을 제안하겠습니다.