클라이언트 측 지오펜싱을 트리거하여 Nav SDK로 모바일 애셋 추적하기

이 문서에서는 클라이언트 측 지오펜싱이 무엇인지, 언제 사용해야 하는지, 모바일 애플리케이션의 사용 사례에 적용하는 방법을 설명합니다. 또한 Google Navigation SDK를 사용하여 Android에서 예를 구현하는 방법을 보여줍니다.

지오펜스 감지가 포함된 탐색 SDK
지오펜스 감지가 포함된 Nav SDK

기업은 모바일 기기가 특정 영역에 들어가거나 나갈 때를 알아야 하는 경우가 많습니다. 이는 가상 지리적 경계 또는 지오펜스를 유지하여 소프트웨어가 기기가 경계를 넘을 때 이벤트를 트리거하도록 함으로써 달성됩니다.

특정 차량이 경계를 통과하는 시점을 파악하는 것은 다음과 같은 여러 사용 사례에서 중요합니다.

  • 고객 참여: 기업은 지오펜싱을 사용하여 특별 혜택, 이벤트 또는 신제품에 관한 푸시 알림을 최종 사용자에게 보낼 수 있습니다.
  • 보안 및 안전: 기업은 지오펜싱을 사용하여 데이터 센터 또는 창고와 같은 민감한 영역 주변에 가상 경계를 만들고 누군가가 해당 영역에 들어가거나 나갈 때 보안 담당자에게 알릴 수 있습니다.
  • 교통: 기업은 지오펜싱을 사용하여 차량의 위치를 추적하고 경로와 일정을 최적화할 수 있습니다.

따라서 클라이언트 대면 앱 내에서 이러한 영역 (다각형)을 나타내는 방법을 알아야 합니다. 이 앱은 기기 위치를 추적하고 특정 지오펜스를 위반했는지 확인해야 합니다.

범위

이 문서에서는 지오펜싱의 클라이언트 측 구현에 중점을 둡니다 . 즉, 클라이언트 앱에는 다음이 있어야 합니다.

  1. 위반 여부를 확인할 다각형
  2. 사용자의 실시간 위치
  3. 현재 위치가 다각형 내부에 있는지 외부에 있는지 확인하는 로직

이 가이드에는 Android의 예가 포함되어 있지만 iOS에서 이를 달성하는 동등한 방법이 있습니다. Android 위치 서비스에는 원형 지오펜스에 대한 기본 구현이 있으며 여기에서 확인할 수 있습니다. 아래의 참조 코드와 설명은 더 복잡한 구현을 위한 시작점입니다.

Navigation SDK는 드라이버 앱에 추가된 네이티브 Android / iOS 라이브러리입니다. 다음을 담당합니다.

  • 실행 중인 앱에서 도로에 스냅된 위치를 가져옵니다. 이는 Google의 도로 네트워크를 사용하여 위치를 가장 가까운 도로 구간에 스냅하므로 ETA가 훨씬 더 정확하고 FLP의 다른 정보를 사용하므로 Android의 FusedLocationProvider (FLP)보다 더 정확합니다.
  • 운전자가 실시간 교통상황 및 기타 경로 제한사항을 고려하여 A 지점에서 B 지점으로 효율적으로 이동할 수 있는 세부 경로 안내 환경
  • 이벤트 리스너 및 등록된 콜백을 통해 이벤트 실행

리스너

Navigation SDK에는 사용할 수 있는 리스너가 많이 있습니다. 예를 들면 다음과 같습니다.

이 가이드에서는 RoadSnappedLocationProvider와 LocationListener만 사용됩니다.

클라이언트 측 지오펜싱 솔루션

이제 클라이언트 측 지오펜싱 기능을 빌드하는 단계를 살펴보겠습니다. 아래 예에서는 세부 경로 안내 모드로 작동하는 Navigation SDK와 지오펜싱을 나타내는 경로에 정의된 다각형이 있습니다.

기능 다이어그램
기능 다이어그램

  1. 지오펜스는 BigQuery에 저장되고 백엔드에서 가져옵니다.
  2. 백엔드는 지오펜스를 드라이브 앱으로 주기적으로 푸시합니다.
  3. 드라이버가 탐색하고 드라이버 앱이 트리거를 위해 지오펜스를 정기적으로 확인합니다.
  4. 드라이버 앱은 백엔드가 조치를 취할 수 있도록 트리거 이벤트를 백엔드에 알립니다.

차량이 경로를 따라 이동하면 앱은 다각형이 위반되었는지 정기적으로 확인합니다. 앱에서 지오펜스를 교차한 것을 감지하면 UI에 지오펜스 위반 이라는 메시지가 표시됩니다.

Android-Maps-Utils의 종속 항목 구성

이 솔루션은 Google Maps Android API를 사용하는 광범위한 애플리케이션에 유용한 유틸리티가 포함된 오픈소스 라이브러리인 Android-Maps-Utils를 사용합니다.

이 라이브러리는 공개 상태이며 GitHub에서 호스팅되며 다음에서 액세스할 수 있습니다.

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

이 라이브러리를 Android 앱 (이 문서의 범위)에 포함하려면 build.gradle 파일을 수정하여 포함해야 합니다. 이 build.gradle 파일은 프로젝트 수준이 아니라 빌드 중인 모듈 (앱)용입니다.

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

그런 다음 Gradle을 최신 build.gradle 파일과 동기화한 후 Java 파일에서 com.google.maps.android.PolyUtil을 가져올 수 있습니다.

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

지오펜스 정의

여기에서도 PolygonOptions가 가져오고 있습니다. 다각형을 나타내는 데 사용되는 항목이기 때문입니다.

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

위에서 볼 수 있듯이 여기에서는 미리 설정된 좌표(위도, 경도 쌍)가 있는 고정 다각형을 정의합니다. 그러나 실제 시나리오에서는 이러한 좌표와 다각형 정의가 대부분 백엔드 엔드포인트에서 가져오고 원격으로 가져올 가능성이 높습니다. 즉, 다각형은 앱에서 즉석으로 만들어야 합니다.

PolygonOptions에서 지정할 수 있는 항목에 관한 자세한 내용은 여기를 참고하세요.

프래그먼트 또는 활동을 만드는 동안 다각형을 정의해야 합니다. 예를 들면 다음과 같습니다.

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
}

위치 업데이트 수신 대기

지오펜스를 정의한 후에는 기기의 최신 위치를 반환하는 RoadSnappedLocationProvider라는 Navigation SDK의 앞서 언급한 이벤트를 구독하는 위치 업데이트 리스너를 만들기만 하면 됩니다.

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

그런 다음 Android-Maps-Utils를 사용하여 PolyUtil.containsLocation을 사용하여 수신된 위치가 미리 정의된 다각형 내부에 있는지 확인할 수 있습니다. 아래 예에서는 지오펜스를 나타내는 미리 정의된 다각형이 사용되지만 실제로는 여러 다각형이 있을 수 있으며 루프가 필요합니다.

대체 방법

이 문서에서는 맞춤 지오펜스 (다각형) 위반을 확인하는 클라이언트 대면 애플리케이션에 중점을 둡니다. 하지만 백엔드에서 이러한 검사를 수행하려는 시나리오가 있습니다.

즉, 앱은 백엔드에 위치 업데이트를 보고하고 이 백엔드는 해당 차량이 특정 다각형을 위반했는지 확인하므로 유효성 검사를 수행하기 위해 클라이언트 앱에 의존하지 않습니다.

가능한 해결책은 다음과 같습니다.

[실행 환경] 서버 측 지오펜싱 아키텍처

지오펜싱에 대한 서버 측 접근 방식을 보여주는 아키텍처의 예입니다.

서버 측 솔루션
서버 측 솔루션

  1. 드라이버 앱은 Driver SDK를 사용하여 Fleet Engine에 위치 업데이트를 보냅니다. 위치 업데이트 및 인앱 탐색은 Navigation SDK를 통해 이루어집니다.
  2. Fleet Engine은 이러한 업데이트를 Cloud Logging 또는 Pub/Sub에 출력합니다.
  3. 백엔드는 이러한 위치 신호를 수집합니다.
  4. 지오펜스는 백엔드에서 분석할 수 있도록 BigQuery에 저장됩니다.
  5. 지오펜스가 트리거되면 드라이버 앱으로 알림이 전송됩니다.

이 아키텍처에서는 Driver SDK와 Fleet Engine이 사용됩니다. Fleet Engine은 PubSub 업데이트를 내보내고 Cloud Logging에서 로그 항목을 생성할 수 있습니다. 두 경우 모두 차량 위치를 가져올 수 있습니다.

그런 다음 백엔드는 PubSub 큐를 모니터링하거나 로그를 읽고 차량 업데이트를 확인할 수 있습니다. 그런 다음 업데이트가 발생할 때마다 (또는 몇 초, 몇 분마다 중요도에 따라) 백엔드는 BigQuery GIS 함수를 호출하여 지정된 차량이 지오펜스 내부에 있는지 외부에 있는지 확인할 수 있습니다. 하나 이상의 지오펜스가 위반된 경우 백엔드는 내부 파이프라인 또는 기타 관련 워크플로를 실행하고 트리거할 수 있습니다.

결론

지오펜싱은 다양한 용도로 사용할 수 있는 강력한 도구입니다. 기업은 지오펜싱을 사용하여 관련성 있는 광고 및 프로모션으로 최종 사용자를 타겟팅하고, 위치 기반 서비스를 제공하고, 보안 및 안전을 개선할 수 있습니다.

Navigation SDK는 여정 중에 중요한 순간을 많이 감지할 수 있는 유용한 이벤트 리스너를 제공합니다. 기업은 특정 사용 사례에 맞춤 지오펜스를 요구하는 경우가 많습니다. 이 문서에서는 이를 달성하는 방법을 보여주었지만 가능성은 무궁무진합니다. 여러분이 무엇을 생각해낼지 기대됩니다.

다음 작업

추천 추가 자료: