Контрактная разработка и производство электроники
38,88
рейтинг
21 мая 2014 в 16:14

Разработка → Как определить местоположение по сетям сотовой связи (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
Promwad
рейтинг 38,88
Контрактная разработка и производство электроники

Комментарии (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м.

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

Самое читаемое Разработка