Prośby o geolokalizację
Żądania geolokalizacji są wysyłane za pomocą metody POST na ten adres URL:
https://www.googleapis.com/geolocation/v1/geolocate?key=YOUR_API_KEY
W żądaniu musisz podać klucz jako wartość parametru key
. key
to klucz interfejsu API Twojej aplikacji. Ten klucz identyfikuje Twoją aplikację na potrzeby zarządzania limitami. Dowiedz się, jak uzyskać klucz.
Treść żądania
Treść żądania musi być sformatowana w formacie JSON. Jeśli nie podasz treści żądania, wyniki zostaną zwrócone na podstawie adresu IP lokalizacji żądania. Obsługiwane są te pola: wszystkie pola są opcjonalne, chyba że zaznaczono inaczej:
Pole | Typ JSON | Opis | Uwagi |
---|---|---|---|
homeMobileCountryCode |
number (uint32 ) |
Kod kraju mobilnego (MCK) sieci domowej urządzenia. | Obsługiwane w przypadku radioType gsm (domyślnie),
wcdma , lte i nr ; nieużywane w przypadku cdma .Prawidłowy zakres: 0–999. |
homeMobileNetworkCode |
number (uint32 ) |
Kod sieci komórkowej dla domowej sieci urządzenia.
To jest MNC dla GSM, WCDMA, LTE i NR. CDMA używa identyfikatora systemu (SID) |
Ważliwy zakres dla MNC: 0–999. Prawidłowy zakres identyfikatora SID: 0–32767. |
radioType |
string |
Typ radia mobilnego. Obsługiwane wartości to gsm , cdma , wcdma , lte i nr . |
To pole jest opcjonalne, ale należy je zawsze uwzględnić, jeśli klient zna typ radia. Jeśli pole zostanie pominięte, Geolocation API przyjmie domyślnie wartość gsm , co spowoduje nieprawidłowe wyniki lub brak wyników, jeśli zadeklarowany typ radia jest nieprawidłowy. |
carrier |
string |
Nazwa przewoźnika. | |
considerIp |
boolean |
Określa, czy w sytuacji, gdy brakuje sygnałów Wi-Fi i stacji bazowych sieci komórkowych, są one puste lub niewystarczające do oszacowania lokalizacji urządzenia. | Domyślna wartość to true . Aby zapobiec użyciu wartości domyślnej, ustaw wartość considerIp na false . |
cellTowers |
array |
Tablica obiektów wież telefonii komórkowych. | Zapoznaj się poniżej z sekcją Obiekty stacji bazowych. |
wifiAccessPoints |
array |
Tablica obiektów punktów dostępu Wi-Fi. | Zobacz sekcję Obiekty punktów dostępu Wi-Fi poniżej. |
Poniżej znajdziesz przykład treści żądania Geolocation 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. ] }
Obiekty stacji bazowych
Tablica cellTowers
w treści żądania może zawierać 0 lub więcej obiektów wieży komórkowej.
Pole | Typ JSON | Opis | Uwagi |
---|---|---|---|
cellId |
number (uint32 ) |
Unikalny identyfikator komórki. | Wymagany w przypadku radioType gsm (domyślnie), cdma ,
wcdma i lte ; odrzucony w przypadku nr .Zapoznaj się z sekcją Obliczanie cellId poniżej, w której znajdziesz również listę prawidłowych zakresów wartości dla każdego typu radio. |
newRadioCellId |
number (uint64 ) |
Unikalny identyfikator komórki NR (5G). | Wymagany w przypadku radioType nr ; odrzucony w przypadku innych typów.Zobacz sekcję Obliczanie newRadioCellId poniżej, w której znajdziesz też listę prawidłowych wartości tego pola. |
locationAreaCode |
number (uint32 ) |
Kod obszaru lokalizacji (LAC) dla sieci GSM i WCDMA. Identyfikator sieci (NID) dla sieci CDMA. Kod obszaru śledzenia (TAC) dla sieci LTE i NR. |
Wymagany w przypadku radioType gsm (domyślnie) i cdma , opcjonalny w przypadku innych wartości.Prawidłowy zakres z wartościami gsm , cdma , wcdma i lte : 0–65535.Prawidłowy zakres dla nr : 0–16777215. |
mobileCountryCode |
number (uint32 ) |
Kod kraju komórki (MCC) stacji bazowej. | Wymagany w przypadku opcji radioType gsm (domyślnie), wcdma , lte i nr . Nie używany w przypadku cdma .Prawidłowy zakres: 0–999. |
mobileNetworkCode |
number (uint32 ) |
Kod sieci komórkowej stacji bazowej.
Jest to MNC dla GSM, WCDMA, LTE i NR. CDMA używa identyfikatora systemu (SID). |
Wymagany. Prawidłowy zakres dla MNC: 0–999. Prawidłowy zakres identyfikatora SID: 0–32767. |
Te opcjonalne pola nie są używane, ale mogą być uwzględnione, jeśli są dostępne wartości.
Pole | Typ JSON | Opis | Uwagi |
---|---|---|---|
age |
number (uint32 ) |
Liczba milisekund od momentu, gdy ta komórka była komórką docelową. | Jeśli wartość age wynosi 0, wartość cellId lub newRadioCellId reprezentuje bieżący pomiar. |
signalStrength |
number (double ) |
Siła sygnału radiowego mierzona w dBm. | |
timingAdvance |
number (double ) |
Wartość przebiegu czasu. |
Obliczam cellId
Typy radia w wersjach starszych niż NR (5G) używają 32-bitowego pola cellId
do przekazywania identyfikatora komórki sieci do interfejsu Geolocation API.
- Sieci GSM (2G) używają 16-bitowego identyfikatora komórki (CID) w postaci domyślnej. Dopuszczalny zakres: 0–65535.
- Sieci CDMA (2G) używają 16-bitowego identyfikatora stacji bazowej (BID). Prawidłowy zakres: 0–65535.
- Sieci WCDMA (3G) używają identyfikatora UTRAN/GERAN Cell Identity (UC-ID), czyli 28-bitowej wartości całkowitej łączącej 12-bitowy identyfikator kontrolera sieci radiowej (RNC-ID) i 16-bitowy identyfikator komórki (CID).
Formuła:rnc_id << 16 | cid
.
Prawidłowy zakres: 0–268435455.
Uwaga: podanie tylko 16-bitowej wartości identyfikatora komórki w sieciach WCDMA spowoduje nieprawidłowe wyniki lub brak wyników. - Sieci LTE (4G) używają identyfikatora komórki E-UTRAN (ECI), który jest 28-bitową wartością całkowitą, zawierającą 20-bitowy identyfikator węzła B E-UTRAN (eNBId) i 8-bitowy identyfikator komórki (CID).
Wzór:enb_id << 8 | cid
.
Prawidłowy zakres: 0–268435455.
Uwaga: podanie tylko 8-bitowej wartości identyfikatora komórki w sieciach LTE spowoduje nieprawidłowe wyniki lub brak wyników.
Umieszczenie wartości poza tymi zakresami w żądaniu do interfejsu API może spowodować niezdefiniowane zachowanie. Interfejs API może według własnego uznania przyciąć liczbę, aby pasowała do udokumentowanego zakresu, wywnioskować poprawkę do radioType
lub zwrócić wynik NOT_FOUND
bez żadnego wskaźnika w odpowiedzi.
Poniżej znajduje się przykład obiektu wieży komórkowej LTE.
{ "cellTowers": [ { "cellId": 170402199, "locationAreaCode": 35632, "mobileCountryCode": 310, "mobileNetworkCode": 410, "age": 0, "signalStrength": -60, "timingAdvance": 15 } ] }
Obliczam: newRadioCellId
Nowsze sieci, których identyfikatory komórek są dłuższe niż 32 bity, używają 64-bitowego pola newRadioCellId
do przekazywania identyfikatora komórki sieci do interfejsu Geolocation API.
- Sieci NR (5G) używają 36-bitowej tożsamości New Radio Cell Identity (NCI) w niezmienionej postaci.
Prawidłowy zakres: 0–68719476735.
Poniżej znajduje się przykładowy obiekt stacji bazowej sieci komórkowej NR.
{ "cellTowers": [ { "newRadioCellId": 68719476735, "mobileCountryCode": 310, "mobileNetworkCode": 410, "age": 0, "signalStrength": -60, } ] }
Obiekty punktu dostępu Wi-Fi
Tablica wifiAccessPoints
w treści żądania musi zawierać co najmniej 2 obiekty punktu dostępu Wi-Fi reprezentujące fizycznie różne urządzenia punktu dostępu. Pole macAddress
jest wymagane, a pozostałe pola są opcjonalne.
Pole | Typ JSON | Opis | Uwagi |
---|---|---|---|
macAddress |
string |
Adres MAC węzła Wi-Fi. Zwykle jest to adres BSS, BSSID lub MAC. |
Wymagany. Ciąg szesnastkowy rozdzielony dwukropkami (: ).
Za pomocą interfejsu API można zlokalizować tylko adresy MAC administrowane globalnie. Inne adresy MAC są po cichu odrzucane i mogą spowodować, że żądanie API stanie się puste. Szczegółowe informacje znajdziesz w sekcji Usuwanie niepotrzebnych punktów dostępu do Wi-Fi. |
signalStrength |
number (double ) |
Bieżąca siła sygnału mierzona w dBm. | W przypadku punktów dostępu Wi-Fi wartości dBm zwykle wynoszą -35 dBm lub mniej i wahają się w zakresie od -128 do -10 dBm. Pamiętaj, aby umieścić znak minusa. |
age |
number (uint32 ) |
Liczba milisekund od wykrycia tego punktu dostępu. | |
channel |
number (uint32 ) |
Kanał, przez który klient komunikuje się z punktem dostępu. | |
signalToNoiseRatio |
number (double ) |
Stosunek bieżącego sygnału do szumu, mierzony w dB. |
Poniżej przedstawiono przykład obiektu punktu dostępu Wi-Fi.
{ "macAddress": "f0:d5:bf:fd:12:ae", "signalStrength": -43, "signalToNoiseRatio": 0, "channel": 11, "age": 0 }
Przykładowe żądania
Jeśli chcesz wypróbować interfejs Geolocation API z przykładowymi danymi, zapisz następujący kod JSON w pliku:
{ "considerIp": "false", "wifiAccessPoints": [ { "macAddress": "3c:37:86:5d:75:d4", "signalStrength": -35, "signalToNoiseRatio": 0 }, { "macAddress": "30:86:2d:c4:29:d0", "signalStrength": -35, "signalToNoiseRatio": 0 } ] }
Następnie możesz użyć cURL, aby przesłać żądanie z poziomu wiersza poleceń:
$ curl -d @your_filename.json -H "Content-Type: application/json" -i "https://www.googleapis.com/geolocation/v1/geolocate?key=YOUR_API_KEY"
Odpowiedź dla powyższych adresów MAC wygląda tak:
{ "location": { "lat": 37.4241173, "lng": -122.0915717 }, "accuracy": 20 }
Usuwanie nieużywanych punktów dostępu Wi-Fi
Usunięcie obiektów punktu dostępu Wi-Fi z identyfikatorami macAddress
, które są locally-administered, może zwiększyć wskaźnik sukcesu wywołań interfejsu Geolocation API, które jako danych wejściowych używają Wi-Fi.
Jeśli po przefiltrowaniu można stwierdzić, że wywołanie interfejsu Geolocation API się nie powiedzie, można zastosować środki złagodzające takie jak użycie starszych sygnałów lokalizacyjnych lub punktów dostępowych Wi-Fi ze słabszymi sygnałami. To podejście jest kompromisem między potrzebą aplikacji w zakresie oszacowania lokalizacji a jej wymaganiami dotyczącymi dokładności i wywołalności. Podane niżej techniki filtrowania pokazują, jak filtrować dane wejściowe, ale nie pokazują środków zaradczych, które możesz zastosować jako inżynier aplikacji.
Adresy MAC zarządzane lokalnie nie są przydatnymi sygnałami lokalizacji dla interfejsu API i automatycznie są usuwane z żądań. Możesz usunąć takie adresy MAC,
upewniając się, że drugi najmniej istotny bit najbardziej istotnego bajtu adresu macAddress
to 0
, np.
2
w 02:00:00:00:00:00
. Adres MAC do rozgłoszenia (FF:FF:FF:FF:FF:FF
) to przykład adresu MAC, który zostanie wykluczony przez ten filtr.
Zakres adresów MAC od 00:00:5E:00:00:00
do 00:00:5E:FF:FF:FF
jest zarezerwowany dla IANA i często jest używany do zarządzania siecią i funkcji multicast, co wyklucza używanie ich jako sygnału lokalizacji. Musisz też usunąć te adresy MAC z danych wejściowych do interfejsu API.
Na przykład użyteczne adresy MAC do geolokalizacji można zebrać z tablicy ciągów znaków macAddress
o nazwie macs
:
String[] macs = {"12:34:56:78:9a:bc", "1c:34:56:78:9a:bc", "00:00:5e:00:00:01"}; ArrayList<String> _macs = new ArrayList<>(Arrays.asList(macs)); _macs.removeIf(m -> !(0 == (2 & Integer.parseInt(m.substring(1, 2), 16)) && !m.substring(0, 8).toUpperCase().equals("00:00:5E")));
macs = ['12:34:56:78:9a:bc', '1c:34:56:78:9a:bc', '00:00:5e:00:00:01'] macs = [m for m in macs if (0 == (2 & int(m[1], 16)) and m[:8].upper() != '00:00:5E')]
macs = ['12:34:56:78:9a:bc', '1c:34:56:78:9a:bc', '00:00:5e:00:00:01']; macs = macs.filter(m => 0 === (2 & Number.parseInt(m[1], 16)) && m.substr(0, 8).toUpperCase() !== '00:00:5E');
Zastosowanie tego filtra powoduje, że na liście pozostają tylko 1c:34:56:78:9a:bc
. Ponieważ na liście jest mniej niż 2 adresy MAC sieci Wi-Fi, żądanie nie zostanie zrealizowane i zwrócona zostanie odpowiedź HTTP 404 (notFound
).
Odpowiedzi dotyczące geolokalizacji
Pomyślne żądanie geolokalizacji zwraca odpowiedź w formacie JSON z określoną lokalizacją i jej promieniem.
location
: Szacowane współrzędne szerokości i długości geograficznej użytkownika w stopniach. Zawiera 1 polelat
i 1 pole podrzędnelng
.accuracy
: dokładność oszacowanej lokalizacji w metrach. Jest to promień okręgu wokół danegolocation
.
{ "location": { "lat": 37.421875199999995, "lng": -122.0851173 }, "accuracy": 120 }