Ответ 1
Это довольно легко. Это всего лишь некоторые основные математики. Разделите его на 2 части:
1) Поиск горизонтального местоположения (без высоты).
Чтобы найти ваше местоположение, вам нужно 3 очка, но просто сосредоточьтесь на 2 очка на секунду. используя 2 балла, вы можете создать треугольник с собой и найти свое местоположение на основе силы сигнала между двумя точками. Это позволит узнать, где вы находитесь между двумя маршрутизаторами. Например, если вы находитесь между маршрутизаторами 3 и 4, а сила сигнала по сравнению с 3 равна -89, а сила сигнала до 4 равна -54, вы знаете, что вы ближе к 3, чем к 4. Если вы приближаетесь к расстоянию между уровнем сигнала и сигналом, вы можете получить довольно точное представление о том, где вы находитесь между маршрутизаторами 3 и 4. Проблема, оставленная тогда, определяет, с какой стороны вы находитесь между 3 и 4, так как вы можете иметь одинаковые значения силы сигнала (-89, -54) выше или ниже маршрутизаторов (смотрите диаграмму)
6
You could be here
3--------------------------4
You could also be here
5
Затем просто найдите другой маршрутизатор и обратите внимание на силу сигнала. Вы должны быть в состоянии определить, с какой стороны вы довольно легко, просто взглянув на отношения силы сигнала между 5 и 6 маршрутизаторами (на диаграмме).
2) Вы можете сделать то же самое с высотой.
Чтобы сделать все вышеизложенное, вам действительно нужно только приблизительное расстояние между уровнем сигнала и силой сигнала, а также расстояния между маршрутизаторами. Из моего тестирования (я написал свой собственный код триангуляции WiFi) сила сигнала довольно однородна для мобильных устройств, поэтому одно устройство должно иметь те же результаты, что и устройство рядом с ним.
skyhook делает это, я думаю, либо через GPS-позиционирование (это может быть жестко закодировано), либо в основном тот же принцип, что и этот. Skyhook - единственная услуга, одобренная Apple, поэтому Apple в основном сделала то же самое, а затем убедилась, что другие приложения не могут ее использовать (любое приложение для iPhone, использующее ограниченную библиотеку 80211, которая содержит функции для этого, будет быть отказано в магазине приложений).
Изменить: как найти расстояние:
Вам нужно сделать несколько простых приближений. Эти приближения не будут одинаковыми в зависимости от вашей среды, поэтому -89 футов может означать, что вы находитесь на расстоянии 15 футов от маршрутизатора 3, но -89 от маршрутизатора 4 может означать, что вы на расстоянии 13 футов. Независимо от того, что вы делаете, это не будет на 100 процентов точным, но это хорошо, потому что вы можете получить в пределах 5 футов точно.
так что вы делаете, так это то, что вы найдете кучу точек, где вы получаете чтение от -89 от маршрутизатора 3, и вы записываете то, что было на расстоянии. Затем вы берете среднее значение, и вы используете это среднее значение для размещения в своей базе данных (это говорит о том, что когда вы -89 с маршрутизатора 3, вы на 15 футов). Затем вы делаете это для других значений, например -50 или любого другого, и вы записываете свои значения и находите среднее значение. Теперь, если -89 означает, что вы находитесь на расстоянии 15 футов, а -50 означает, что вы находитесь на расстоянии 25 футов (просто пример), вам нужно приблизиться к расстоянию, когда вы -75 от маршрутизатора 3, если вы не хотите идти приближение вручную для -75. Это было бы громоздким для тонны значений, но вам нужно будет поэкспериментировать, чтобы узнать, насколько точны вы с таким количеством данных, сколько вы можете получить. Вы можете приблизиться к двум средним значениям силы сигнала, осознав, что уровень сигнала логарифмичен, поэтому вы можете оценить, что с -89 составляет 15 футов, тогда -75 будет логарифмически (базовая 10 или базовая 2, я не могу вспомнить, но я наклоняясь к основанию 10) дальше, чем -89, в 14/100 раз.
Изменить: запросить код
У меня есть код где-то, но это было пару лет назад, поэтому мне пришлось бы прорыть много вещей, чтобы найти его. Я думаю, что концептуально это должно быть легко реплицироваться без кода. Мне потребовалось около 50 строк кода Java для устройств Android, которые я тестировал.
По сути, я взял Android-телефон и создал приложение, которое позволяет мне в любой момент отображать текущий идентификатор подключенного Wi-Fi устройства, его уровень сигнала, другой близкий идентификатор Wi-Fi и их уровень сигнала, а затем местоположение GPS. Все это доступно через android api. Я думаю, вам нужно устройство Android на API 4 или выше или что-то еще. Это было как 3 или 4 года назад, поэтому я просто выбрасываю это из того, что я помню.
Часть местоположения GPS заключалась в том, чтобы упростить сопоставление между физической и беспроводной сетью, вместо того, чтобы создавать карту чертежей моего объекта каким-либо другим способом, я мог бы просто сделать карты Google, сделав это для меня одновременно с Я могу наложить их карту и координаты GPS в основном, создавая карту расстояния. Вам все равно нужна карта глубины, чтобы отображать уровни пола, хотя мы можем сделать это вручную, легко обнаружив, если вы находитесь в середине двух маршрутизаторов. Мы знаем, что уровень сигнала сильнее всего для Wi-Fi-концентраторов на одном этаже, а затем можно дважды проверить, убедившись, что у вас слабые сигналы на концентраторы WiFi на разных этажах. Эта карта глубины - это, по существу, список концентраторов wifi и их соответствующих этажей. Нам не нужны их позиции, так как мы можем лучше всего соответствовать силе сигнала в местоположениях GPS, которые мы схватили, когда ходим по объекту и хватаем силу сигнала для определенных концентраторов. Это простая математика. Итак, для 2D-плоскости, глядя сверху вниз, у нас есть такие объекты:
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
}
И затем, когда мы пинговаем клиентское устройство и хотим наилучшим образом его подобрать, он возвращает такой объект:
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.
}
Тогда мы сможем легко подобрать наш ClientPosition для 2D-карты, которую мы создали с помощью двух указанных выше объектов.
Вышеприведенное довольно просто, а карта глубины еще проще. На мой взгляд.
В идеале вы бы хотели попробовать несколько разных устройств, которые охватывают пару разных беспроводных технологий (некоторые устройства, некоторые устройства b, n, g и т.д.), чтобы получить более точные результаты. То, что я нашел, было то, что точность не такая большая, и вы будете в пределах 5 футов или около того. Это было достаточно точно для моих нужд. В идеале все концентраторы wifi являются одной и той же моделью, и они обычно находятся в крупных объектах/компаниях, но даже тогда это не так уж и важно. Изменчивость настолько мала, и если вам не нужна безумная точность, это не имеет значения.