Как правильно триангулировать сотовые ячейки GSM, чтобы получить местоположение?
Прежде всего, я пытаюсь сделать всю эту катастрофу в С# (.net 4), поэтому, если вы придумаете какой-то код, который поможет мне, что было бы оценено, но на самом деле все могло бы помочь на этом этапе.
У меня есть ситуация, когда у меня есть устройство, которое может получать информацию о GSM-ячейке (кстати, через команду AT+KCELL
), поэтому у меня есть набор значений о башнях сот (каждый из них имеет LAC, MCC, MNC, Cell ID, Сила сигнала и первый предварительный переход времени). Поэтому я думаю, что я нахожусь в хорошем месте, чтобы иметь возможность найти какую-то координату долготы и широты (хотя и неточную, но хорошо меня). Вот где я обращаюсь за помощью, потому что теперь мой маленький мозг запутался...
Я могу видеть различные службы, предоставляющие разрешение сотового кода (Google, Open Cell ID и т.д.), и они принимают LAC, MCC и т.д. в качестве аргументов и возвращают координату. Я полагаю, что то, что они возвратят, будет поэтому координатой данной башни, в которую я вхожу. Поэтому в моем случае я мог бы отправить все LAC и т.д., Которые у меня есть, и вернуть коллекцию долготы и широт. Блестяще, но это не то место, где мое устройство. Теперь я думаю, что мне нужно сделать какую-то триангуляцию, и именно здесь мне не хватает знаний.
Так я до сих пор прав? Предполагая, что я, как мне выполнить этот расчет (есть ли что-то там, которое скажет мне, что делать со всеми этими цифрами или, что еще лучше, с какой-либо библиотекой с открытым исходным кодом, я могу ссылаться и передавать все это, чтобы получить что-то разумное)
Я предполагаю, что мне нужно будет использовать предварительный выбор времени, чтобы выработать приблизительное расстояние от ячеистой башни (возможно, используя силу сигнала как-то), но что мне делать? Как вы можете сказать - я вышел из своей глубины здесь!
Например, это то, что я могу получить от вышеупомянутой команды AT:
5,74,33,32f210,157e,8101,50,0,79,3,32f210,157e,80f7,37,64,5,32f210,157e,810b,37,55,32,32f210,157e,9d3,27,41,33,32f210,157e,edf8,15
Разбирая его и разбирая, я получаю (надеюсь, что разобраю это право - есть вероятность, что в моей рутинной программе есть ошибка, но это выглядит разумно):
Number of cells: 5
Ячейка 1
LAC: 5502
MNC: 1
MCC: 232
Cell ID: 33025
Signal: 80
ARFCN: 74
BSIC: 33
Timing advance: 0
Longitude: 14.2565389
Latitude: 48.2248439
Ячейка 2
LAC: 5502
MNC: 1
MCC: 232
Cell ID: 33015
Signal: 55
ARFCN: 79
BSIC: 3
Longitude: 14.2637736
Latitude: 48.2331576
Ячейка 3
LAC: 5502
MNC: 1
MCC: 232
Cell ID: 33035
Signal: 55
ARFCN: 64
BSIC: 5
Longitude: 14.2488966
Latitude: 48.232513
Ячейка 4
LAC: 5502
MNC: 1
MCC: 232
Cell ID: 2515
Signal: 39
ARFCN: 55
BSIC: 32
Longitude: 14.2488163
Latitude: 48.2277972
Ячейка 5
LAC: 5502
MNC: 1
MCC: 232
Cell ID: 60920
Signal: 21
ARFCN: 41
BSIC: 33
Longitude: 14.2647612
Latitude: 48.2299558
Итак, со всей этой информацией, как я могу найти наиболее точным способом, где я на самом деле?
Ответы
Ответ 1
Я могу немного помочь вам в теории.
Триангуляция в основном находит точку пересечения трех окружностей.
Каждая передвижная башня - это центр круга. Размер круга относительно уровня сигнала этой башни.
Место, где перекрывается 3 круга, - это где пользователь.
Вы можете сделать очень простую триангуляцию следующим образом:
3 Towers at
tx1,ty1
tx2,ty2
tx3,ty3
With signal strengths s1, s2, s3
We calculate the weight of each signal. Essentially a number from 0 to 1 for each tower where the sum of the weights adds up to 1.
Weighted signal w1, w2, w3 where:
w1 = s1/(s1+s2+s3)
w2 = s2/(s1+s2+s3)
w3 = s3/(s1+s2+s3)
User will be at
x: (w1 * tx1 + w2 * tx2+ w3 * tx3)
y: (w1 * ty1 + w2 * ty2+ w3 * ty3)
Вот рабочий пример, используя значения из вашего вопроса:
s1 = 80
s2 = 55
s3 = 55
s4 = 55
s5 = 21
w1 = 80 / ( 80 + 55 + 55 + 55 + 21 )
w2 = 55 / ( 80 + 55 + 55 + 55 + 21 )
w3 = 55 / ( 80 + 55 + 55 + 55 + 21 )
w4 = 55 / ( 80 + 55 + 55 + 55 + 21 )
w5 = 21 / ( 80 + 55 + 55 + 55 + 21 )
w1 = 0.3007519
w2 = 0.2067669
w3 = 0.2067669
w4 = 0.2067669
w5 = 0.0789474
1. Longitude: 14.2565389
1. Latitude: 48.2248439
2. Longitude: 14.2637736
2. Latitude: 48.2331576
3. Longitude: 14.2488966
3. Latitude: 48.232513
4. Longitude: 14.2488163
4. Latitude: 48.2277972
5. Longitude: 14.2647612
5. Latitude: 48.2299558
Location Longitude =
14.2565389 * 0.3007519 +
14.2637736 * 0.2067669 +
14.2488966 * 0.2067669 +
14.2488163 * 0.2067669 +
14.2647612 * 0.0789474
Location Latitude: =
48.2248439 * 0.3007519 +
48.2331576 * 0.2067669 +
48.232513 * 0.2067669 +
48.2277972 * 0.2067669 +
48.2299558 * 0.0789474
Result Longitude: 14.255507
Result Latitude: 48.2291628
Ответ 2
Это не ответ на самом деле, но его стартер, и я могу добавить к нему больше:
Имена клеток опубликованы:
http://openbmap.org/
Я нашел эту ссылку на этой странице вики, в которой есть ссылки на другие источники данных сотовых идентификаторов: http://en.wikipedia.org/wiki/Cell_ID)
см. нижнюю часть страницы, это ссылка на данные идентификатора ячейки:
http://openbmap.org/latest/cellular/raw/input_raw.zip
Кроме того, я нашел это видео youtube, где ребята играют с некоторыми приложениями, у которых есть ячейки сотовой башни, которые кажутся:
http://www.youtube.com/watch?v=CYvVN5dJD7A
возможно между идентификаторами ячеек и мощностью сигнала, которые вы можете сделать.
но AFAIK для общей триангуляции вам нужно знать точное местоположение как минимум трех башен и точное расстояние от них (это может быть грубое расстояние с силой сигнала, но оно может быть слишком точным).
похоже, что википедия говорит, что это сделано таким образом. Используйте комбинацию, в которой вы находитесь, ближайшая башня и сила сигнала, чтобы получить ваше местоположение:
http://en.wikipedia.org/wiki/Mobile_phone_tracking