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 aplikacji mobilnych. 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. Osiąga się to dzięki utrzymywaniu 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 lub 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 geofence.

Zakres

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

  1. wielokąty, z którymi musi porównać dane pod kątem naruszeń;
  2. bieżącą lokalizację 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 na 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 Navigation SDK 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 przypisywać 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 pośrednictwem obiektów nasłuchujących zdarzeń i zarejestrowanych wywołań zwrotnych.

Detektory

Pakiet Navigation SDK ma wiele detektorów, z których możesz korzystać. Aby wymienić kilka:

  • Zmiany lokalizacji za pomocą dostawcy RoadSnappedLocation.
  • Przekieruj zdarzenia (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

Przyjrzyjmy się teraz procesowi tworzenia funkcji geofencingu po stronie klienta. W przykładzie poniżej pakiet Navigation SDK działa w trybie nawigacji krok po kroku, a wielokąt zdefiniowany na trasie reprezentuje 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 nawiguje, a aplikacja kierowcy regularnie sprawdza granice geograficzne w poszukiwaniu wyzwalaczy.
  4. Aplikacja kierowcy powiadamia backend o zdarzeniu aktywującym, aby mógł on podjąć odpowiednie działania.

W miarę jak pojazd porusza się po trasie, aplikacja regularnie sprawdza, czy poligon został naruszony. Gdy aplikacja wykryje przekroczenie strefy geograficznej, na interfejsie użytkownika wyświetla się komunikat: Strefa geograficzna naruszona.

Konfigurowanie zależności dla 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żna 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

Zwróć uwagę, że w tym przypadku 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 geofencing, 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 monitorować kolejkę PubSub lub odczytywać dzienniki i sprawdzać 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 geofencingu, 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 zaawansowane 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’ów w określonych przypadkach użycia. W tym dokumencie pokazaliśmy jeden ze sposobów na osiągnięcie tego celu, ale możliwości są nieograniczone. Jesteśmy ciekawi, co wymyślisz.

Następne działania

Sugerowane dodatkowe materiały: