Aktywuj geofencingi po stronie klienta, aby śledzić zasoby mobilne za pomocą Nav SDK

Z tego dokumentu dowiesz się, czym jest geofencing po stronie klienta, kiedy go używać i jak stosować go w przypadku zastosowań w aplikacji mobilnej. Pokazuje też, jak wdrożyć przykład na Androidzie za pomocą pakietu SDK do nawigacji Google.

Pakiet SDK nawigacji z wykrywaniem geofencingu
Pakiet SDK nawigacji z wykrywaniem geofencingu

Firmy często potrzebują informacji o tym, kiedy urządzenie mobilne wchodzi na określony obszar lub go opuszcza. Odbywa się to poprzez utrzymywanie wirtualnych granic geograficznych, czyli geofencingu, co umożliwia oprogramowaniu wywoływanie zdarzeń, gdy urządzenie przekroczy granicę.

Informacje o tym, kiedy dany pojazd przekracza granicę, są ważne w wielu przypadkach, np.:

  • Zaangażowanie klientów: firmy mogą używać geofencingu do wysyłania powiadomień push do użytkowników końcowych o ofertach specjalnych, wydarzeniach lub nowych produktach.
  • Bezpieczeństwo: firmy mogą używać geofencingu do tworzenia wirtualnych granic wokół obszarów wrażliwych, takich jak centra danych czy magazyny, i powiadamiać personel ochrony, gdy ktoś wchodzi na ten obszar lub go opuszcza.
  • Transport: firmy mogą używać geofencingu do śledzenia lokalizacji pojazdów oraz optymalizowania tras i harmonogramów.

Dlatego ważne jest, aby wiedzieć, jak przedstawić te strefy (wielokąty) w aplikacji dla klientów. Aplikacja powinna śledzić lokalizację urządzenia i sprawdzać, czy nie narusza ona określonego obszaru geograficznego.

Zakres

Ten dokument koncentruje się na implementacji geofencingu po stronie klienta . Oznacza to, że aplikacja kliencka musi mieć:

  1. wielokąty, z którymi należy porównać dane pod kątem naruszeń;
  2. bieżąca lokalizacja użytkownika;
  3. Logika sprawdzająca, czy bieżąca lokalizacja znajduje się w którymś z wielokątów.

Ten przewodnik zawiera przykłady na Androida, ale na iOS można to zrobić w podobny sposób. Usługa lokalizacji w Androidzie ma wbudowaną implementację okrągłych geofence, którą można zobaczyć tutaj. Poniższy kod referencyjny i opis to punkt wyjścia dla bardziej złożonych wdrożeń.

Pakiet SDK do nawigacji to natywna biblioteka na Androida lub iOS dodana do aplikacji dla kierowców. Odpowiada ona za:

  • uzyskiwanie przyciągniętych do drogi lokalizacji z aplikacji, która je generuje; Jest to dokładniejsze niż FusedLocationProvider (FLP) na Androidzie, ponieważ korzysta z sieci dróg Google, aby przyciągać lokalizacje do najbliższego odcinka drogi, co znacznie zwiększa dokładność szacowanego czasu przybycia, oraz z innych informacji z FLP.
  • Nawigacja krok po kroku, która umożliwia kierowcom efektywne dotarcie z punktu A do punktu B z uwzględnieniem ruchu w czasie rzeczywistym i innych ograniczeń na trasie.
  • Wywoływanie zdarzeń za pomocą detektorów zdarzeń i zarejestrowanych wywołań zwrotnych.

Detektory

Pakiet Navigation SDK ma wiele detektorów, z których możesz korzystać. Oto kilka przykładów:

  • Zmiany lokalizacji za pomocą dostawcy RoadSnappedLocation.
  • Przekierowywanie zdarzeń (użytkownik nie wykonał zawracania, skrętu w lewo itp. i zboczył z zalecanej trasy) za pomocą ReroutingListener.
  • zdarzenia przybycia (użytkownik dociera do zaplanowanego miejsca docelowego) za pomocą interfejsu ArrivalListener;
  • Pozostała odległość i szacowany czas przyjazdu (powiadomienia o tym, że kierowca zbliża się do miejsca docelowego – na podstawie liczby metrów, powiadomienia o tym, że kierowca zbliża się do miejsca docelowego – na podstawie czasu) są dostępne za pomocą interfejsu RemainingTimeOrDistanceChangedListener.

W tym przewodniku używamy tylko dostawcy RoadSnappedLocation i jego interfejsu LocationListener.

Rozwiązanie geofencingowe po stronie klienta

Teraz przejdźmy do tworzenia funkcji geofencingu po stronie klienta. W przykładzie poniżej pakiet SDK Navigation działa w trybie nawigacji krok po kroku, a na trasie zdefiniowano wielokąt reprezentujący nasz geofencing.

Schemat funkcjonalny
Schemat funkcjonalny

  1. Geofence są przechowywane w BigQuery i pobierane przez backend.
  2. Backend okresowo przesyła geofence do aplikacji dla kierowców.
  3. Kierowca korzysta z nawigacji, a aplikacja dla kierowców regularnie sprawdza, czy w geofencingu występuje wyzwalacz.
  4. Aplikacja kierowcy powiadamia backend o zdarzeniu aktywującym, aby mógł on podjąć odpowiednie działania.

Gdy pojazd porusza się po trasie, aplikacja regularnie sprawdza, czy wielokąt został naruszony. Gdy aplikacja wykryje przekroczenie granicy strefy, w interfejsie użytkownika pojawi się komunikat: Przekroczono granicę strefy.

Konfigurowanie zależności w przypadku Android-Maps-Utils

To rozwiązanie korzysta z Android-Maps-Utils, biblioteki open source zawierającej narzędzia przydatne w wielu różnych aplikacjach korzystających z interfejsu Google Maps Android API.

Ta biblioteka jest publiczna i hostowana w GitHubie. Możesz uzyskać do niej dostęp pod adresem:

  • Android https://github.com/googlemaps/android-maps-utils
  • iOS https://github.com/googlemaps/google-maps-ios-utils

Aby uwzględnić tę bibliotekę w aplikacji na Androida (zakres tego dokumentu), zmodyfikuj plik build.gradle. Pamiętaj, że ten plik build.gradle dotyczy modułu (aplikacji), który tworzysz, a nie poziomu projektu.

dependencies {
   ...
   // Utilities for Maps SDK for Android (requires Google Play Services)
   implementation 'com.google.maps.android:android-maps-utils:2.3.0'
}

Następnie, po zsynchronizowaniu Gradle z najnowszym plikiem build.gradle, możesz zaimportować com.google.maps.android.PolyUtil w pliku Java:

import com.google.android.gms.maps.model.PolygonOptions;
import com.google.maps.android.PolyUtil;

Określanie obszarów geofence

Pamiętaj, że tutaj też importowany jest plik PolygonOptions. Dzieje się tak, ponieważ wielokąt jest reprezentowany w ten sposób:

mPolygonOptions = new PolygonOptions()
       .add(new LatLng(29.4264525,-98.4948758))
       .add(new LatLng(29.4267029,-98.4948758))
       .add(new LatLng(29.4273742,-98.4945822))
       .add(new LatLng(29.4264562,-98.4943592))
       .fillColor(0x0000ff36)
       .strokePattern(Arrays.asList(new Dash(45.0f), new Gap(10.0f)))
       .strokeColor(Color.BLUE)
       .strokeWidth(5);

Jak widać powyżej, definiujemy tutaj stały wielokąt z wcześniej ustalonymi współrzędnymi – parami (szerokość geograficzna, długość geograficzna). W rzeczywistych scenariuszach te współrzędne i definicje wielokątów pochodzą zwykle z punktu końcowego backendu i są prawdopodobnie pobierane zdalnie. Oznacza to, że wielokąty będą musiały być tworzone na bieżąco przez aplikację.

Więcej informacji o tym, co można określić w PolygonOptions, znajdziesz tutaj.

Wielokąty należy zdefiniować podczas tworzenia fragmentu lub aktywności. Na przykład:

protected void onCreate(Bundle savedInstanceState) {
   ...
   mPolygonOptions = new PolygonOptions()
           .add(new LatLng(29.4264525,-98.4948758))
           .add(new LatLng(29.4267029,-98.4948758))
           .add(new LatLng(29.4273742,-98.4945822))
           .add(new LatLng(29.4264562,-98.4943592))
           .fillColor(0x0000ff36)
           .strokePattern(Arrays.asList(new Dash(45.0f), new Gap(10.0f)))
           .strokeColor(Color.BLUE)
           .strokeWidth(5);

   ...// more code here
}

Nasłuchiwanie aktualizacji lokalizacji

Po zdefiniowaniu geofence wystarczy utworzyć detektor aktualizacji lokalizacji, aby zasubskrybować wspomniane zdarzenie w pakiecie SDK do nawigacji o nazwie RoadSnappedLocationProvider, które zwróci najnowszą lokalizację urządzenia.

mLocListener = new RoadSnappedLocationProvider.LocationListener() {
   @Override
   public void onLocationChanged(Location snapped) {
       LatLng snappedL = new LatLng(snapped.getLatitude(), snapped.getLongitude());
       if(PolyUtil.containsLocation(snappedL, mPolygonOptions.getPoints(), true) && !mGeofenceBreached){
           Log.d("Geofence", "Vehicle has breached the polygon");
       }
   }
   @Override
   public void onRawLocationUpdate(Location location) {
   }
};

Za pomocą biblioteki Android-Maps-Utils możesz użyć funkcji PolyUtil.containsLocation, aby sprawdzić, czy otrzymana lokalizacja znajduje się w predefiniowanym wielokącie. W przykładzie poniżej użyto wstępnie zdefiniowanego wielokąta reprezentującego geofence, ale w praktyce możesz mieć wiele wielokątów i konieczne będzie użycie pętli.

Podejście alternatywne

Ten dokument koncentruje się na aplikacji dla klientów, która sprawdza naruszenie niestandardowego obszaru geograficznego (wielokąta). W niektórych przypadkach możesz jednak chcieć przeprowadzić takie weryfikacje na serwerze backendu.

Oznacza to, że aplikacja będzie zgłaszać aktualizacje lokalizacji do backendu, który następnie sprawdzi, czy pojazd przekroczył określony wielokąt. W ten sposób weryfikacja nie będzie zależeć od aplikacji klienckiej.

Możliwe rozwiązanie:

[Środowisko wykonawcze] Architektura geofencingu po stronie serwera

Przykładowa architektura pokazująca podejście do geofencingu po stronie serwera.

Rozwiązanie po stronie serwera
Rozwiązanie po stronie serwera

  1. Aplikacja kierowcy, korzystająca z pakietu Driver SDK, wysyła aktualizacje lokalizacji do Fleet Engine. Aktualizacje lokalizacji i nawigacja w aplikacji są realizowane za pomocą pakietu Navigation SDK.
  2. Fleet Engine przesyła te aktualizacje do Cloud Logging lub Pub/Sub.
  3. Backend zbiera te sygnały lokalizacji.
  4. Geofence są przechowywane w BigQuery na potrzeby analizy przez backend.
  5. Po przekroczeniu granicy obszaru alerty są wysyłane do aplikacji kierowcy.

W tej architekturze używane są pakiet Driver SDK i Fleet Engine. Fleet Engine może wysyłać aktualizacje PubSub i generować wpisy w logach w Cloud Logging. W obu przypadkach można pobrać lokalizację pojazdu.

Backend może wtedy monitorować kolejkę PubSub lub odczytywać dzienniki i śledzić aktualizacje pojazdów. Następnie, gdy nastąpi aktualizacja (lub co kilka sekund lub minut, w zależności od jej znaczenia), backend może wywołać funkcje BigQuery GIS, aby określić, czy dany pojazd znajduje się w geofence, czy poza nim. Jeśli co najmniej jeden obszar zostanie naruszony, backend może podjąć działania i uruchomić wewnętrzne potoki lub inne odpowiednie przepływy pracy.

Podsumowanie

Geofencing to potężne narzędzie, które można wykorzystać do różnych celów. Firmy mogą używać geofencingu do kierowania do użytkowników trafnych reklam i promocji, świadczenia usług opartych na lokalizacji oraz zwiększania bezpieczeństwa.

Pakiet Navigation SDK udostępnia przydatne odbiorniki zdarzeń, które mogą wykrywać wiele ważnych momentów podczas podróży. Firmy często wymagają niestandardowych geofence do określonych zastosowań. W tym dokumencie pokazaliśmy, jak to zrobić, ale możliwości są nieograniczone. Nie możemy się doczekać, aby zobaczyć, co wymyślisz.

Następne działania

Sugerowane materiały dodatkowe: