RSSI (Received Signal Strength Indicator) é uma métrica numérica que mede a potência do sinal de um dispositivo BLE em dBm no lado receptor. Os valores de RSSI variam de -30 dBm (dispositivo próximo) a -100 dBm (no limite de deteção). Bluetooth Core Specification 5.4 (2023) define RSSI como um parâmetro opcional disponível em cada pacote de publicidade e pacote de dados. O RSSI é usado para estimativa de distância e filtragem de dispositivos por nível de sinal, mas é um indicador impreciso: é afetado por obstáculos, propagação por múltiplos caminhos e tipo de antena. Para posicionamento preciso, são utilizados triangulação e filtragem Kalman.
Pontos principais
RSSI (Received Signal Strength Indicator) é uma medida da potência do sinal de rádio recebida pelo recetor BLE no momento da receção do pacote. Em BLE, o RSSI é medido para cada pacote de publicidade e para cada pacote de dados após a conexão. RSSI é uma escala logarítmica onde cada passo de 1 dBm corresponde aproximadamente a uma mudança de 1.26 vezes na potência do sinal.
RSSI é um indicador dependente de hardware: diferentes chips BLE (nRF, TI, Dialog, Broadcom) e diferentes antenas podem mostrar valores diferentes de RSSI para o mesmo sinal. Portanto, comparar RSSI entre dispositivos diferentes é incorreto. Até dois smartphones idênticos no mesmo SO podem mostrar uma diferença de 2–5 dBm para o mesmo beacon.
Num pacote de publicidade, o RSSI é medido para cada um dos três canais (37, 38, 39). Os valores podem diferir em 3–10 dBm entre canais devido a interferências de frequência. Pilhas BLE modernas relatam o RSSI médio em todos os canais ou RSSI para cada pacote individualmente. iOS Core Bluetooth fornece RSSI médio, Android fornece RSSI do último pacote.
A faixa típica de RSSI para BLE é de -30 dBm a -100 dBm. Valores fora desta faixa são extremamente raros: -20 dBm significa que o dispositivo está literalmente a tocar na antena do scanner, enquanto -105 dBm significa ausência total de sinal. Os fabricantes de chips podem limitar a faixa: por exemplo, nRF52832 relata RSSI de -40 a -105 dBm.
| RSSI (dBm) | Qualidade do sinal | Distância aproximada | Recomendação |
|---|---|---|---|
| -30 – -50 | Excelente | 0–1 m | Dispositivo próximo |
| -51 – -70 | Boa | 1–5 m | Dentro da sala |
| -71 – -85 | Média | 5–15 m | Aceitável para beacons |
| -86 – -95 | Fraca | 15–30 m | Conexão não confiável |
| Abaixo de -95 | Crítica | 30+ m | No limite de deteção |
TX Power Level é a potência do transmissor indicada no pacote de publicidade (AD Type 0x0A) e permite ajustar a estimativa. RSSI -70 dBm de um dispositivo com TX Power +4 dBm significa que o sinal foi atenuado em 74 dB. Se TX Power for desconhecido, a estimativa precisa da distância é impossível. O iBeacon inclui TX Power (1 byte) na estrutura Manufacturer Data para calibração de distância.
O modelo Path Loss (perda de propagação) é usado para estimar a distância a partir do RSSI. A fórmula básica: RSSI = TX_Power - 10 × n × log10(d), onde n é o coeficiente de atenuação (2.0 para espaço livre, 3.0–4.5 para ambientes internos com obstáculos) e d é a distância em metros. Na prática, a precisão da estimativa é de ±2–5 m em condições reais.
Para calibrar o modelo, é necessário medir o RSSI a uma distância conhecida (geralmente 1 m) e calcular a referência de TX Power. No iBeacon, este parâmetro é armazenado no pacote. O Eddystone usa um mecanismo semelhante. Após a calibração, a distância pode ser calculada: d = 10 ^ ((TX_Power — RSSI) / (10 × n)).
De acordo com o Apple Core Bluetooth Programming Guide (2024), a precisão da estimativa de distância para iBeacon é: immediate (<0.5 m) — quando o RSSI está acima do valor de calibração, near (0.5–3 m) — quando o RSSI está dentro de 3–6 dB do valor de calibração, far (>3 m) — com sinal fraco. Nenhum modelo matemático fornece precisão melhor que ±1 m sem processamento adicional.
O RSSI é um indicador ruidoso, e a sua precisão depende de muitos fatores. As principais fontes de erro: obstáculos (paredes, móveis, pessoas) atenuam o sinal em 3–15 dB cada, a propagação por múltiplos caminhos (reflexões nas paredes) pode amplificar o sinal em alguns pontos e atenuá-lo noutros, a orientação da antena altera o RSSI em 3–10 dB ao rodar o dispositivo.
O corpo humano é um dos mais fortes absorvedores do sinal BLE. Se houver uma pessoa entre o beacon e o smartphone, o RSSI pode cair 10–20 dB. A água no corpo humano absorve eficazmente a radiação rádio a 2.4 GHz. Portanto, beacons nas portas das lojas podem mostrar RSSI diferente para clientes de diferentes alturas e constituições.
Fatores adicionais: a interferência Wi-Fi em canais adjacentes pode reduzir o RSSI em 3–5 dB, a temperatura do chip BLE afeta a precisão da medição do RSSI (alguns chips têm desvio até 1 dB/°C), a degradação da bateria no beacon reduz a potência TX, levando a um RSSI mais baixo no recetor.
O RSSI bruto não é adequado para cálculos precisos — contém demasiado ruído e valores atípicos. Os métodos de filtragem são usados para obter uma estimativa de distância estável. O mais simples é a média móvel: calcula-se a média aritmética dos últimos N valores de RSSI. Geralmente N = 5–10 é suficiente para suavizar flutuações de curto prazo.
// Filtro Kalman para 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 {
// Prever
errorCovariance += processNoise
// Atualizar
val kalmanGain =
errorCovariance /
(errorCovariance + measurementNoise)
estimate = estimate +
kalmanGain * (rawRssi - estimate)
errorCovariance =
(1.0 - kalmanGain) * errorCovariance
return estimate
}
}
O filtro Kalman é um método mais avançado que considera a dinâmica da mudança do RSSI e proporciona menos atraso do que a média móvel. Para beacons estacionários (fixos), a média móvel dá resultados aceitáveis. Para dispositivos em movimento, o filtro Kalman é preferível porque se adapta mais rapidamente às mudanças. Adicionalmente, pode ser usado um filtro Mediana para descartar valores atípicos.
iOS Core Bluetooth fornece RSSI através da propriedade peripheral.rssi (NSNumber) após a leitura de RSSI ser concluída. Para obter RSSI do pacote de publicidade, use advertisementData[CBAdvertisementDataRSSIKey]. O iOS retorna o RSSI como um valor médio nos três canais. Para monitorização contínua de RSSI, chame readRSSI com intervalos não superiores a uma vez por segundo.
// Obter RSSI no iOS
func centralManager(
_ central: CBCentralManager,
didDiscover peripheral: CBPeripheral,
advertisementData: [String: Any],
rssi RSSI: NSNumber
) {
let signalStrength = Int(truncating: RSSI)
// Filtrar sinais fracos
guard signalStrength > -90 else {
return
}
print("Dispositivo " +
"\(peripheral.name ?? "unknown") " +
"RSSI: \(signalStrength) dBm")
}
Android fornece RSSI através do callback onScanResult: result.getRssi(). O valor RSSI é o RSSI do último pacote de publicidade (não uma média). Para leituras estáveis, é necessário acumular vários valores e aplicar filtragem. O Android também fornece TX Power Level através de result.getScanRecord().getTxPowerLevel(), se for transmitido no pacote de publicidade.
// Obter RSSI no Android
private val scanCallback = object : ScanCallback() {
override fun onScanResult(
callbackType: Int,
result: ScanResult
) {
val rssi = result.rssi
val txPower = result.scanRecord?.
txPowerLevel ?: -128
// Aplicar filtro Kalman
val filtered = kalmanFilter.
filter(rssi.toDouble())
Log.d("BLEScanner",
"RSSI: $rssi, " +
"Filtered: $filtered, " +
"TX: $txPower")
}
}
Ao desenvolver aplicações que usam RSSI para posicionamento, tenha em conta: no iOS, os valores de RSSI são mais estáveis graças à calibração de hardware; no Android, são mais ruidosos e dependem do fabricante do dispositivo. Para projetos multiplataforma, recomenda-se implementar filtragem no lado da aplicação com parâmetros configuráveis para cada plataforma.
Perguntas frequentes
Não, o RSSI fornece apenas uma estimação aproximada da distância com precisão de ±2–5 m em condições reais. Para um posicionamento preciso, é necessária triangulação a partir de vários scanners, filtragem Kalman e consideração do TX Power.
Devido à propagação por múltiplos caminhos e flutuações do sinal de rádio. As reflexões em paredes e objetos criam interferência onde o sinal alternadamente se fortalece e enfraquece. Alterações de RSSI de 5–10 dB num dispositivo estacionário são normais.
O iOS recomenda chamar readRSSI não mais do que uma vez por segundo. Pedidos muito frequentes podem levar à perda de pacotes de dados. Para monitorizar o RSSI durante a digitalização, use CBAdvertisementDataRSSIKey, que está disponível para cada pacote de publicidade.
TX Power Level é a potência do transmissor em dBm indicada no pacote de publicidade. RSSI + TX Power = atenuação total do sinal do transmissor para o recetor. Conhecendo o TX Power, pode estimar-se a distância com mais precisão: RSSI - TX Power = Path Loss (perda de percurso).
Para beacons estacionários — média móvel com janela de 5–10 valores. Para dispositivos em movimento — filtro Kalman com baixo ruído de processo (0.01–0.05). Para descartar valores atípicos, adicione um filtro Mediana que remova valores fora de 2 desvios padrão.
Resumo
Vamos desenvolver um aplicativo móvel chave na mão
A IT Sectr cria aplicativos para iOS e Android para startups e empresas desde 2017. Nós vamos aconselhá-lo e propor a melhor solução.
Leia também