Как определить местонахождение без GPS
Если вы находитесь в Москве, то наверняка большую часть времени ваш телефон думает, что вы где-то в Химках. В других регионах наверняка есть свои «точки притяжения». Все уже знают, что это происходит из-за того, что в целях безопасности глушат GPS. Но Яндекс, Самокат, маркетплейсы вроде Ozon/WB и другие приложения всё равно умудряются довольно неплохо понимать, где вы находитесь. Как? С помощью использования LBS (Location-based services), о методах работы которых я расскажу в этом посте. Недавно на E-code был доклад на эту тему. Изначально я хотела просто отправить вам ссылку на его запись, но ее все еще нет (или просто я не нашла). Там, конечно, копали гораздо глубже, а я попробую объяснить базу простыми словами.
Мы сразу отставим в сторону то, что большую часть времени приложения просто используют закешированные данные (кстати по ним тоже готовлю интересненький пост) и представим, что нам нужно получить координаты с нуля.
Приложение обычно не спрашивает GPS напрямую. Оно обращается к Location API телефона и получает что-то вроде:
latitude: 55.7512 longitude: 37.6184 accuracy: 35 m timestamp: …
Кстати, технически правильнее говорить GNSS. GPS — только американская спутниковая система. Есть ещё ГЛОНАСС, Galileo, BeiDou. Телефон может использовать несколько систем одновременно.
Именно эти данные у нас искажаются, и тогда сервисы отталкиваются от других источников.
Wi-Fi Телефон видит точки Wi-Fi вокруг, даже если ни к одному не подключён. У каждой из них есть SSID и BSSID:
SSID: CoffeeShop_WiFi (название точки доступа, может повторятся в разных местах) BSSID: 44:27:f3:7e:59:02 (идентификатор конкретной точки)
Телефон видит примерно такую картину:
BSSID A -65 dBm BSSID B -73 dBm BSSID C -81 dBm
dBm это единица мощности сигнала. Если сервис знает, где находятся A, B и C, можно довольно неплохо оценить координаты телефона. Координаты A,B и C сервисы берут обычно из предыдущих наблюдений. В какой-то момент другой телефон одновременно видел эти Wi-Fi и имел хорошую позицию по спутникам:
55.7512, 37.6184 + Wi-Fi A, B, C
Много таких наблюдений постепенно формируют базу:
набор BSSID: примерная область на карте
И потом схема работает в обратную сторону: спутников нет, зато телефон видит знакомое окружение Wi-Fi → можно оценить, где он находится.
У Яндекса, например, есть публичный Локатор API, который умеет определять положение по Wi-Fi, сотовой сети и IP.
Сотовая сеть С вышками похожая история. Телефон знает, к какой соте подключён. У сети есть идентификаторы вроде MCC, MNC, LAC и Cell ID.
Если совсем просто: MCC - страна MNC - оператор Cell ID - конкретная сота
Если сервис знает, где находится эта сота, он уже примерно понимает, где находится телефон. В городе сот много, поэтому точность выше, а за городом одна базовая станция может покрывать большую территорию, и точность хуже.
Если ничего этого не помогло - IP
Backend видит публичный IP пользователя и может прогнать его через GeoIP-базу.
Так можно определить страну и, приблизительно, город. Это лучше чем ничего, но пожалуй один из самых ненадежных источников, особенно в мобильных сетях из-за NAT - это технология, позволяющая оператору выпустить множество телефонов в интернет через один публичный IPv4 - который довольно слабо связан с реальным положением конкретного телефона.
С VPN всё ещё веселее: физически ты в Москве, а по IP внезапно в Амстердаме.
Просто для галочки упомяну также BLE-маяки (Bluetooth Low Energy), их используют для навигации по большим помещениям (аэропорты, тц и тд). Телефон видит их и по идентификаторам и силе сигнала понимает, где примерно находится, но применение тут все таки достаточно узкое.
Вот такие способы и из комбинации используют большинство современных приложений, которым важно хотя бы примерно определять реальное положение пользователя.
Забегайте в мой телеграм, чтобы не пропустить следующие посты 🩷