Saltar al contenido

Estimación de proximidad/distancia de baliza basada en RSSI – Bluetooth LE

Guadalupe, miembro de nuestro equipo, nos hizo el favor de escribir este post porque domina perfectamente este tema.

Solución:

los txPower mencionado por @davidgyoung está dado por la fórmula:

RSSI = -10 n log d + A

dónde

  • d = distancia
  • A = txPotencia
  • n = constante de propagación de la señal
  • RSSI = dBm

en espacio libre n = 2pero variará según la geometría local; por ejemplo, una pared reducirá RSSI por ~3dBm y afectará n respectivamente.

Si desea la mayor precisión posible, puede valer la pena determinar experimentalmente estos valores para su sistema en particular.

Referencia: consulte el artículo Evaluación de la fiabilidad de RSSI para la localización en interiores de Qian Dong y Waltenegus Dargie para obtener una explicación más detallada de la derivación y la calibración.

double getDistance(int rssi, int txPower) 
    /*
     * RSSI = TxPower - 10 * n * lg(d)
     * n = 2 (in free space)
     * 
     * d = 10 ^ ((TxPower - RSSI) / (10 * n))
     */

    return Math.pow(10d, ((double) txPower - rssi) / (10 * 2));

No está claro si su incapacidad para leer la constante de calibración “txPower” o “measuredPower” se debe a la AdRecord class o debido a que falta información en los anuncios que intenta analizar. No me parece que esa clase analice un anuncio estándar de iBeacon. De cualquier manera, hay una solución:

SOLUCIÓN 1: Si sus balizas envían un anuncio iBeacon estándar que incluye la constante de calibración, puede analizarla utilizando código en la clase IBeacon de la biblioteca iBeacon de Android de código abierto aquí.

SOLUCIÓN 2: Si sus balizas NO envían un anuncio estándar de iBeacon o no incluyen una constante de calibración:

Debe codificar una constante de calibración en su aplicación para cada tipo de dispositivo que pueda usar. Todo lo que realmente necesita del anuncio para estimar la distancia es la medición RSSI. El objetivo de incorporar una constante de calibración en la transmisión es permitir que una amplia variedad de balizas con una potencia de salida de transmisor bastante diferente funcionen con el mismo algoritmo de estimación de distancia.

La constante de calibración, tal como la define Apple, básicamente dice cuál debería ser el RSSI si su dispositivo está exactamente a un metro de distancia de la baliza. Si la señal es más fuerte (menos RSSI negativo), entonces el dispositivo está a menos de un metro de distancia. Si la señal es más débil (RSSI más negativo), entonces el dispositivo está a más de un metro de distancia. Puedes usar una fórmula para hacer una estimación numérica de la distancia. Mira aquí.

Si no está tratando con anuncios que contienen una constante de calibración “txPower” o “measuredPower”, entonces puede codificar una tabla de búsqueda en su aplicación que almacena las constantes de calibración conocidas para varios transmisores. Primero deberá medir el RSSI promedio de cada transmisor a un metro de distancia. Entonces necesitará algún tipo de key para buscar estas constantes de calibración en la tabla. (Quizás puedas usar alguna parte del string de la estructura AD, o la dirección mac?) Entonces su tabla podría verse así:

HashMap txPowerLookupTable = new HashMap();
txPowerLookupTable.put("a5:09:37:78:c3:22", new Integer(-65));
txPowerLookupTable.put("d2:32:33:5c:87:09", new Integer(-78));

Luego, después de analizar un anuncio, puede buscar la constante de calibración en su onLeScan método como este:

String macAddress = device.getAddress();
Integer txPower = txPowerLookupTable.get(macAddress);

Puntuaciones y reseñas

Al final de la web puedes encontrar las críticas de otros gestores de proyectos, tú de igual forma puedes insertar el tuyo si te apetece.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *