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 App eingesetzt werden kann. Außerdem wird gezeigt, wie ein Beispiel unter Android mit dem Google Navigation SDK implementiert wird.

Nav SDK mit Geofence-Erkennung
Navigation SDK mit Geofence-Erkennung

Unternehmen müssen oft wissen, wann ein Mobilgerät einen bestimmten Bereich betritt oder verlässt. Dazu werden virtuelle geografische Grenzen oder Geofences verwendet, mit denen Software Ereignisse auslösen kann, wenn ein Gerät eine Grenze überschreitet.

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

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

Daher ist es wichtig zu wissen, wie diese Zonen (Polygone) in einer kundenorientierten App dargestellt werden können. Diese App sollte den Gerätestandort verfolgen und prüfen, ob ein bestimmter Geofence überschritten wurde.

Umfang

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

  1. Die Polygone, die auf Verstöße geprüft werden müssen
  2. Echtzeitstandort des Nutzers
  3. Logik, um zu prüfen, ob sich der aktuelle Standort innerhalb oder außerhalb eines der Polygone befindet

Diese Anleitung 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 Sie hier sehen können. 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 zuständig:

  • Abrufen von standortbezogenen Daten von der App, die sie ausführt. Diese Daten sind genauer als die des FusedLocationProvider (FLP) von Android, da sie das Straßennetz von Google verwenden, um Standorte dem nächsten Straßenabschnitt zuzuordnen. Dadurch wird die voraussichtliche Ankunftszeit viel genauer. Außerdem werden andere Informationen aus FLP verwendet.
  • Detaillierte Routenführung, mit der Fahrer effizient von A nach B gelangen können, wobei der Echtzeit-Traffic und andere Routenbeschränkungen berücksichtigt werden.
  • Auslösen von Ereignissen über Ereignis-Listener und registrierte Callbacks.

Listener

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

  • Standortänderungen über den RoadSnappedLocation-Anbieter.
  • Ereignisse für Routenänderungen (Nutzer verpasst eine Kehrtwende, eine Linksabbiegung usw. und weicht von der empfohlenen Route ab) über ReroutingListener.
  • Ankunftsereignisse (Nutzer erreicht das geplante Ziel) über ArrivalListener.
  • Ereignisse für die verbleibende Entfernung und die voraussichtliche Ankunftszeit (Benachrichtigung, wenn der Fahrer das Ziel fast erreicht hat – basierend auf Metern; Benachrichtigung, wenn der Fahrer das Ziel fast erreicht hat – basierend auf der Zeit). Beide sind über .RemainingTimeOrDistanceChangedListener verfügbar.

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

Die clientseitige Geofencing-Lösung

Sehen wir uns nun an, wie Sie eine clientseitige Geofencing-Funktion erstellen. Im folgenden Beispiel wird das Navigation SDK im Modus für detaillierte Routenführung verwendet 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 sendet die Geofences regelmäßig an die Fahrer-Apps.
  3. Der Fahrer navigiert und die Fahrer-App prüft regelmäßig, ob ein Geofence ausgelöst wurde.
  4. Die Fahrer-App benachrichtigt das Backend über ein Auslöseereignis, 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 feststellt, dass ein Geofence überschritten wurde, wird auf der Benutzeroberfläche die Meldung Geofence überschritten angezeigt.

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

Diese Lösung verwendet Android-Maps-Utils, 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 ist unter folgenden Links verfügbar:

  • 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 der neuesten 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 liegt daran, dass damit das Polygon dargestellt wird:

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 Koordinatenpaaren (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 im laufenden Betrieb erstellt werden müssen.

Weitere Informationen zu den Angaben, die in PolygonOptions gemacht werden können, finden Sie hier.

Sie sollten die Polygone bei der Erstellung Ihres Fragments oder Ihrer 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
}

Auf Standortaktualisierungen warten

Nachdem Sie Ihre Geofences definiert haben, müssen Sie nur noch einen Listener für Standort-Updates erstellen, um das oben genannte Ereignis im Navigation SDK zu abonnieren. Dieses Ereignis heißt RoadSnappedLocationProvider und gibt den aktuellen 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 PolyUtil.containsLocation verwenden, um zu 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 eine Schleife wäre erforderlich.

Alternative Vorgehensweise

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

In diesem Fall würde die App Standortaktualisierungen an ein Backend senden und dieses Backend würde dann prüfen, ob das Fahrzeug ein bestimmtes Polygon überschritten hat. Die Validierung würde also nicht von der Client-App durchgeführt.

Eine mögliche Lösung wäre folgende:

[Ausführungsumgebung] Serverseitige Geofencing-Architektur

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

Serverseitige Lösung
Serverseitige Lösung

  1. Die Fahrer-App sendet mit dem Driver SDK 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 ein 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-Aktualisierungen ausgeben und Logeinträge in Cloud Logging generieren. In beiden Fällen kann der Fahrzeugstandort abgerufen werden.

Das Backend könnte dann die Pub/Sub-Warteschlange überwachen oder Logs lesen und nach Fahrzeugaktualisierungen suchen. Immer wenn eine Aktualisierung erfolgt (oder alle paar Sekunden oder Minuten, je nach Wichtigkeit), könnte 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 überschritten wurden, kann das Backend reagieren und interne Pipelines oder andere relevante Workflows auslösen.

Fazit

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

Das Navigation SDK bietet nützliche Ereignis-Listener, die viele wichtige Momente während einer Fahrt erkennen können. Unternehmen benötigen oft benutzerdefinierte Geofences für bestimmte Anwendungsfälle. In diesem Dokument haben wir eine Möglichkeit gezeigt, dies zu erreichen, aber die Möglichkeiten sind endlos. Wir sind schon gespannt auf Ihre Ideen.

Nächste Schritte

Empfohlene weitere Informationen: