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.
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ć:
- wielokąty, z którymi musi porównać dane pod kątem naruszeń;
- bieżącą lokalizację użytkownika;
- 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ń.
Navigation SDK
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.
- Geofence są przechowywane w BigQuery i pobierane przez backend.
- Backend okresowo przesyła geofence do aplikacji dla kierowców.
- Kierowca nawiguje, a aplikacja kierowcy regularnie sprawdza granice geograficzne w poszukiwaniu wyzwalaczy.
- 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.
- 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.
- Fleet Engine przesyła te aktualizacje do Cloud Logging lub Pub/Sub.
- Backend zbiera te sygnały lokalizacji.
- Geofence są przechowywane w BigQuery na potrzeby analizy przez backend.
- 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: