Введение
API геолокации возвращает местоположение и радиус точности на основе информации о вышках сотовой связи и узлах WiFi, которые может обнаружить мобильный клиент. В этом документе описывается протокол, используемый для отправки этих данных на сервер и для возврата ответа клиенту.
Связь осуществляется по протоколу HTTPS с использованием POST. И запрос, и ответ имеют формат JSON, а тип содержимого обоих — application/json
.
Прежде чем вы начнете
Прежде чем приступить к разработке с помощью Geolocation API, ознакомьтесь с требованиями аутентификации (вам нужен ключ API), а также с информацией об использовании API и выставлении счетов (вам необходимо включить выставление счетов в своем проекте).
Запросы геолокации
Запросы геолокации отправляются с помощью POST на следующий URL:
https://www.googleapis.com/geolocation/v1/geolocate?key=YOUR_API_KEY
В запросе необходимо указать ключ, включенный в качестве значения key
параметра. key
— это ключ API вашего приложения. Этот ключ идентифицирует ваше приложение для целей управления квотами. Узнайте, как получить ключ .
Тело запроса
Тело запроса должно быть в формате JSON. Если тело запроса не включено, результаты будут возвращены на основе IP-адреса местоположения запроса. Поддерживаются следующие поля, и все поля являются необязательными, если не указано иное:
Поле | Тип JSON | Описание | Заметки |
---|---|---|---|
homeMobileCountryCode | number ( uint32 ) | Мобильный код страны (MCC) для домашней сети устройства. | Поддерживается для radioType gsm (по умолчанию), wcdma , lte и nr ; не используется для cdma .Допустимый диапазон: 0–999. |
homeMobileNetworkCode | number ( uint32 ) | Код мобильной сети для домашней сети устройства. Это MNC для GSM, WCDMA, LTE и NR. CDMA использует идентификатор системы (SID). | Допустимый диапазон для MNC: 0–999. Допустимый диапазон для SID: 0–32767. |
radioType | string | Тип мобильного радио. Поддерживаемые значения: gsm , cdma , wcdma , lte и nr . | Хотя это поле является необязательным, оно всегда должно быть включено, если тип радиомодуля известен клиенту. Если поле опущено, API геолокации по умолчанию будет использовать gsm , что приведет к неверным или нулевым результатам, если предполагаемый тип радио неверен. |
carrier | string | Имя оператора. | |
considerIp | boolean | Указывает, следует ли возвращаться к геолокации IP, если сигналы Wi-Fi и вышек сотовой связи отсутствуют, пусты или недостаточны для оценки местоположения устройства. | По умолчанию true . Установите для considerIp значение false , чтобы отключить откат. |
cellTowers | array | Массив объектов вышек сотовой связи. | См. раздел « Объекты вышек сотовой связи » ниже. |
wifiAccessPoints | array | Массив объектов точки доступа WiFi. | См. раздел « Объекты точки доступа Wi -Fi» ниже. |
Пример тела запроса API геолокации показан ниже.
{ "homeMobileCountryCode": 310, "homeMobileNetworkCode": 410, "radioType": "gsm", "carrier": "Vodafone", "considerIp": true, "cellTowers": [ // See the Cell Tower Objects section below. ], "wifiAccessPoints": [ // See the WiFi Access Point Objects section below. ] }
Объекты вышек сотовой связи
Массив cellTowers
тела запроса содержит ноль или более объектов вышек сотовой связи.
Поле | Тип JSON | Описание | Заметки |
---|---|---|---|
cellId | number ( uint32 ) | Уникальный идентификатор ячейки. | Требуется для radioType gsm (по умолчанию), cdma , wcdma и lte ; отклонено для nr .См. раздел « Вычисление идентификатора ячейки » ниже, в котором также перечислены допустимые диапазоны значений для каждого типа радио. |
newRadioCellId | number ( uint64 ) | Уникальный идентификатор соты NR (5G). | Требуется для radioType nr ; отклонены для других типов.См. раздел « Вычисление newRadioCellId » ниже, в котором также указан допустимый диапазон значений для поля. |
locationAreaCode | number ( uint32 ) | Код зоны местоположения (LAC) для сетей GSM и WCDMA. Идентификатор сети (NID) для сетей CDMA. Код зоны отслеживания (TAC) для сетей LTE и NR. | Требуется для radioType gsm (по умолчанию) и cdma , необязателен для других значений.Допустимый диапазон для gsm , cdma , wcdma и lte : 0–65535.Допустимый диапазон с номером: nr . |
mobileCountryCode | number ( uint32 ) | Мобильный код страны (MCC) вышки сотовой связи. | Требуется для radioType gsm (по умолчанию), wcdma , lte и nr ; не используется для cdma .Допустимый диапазон: 0–999. |
mobileNetworkCode | number ( uint32 ) | Код мобильной сети вышки сотовой связи. Это MNC для GSM, WCDMA, LTE и NR. CDMA использует идентификатор системы (SID). | Необходимый. Допустимый диапазон для MNC: 0–999. Допустимый диапазон для SID: 0–32767. |
Следующие необязательные поля в настоящее время не используются, но могут быть включены, если доступны значения.
Поле | Тип JSON | Описание | Заметки |
---|---|---|---|
age | number ( uint32 ) | Количество миллисекунд, прошедших с тех пор, как эта ячейка стала основной. | Если age равен 0, то cellId или newRadioCellId представляет текущее измерение. |
signalStrength | number ( double ) | Мощность радиосигнала измеряется в дБм. | |
timingAdvance | number ( double ) | Значение опережения синхронизации . |
Вычисление cellId
Типы радио до NR (5G) используют 32-битное поле cellId
для передачи идентификатора соты сети в API геолокации.
- Сети GSM (2G) используют 16-битный идентификатор соты (CID) как есть. Допустимый диапазон: 0–65535.
- Сети CDMA (2G) используют 16-битный идентификатор базовой станции (BID) как есть. Допустимый диапазон: 0–65535.
- В сетях WCDMA (3G) используется идентификатор соты UTRAN/GERAN (UC-ID), который представляет собой 28-битное целочисленное значение, объединяющее 12-битный идентификатор контроллера радиосети (RNC-ID) и 16-битный идентификатор соты (CID).
Формула:rnc_id << 16 | cid
.
Допустимый диапазон: 0–268435455.
Примечание. Указание только 16-битного идентификатора соты в сетях WCDMA приведет к неправильным результатам или к нулевым результатам. - Сети LTE (4G) используют идентификатор соты E-UTRAN (ECI), который представляет собой 28-битное целочисленное значение, объединяющее 20-битный идентификатор узла B E-UTRAN (eNBId) и 8-битный идентификатор соты (CID).
Формула:enb_id << 8 | cid
.
Допустимый диапазон: 0–268435455.
Примечание. Указание только 8-битного идентификатора соты в сетях LTE приведет к неправильным результатам или к нулевым результатам.
Размещение значений вне этих диапазонов в запросе API может привести к неопределенному поведению. API, по усмотрению Google, может обрезать число, чтобы оно соответствовало задокументированному диапазону, внести исправление в radioType
или вернуть результат NOT_FOUND
без какого-либо индикатора в ответе.
Ниже приведен пример объекта вышки сотовой связи LTE.
{ "cellTowers": [ { "cellId": 170402199, "locationAreaCode": 35632, "mobileCountryCode": 310, "mobileNetworkCode": 410, "age": 0, "signalStrength": -60, "timingAdvance": 15 } ] }
Вычисление newRadioCellId
Более новые сети, чьи идентификаторы ячеек длиннее 32 бит, используют 64-битное поле newRadioCellId
для передачи идентификатора ячейки сети в API геолокации.
- Сети NR (5G) используют 36-битный идентификатор новой радиосоты (NCI) как есть.
Допустимый диапазон: 0–68719476735.
Пример объекта вышек сотовой связи NR приведен ниже.
{ "cellTowers": [ { "newRadioCellId": 68719476735, "mobileCountryCode": 310, "mobileNetworkCode": 410, "age": 0, "signalStrength": -60, } ] }
Объекты точки доступа Wi-Fi
Массив wifiAccessPoints
тела запроса должен содержать два или более объектов точки доступа Wi-Fi. macAddress
обязателен; все остальные поля являются необязательными.
Поле | Тип JSON | Описание | Заметки |
---|---|---|---|
macAddress | string | MAC-адрес узла WiFi. Обычно он называется BSS, BSSID или MAC-адресом. | Необходимый. : (двоеточие) разделенная шестнадцатеричная строка. |
signalStrength | number ( double ) | Текущий уровень сигнала измеряется в дБм. | Для точек доступа WiFi значения дБм обычно составляют -35 или ниже и находятся в диапазоне от -128 до -10 дБм. Не забудьте поставить минус. |
age | number ( uint32 ) | Количество миллисекунд с момента обнаружения этой точки доступа. | |
channel | number ( uint32 ) | Канал, по которому клиент взаимодействует с точкой доступа. | |
signalToNoiseRatio | number ( double ) | Текущее отношение сигнал/шум измеряется в дБ. |
Пример объекта точки доступа Wi-Fi показан ниже.
{ "macAddress": "9c:1c:12:b0:45:f1", "signalStrength": -43, "signalToNoiseRatio": 0, "channel": 11, "age": 0 }
Геолокационные ответы
Успешный запрос геолокации вернет ответ в формате JSON с указанием местоположения и радиуса.
-
location
: расчетная широта и долгота пользователя в градусах. Содержит одноlat
широты и одноlng
. -
accuracy
: Точность предполагаемого местоположения в метрах. Это представляет собой радиус круга вокруг данногоlocation
.
{ "location": { "lat": 37.421875199999995, "lng": -122.0851173 }, "accuracy": 120 }
Ошибки
В случае ошибки будет возвращено тело ответа об ошибке стандартного формата, а код состояния HTTP будет установлен в состояние ошибки.
Ответ содержит объект с одним объектом error
со следующими ключами:
-
code
: это то же самое, что и HTTP-статус ответа. -
message
: краткое описание ошибки. -
errors
: Список ошибок, которые произошли. Каждая ошибка содержит идентификатор типа ошибки (reason
) и краткое описание (message
).
Например, при отправке недопустимого JSON будет возвращена следующая ошибка:
{ "error": { "errors": [ { "domain": "global", "reason": "parseError", "message": "Parse Error", } ], "code": 400, "message": "Parse Error" } }
Среди возможных ошибок:
Причина | Домен | Код состояния HTTP | Описание |
---|---|---|---|
dailyLimitExceeded | usageLimits | 403 | Вы превысили дневной лимит . |
keyInvalid | usageLimits | 400 | Ваш ключ API недействителен для API геолокации. Убедитесь, что вы включили весь ключ и либо приобрели API, либо включили выставление счетов и активировали API , чтобы получить квоту бесплатно. |
userRateLimitExceeded | usageLimits | 403 | Вы превысили лимит запросов, который вы настроили в Google Cloud Console. Этот предел обычно устанавливается как количество запросов в день, запросов на 100 секунд и запросов на 100 секунд для каждого пользователя. Это ограничение должно быть настроено таким образом, чтобы предотвратить исчерпание вашей дневной квоты одной или небольшой группой пользователей, но при этом обеспечить разумный доступ для всех пользователей. См. раздел «Ограничение использования API» , чтобы настроить эти ограничения. |
notFound | geolocation | 404 | Запрос был действительным, но результаты не были возвращены. |
parseError | global | 400 | Тело запроса не является допустимым JSON. Подробнее о каждом поле см. в разделе « Тело запроса ». |
Примеры запросов
Если вы хотите попробовать Geolocation API с примерами данных, сохраните следующий JSON в файл:
{ "considerIp": "false", "wifiAccessPoints": [ { "macAddress": "3c:37:86:5d:75:d4", "signalStrength": -35, "signalToNoiseRatio": 0 }, { "macAddress": "94:b4:0f:fd:c1:40", "signalStrength": -35, "signalToNoiseRatio": 0 } ] }
Затем вы можете использовать cURL , чтобы сделать запрос из командной строки:
$ curl -d @your_filename.json -H "Content-Type: application/json" -i "https://www.googleapis.com/geolocation/v1/geolocate?key=YOUR_API_KEY"
Ответ для вышеуказанных адресов Mac выглядит так:
{ "location": { "lat": 37.4241876, "lng": -122.0917381 }, "accuracy": 32.839 }
(См. раздел Получение ключа API , если у вас нет ключа API.)
Для дополнительного тестирования вы можете собрать информацию со своего устройства Android с помощью Places SDK для Android и Android Location API , а также с устройства iOS с помощью Places SDK для iOS .
Часто задаваемые вопросы
Почему я получаю очень большой радиус accuracy
в своем ответе геолокации?
Если ваш ответ геолокации показывает очень высокое значение в поле accuracy
, служба может определять геолокацию на основе IP-адреса запроса, а не точек Wi-Fi или вышек сотовой связи. Это может произойти, если нет действующих или распознанных вышек сотовой связи или точек доступа.
Чтобы подтвердить, что проблема именно в этом, задайте в запросе для considerIp
значение false
. Если ответ 404
, вы подтвердили, что ваши wifiAccessPoints
и cellTowers
не могут быть геолокированы.