RSSI em BLE — indicador de sinal e estimativa de distância

Autor: IT Sectr Publicado: 2026-07-16 Tempo de leitura: 10 min

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 é o nível de potência do sinal BLE em dBm medido no lado recetor ao receber um pacote.
  • Faixa de RSSI: de -30 dBm (sinal muito forte) a -100 dBm (limite de deteção).
  • O RSSI é usado para estimar distância através do modelo Path Loss, mas a precisão é de ±2–5 m em condições reais.
  • O RSSI é afetado por: obstáculos (paredes, pessoas), propagação por múltiplos caminhos e orientação da antena.
  • Para melhorar a precisão, são usados filtragem Kalman, média móvel e triangulação a partir de vários scanners.

O que é RSSI em BLE?

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.

Faixa de valores de RSSI

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 sinalDistância aproximadaRecomendação
-30 – -50Excelente0–1 mDispositivo próximo
-51 – -70Boa1–5 mDentro da sala
-71 – -85Média5–15 mAceitável para beacons
-86 – -95Fraca15–30 mConexão não confiável
Abaixo de -95Crítica30+ mNo 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.

Relação RSSI-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.

Fatores que afetam a precisão do RSSI

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.

Filtragem e suavização de RSSI

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.

kotlin
// 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.

Obter RSSI em iOS e Android

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.

swift
// 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.

kotlin
// 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

É possível determinar a distância com precisão através do RSSI?

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.

Porque é que o RSSI muda mesmo quando o dispositivo não se move?

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.

Com que frequência se pode ler o RSSI no iOS?

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.

O que é TX Power Level e como se relaciona com o RSSI?

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).

Qual o melhor método de filtragem de RSSI para beacons?

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

  • RSSI é um indicador de potência de sinal BLE em dBm medido no lado recetor ao receber cada pacote.
  • Faixa de valores: de -30 dBm (sinal excelente) a -100 dBm (sinal fraco no limite de deteção).
  • O RSSI fornece uma estimativa aproximada de distância com precisão de ±2–5 m, mas não é um telémetro preciso devido ao ruído e interferência.
  • Principais fontes de erro: obstáculos (paredes, pessoas), propagação por múltiplos caminhos, orientação da antena e interferência Wi-Fi.
  • Para uma estimativa estável de distância, usam-se filtragem Kalman, média móvel e filtro Mediana para remoção de valores atípicos.
  • No iOS, o RSSI é a média dos três canais; no Android, é o valor do último pacote, exigindo filtragem no lado da aplicação.
  • O TX Power Level no pacote de publicidade juntamente com o RSSI fornece Path Loss — a atenuação total do sinal para uma estimativa de distância mais precisa.

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.

Discutir o projeto

Leia também