Triangulación de position Wi-Fi

introduzca la descripción de la imagen aquí

Necesito entender cómo básicamente funciona la triangulación Wifi. La escena se describe en el diagtwig anterior. Para implementar la triangulación wifi, necesito un mínimo de 3 hotspots Wifi y sus posiciones. La puesta en marcha:
1. Para simplificar, supongamos que tengo un área de 1 km2 por 1 km2 , y tengo 3 puntos Wi-Fi en esta área. El sistema de coorderadas es el siguiente: 1 esquina del área cuadrada es (0,0,0), y la esquina más alejada en diagonal tendrá coorderadas (1,1,1). Toda la determinación de la position debe hacerse en relación con este sistema de coorderadas solo (para simplificar, no quiero coorderadas globales xyz). Dentro de esto, tengo 3 hotspots wifi en (x1, y1, z1), (x2, y2, z2), (x3, y3, z3).
2. Tenemos una persona con un dispositivo capaz de recibir señales wifi y calcular la intensidad de la señal en la position (x, y, z) . El dispositivo podría ser un teléfono, una tableta, etc.
El problema: Calcule la position (x, y, z) de la persona dinámicamente, a medida que se muevan cuando tenga las siguientes inputs:
1. Intensidad de señal de las señales recibidas de cada uno de los hotspots Wi-Fi
2. Coorderadas de los hotspots wifi previamente almacenados en variables o en una database.

Primera pregunta: ¿Cómo calculo la position de las inputs anteriores? Supongo que la intensidad de la señal es directamente proporcional a la distancia desde el enrutador, pero ¿cuál es la relación exacta? ¿Cómo lo hace Skyhook con tanta precisión?
Segunda pregunta: creo que las inputs anteriores son suficientes. ¿Se requiere algo más?

¡Gracias!

Esto es bastante fácil Es solo algunas matemáticas básicas. Divídalo en 2 partes:

1) Encontrar su location horizontal (sin altura).

Para encontrar su location, necesita 3 puntos, pero solo concéntrese en 2 puntos por un segundo. Al usar 2 puntos, puede crear un triángulo consigo mismo y encontrar su location en function de la intensidad de su señal entre dos puntos. Esto descubrirá dónde se encuentra entre dos enrutadores. Por ejemplo, si está entre los enrutadores 3 y 4, y la intensidad de su señal en comparación con 3 es -89 y su intensidad de señal a 4 es -54, usted sabe que está más cerca de 3 que de 4. Si hace una aproximación de la distancia frente a la intensidad de la señal, puede encontrar una lectura bastante precisa de dónde se encuentra entre los enrutadores 3 y 4. El problema que queda después es determinar de qué lado se encuentra entre 3 y 4 , ya que podría tener los mismos valores de intensidad de señal (-89, -54), ya sea arriba o debajo de los enrutadores (mira el diagtwig)

6 You could be here 3--------------------------4 You could also be here 5 

Luego, busque otro enrutador y observe la potencia de su señal. Debería poder determinar de qué lado se encuentra con bastante facilidad simplemente mirando las relaciones de intensidad de señal entre 5 y 6 enrutadores (en el diagtwig).

2) Puedes hacer lo mismo con altura.

Para hacer todo lo anterior, realmente solo necesita una aproximación de la distancia y la fuerza de la señal, y las distancias entre los enrutadores. A partir de mis testings (escribí mi propio código de triangulación WiFi), la intensidad de la señal es bastante uniforme en todos los dispositivos mobilees, por lo que un dispositivo debería tener los mismos resultados que el dispositivo al lado.

skyhook lo creo, ya sea a través del posicionamiento GPS (podría estar codificado en forma rígida), o básicamente el mismo principio que este. Skyhook es el único service aprobado por Apple para esto, por lo que Apple básicamente hizo lo mismo y luego se aseguró de que otras aplicaciones no pudieran usarlo (cualquier aplicación para iPhone que use la biblioteca restringida 80211 que contiene las funciones para hacerlo se denegará desde la tienda de aplicaciones).

Editar: Cómo encontrar la distancia:

Necesitas hacer algunas aproximaciones simples. Estas aproximaciones no serán las mismas dependiendo de su entorno, por lo que -89 pies podría significar que está a 15 pies de distancia del enrutador 3, pero -89 del enrutador 4 podría significar que está a 13 pies de distancia. No importa lo que hagas, esto no será 100 por ciento exacto, pero está bien, porque puedes llegar a 5 pies por seguro.

así que lo que hace es encontrar un montón de puntos donde obtiene una lectura de -89 desde el enrutador 3, y anota cuál fue su distancia. Luego, tomas un promedio, y usas este promedio para poner en tu database (que dice cuando eres -89 desde el enrutador 3, tienes 15 pies). A continuación, haz esto para otros valores, como -50 o lo que sea, y anota tus valores y encuentra un promedio. Ahora, si -89 significa que estás a 15 pies de distancia, y -50 significa que estás a 25 pies de distancia (solo un ejemplo), tienes que aproximar tu distancia cuando eres -75 desde el enrutador 3 a less que quieras ir una aproximación a mano para -75. Esto sería engorroso para toneladas de valores, pero tendrás que experimentar para ver qué tan preciso puedes ser con tan pocos puntos de datos como puedas get. Puede aproximar entre dos promedios de potencia de señal al darse count de que la potencia de la señal es logarítmica, por lo que puede estimar que dado que -89 es de 15 pies, entonces -75 sería logarítmicamente (base 10 o base 2, no puedo recordar, pero estoy inclinándose hacia la base 10) más lejos que -89 por un factor de 14/100.

Editar: pidiendo código

Tengo el código en alguna parte, pero fue hace un par de años, así que tendría que search muchas cosas para encontrarlo. Creo que, conceptualmente, debería ser fácil de replicar sin código. Me tomó alnetworkingedor de 50 líneas de código de Java para los dispositivos Android que estaba probando.

Básicamente, tomé un teléfono Android y creé una aplicación que me permitía mostrar en cualquier momento la ID actual del dispositivo wifi conectado, su potencia de señal, otras ID de Wi-Fi cercanas y su intensidad de señal, y luego la location del GPS. Todo esto es accesible a través de la API de Android. Creo que necesitas un dispositivo Android en API 4 o superior o algo así. Esto fue como hace 3 o 4 años, así que estoy tirando esto de lo que recuerdo.

La parte de la location del GPS era facilitar el mapeo entre la fuerza física y la wifi, en lugar de tener que crear un map de planos de mi installation de alguna otra manera, podría hacer que los maps de Google lo hagan por mí al mismo time, ya que puedo superponer su map y el GPS se coordinan esencialmente, mientras se crea el map de distancia. Aún así, necesitaría un map de profundidad para mapear los niveles de piso, lo que podemos hacer a mano bastante fácilmente al encontrar si está en medio de dos enrutadores. Sabemos que la potencia de la señal es más fuerte para los concentradores Wi-Fi en el mismo piso, y luego puede hacer un doble control asegurándose de tener señales más débiles a los concentradores Wi-Fi en diferentes pisos. Este map de profundidad es esencialmente una list de los centros wifi, y sus respectivos pisos. No necesitamos sus posiciones, ya que podemos ajustar mejor la potencia de la señal a las ubicaciones de GPS que tomamos cuando caminamos por la installation y agarramos la potencia de la señal a ciertos concentradores. Esta es una simple matemática. Entonces, para la position del plano 2D, mirando hacia abajo desde la parte superior, tenemos un montón de objects como tales:

 BestFitObject{ Tuple<long, long> GPSLocation; List<Tuple<WifiDevice, signedInt>> WifiReadings; //WifiDeviceName(through UUID or some other way), tupled with the signalStrength when that bestFit reading was taken } WifiDevice{ UUID ID; //Think a string should work fine, might be an internal type that encompasses UUID which woudl be better. int floorNumber; Tuple<long, long> GPSLocation; //Not entirely necessary, could provide better accuracy though } 

Y luego, cuando hacemos ping al dispositivo cliente y queremos encajar mejor, devuelve un object como este:

 ClientPosition{ List<Tuple<UUID, signedIt> NearbySignals; //Tuple of the UUID of the wifi device and the signal strength taken during the time of the ping. } 

Entonces, podemos adaptar fácilmente nuestra position de cliente al map 2D que creamos con los dos objects anteriores.

Lo anterior es bastante simple, y el map de profundidad es aún más simple. En mi opinión.

Idealmente, querría probar y conectar un par de dispositivos diferentes que abarcan un par de técnicos inalámbricos diferentes (algunos dispositivos, algunos dispositivos b, n, g, etc.) solo para get resultados más precisos. Sin embargo, lo que encontré fue que la precisión no es tan importante, y estarás a 5 pies o less. Eso fue lo suficientemente preciso para mis necesidades. Idealmente, todos los concentradores wifi son del mismo model, y usualmente están en instalaciones / compañías grandes, pero incluso entonces, no es tan importante. La variabilidad es muy pequeña, y si no necesitas una precisión loca, no importará.

Bueno, es una señal, por lo que su intensidad caerá del cuadrado de la distancia. Ver Ley de Cuadrado Inverso

Android le dará la potencia de la señal en dBm . No estoy familiarizado con esa unidad, pero si es algo así como decibelios de audio, no es una escala lineal. Querrá tener en count eso.

En un mundo perfecto, los campos serán lo suficientemente uniformes como para que las mediciones puras te den distancia, pero si haces esto a través de cualquier metal, las cosas se volverán feas. Además, la configuration interna de la radio wifi de su dispositivo puede hacerlo más sensible en ciertas direcciones. No soy ingeniero ni nada, así que no sé hasta qué punto estas cosas afectarán el resultado final. Puede ser intrascendente.

Finalmente, para la location tridimensional, creo que necesita cuatro puntos de reference. Si todos los puntos wifi están a la misma altura, puedes encontrar tu position horizontal. Si no lo están, encontrarás tu position en el avión en el que están, lo que puede no ser lo suficientemente exacto para ti, dependiendo de qué tan empinado sea ese avión.

Ni siquiera te preocupes por convertir el DBm a distancia. Las señales de radio viajan a la velocidad de la luz (casi), salvo por alguna atenuación debida a factores ambientales. Por lo tanto, si puede "hacer ping" en el dispositivo, puede get una idea general de su distancia. Dado una antena omnidireccional de una location conocida, puede usar el time que lleva recibir la respuesta para trazar un radio y dibujar un círculo. Ahora, si hace esto desde múltiples dispositivos, los círculos se cruzarán, lo que debería proporcionarle la dirección. Por supuesto, esto es todo 2d. Podrías hacer lo mismo, cosa en 3d, pero estarías ttwigndo esferas en su lugar. Cuantos más dispositivos tenga, más precisa será la location.