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

W tym dokumencie opisujemy, czym jest geofencing po stronie klienta, kiedy należy go stosować i jak można go stosować w różnych zastosowaniach w aplikacji mobilnej. Znajdziesz w nim też informacje o tym, jak wdrożyć przykład na Androidzie przy użyciu pakietu SDK nawigacji Google.

Nav SDK z wykrywaniem geofence
Pakiet Nav SDK z wykrywaniem geofence

Firmy często muszą wiedzieć, kiedy urządzenie mobilne pojawia się w danym sklepie lub je opuszcza w pobliżu. Osiąga się to przez utrzymywanie wirtualnych granic geograficznych, czyli geofence’ów, które umożliwiają oprogramowaniu uruchamianie zdarzeń, gdy urządzenie przekroczy granicę.

Wiedza o tym, kiedy określony pojazd przekracza granicę, jest ważna w wielu przypadkach użycia, takich jak:

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

Dlatego ważne jest, aby wiedzieć, jak reprezentować te strefy (wielokąty) w aplikacji dla klienta. Aplikacja powinna śledzić lokalizację urządzenia i sprawdzać, czy nie narusza ona określonej geoogrodzenia.

Zakres

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

  1. wielokąty, które ma sprawdzać pod kątem naruszeń;
  2. Bieżąca lokalizacja użytkownika
  3. Operatory logiczne sprawdzające, czy bieżąca lokalizacja znajduje się wewnątrz czy na zewnątrz żadnego wielokąta.

Ten przewodnik zawiera przykłady na Androida, ale te same czynności można wykonać na iOS. Usługa lokalizacji Androida ma wbudowaną implementację okrągłych geopłotów, którą można zobaczyć tutaj. Poniżej znajdziesz kod referencyjny i opis, które stanowią punkt wyjścia do bardziej złożonych implementacji.

Pakiet SDK nawigacji to natywna biblioteka na Androida lub iOS dodana do aplikacji kierowcy. Odpowiada on za:

  • Pobieranie z aplikacji, która jest uruchomiona, lokalizacji z zdjęciami drogi. Jest to dokładniejsze niż FusedLocationProvider (FLP) na Androidzie, ponieważ wykorzystuje sieć drogową Google, aby przyciągać lokalizacje do najbliższego fragmentu drogi, co zwiększa dokładność szacowanego czasu dotarcia na miejsce i inne informacje od FLP.
  • Szczegółowa nawigacja, która pozwala kierowcom sprawnie dotrzeć z punktu A do punktu B z uwzględnieniem informacji o natężeniu 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ć. Na przykład:

  • Lokalizacja jest zmieniana przez dostawcę RoadSnappedLocation.
  • Przekierowuj zdarzenia (użytkownik nie zawróć, zakręt w lewo itp. oraz zjedzie z zalecanej trasy) za pomocą funkcji ReroutingListener.
  • Zdarzenia przybycia (użytkownik dociera do zaplanowanego miejsca docelowego) za pomocą interfejsu ArrivalListener.
  • Zdarzenia dotyczące pozostałej odległości i przewidywanego czasu przybycia (powiadomienia o tym, że kierowca wkrótce dojedzie do miejsca docelowego – na podstawie odległości, oraz o tym, że kierowca wkrótce dojedzie do miejsca docelowego – na podstawie czasu). Oba dostępne za pomocą interfejsu RemainingTimeOrDistanceChangedListener.

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

Rozwiązanie do geofencingu po stronie klienta

Teraz pokażę, jak tworzyć funkcję geofencingu po stronie klienta. W poniższym przykładzie mamy pakiet SDK do nawigacji, który działa w trybie „zakręt po zakręcie”, a na trasie jest zdefiniowany wielokąt reprezentujący nasze geofencing.

Schemat funkcjonalny
Diagram funkcjonalny

  1. Geoferencje są przechowywane w BigQuery i pobierane przez Twój backend.
  2. Backend okresowo wysyła geofence do aplikacji na Dysku.
  3. Kierowca działa w kierunku, a aplikacja kierowcy regularnie sprawdza zabezpieczenia geograficzne pod kątem wyzwalacza.
  4. Aplikacja sterownika powiadamia backend o zdarzeniu aktywującym, aby umożliwić jego działanie.

Gdy pojazd porusza się po trasie, aplikacja regularnie sprawdza, czy wielokąt nie został naruszony. Gdy aplikacja wykryje, że przekroczyła geofencing, w interfejsie pojawi się komunikat o treści Naruszenie geofencingu.

Konfigurowanie zależności dla pakietu Android-Maps-Utils

To rozwiązanie wykorzystuje bibliotekę open source Android-Maps-Utils z narzędziami przydatnymi w wielu różnych aplikacjach korzystających z interfejsu API Map Google na Androida.

Ta biblioteka jest publiczna i hostowana na GitHubie. Można ją otworzyć 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, aby uwzględnić tę bibliotekę. Pamiętaj, że ten plik build.gradle jest przeznaczony do kompilowania 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ć wartość com.google.maps.android.PolyUtil w pliku Java:

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

Zdefiniuj swoje granice

Zwróć uwagę, że tutaj także 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, tutaj definiujemy wielokąt stały z ustalonymi wcześniej współrzędnych - (szerokość, długość). W rzeczywistych scenariuszach te współrzędne i definicje wielokątów pochodzą najczęściej z punktu końcowego w backendzie i prawdopodobnie są pobierane zdalnie. Oznacza to, że wielokąty będą tworzone na bieżąco przez aplikację.

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

Poligony 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 obszarów geograficznych musisz 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ą Android-Maps-Utils możesz użyć PolyUtil.containsLocation, aby sprawdzić, czy otrzymana lokalizacja znajduje się wewnątrz zdefiniowanego wstępnie wielokąta. W przykładzie poniżej wstępnie zdefiniowany wielokąt reprezentujący geofencing jest używany, ale w praktyce może być kilka wielokątów, a konieczna będzie pętla.

Alternatywne podejście

Ten dokument dotyczy aplikacji dla klienta, która sprawdza, czy nie doszło do naruszenia niestandardowego geoogrodzenia (poligonu). Czasami jednak warto przeprowadzić takie sprawdzenie na zapleczu.

Oznacza to, że aplikacja zgłasza aktualizacje lokalizacji do backendu, a ten backend sprawdza, czy pojazd nie naruszył określonego wielokąta – nie zależy to od aplikacji klienckiej przeprowadzającej weryfikację.

Możliwe rozwiązanie jest następujące:

[Execution Environment] Architektura geofencingu po stronie serwera

Przykład architektury pokazujący podejście do geofencingu po stronie serwera.

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

  1. Aplikacja kierowcy korzysta z Driver SDK do wysyłania aktualizacji lokalizacji do Fleet Engine. Aktualizacje lokalizacji i nawigacja w aplikacji odbywają się za pomocą pakietu SDK nawigacji.
  2. Fleet Engine wysyła te aktualizacje do Cloud Logging lub Pub/Sub.
  3. Backend zbiera te sygnały lokalizacyjne.
  4. Geofencje są przechowywane w BigQuery na potrzeby analizy przez backend.
  5. Po włączeniu geoogrodzenia do aplikacji kierowcy wysyłane są alerty.

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 czytać dzienniki i sprawdzać aktualizacje dotyczące pojazdu. Następnie, gdy nastąpi aktualizacja (lub co kilka sekund, minut, w zależności od krytycznego charakteru), backend może wywołać funkcje GIS BigQuery, aby określić, czy dany pojazd znajduje się wewnątrz czy na zewnątrz geoogrodzenia. W przypadku naruszenia co najmniej jednej funkcji geofence backend może aktywować i aktywować potoki wewnętrzne 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 na użytkowników końcowych odpowiednich reklam i promocji, świadczenia usług wykorzystujących lokalizację 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 przypadku określonych zastosowań. W tym dokumencie pokazujemy, jak to zrobić, ale możliwości są nieograniczone. Nie możemy się doczekać, aby zobaczyć, co wymyślisz.

Dalsze działania

Proponowane dalsze czytanie: