Как определить местоположение по сетям сотовой связи (Cell ID)


    Карта Участники OpenStreetMap
     
    Существует множество способов определения местоположения, такие как спутниковая навигация (GPS), местоположение по беспроводным сетям WiFi и по сетям сотовой связи.
     
    В данном посте мы попытались проверить, насколько хорошо работает технология определения местоположения по вышкам сотовой связи в городе Минске (при условии использования только открытых баз данных координат передатчиков GSM).
     
    Принцип действия заключается в том, что сотовый телефон (или модуль сотовой связи) знает, каким приемопередатчиком базовой станции он обслуживается и имея базу данных координат передатчиков базовой станции можно приблизительно определить своё местоположение.

     

     
    Как указано на странице Cell ID, открытых баз данных с координатами передатчиков сотовой связи не так уж и много. Например, это OpenCellID.org, содержащая 2 611 805 передатчиков (13042 из них в Беларуси) и openbmap.org, содержащая 695 294 передатчиков.
     
    Ниже приведен скриншот с обозначенными передатчиками в западной части Минска. Как видно число базовых станций не равно нулю, что вселяет оптимизм и возможный положительный исход эксперимента.
     

    Карта Участники OpenStreetMap
     
    Теперь немного о том, что такое передатчик в понимании OpenCellID и каким образом наполняется база данных OpenCellID. Эта БД наполняется различными способами, наиболее простой — это установка на смартфон приложения, которое записывает координаты телефона и обслуживающую базовую станцию, а затем отсылает на сервер все измерения. На сервере OpenCellID происходит вычисление приблизительного местоположения базовой станции на основании большого числа измерений (см. рисунок ниже). Таким образом, координаты беспроводной сети вычисляются автоматически и являются очень приблизительными.
     

    Карта Участники OpenStreetMap
     
    Теперь перейдем к вопросу о том, как использовать эту базу данных. Есть два варианта: использовать сервис перевода Cell ID в координаты, который предоставляется сайтом OpenCellID.org, либо выполнять локальный поиск. В нашем случае локальный способ предпочтительней, т.к. мы собираемся проехать по 13-километровому маршруту, и работа через веб будет медленной и неэффективной. Соответственно нам необходимо скачать базу данных на ноутбук. Это можно сделать, скачав файл cell_towers.csv.gz c сайта downloads.opencellid.org.
     

     
    База данных представляет собой таблицу в CSV-формате, описанном ниже:
     

     
    Нас интересуют следующие параметры:
    • <mcc> — код страны;
    • <mnc> — код оператора;
    • <lac> — код зоны;
    • <cellid> — идентификатор передатчика;
    • <long> — долгота передатчика;
    • <lat> — широта передатчика.

    С базой данных все понятно, теперь можно переходить к определению Cell ID.
     
    Все сотовые модули поддерживают следующие команды: AT+CREG, AT+COPS (обслуживающая базовая станция), AT+CSQ (уровень сигнала от базовой станции). Некоторые модули позволяют узнать кроме обслуживающего передатчика также и соседние, т.е. выполнять мониторинг базовых станций с помощью команд AT^SMONC для Siemens и AT+CCINFO для Simcom. У меня в распоряжении был модуль SIMCom SIM5215Е.
     

     
    Соответственно мы воспользовались командой AT+CCINFO, ее формат приведен ниже.
     

     

     
    Нас интересуют следующие параметры:
    • <SCELL> — индикатор обслуживающего передатчика;
    • <NCELLn> — индикатор соседнего передатчика;
    • <mcc> — код страны;
    • <mnc> — код оператора;
    • <lac> — код зоны;
    • <id> — идентификатор передатчика;
    • <rxlev> — мощность принимаемого сигнала в дБм.

    Подключив сотовый модуль к ноутбуку, мы получили следующий лог:
     

     
    Мониторинг работает – можно ехать.
     
    Маршрут пролег в западной части Минска по ул. Матусевича, пр. Пушкина, ул. Пономаренко, ул. Шаранговича, ул. Максима Горецкого, ул. Лобанка, ул. Кунцевщина, ул. Матусевича.
     

    Карта Участники OpenStreetMap
     
    Запись лога велась с интервалом в 1 секунду. Выполняя преобразование CellID в координаты, выяснилось что 6498 обращений к базе данных OpenCellID были результативными, а 3351 обращений не нашли соответствий в БД. Т.е. hit rate для Минска составляет примерно 66 %.
     
    На рисунке ниже показаны все передатчики, которые встречались в логе и были в БД.
     

    Карта Участники OpenStreetMap
     
    На рисунке ниже показаны все обслуживающие передатчики, которые встречались в логе и были в базе данных. Т.е. подобный результат можно получить на любом сотовом модуле или телефоне.
     

    Карта Участники OpenStreetMap
     
    Как видим, в один из моментов нас обслуживал передатчик, находящийся за транспортной развязкой на пересечении ул. Притыцкого и МКАД. Скорее всего, это загородная базовая станция, обслуживающая абонентов на расстоянии в несколько километров, что ведет к значительным ошибкам в определении местоположения по Cell ID.
     
    Поскольку наш SIMCom SIM5215Е в каждый момент времени показывает не только обслуживающий передатчик, но также соседние и уровни сигнала от них, то попробуем рассчитать координаты аппарата на основании всех данных, имеющихся в конкретный момент времени.
     
    Расчет координат абонента будем выполнять как взвешенное среднее координат передатчиков:
    Latitude = Sum (w[n] * Latitude[n] ) / Sum(w[n])
    Longitude = Sum (w[n] * Longitude[n]) / Sum(w[n])
     
    Как известно из теории распространения радиоволн, затухание радиосигнала в вакууме пропорционально квадрату расстояния от передатчика до приемника. Т.е. при удалении в 10 раз (например, с 1 км до 10 км) сигнал станет в 100 раз слабее, т.е. уменьшится на 20 дБ по мощности. Соответственно вес при каждом слагаемом определяется как:
    w[n] = 10^(RSSI_in_dBm[n] / 20)
     
    Здесь мы допустили, что мощность всех передатчиков одинаковая, это допущение ошибочно. Но ввиду отсутствия информации о мощности передатчика базовой станции приходится идти на заведомо грубые допущения.
     
    В результате получаем более подробную картину местоположений.
     

    Карта Участники OpenStreetMap
     
    По итогу маршрут оказался неплохо прочерчен за исключением выброса в сторону развязки на МКАД, по ранее описанной причине. Кроме того, со временем база данных координат будет наполнятся, что также должно повысить точность и доступность технологии определения местоположения по Cell ID.
     
    Спасибо за внимание. Вопросы и комментарии приветствуются.
    Метки:
    Promwad 37,08
    Контрактная разработка и производство электроники
    Поделиться публикацией
    Комментарии 35
    • 0
      Интересный сайт. Нашёл свою БС по cellid, странно, но есть станции ближе чем моя, почему телефон не привязался к тем что ближе? И там ещё круги (я так понимаю это покрытие, конкретные устройства связанные с БС), так к мою сторону даже намёка нет.
      • +1
        Насколько я понимаю — все зависит от нагрузки на конкретную станцию. В вашем случае нагрузка на самую близкую станцию может быть слишком высокой, поэтому вас коммутирует на следующую.
        • 0
          А скажите пожалуйста. Можно ли принудительно выбирать БС? Типа того, что установить на свой андроидофон патч к ОС, который позволит цепляться только за определенную станцию?

          Для чего это нужно:
          1) На ближней БС есть связь, но нет 3G. А я согласен на более дальнюю, с пусть и хреновеньким 3G.
          2) На ближней БС есть связь, но она находится в соседней области, и тарифицируется по-другому. А более дальняя находится в «родном» регионе.
          3) Мне не хочется чтобы ZOG или любая иная трехбуквенная организация знала мое местоположение, поэтому я цепляюсь только за одну-единственную БС, а с другим принципиально ни одного пакета не отсылаю.

          Можно ли?
          • +2
            Логика данного решения понятна, однако на практике у вас вряд ли получается такое реализовать.
            По дефолту БС считает себя умнее юзера, политика, в чем-то схожая с политикой Microsoft.
            • 0
              Мне вспомнилась одна из историй, проскакивавших на Хабре.

              Сделали антенну для 3G и она поймала сигнал из деревни за 12км (учитывая что в 8км тоже была станция с 3G). По одному направлению.
              Так что самостоятельный выбор вышки мог бы решить некоторые проблемы, но мог бы создать «пробки».
              • 0
                На старых версиях симбиана (мобильной ОС) 6-7-8 было приложение netmonitor, которое позволяло вручную привязываться к нужно базовой станции, и как раз решать задачи, перечисленные Вами. К сожалению, с тех времен данное приложение не было портировано на свежие версии мобильных ОС :-( Как я понял, в следствии ограничений разработчиков мобильных ОС.
                • 0
                  Как я понял, в следствии ограничений разработчиков мобильных ОС.
                  Да, согласен, разработчики мобильных ОС в следствии очень ограничены. Однако мобильные ОС они должны разрабатывать всё же лучше, чем вести следствие.
                  • 0
                    А с другой стороны — вон, собственные сборки андроида же выпускают? т.е. можно глубоко довольно залезть? с помощью NDK и всего такого
                  • 0
                    Не забываем, что как правило приоритет отдается голосу.
                    Кроме того телефон еще стремиться уменьшить можность передатчика для экономии батарейки, а также число хендоверов — там есть некий гистерезис.
                    И насколько я знаю реализация GSM стека вещь достаточно закрытая. Так что просто так получить к нему доступ — врядли.
                    • +1
                      Единственное, что можно посоветовать — это использовать направленную антенну и в настройках сети на телефоне выставить «WDCMA only».

                      Сматрфон, как известно, состоит из GSM Baseband Processor и Application Processor. Т.о. мобильная ОС, работающая на Application Processor, имеет весьма ограниченное влияние на то, что происходит в отдельной закрытой прошивке Baseband Processor, это, в частности, выбор оператора и стандарта связи, но никак не исключение определенных БС из логики выбора обслуживающей БС.
                      • 0
                        Очень интересно, спасибо.

                        Навскидку порылся, самое близкое, что на этот счет придумали — проект OsmocomBB. Это прошивка для управления Baseband Processor'ом через Linux, установленный на телефон. Увы, очень короткий список поддерживаемых телефонов, и современных там нет.
                  • +4
                    Учтите кроме расстояния также: частоту, режим работы (3G или GSM), раскрытия секторов, помехи, препятствия, отражения — и получите ответ.
                    • +1
                      GSM, станция моего оператора, ID совпадает с тем что на телефоне, но как раз к ней больше всего препятствий, окна мои выходят в обратную сторону (если конечно сигнал не отражается от здания напротив и это считается нормальным). Хотелось бы комментарий или лучше статью от человека который имеет непосредственное отношение к работе с БС )
                      • 0
                        Тут очень много сценариев возможны. Например: Аппарат зарегистрировался в одной ячейке, и пока с ней сигнал приемлемый, он будет поддерживать с ней соединение до тех пор, пока нет препятствий для передачи данных, даже если есть ячейки с сигналом получше. Или так: аппарат включен в режиме «3G предпочтительно» или «только 3G», а более близкая станция, предположим, имеет только одну секторную антенну 3G, смотрящую в противоположную сторону, т.е. вы не попадаете в область действия сектора. Зато вы попадаете в зону действия другой антенны — пусть она находится дальше, зато смотрит прямо на вас. Уровень сигнала в этом случае будет больше. Я не профессионал, поэтому моим комментариям может быть грош цена, но с отделом БСС одного сотового оператора дело имел, и оборудование знаю как работает, так что примерно представляю что там к чему.
                    • 0
                      У меня через 200 метров от дома мачта сотовой. Но не факт, что я подключусь на неё. Она расположена заметно ниже, а антенны могут быть на моей высоте примерно с учётом рельефа местности. При этом я вижу другую станцию (точнее её мачту) в пределах 3,8 километрах от меня (высоко дом стоит). Не факт, что сигнал с ближайшей станции сильнее той,
                    • +3
                      У OpenCellID далеко не самая полная база. Куда точнее можно определять местоположение через API Яндекса и Гугла, их базы гораздо точнее и постоянно пополняются.

                      Не сочтите за рекламу, но у меня на сайте (ссылка в профиле) есть пара статей на эту тему, а также маленький сервис определения адресов базовых станций по четырем самым популярным базам: Yandex, Google, OpenCellID, Mozilla Location Service. Так вот, наиболее точный результат дают именно Яндекс и Гугл, и у них почти все вышки есть.
                      • +4
                        Гугл и Яндекс — это конечно классно, но ваш способ требует включенного интернета, а способ из статьи не требует, чем и примечателен.
                        PS: спасибо за статьи и сервис, добавил в закладки
                        • 0
                          Просто как коммент от тестера :) по Вашему сервису: Мой ip где-то в центре москвы (по факту — спальные районы Питера), базовая станция в Е-бурге (там же) и телефон — Самсунг 2010 года (по факту Jolla), номер — Санкт-Петербург Телеком (нет такого, Tele2). Итого из проверяемого на коленке попадание 0% :)
                          • 0
                            Опишу принцип попадания координат базовых станций в подобные базы. На самом деле, все очень просто — во всех базах лежат данные от самих пользователей. В случае Гугла, вам достаточно использовать смартфон на базе ОС Андроид с включенными GPS и интернетом, для попадания в базы Яндекса, надо воспользоваться Яндекс-Картами, для других сервисов надо устанавливать специальные приложения (по крайней мере, для OpenCellID и Mozilla Location Service).

                            Телефон, переключаясь на базовую станцию с определенными параметрами (MCC, MNC, LAC, CID для GSM), отправляет эти параметры вместе с текущими GPS-координатами на сервер. Там измерения от многих пользователей обрабатываются, координаты усредняются. И в итоге получаются некие координаты — это средние координаты вероятного местонахождения телефона, находящегося в данном секторе.

                            Таким образом:
                            Во-первых, чем больше мы сами будем отправлять данных на указанные сервисы, тем точнее будет позиционирование. Так что всем, кто заинтересован в таком способе определения местоположения, можно установить на свои смартфоны программу того сервиса, который планируется использовать (для данной статьи, это OpenCellID: http://wiki.opencellid.org/wiki/Data_sources).

                            Во-вторых, погрешность ограничивается сотнями метров, ну в крайнем случае, километрами (на открытом пространстве, возможно, десятками километров), но никак не регионами, где даже LAC будет другой. Т.е. если сразу несколько сервисов у вас показывают Екатеринбург, то именно там эта БС и находится.
                            • 0
                              А как насчет переезда БС из одного региона в другой? В нашем городе есть пара зон где местоположение по GSM (яндекс, гугл) определяется будто телефон находится в Дагестане или в Краснодарском крае, а по факту в Казани. Это хорошо видно в истории местоположений Google. Я также разрабатывал ПО для отслеживания торговых представителей (данные брались и из Яндекса и из Гугла, и собирались нашим же приложением, по описанному вами алгоритму). И такие перемещения БС были хорошо заметны.
                              http://habrahabr.ru/company/yandex/blog/162955/ — тут тоже этот момент описан.
                              • 0
                                Нумерация CellID, разумеется, может меняться. Но эта нумерация существует в пределах LAC (по вашей ссылке именно об этом). И переезда БС в другой регион с прежним LAC быть в принципе не может.

                                Можно пример, когда БС из одного региона определяется в другом? Если такие есть, значит LAC при поиске не учитывается, что врядли, т.к. в пределах сети оператора CellID не уникален.
                                • 0
                                  сейчас уже не смогу дать рабочий пример.
                                  mcc=250&mnc=1&lac=16102&cid=86181628 вот эта вышка еще 15 апреля гуглом определялась вообще в Алжире =), сейчас уже все ок.
                                  Но это скорее глюк Гугла
                                  • 0
                                    Код страны «250» — это Россия. Код оператора «01» (а не просто «1», есть разница) — это МТС. Есть предположение, что Гугл просто не смог найти ее в своей базе и определил местоположение, например, по IP (Mozilla Location Service так делает).
                        • 0
                          Интересно, есть ли Android-приложение для OpenCellID, которое синхронизировало бы с сервером локальную БЮ, содержащую CellID нужной страны (стран) и давало бы возможность получения приблизительного местоположения смартфона (на основе этой базы) или повышало бы скорость «холодного старта» GPS в случае отсутствия WiFi/GPRS?
                          • 0
                            Не очень понимаю вопрос, простите (спать пора). Однако практически все приложения фирмы-собирателя OpenCellID так или иначе используют собранную информацию.
                            Почитал описание самого близкого по смыслу inViu GPS-details. Про повышение скорости старта ничего не сказано. Наверное эта часть в андроиде исключительно огорожена от приложения. Надо смотреть архитектуру системы.
                          • 0
                            Когда я исследовал данную тему, у меня была информация что последняя цифра cellId это номер антены, раньше было правило что 0 — север, 1 — восток, 2- юг, 3- запад, 4 -круговая(пишу по памяти, тут возможна не точность), так вот у нас при использовании такой информации, по формуле получалась точность: если обьект стоит, то точность плохая прыгает пипец до километра, а вот если обьект движется, то гдето до 100 метров, но я использовал в расчете координат текущией точки значение предыдущей.
                            И да сравнивал с GPS у нас устроства стояли на машине и собирали два типа данных, GSM здорово выручало когда машина уезжала на подземный паркинг
                            • 0
                              CellId просто номер антенны. Каких то правил тут нет. Точнее они могут быть, но это все импровизация конкретного оператора. Азимут и угол раскрытия есть в базах у самого оператора. Поэтому ему какой то корреляции не нужно. Разве что только для техников своих.

                              Пример кстати довольно спорный. Дело в том что емкость БСки таки не очень большая, и в местах скопления людей очень легко получить отказ в обслуживании. Таким «местом скопления» являются городские дороги, особенно с маршрутными транспортными средствами. Пара тройка автобусов низкопольных и все.

                              Поэтому операторы наращивают «группировку станций» вдоль дорог. Причем светящих на дорогу. Соответственно результат трека по дороге (особенно крупной) будет очень хорош. А вот если треком будет пересечение спального района по диагонали, то результат значительно хуже.

                              Гугловцы еще ведут базу засеченых маков WiFi роутеров. Что позволяет еще точнее зачечь место.
                            • +2
                              На сколько я знаю, как минимум в случае обычного GSM, и мобильная станция и БС знают с точностью ± 547 метров расстояние между собственно аппаратом и БС. Точнее они знают задержку прохождения сигнала, из которой можно с такой точностью получить расстояние. К сожалению это актуально только для БС, с которой аппарат непосредственно общается (точно знать задержку необходимо для корретной синхронизации времени передачи, т.к. GSM использует TDMA разделение канала между абонентами).
                              Было-бы здорово, если бы можно было заставить модемный модуль по-переключатся по всем сосденим БС, тем самым получить расстояние до каждой из них с точностью 547м, тогда и триангуляция выдаст аналогичную точностью, что не так ужасно.

                              Да, параметр называется Timing Advance, его видно было в разных netmonitor-ах на старых телефонах, выдает значение в каких-то своих GSM-ных еденицах измерения, умножением на 547м получается расстояние до БС в метрах. В вашем случае, судя по логам, оно тоже репортится, только, естественно, только для текущей активной БС, значение TA — 0, следовательно расстояние до БС, на вскидку — от 0 до 547*1.5 км (выше полутора — оно будет округлятся в большую сторону до 2х уже). Даже эта информация, будучи учтенной, может немного повысить общую точность, если совместить с вашим методом.
                              • 0
                                Просмотрели еще раз записанный лог-файл проезда — значений Timing Advance (TA) отличных от нуля в нем, к сожалению, нету. Возможно, за городом этот параметр и даст дополнительную информацию.
                                • 0
                                  Ну оно по крайне мере позволяет ограничить триангуляцию радиусом 1.5*547м вокруг БС
                              • –1
                                Лет пять назад работал в компании, в которой занимался разработкой ПО для наших органов по прослушке сотовой связи и определению местоположения абонентов нашего города по способу, описанному выше. Разумеется, использовал для собственных личных целей (не коммерческих, правда).
                                • 0
                                  Опубликовал на Github библиотеку для node.js, которая получает координаты по базовым станциям в режиме онлайн, о чем я писал выше.
                                  • 0
                                    То самое чувство, когда понимаешь, что большинство информации как минимум по одному оператору собрано тобой. Регулярно в свое время запускал inViu OpenCellID, потом как-то заглохло…
                                    Внимательно смотрел, много думал. Судя по всему идентификатор действительно меняется. Например при обновлении оборудования с 2.5Г на 3/4Г. Т.е. имеет смысл старые измерения игнорировать, хотя бы для того чтоб ускорить выборки.
                                    Так же обратил внимание, что более-менее точное положение получается при 500+ измерений. Уже ближе к 200 угадывается совсем плохо. Попробуйте таким образом отфильтровать БД БС-ок.

                                    PS: стараюсь в ОСМ антенны связи наносить, они как ориентиры хороши. Вот бы туда еще и информацию из этих баз вписать… Но тут без инсайда не получится думаю.
                                    • –1
                                      Здесь качал прогу locator.by/pages/apps/android, для беларуси не плохо трекинг работает и отображает
                                      • 0
                                        Жаль авторы статьи не догадались сравнить положение по GPS с вычисленным и получить погрешность.

                                        Не уверен, что в условиях города можно получить достаточно высокую точность. К примеру, network provider андроида в моем городе по БС давал лучшую точность порядка 700м, а среднюю 1200м.

                                        Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                                        Самое читаемое