Карта © Участники 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