что такое lac сотовой вышки
Без GPS и геолокации: узнаём местоположение пользователя, используя сим-карту
Сегодня огромное количество приложений пытается получить информацию о местоположении устройства пользователя.
Но и вам как разработчику эта информация также может понадобиться. Например, вы разрабатываете приложение новой социальной сети. В специальном разделе пользователи будут просматривать популярные публикации. А хитрый алгоритм настолько хитрый, что подсовывает свои рекомендации, основываясь на местоположении устройства пользователя.
Получить данные о местоположении устройства особого труда не составит, и после некоторой обработки они будут использоваться хитрым алгоритмом.
Но параноик внимательный читатель спросит: «Погодите-ка. А что если пользователь будет отдавать приложению фиктивные данные о своём местоположении?»
И будет прав! Если пользователи включат фиктивное местоположение, описанный функционал вашего приложения должным образом работать не будет. Хитрый алгоритм будет думать, что он всех перехитрил, но по факту пользователи из Индии увидят бесполезный для них контент, к примеру, на китайском языке от пользователей «из Китая».
Итог: киллер-фича вашего приложения не работает.
Может, есть выход?
Да, выход есть. Конкретно в нашем случае нет необходимости знать точное местоположение пользователя. Достаточно знать район/город, где он находится.
Чтобы узнать примерное местоположение пользователя, нужно узнать местоположение базовой станции оператора сотовой связи, к которой подключен пользователь. А для этого нужно получить кое-какие данные с SIM-карты на устройстве пользователя.
Кстати, известное приложение TikTok так и делает: оно получает данные с SIM-карты и определяет местоположение пользователя, предотвращая подделку местоположения.
Как мы к этому пришли?
Мы разрабатывали продукт, который сильно зависел от местоположения пользователя, и подумали: «Что делать, если определение местоположения будет недоступно из-за сбоя на устройстве, плохой погоды или если пользователь предоставит фиктивное местоположение?»
Мы тщательно изучили эти сценарии со всеми аспектами и решили использовать данные SIM-карты для получения информации о базовой станции и её координатах. Это позволило нам определить местоположение пользователя с помощью триангуляции. Качество данных, которое мы получили нас устроило.
В этой статье я опишу способ получения информации о местоположении базовой станции, к которой подключен пользователь. Для этого нам понадобится смартфон с SIM-картой.
Примечание: не имеет значения, включен GPS или выключен. В описанном процессе он не используется.
Начнём, пожалуй
Прежде всего, нам нужно API для доступа к информации о геолокации. Мне известно два:
Google Geolocation API — удобный API, но требуется подключенная платёжная учётная запись для вашего проекта;
OpenCellID от Unwiredlabs — простой в использовании API, крупнейшая в мире открытая база данных вышек сотовой связи.
Перейдите по ссылке выше, зарегистрируйтесь и получите API-ключ. И почитайте документацию, там всё подробно описано.
Как же оно всё работает?
Ваше приложение должно сделать запрос к API, отправив такие данные:
Описание полей для ясности:
token — ваш API-ключ;
radio — тип сети, например GSM, LTE и пр.;
mcc — Mobile Country Code, уникальный идентификатор сотового оператора;
mnc — Mobile Network Code, код мобильной сети. В комбинации с MCC является уникальным идентификатором сотового оператора;
lac — Location Area Code;
Ответ вы получите в таком формате:
То, что нужно. Приступим к реализации.
Реализация
Запустите Android Studio. Создайте новый проект или клонируйте/импортируйте этот.
Создаём модель запроса
Она будет использоваться для запроса к API:
Создаём модель ответа
Она будет использоваться при получении ответа от API:
Создаём сервис
Он используется для взаимодействия с API:
В приложении мы использовали Retrofit. Полную реализацию здесь я приводить не буду, но исходный код доступен. Мы реализовали ViewModel и Activity, которые будут взаимодействовать с API.
Важно! Для доступа к сетевой информации на устройстве всё же необходимо запросить соответствующее разрешение:
Получаем сведения о сети
Для получения сведений о сети нам нужно проверить, является ли тип сети GSM, CDMA или LTE. Для этого создаём метод getCellInfo() для каждого типа сети.
Ниже код для сети типа GSM:
Этот же метод необходимо реализовать для каждого типа сети.
На этом реализация киллер-фичи приложения закончена. Как видите, мы не использовали ни GPS, ни службу определения местоположения. Полученные данные мы отправляем к API, а в ответ сразу получаем информацию о местоположении устройства.
Приложение работает, как ожидалось. На этом всё.
Практикум: Как найти базовую станцию для настройки антенны LTE
Многие пользуются всевозможными LTE модемами на дачах.
В сложных условиях для хорошего приема нужна не только приличная антенна, но и как можно более точная ее настройка на ближайшую базовую станцию (БС) мобильного оператора.
Есть сравнительно простой способ, которым я сегодня воспользовался настраивая LTE роутер HUAWEI B880-75 про который я уже рассказывал.
В настройках большинства роутеров можно найти информацию о базовой станции к которой модему удалось подключиться.
Нас интересуют строки: Cell ID и TAC — Tracking Area Code*
Имея эти данные можно искать расположение БС используя сервис XINIT.RU
Но! Есть небольшая хитрость!
Дело в том, что TAC и Cell ID в этих сервисах могут отображаться как в десятичном (dec) так и в шестнадцатеричном (hex) формате… и здесь надо быть внимательным!
Рассмотрим мой конкретный пример:
Компактный и удобный сервис Ultrastar (Имеет данные по БС, которых нет в Xinit)
Примет данные только в шестнадцатеричном (hex) формате.
Если все данные ввести верно, то вы получите координаты базовой станции и сможете найти эту станцию на карте.
Имея данные о БС гораздо проще монтировать и настраивать антенну.
Мне удалось сравнительно быстро стабилизировать работу модема.
P.S. *TAC (Tracking Area Code) в сетях LTE, LAC (Location Area Code) в сетях GSM — код локальной зоны. Объединение некоторого количества базовых станций, которые обслуживаются одним контроллером базовых станций (BSC).
RSSI (Received Signal Strength Indicator) — мощность принимаемого сигнала
RSRP (Reference Signal Received Power) — среднее значение мощности принятых пилотных сигналов БС
SINR (Signal Interference Noise Ratio) — соотношение сигнал-шум в радиоканале.
RSRQ (Reference Signal Received Quality) — качество принятых пилотных сигналов БС.
ULCA (Uplink Carrier Aggregation) — агрегация частот исходящего канала.
CellID Finder
mayak
Комментарии 43
Полный вздор, показывает несуразицу полную. Запомните раз и навсегда: не существует ни сайтов, ни программ, которые бы имели базу данных с точным расположением станций сотовой связи. Плюс-минус несколько километров, иногда сотен метров, они ещё что-то показать могут, но не более того. И пользоваться всем этим, веря в правдивость информации, просто смешно.
Единственный сайт, где можно почерпнуть хоть какую-то информацию по станциям (далеко не всем и далеко не всегда правдоподобную, так как и там полно несоответствий), это сайт Роспотребнадзора: fp.crc.ru/doc/?type=max
Но даже на нём для подавляющего большинства станций нет GPS-координат, только оператор Теле2 иногда их публикует.
Наконец-то!
За 3.5 года Вы первый, кто написал отрицательный отзыв и заклеймил «полным вздором»!
Спасибо дружище!
P.S. А еще по телеку говорят, что Земля плоская! :))
Полный вздор, показывает несуразицу полную. Запомните раз и навсегда: не существует ни сайтов, ни программ, которые бы имели базу данных с точным расположением станций сотовой связи. Плюс-минус несколько километров, иногда сотен метров, они ещё что-то показать могут, но не более того. И пользоваться всем этим, веря в правдивость информации, просто смешно.
По следам мобильного телефона. Геолокация с помощью сотовой сети
В прошлый раз, когда мы рассказывали о приложении МегаФон Навигация и принципах его работы, мы упомянули еще несколько услуг, главной составляющей которых является определение координат и их интерпретация (Location-based services).
В зависимости от поставленных перед сервисом задач и требований по точности, мы применяем разные технологии определения координат. Сегодня мы расскажем, какие технологические площадки есть у нас в распоряжении, и как мы их используем.
Теория
Включив ваш мобильный телефон или любое другое устройство, работающее в GSM-сети (Mobile station), вы запускаете огромный технологический процесс.
Первое, что делает ваше мобильное устройство (MS), это осуществляет поиск ближайших базовых станций (Base station, BS). Если быть точнее, то прослушивает эфир в поисках доступных сот. Телефон может прослушивать до 16 широковещательных каналов. Из их числа определяет 6, наиболее удовлетворяющих с точки зрения затрат энергии и качества сигнала. Но в один момент времени работать будет только с одной. У каждой из сот есть свой уникальный номер (CellID).
При этом все базовые станции (BS) объединены в группы. Как правило, принадлежность к группе определяется их местоположением (Location area), и чтобы базовые станции можно было идентифицировать, каждой группе присваивается уникальный номер — Location area code (LAC).
Вместе параметры LAC и CellID работают как уникальные идентификаторы базовой станции, на которой зарегистрировано и работает мобильное устройство. Именно используя эти параметры, Центр коммутации выбирает верное направление для отправки вызова в вашу сторону, иначе приходилось бы искать вас среди тысяч базовых станций.
Кроме того, определяется сектор базовой станции (Cell Sector) и фиксируется время, за которое сигнал от мобильного устройства достигает базовой станции – это параметр Timing Advance. Благодаря этому известна не только принадлежность к базовой станции, но и удаленность от нее.
Определение положения абонента в сотовой сети.
Данные о местоположении мобильного телефона обновляются с определенной периодичностью или в случае, если он перемещается (конечно же, вместе с вами), то при каждом переключении между базовыми станциями.
Как направить звонок нужному абоненту?
Взаимодействие систем для определения позиции мобильного устройства.
Номер телефона, который хранится в огромной базе номеров сотового оператора. Домашний регистр местоположения (Home location registry, HLR) содержит информацию обо всех абонентах, приписанных к нему. Найдя абонента в одной из HLR, мы перенаправляем вызов на связанный с ним Центр коммутации (Mobile switching centre, MSC), тот в свою очередь запрашивает информацию у Гостевого регистра местоположения (VLR), который содержит данные о последнем зарегистрированном CallID, LAC абонента. После чего контроллер базовых станций (Base station controller, BSC) связывается с базовыми станциями в рамках переданного LAC, и звонок направляется на нужную соту (CellID).
Практика
Благодаря тому, что работа сотовой связи неотрывно связана с определением местоположения, стали развиваться и геолокационные сервисы на основе GSM/UMTS-сети.
Основными критериями работы геолокационных сервисов являются не только точность определения координат мобильного терминала, но и частота их обновления по запросу, возможность получить не только актуальные координаты в текущий момент, но и хранить исторические данные и строить маршрут передвижения телефона, а значит и абонента.
Поскольку работа многих абонентских услуг связана с получением координат конкретного абонента, показать координаты, мы можем только в случае, если абонент дал на это разрешение: подтвердил эту возможность в рамках запроса от сервиса. Другого способа получить координаты абонента нет.
Для услуг Радар и Маячок, где местоположение отслеживается только по запросу от абонента, мы используем следующую логику работы.
При каждом запросе от сервиса система обращается к цепочке оборудования и получает параметр CellID и LAC. Мы в свою очередь знаем координаты каждой базовой станции и после дополнительной математической обработки показываем пользователю зону, в которой может находиться абонент. Чем больше плотность размещения базовых станций, тем точнее определение координат. Соответственно в черте города погрешность ниже, чем за городом.
У нас есть возможность получить не только данные CellID базовой станции, на которую подключен абонент, но и данные «соседей» (соседние базовые станции), мы можем повысить точность определения используя триангуляцию – теперь зона, в которой находится абонент уже ограничивается не дальностью действия базовой станции, а симплексом между несколькими базовыми станциями (зачастую это треугольник, вершины которого заданы координатами базовых станций). Данный метод определения так же работает по запросу пользователя и, к примеру, используется в услуге Навигатор.
Создавая сервис Контроль кадров мы поставили перед ним более сложные задачи. Помимо определения координат абонента, мы можем дать пользователю данные о входе и выходе абонента из определенной географической зоны, поиск сотрудников, которые находятся наиболее близко к заданной точке, а главное сбор статистики всех маршрутов. Дополнительно сервис позволяет настраивать время для мониторинга (чтобы ограничить его только рабочим временем сотрудника), а также позволяет отправлять сообщения сотрудникам непосредственно из сервиса.
Пример использования услуги «Контроль кадров»
Возможно применение и обезличенных данных (без использования данных абонента), когда для анализа используется только географические координаты. Мы называем это Геопространственный анализ – агрегация информации о миграции и перемещении, скоплении абонентов. Получив подобную информацию, можно найти наиболее подходящее место для развития сети магазинов, офисов обслуживания или установки банкоматов. Но это не единственной применение, благодаря этим данным можно прогнозировать новые транспортные развязки, остановки общественного транспорта, социальные объекты: парки, прогулочные зоны и прочее.
Пример анализа скопления мобильных устройств определенной категории в регионах.
В сервисе Знакомства, который встроен в приложение МегаФон-Навигация, мы также применяем только географическую позицию. Вы можете найти ближайших к вам абонентов, но единственное, что вы сможете узнать о них, это имена (nickname), которые пользователи задали самостоятельно.
Заключение
В целом для каждой задачи можно найти свой инструмент, который позволяет ее решить наилучшим образом. Возможно, у вас также появятся идеи для геолокационного сервиса, который будут использовать абоненты «МегаФона» или сотрудники вашей компании. Мы будем рады всем предложениям о сотрудничестве или запросам на доступ к API сервисам.
Все описанные сервисы разработаны и развиваются в компании «МегаЛабс».
Как это работает: координаты базовых станций. Часть 2
В первой части мы уже рассмотрели, откуда сервис местонахождения базовых станций берет данные и что именно показывает вам. Во второй части мы рассмотрим практическое использование сервиса, посмотрим, какие параметры он использует и где их брать.
Базовая станция сотовой сети
Параметры базовой станции
Зайдя на страницу сервиса, вы видите форму, предлагающую указать параметры базовой станции: MCC, MNC, LAC/TAC, CID/SAC/ECI. Все эти параметры обязательны для того, чтобы найти, где расположена базовая станция.
Форма ввода параметров базовой станции
MCC — это код страны, Mobile Country Code. Номер, состоящий из трех цифр, уникальный для каждой из стран мира.
Вы можете ввести этот код самостоятельно (ручной ввод) или воспользоваться встроенным справочником, в котором есть коды абсолютно всех стран.
MNC — код сотовой сети, Mobile Network Code. Номер, состоящий из двух цифр, присваивается каждой сотовой сети. Является уникальным кодом сотового оператора внутри страны. То есть в разных странах коды сотовых сетей могут повторяться.
Встроенный справочник содержит коды всех сотовых сетей России. Коды операторов «большой тройки» также применимы к Белоруссии и Украине.
Если объединить MCC и MNC, то получится номер мобильной сети PLMN — Public Land Mobile Network. Например, для сети Билайн (MNC — 99) в России (MCC — 250) номер PLMN — 25099.
CID / SAC / ECI — идентификатор соты (Cell ID) в GSM, код зоны обслуживания (Service Area Code) в UMTS и идентификатор соты E-UTRAN (E-UTRAN Cell Identifier) в LTE-сетях. Для GSM и UMTS представляет собой число размером 16 бит (от 0 до 65535), для LTE — число размером в 28 бит, т.е. от 0 до 268435455. Этот номер однозначно указывает на базовую станцию, он уникален внутри каждой зоны обслуживания (LAC или TAC) каждого оператора в стране.
Строго говоря, ECI уникален в пределах сети оператора даже без учета зоны обслуживания, так что некоторые геолокационные сервисы найдут базовую станцию сети LTE, даже если вы введете неверный TAC, например, 0.
Собирая все эти параметры вместе, мы получаем комбинацию чисел, однозначно определяющую базовую станцию по всему миру:
MCC—MNC—LAC—CID.
Например, базовая станция оператора МТС (код оператора — 01) с идентификатором соты 1384, расположенная в регионе с кодом местности 114 республики Беларусь (код страны — 257) будет кодироваться такой последовательностью чисел: 257-01-114-1384.
Мониторинг сотовых сетей
Теперь немного о том, где мы можем достать все эти параметры, чтобы посмотреть, где находится базовая станция (вернее, как мы знаем из предыдущей части статьи, где может находиться абонент, зарегистрированный на базовой станции).
Если вы являетесь счастливым обладателем смартфона на базе ОС Android, то лучшими приложениями, которые покажут всю необходимую информацию являются бесплатные G-MoN и G-MoN Pro. Можно также использовать комбинацию *#*#4636#*#* для запуска инженерного меню, в котором также будет вся необходимая информация.
G-MoN (слева) и G-MoN Pro (справа)
Лично мне больше нравится именно версия Pro, т.к. позволяет видеть информацию сразу о двух сетях сотовой связи в двухсимочном смартфоне.
Для владельцев iPhone-ов таких приложений, насколько мне известно, нет. Но вы можете посмотреть нужные параметры в инженерном меню, попасть в которое можно, набрав комбинацию *3001#12345#*
Так вот, если посмотреть на экран любого из приложений (или на экран инженерного меню), то для начала мы увидим параметры сети оператора связи — NET в G-MoN или PLMN в G-MoN Pro. Как вы уже знаете, PLMN представляет собой два параметра — 3 цифры MCC и и 2 цифры MNC, записанные вместе.
Например, на скриншоте G-MoN выше мы видим сеть 26203, т.е. MCC здесь будет — 262, а MNC — 03. Вводим эти данные на сайте и видим, что разработчик приложения, скорее всего, живет в Германии, а воспользовавшись этим списком, понимаем, что он использует оператора связи E-Plus.
Дальше нам нужны параметры LAC (825 на скриншоте) и CID (23395 на скриншоте). Вводим все это на сайте и получаем примерное местонахождение разработчика, когда он сделал этот скриншот.
Местонахождение базовой станции 262-03-825-23395
Чтобы определить место еще точнее, можно последовательно ввести данные всех соседних вышек, которые показаны в разделе Neighbour cells detected программы G-MoN: 40055, 7655, 34105, 39075. Но не забывайте обращать внимание на параметр RXL в крайнем правом столбце, чем он меньше (больше в абсолютном значении), тем хуже уровень приема базовой станции, а значит, тем дальше она находится от абонента.
Соседние базовые станции
На скриншоте выше мы отобразили все базовые станции (вернее, усредненные местоположения абонентов в секторе), которые видит телефон разработчика программы G-MoN. Как видим, базовая станция, на которой абонент зарегистрирован в данный момент (в момент снятия скрина), находится посередине между соседними базовыми станциями, причем, чем хуже сигнал (меньше RXL), тем дальше базовая станция находится от абонента.
Вместо заключения
Я думаю, не надо объяснять, что таким образом вы можете узнать параметры только своего телефона, так что следить за другими людьми у вас не выйдет. Если, конечно, у вас нет доступа к сети SS7 (подробнее об этом можно узнать в исследовании Positive Technologies), но это уже совсем другая история.
А пока пользуйтесь сервисом и не забывайте, что сайт живет на ваши донаты.
Как определить местоположение по сетям сотовой связи (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-формате, описанном ниже:
Все сотовые модули поддерживают следующие команды: AT+CREG, AT+COPS (обслуживающая базовая станция), AT+CSQ (уровень сигнала от базовой станции). Некоторые модули позволяют узнать кроме обслуживающего передатчика также и соседние, т.е. выполнять мониторинг базовых станций с помощью команд AT^SMONC для Siemens и AT+CCINFO для Simcom. У меня в распоряжении был модуль SIMCom SIM5215Е.
Соответственно мы воспользовались командой AT+CCINFO, ее формат приведен ниже.
Мониторинг работает – можно ехать.
Маршрут пролег в западной части Минска по ул. Матусевича, пр. Пушкина, ул. Пономаренко, ул. Шаранговича, ул. Максима Горецкого, ул. Лобанка, ул. Кунцевщина, ул. Матусевича.
Карта Участники 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.
Спасибо за внимание. Вопросы и комментарии приветствуются.