Geofences clientseitig zur Verfolgung mobiler Assets mit Nav SDK auslösen

In diesem Dokument wird beschrieben, was clientseitiges Geofencing ist, wann es verwendet werden sollte und wie es in Anwendungsfällen in einer mobilen Anwendung eingesetzt werden kann. Außerdem wird gezeigt, wie ein Beispiel unter Android mit dem Google Navigation SDK implementiert wird.

Nav SDK mit Geofence-Erkennung
Nav SDK with geofence detection

Unternehmen müssen oft wissen, wann ein Mobilgerät einen bestimmten Bereich betritt oder verlässt. Dies wird durch die Aufrechterhaltung virtueller geografischer Grenzen oder Geofences erreicht, sodass Software Ereignisse auslösen kann, wenn ein Gerät eine Grenze überschreitet.

Es ist wichtig zu wissen, wann ein bestimmtes Fahrzeug eine Grenze überschreitet, da dies für viele Anwendungsfälle relevant ist, z. B.:

  • Kundeninteraktion: Unternehmen können Geofencing nutzen, um Push-Benachrichtigungen zu Sonderangeboten, Veranstaltungen oder neuen Produkten an Endnutzer zu senden.
  • Sicherheit: Unternehmen können Geofencing nutzen, um virtuelle Grenzen um sensible Bereiche wie Rechenzentren oder Lager zu erstellen und Sicherheitspersonal zu benachrichtigen, wenn jemand den Bereich betritt oder verlässt.
  • Transport: Unternehmen können Geofencing nutzen, um den Standort von Fahrzeugen zu verfolgen und Routen und Zeitpläne zu optimieren.

Daher ist es wichtig, dass Sie wissen, wie Sie diese Zonen (Polygone) in einer kundenorientierten App darstellen. Diese App sollte den Gerätestandort erfassen und prüfen, ob ein bestimmter Geofence überschritten wurde.

Umfang

In diesem Dokument geht es um die clientseitige Implementierung von Geofencing . Das bedeutet, dass die Client-App Folgendes haben muss:

  1. Die Polygone, anhand derer nach Verstößen gesucht werden muss.
  2. Echtzeitstandort des Nutzers
  3. Logik, um zu prüfen, ob sich der aktuelle Standort innerhalb oder außerhalb eines der Polygone befindet.

Dieser Leitfaden enthält Beispiele für Android, aber es gibt entsprechende Möglichkeiten, dies auch unter iOS zu erreichen. Der Android-Standortdienst bietet eine integrierte Implementierung für kreisförmige Geofences, die hier zu sehen ist. Der Referenzcode und die Beschreibung unten sind ein Ausgangspunkt für komplexere Implementierungen.

Das Navigation SDK ist eine native Android-/iOS-Bibliothek, die der Fahrer-App hinzugefügt wird. Es ist für Folgendes verantwortlich:

  • Abrufen von Standorten, die an Straßen ausgerichtet sind, von der App, die die Route ausführt. Diese Methode ist genauer als der FusedLocationProvider (FLP) von Android, da sie das Straßennetz von Google verwendet, um Standorte dem nächstgelegenen Straßenabschnitt zuzuordnen. Dadurch wird die voraussichtliche Ankunftszeit viel genauer berechnet. Außerdem werden andere Informationen aus FLP verwendet.
  • Eine detaillierte Wegbeschreibung, die es Fahrern ermöglicht, unter Berücksichtigung von Echtzeit-Verkehrsinformationen und anderen Routenbeschränkungen effizient von A nach B zu gelangen.
  • Ereignisse über Event-Listener und registrierte Callbacks auslösen.

Listener

Das Navigation SDK bietet viele Listener, die Sie verwenden können. Hier einige Beispiele:

  • Standortänderungen über den Anbieter RoadSnappedLocation.
  • Ereignisse über ReroutingListener umleiten, wenn ein Nutzer eine Kehrtwende, eine Linksabbiegung usw. verpasst und von der empfohlenen Route abweicht.
  • Ereignisse bei der Ankunft (Nutzer kommt am geplanten Ziel an) über ArrivalListener.
  • Die Ereignisse „Verbleibende Entfernung“ und „Geschätzte Ankunftszeit“ (Benachrichtigung, wenn der Fahrer kurz vor dem Erreichen des Ziels ist – basierend auf Metern; Benachrichtigung, wenn der Fahrer kurz vor dem Erreichen des Ziels ist – basierend auf der Zeit) sind beide über RemainingTimeOrDistanceChangedListener verfügbar.

In dieser Anleitung wird nur der RoadSnappedLocationProvider und sein LocationListener verwendet.

Clientseitige Geofencing-Lösung

Sehen wir uns nun an, wie Sie eine clientseitige Geofencing-Funktion erstellen. Im folgenden Beispiel wird das Navigation SDK im Turn-by-Turn-Modus ausgeführt und ein Polygon in der Route definiert, das unseren Geofence darstellt.

Funktionsdiagramm
Funktionsdiagramm
>

  1. Geofences werden in BigQuery gespeichert und von Ihrem Backend abgerufen.
  2. Das Backend überträgt die Geofences regelmäßig an die Drive-Apps.
  3. Der Fahrer navigiert und die Fahrer-App prüft regelmäßig, ob die Geofences einen Trigger auslösen.
  4. Die Fahrer-App benachrichtigt das Backend über ein Triggerereignis, damit es reagieren kann.

Während sich das Fahrzeug auf der Route bewegt, prüft die App regelmäßig, ob das Polygon überschritten wurde. Wenn die App erkennt, dass ein Geofence überschritten wurde, wird auf der Benutzeroberfläche die Meldung Geofence breached (Geofence überschritten) angezeigt.

Abhängigkeiten für Android-Maps-Utils konfigurieren

Bei dieser Lösung wird Android-Maps-Utils verwendet, eine Open-Source-Bibliothek mit Dienstprogrammen, die für eine Vielzahl von Anwendungen nützlich sind, die die Google Maps Android API verwenden.

Diese Bibliothek ist öffentlich und wird auf GitHub gehostet. Sie kann unter folgender Adresse aufgerufen werden:

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

Wenn Sie diese Bibliothek in Ihre Android-App einbinden möchten (Umfang dieses Dokuments), müssen Sie die Datei build.gradle entsprechend ändern. Diese build.gradle-Datei gilt für das Modul (die App), das Sie erstellen, nicht für das Projekt.

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

Nachdem Sie Gradle mit Ihrer aktuellen build.gradle-Datei synchronisiert haben, können Sie com.google.maps.android.PolyUtil in Ihre Java-Datei importieren:

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

Geofences definieren

Beachten Sie, dass hier auch PolygonOptions importiert wird. Das Polygon wird so dargestellt:

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);

Wie Sie oben sehen, definieren wir hier ein festes Polygon mit vordefinierten Koordinaten – Paaren aus Breiten- und Längengrad. In der Praxis stammen diese Koordinaten und Polygondaten jedoch meist von einem Backend-Endpunkt und werden wahrscheinlich remote abgerufen. Das bedeutet, dass die Polygone von der App dynamisch erstellt werden müssen.

Weitere InformationenPolygonOptions

Sie sollten die Polygone beim Erstellen des Fragments oder der Aktivität definieren. Beispiel:

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
}

Standortaktualisierungen abrufen

Nachdem Sie Ihre Geofences definiert haben, müssen Sie nur noch einen Listener für Standortaktualisierungen erstellen, um das oben genannte Ereignis im Navigation SDK zu abonnieren. Dieses Ereignis heißt RoadSnappedLocationProvider und gibt den letzten Standort des Geräts zurück.

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) {
   }
};

Mit Android-Maps-Utils können Sie dann mit PolyUtil.containsLocation prüfen, ob sich der empfangene Standort innerhalb des vordefinierten Polygons befindet. Im folgenden Beispiel wird das vordefinierte Polygon verwendet, das den Geofence darstellt. In der Praxis haben Sie jedoch möglicherweise mehrere Polygone und es wäre eine Schleife erforderlich.

Ein alternativer Ansatz

In diesem Dokument geht es um eine clientseitige Anwendung, die auf einen Verstoß gegen einen benutzerdefinierten Geofence (Polygon) prüft. Es gibt jedoch Szenarien, in denen Sie solche Prüfungen in Ihrem Backend durchführen möchten.

Das bedeutet, dass die App Standortaktualisierungen an ein Backend sendet und dieses Backend dann prüft, ob das Fahrzeug ein bestimmtes Polygon überschritten hat. Die Validierung hängt also nicht von der Client-App ab.

Eine mögliche Lösung wäre:

[Execution Environment] Server side geofencing architecture

Eine Beispielarchitektur, die einen serverseitigen Ansatz für Geofencing veranschaulicht.

Serverseitige Lösung
Serverseitige Lösung

  1. Die Fahrer-App, die das Driver SDK verwendet, sendet Standortaktualisierungen an Fleet Engine. Standortaktualisierungen und In-App-Navigation erfolgen über das Navigation SDK.
  2. Fleet Engine gibt diese Aktualisierungen an Cloud Logging oder Pub/Sub aus.
  3. Das Backend erfasst diese Standortsignale.
  4. Geofences werden in BigQuery gespeichert, damit sie vom Backend analysiert werden können.
  5. Wenn der Geofence ausgelöst wird, werden Benachrichtigungen an die Fahrer-App gesendet.

In dieser Architektur werden das Driver SDK und Fleet Engine verwendet. Fleet Engine kann Pub/Sub-Updates ausgeben und Logeinträge in Cloud Logging generieren. In beiden Fällen kann der Standort des Fahrzeugs abgerufen werden.

Das Backend kann dann die Pub/Sub-Warteschlange überwachen oder Logs lesen und nach Fahrzeugupdates suchen. Immer wenn eine Aktualisierung erfolgt (oder alle paar Sekunden oder Minuten, je nach Wichtigkeit), kann das Backend BigQuery GIS-Funktionen aufrufen, um zu ermitteln, ob sich ein bestimmtes Fahrzeug innerhalb oder außerhalb von Geofences befindet. Wenn ein oder mehrere Geofences verletzt wurden, kann das Backend reagieren und interne Pipelines oder andere relevante Arbeitsabläufe auslösen.

Fazit

Geofencing ist ein leistungsstarkes Tool, das für verschiedene Zwecke eingesetzt werden kann. Unternehmen können Geofencing nutzen, um Endnutzer mit relevanten Anzeigen und Angeboten anzusprechen, standortbezogene Dienste bereitzustellen und die Sicherheit zu verbessern.

Das Navigation SDK bietet nützliche Event-Listener, mit denen viele wichtige Momente während einer Fahrt erkannt werden können. Unternehmen benötigen häufig benutzerdefinierte Geofences für bestimmte Anwendungsfälle. In diesem Dokument haben wir eine Möglichkeit gezeigt, dies zu erreichen. Die Möglichkeiten sind jedoch endlos. Wir sind gespannt auf Ihre Ideen.

Nächste Aktionen

Empfohlene weiterführende Informationen: