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

W tym dokumencie opisujemy, czym jest geofencing po stronie klienta, kiedy go używać i jak stosować go w aplikacjach mobilnych. Wyjaśnimy też, jak wdrożyć przykład na Androidzie za pomocą pakietu SDK nawigacji Google.

Pakiet Nav SDK z wykrywaniem geofencingu
Pakiet Nav SDK z wykrywaniem geofencingu

Firmy często muszą wiedzieć, kiedy urządzenie mobilne znajduje się w danym obszarze lub je opuszcza. Jest to możliwe dzięki utrzymywaniu wirtualnych granic geograficznych (geofencingu), dzięki czemu oprogramowanie może wywoływać zdarzenia, gdy urządzenie przekroczy daną granicę.

Informacja o tym, kiedy pojazd przekracza granicę, jest ważna w wielu przypadkach, takich jak:

  • Zaangażowanie klientów: firmy mogą używać geofencingu, aby wysyłać użytkownikom powiadomienia push o ofertach specjalnych, wydarzeniach lub nowych produktach.
  • Bezpieczeństwo i bezpieczeństwo: firmy mogą używać geofencingu do tworzenia wirtualnych granic wokół obszarów wrażliwych, takich jak centra danych czy hurtownie, i powiadamiać o tym pracowników ochrony, gdy ktoś wejdzie na dany obszar lub go opuści.
  • Transport: firmy mogą korzystać z geofencingu, aby śledzić lokalizację pojazdów oraz optymalizować trasy i rozkłady jazdy.

Dlatego warto wiedzieć, jak przedstawić te strefy (wielokąty) w aplikacji dla klienta. Powinna ona śledzić lokalizację urządzenia i sprawdzać, czy nie przekroczyła określonego progu.

Zakres

Niniejszy dokument dotyczy implementacji geofencingu po stronie klienta . Oznacza to, że aplikacja kliencka musi mieć:

  1. wielokąty, które musi sprawdzić pod kątem naruszeń zabezpieczeń;
  2. Bieżąca lokalizacja użytkownika
  3. Działanie logiczne mające na celu sprawdzenie, czy bieżąca lokalizacja znajduje się wewnątrz czy na zewnątrz wielokąta.

W tym przewodniku znajdziesz przykłady dotyczące Androida, ale istnieją podobne sposoby na iOS. Usługa lokalizacyjna na Androida ma wbudowaną implementację geofencingu, którą można zobaczyć tutaj. Poniższy kod referencyjny i opis stanowią punkt wyjścia dla bardziej złożonych implementacji.

Pakiet Navigation SDK to natywna biblioteka na Androida / iOS dodana do aplikacji sterownika. Odpowiada za:

  • Uzyskiwanie lokalizacji zapisanych dróg z aplikacji, która ją obsługuje. Jest to dokładniejsze niż rozwiązanie FusedLocationProvider (FLP) na Androidzie, ponieważ używa sieci dróg Google, aby przyciągać lokalizacje do najbliższego segmentu drogi, dzięki czemu szacowany czas dotarcia na miejsce jest o wiele bardziej dokładny, oraz inne informacje z FLP.
  • Funkcja zakręt po zakręcie, która umożliwia kierowcom skuteczne poruszanie się z punktu A do punktu B z uwzględnieniem natężenia ruchu w czasie rzeczywistym i innych ograniczeń na trasie.
  • Uruchamianie zdarzeń przez detektory zdarzeń i zarejestrowane wywołania zwrotne.

Detektory

Pakiet Navigation SDK ma wiele odbiorników, których możesz użyć. Oto kilka przykładów:

  • Lokalizacja zmienia się za pomocą dostawcy RoadSnappedLocation.
  • Przekierowywanie zdarzeń (użytkownik nie wykonuje zakrętu w lewo, skręt w lewo itp. lub odbiega od zalecanej trasy) za pomocą funkcji ReroutingListener.
  • Zdarzenia przyjazdu (użytkownik dociera do planowanego miejsca docelowego) przez metodę ArrivalListener.
  • Pozostały dystans i informacje o szacowanym czasie dotarcia (otrzymujesz powiadomienia, gdy kierowca zbliża się do miejsca docelowego – w oparciu o metry i o zbliżającym się do celu – na podstawie czasu – powiadomienie, gdy kierowca będzie na miejscu – na podstawie godziny) dostępne w aplikacji .RemainingTimeOrDistanceChangedListener

W tym przewodniku używany jest tylko dostawca RoadSnappedLocation i jego parametr LocationListener.

Rozwiązanie do geofencingu po stronie klienta

Przyjrzyjmy się teraz tworzeniu geofencingu po stronie klienta. W poniższym przykładzie pakiet SDK nawigacji działa w trybie zakręt po zakręcie oraz zdefiniowany na trasie wielokąt reprezentujący nasze geofencing.

Schemat funkcji
Schemat funkcji

  1. Geofence jest przechowywane w BigQuery i pobierane przez Twój backend.
  2. Backend okresowo przekazuje geofence poza aplikacje Dysku.
  3. Kierowca porusza się w trasie, a aplikacja kierowcy regularnie sprawdza granice geograficzne w poszukiwaniu aktywatora.
  4. Aplikacja sterownika powiadamia backend o zdarzeniu aktywatora, aby mógł działać.

Gdy pojazd porusza się po trasie, aplikacja regularnie sprawdza, czy wielokąt został naruszony. Gdy aplikacja wykryje, że przekroczyła geofencing, w interfejsie pojawi się komunikat: Naruszenie bezpieczeństwa geofencingu.

Konfigurowanie zależności dla narzędzi Map Google na Androida

To rozwiązanie wykorzystuje Android-maps-Utils – bibliotekę open source zawierającą narzędzia przydatne w wielu różnych aplikacjach korzystających z interfejsu API Map Google na Androida.

Ta biblioteka jest publiczna i hostowana w GitHubie:

  • 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, by ją uwzględnić. Pamiętaj, że ten plik build.gradle jest przeznaczony dla tworzonego modułu (aplikacji), a nie na poziomie 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;

Definiowanie geofencingu

Zwróć uwagę, że tutaj również importowany jest plik PolygonOptions. Dzieje się tak, ponieważ do reprezentowania wielokąta wygląda to następująco:

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 wstępnie określonymi współrzędnymi – długością i szerokością geograficzną. W rzeczywistych scenariuszach jednak te współrzędne i definicje wielokątów najczęściej pochodzą z punktu końcowego backendu i prawdopodobnie będą pobierane zdalnie. Oznacza to, że aplikacja będzie musiała utworzyć te wielokąty na bieżąco.

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

Wielokąty należy zdefiniować podczas tworzenia fragmentu kodu 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
}

Posłuchaj aktualizacji lokalizacji

Po zdefiniowaniu geofencingu musisz utworzyć odbiornik aktualizacji lokalizacji, aby zasubskrybować wspomniane wcześniej zdarzenie w pakiecie SDK nawigacji o nazwie RoadSnappedLocationProvider, które będzie zwracać ostatnią 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) {
   }
};

W Android-Map-Utils możesz użyć PolyUtil.containsLocation, aby sprawdzić, czy otrzymana lokalizacja znajduje się we wstępnie zdefiniowanym wielokątie. W przykładzie poniżej używany jest wstępnie zdefiniowany wielokąt reprezentujący geofencing, ale w praktyce może istnieć wiele wielokątów i wymagana jest pętla.

Alternatywne podejście

Ten dokument dotyczy aplikacji dla klienta, która sprawdza pod kątem naruszenia niestandardowych geofencingu (wielokątów). Istnieją jednak sytuacje, w których możesz chcieć przeprowadzić takie testy w backendzie.

Oznacza to, że aplikacja przesyła do backendu informacje o aktualizacjach lokalizacji, a ten backend sprawdza, czy pojazd przekroczył określony wielokąt – nie zależy to od aplikacji klienckiej, która przeprowadzi weryfikację.

Oto możliwe rozwiązanie:

[Środowisko wykonawcze] Architektura geofencingu po stronie serwera

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

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

  1. Aplikacja sterownika, używająca pakietu SDK sterownika, wysyła aktualizacje lokalizacji do Fleet Engine. Aktualizacje lokalizacji i nawigacja w aplikacji są przeprowadzane przez pakiet SDK nawigacji.
  2. Fleet Engine zapisuje te aktualizacje do Cloud Logging lub Pub/Sub.
  3. Backend zbiera te sygnały dotyczące lokalizacji.
  4. Geofence są przechowywane w BigQuery na potrzeby analizy przez backend.
  5. Po uruchomieniu geofencingu alerty są wysyłane do aplikacji kierowcy.

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

Backend może wtedy monitorować kolejkę PubSub lub odczytywać logi i obserwować aktualizacje pojazdów. Następnie przy każdej aktualizacji (lub co kilka sekund lub minut, w zależności od jej krytyczności) backend może wywołać funkcje BigQuery GIS, aby ustalić, czy dany pojazd znajduje się wewnątrz czy na zewnątrz geofencingu. W przypadku naruszenia co najmniej jednego geofencingu backend może działać i aktywować wewnętrzne potoki lub inne odpowiednie przepływy pracy.

Podsumowanie

Geofencing to zaawansowane narzędzie, którego można używać do różnych celów. Firmy mogą używać geofencingu, aby wyświetlać użytkownikom trafne reklamy i promocje, świadczyć usługi związane z lokalizacją oraz zwiększać bezpieczeństwo.

Pakiet Navigation SDK udostępnia przydatne detektory zdarzeń, które pozwalają wykryć wiele ważnych momentów podczas podróży. Firmy często wymagają niestandardowych geofencingu w określonych przypadkach. W tym dokumencie pokazaliśmy, jak to osiągnąć, ale możliwości są nieograniczone. Chętnie zobaczymy, co nam zaproponujesz.

Następne działania

Sugerujemy dalszą lekturę: