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

In diesem Dokument wird beschrieben, was clientseitiges Geofencing ist, wann es verwendet wird und wie es auf Anwendungsfälle in einer mobilen App angewendet wird. Außerdem wird gezeigt, wie Sie ein Beispiel auf Android mit dem Google Navigation SDK implementieren.

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

Unternehmen müssen oft wissen, wann ein Mobilgerät in einen bestimmten Bereich. Dies wird erreicht, indem virtuelle geografische Grenzen Geofencings, mit denen Software Ereignisse auslösen kann, wenn ein Gerät eine Grenze überschreitet.

Zu wissen, wann ein bestimmtes Fahrzeug eine Grenze überquert, ist für verschiedene Anwendungsfälle wichtig, z. B.:

  • Interaktion mit Kunden: Unternehmen können mithilfe von Geofencing Push-Benachrichtigungen an Endnutzer über Sonderangebote, Veranstaltungen oder neue Produkte senden.
  • Sicherheit und Sicherheit: Unternehmen können mit Geofencing virtuelle Begrenzungen um sensible Bereiche wie Rechenzentren oder Lagerhäuser erstellen und das Sicherheitspersonal benachrichtigen, wenn jemand den Bereich betritt oder verlässt.
  • Verkehr: Unternehmen können Geofencing nutzen, um den Standort von Fahrzeugen zu verfolgen und Routen und Fahrpläne zu optimieren.

Daher ist es wichtig, dass Sie wissen, wie Sie diese Zonen (Polygone) innerhalb einer clientseitigen Anwendung darstellen. Diese App sollte den Gerätestandort verfolgen und prüfen, ob ein bestimmter Geofence gehackt wurde.

Umfang

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

  1. Die Polygone, die auf Sicherheitsverletzungen geprüft werden müssen
  2. Echtzeitstandort des Nutzers
  3. Logik zur Überprüfung, ob die aktuelle Position innerhalb oder außerhalb der Polygone liegt.

Dieser Leitfaden enthält Beispiele für Android-Geräte. Die Schritte sind aber auch auf iOS-Geräten identisch. Der Android-Standortdienst hat eine integrierte Implementierung für Kreislauf-Geofences (siehe hier). 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:

  • Gespeicherte Straßenstandorte über die darauf laufende App abrufen Das ist genauer als der FusedLocationProvider (FLP) von Android, da Standorte anhand des Straßennetzes von Google an das nächste Straßensegment angedockt werden, was die geschätzte Ankunftszeit und andere Informationen von FLP viel genauer macht.
  • Eine detaillierte Routenführung, die es Fahrern ermöglicht, effizient von Punkt A nach Punkt B zu gelangen, wobei Echtzeit-Verkehr und andere Routenbeschränkungen berücksichtigt werden.
  • Ereignisse über Ereignis-Listener und registrierte Callbacks auslösen

Listener

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

  • Standortänderungen über den RoadSnappedLocation-Anbieter.
  • Ereignisse zur Umleitung (Nutzer verpasst eine Kehrtwende, Abbiegung nach links usw. und weicht von der empfohlenen Route ab) über ReroutingListener.
  • Ankunftsereignisse (der Nutzer kommt am geplanten Ziel an) über ArrivalListener.
  • Ereignisse für verbleibende Entfernung und geschätzte Ankunftszeit (benachrichtigt werden, wenn der Fahrer kurz vor dem Ziel ist – basierend auf Metern, benachrichtigt werden, wenn der Fahrer kurz vor dem Ziel ist – basierend auf der Zeit) sind beide ü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 Schritt-für-Schritt-Modus betrieben und in der Route wird ein Polygon 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 Drive-Apps.
  3. Der Fahrer fährt und die Fahrer-App prüft regelmäßig die Geofences auf einen Trigger.
  4. Die Fahrer App benachrichtigt das Backend über ein Triggerereignis, damit es entsprechend reagieren kann.

Während sich das Fahrzeug auf der Route bewegt, prüft die App regelmäßig, ob das Polygon verletzt wurde. Wenn die App erkennt, dass ein Geofence überschritten wurde, wird auf der Benutzeroberfläche die Meldung Geofence-Überschreitung 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 mit der Google Maps Android API nützlich sind.

Diese Bibliothek ist öffentlich und wird auf GitHub gehostet. Sie ist unter folgendem Link 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 (im Rahmen dieses Dokuments), sollten Sie die Datei build.gradle entsprechend ändern. Diese build.gradle-Datei gilt für das Modul (die App), das Sie erstellen, und 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 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. Der Grund dafür ist, 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 können, definieren wir hier ein festes Polygon mit vordefinierten Koordinaten- (Breitengrad, Längengrad)-Paaren. In der Praxis stammen diese Koordinaten und Polygondefinitionen jedoch in den meisten Fällen von einem Backend-Endpunkt und werden wahrscheinlich aus der Ferne abgerufen. Das bedeutet, dass die Polygone im laufenden Betrieb von der App erstellt werden müssen.

Weitere Informationen zu den Angaben in PolygonOptions

Sie sollten das oder die Polygone beim Erstellen 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 einen Listener für Standortupdates erstellen, um das oben erwähnte Ereignis mit dem Namen RoadSnappedLocationProvider im Navigation SDK zu abonnieren. Dieses Ereignis 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 mithilfe von PolyUtil.containsLocation prüfen, ob der empfangene Standort innerhalb des vordefinierten Polygons liegt. Im Beispiel unten wird das vordefinierte Polygon, das den Geofence darstellt, verwendet, aber in der Praxis könnten Sie mehrere Polygone haben und eine Schleife wäre erforderlich.

Ein alternativer Ansatz

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

Das bedeutet, dass die App Standortaktualisierungen an ein Backend meldet und dieses Backend dann prüft, ob das Fahrzeug ein bestimmtes Polygon verletzt hat. Die Validierung ist also nicht von der Client-App abhängig.

Eine mögliche Lösung wäre:

[Execution Environment] Serverseitige Geofencing-Architektur

Beispielarchitektur, die einen serverseitigen Ansatz für das Geofencing veranschaulicht

<ph type="x-smartling-placeholder">
</ph> Serverseitige Lösung
Serverseitige Lösung

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

In dieser Architektur werden das Driver SDK und die Fleet Engine verwendet. Fleet Engine kann PubSub-Aktualisierungen senden und Logeinträge in Cloud Logging generieren. In beiden Fällen kann der Fahrzeugstandort abgerufen werden.

Das Back-End könnte dann die Pub/Sub-Warteschlange überwachen oder Logs lesen und auf Fahrzeugupdates warten. Jedes Mal, wenn eine Aktualisierung erfolgt (oder alle paar Sekunden oder Minuten, je nach Dringlichkeit), 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 verletzt 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. Mit Geofencing können Unternehmen Endnutzer mit relevanten Anzeigen und Angeboten ansprechen, standortbezogene Dienstleistungen bereitstellen und die Sicherheit verbessern.

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

Nächste Aktionen

Weitere Informationen: