برای ردیابی دارایی های تلفن همراه با Nav SDK، geofences سمت مشتری را راه اندازی کنید

این سند توضیح می‌دهد که geofencing سمت کلاینت چیست، چه زمانی باید از آن استفاده کرد و چگونه آن را در موارد استفاده در یک برنامه تلفن همراه اعمال کرد. همچنین نحوه پیاده‌سازی یک مثال در Android با استفاده از Google Navigation SDK را نشان می‌دهد.

Nav SDK با تشخیص geofence
Nav SDK با تشخیص geofence

شرکت ها اغلب باید بدانند که یک دستگاه تلفن همراه چه زمانی وارد یک منطقه خاص می شود یا از آن خارج می شود. این کار با حفظ مرزهای جغرافیایی مجازی یا geofences انجام می‌شود و نرم‌افزار را قادر می‌سازد تا زمانی که دستگاه از یک مرز عبور می‌کند، رویدادها را راه‌اندازی کند.

درک زمانی که یک وسیله نقلیه خاص از یک مرز عبور می کند، برای موارد استفاده چندگانه مهم است مانند:

  • تعامل با مشتری : کسب‌وکارها می‌توانند از geofencing برای ارسال اعلان‌های فشار به کاربران نهایی درباره پیشنهادات ویژه، رویدادها یا محصولات جدید استفاده کنند.
  • امنیت و ایمنی : کسب‌وکارها می‌توانند از geofencing برای ایجاد محیط‌های مجازی در اطراف مناطق حساس، مانند مراکز داده یا انبارها استفاده کنند و در صورت ورود یا خروج شخصی به پرسنل امنیتی، هشدار دهند.
  • حمل و نقل : کسب و کارها می توانند از geofencecing برای ردیابی مکان وسایل نقلیه و بهینه سازی مسیرها و برنامه ها استفاده کنند.

بنابراین مهم است که بدانید چگونه آن مناطق (چند ضلعی ها) را در داخل یک برنامه رو به مشتری نشان دهید. این برنامه باید مکان دستگاه را ردیابی کند و بررسی کند که آیا یک geofence خاصی را نقض کرده است یا خیر.

دامنه

این سند بر روی اجرای geofencing در سمت مشتری تمرکز دارد. این بدان معناست که برنامه مشتری باید دارای موارد زیر باشد:

  1. چند ضلعی هایی که باید آن ها را بررسی کند تا نقائص وجود داشته باشد.
  2. موقعیت مکانی کاربر در زمان واقعی
  3. منطقی برای بررسی اینکه آیا مکان فعلی در داخل یا خارج هر یک از چند ضلعی ها است.

این راهنما شامل مثال‌هایی در اندروید است، اما راه‌های مشابهی برای انجام این کار در iOS وجود دارد. Android Location Service یک پیاده سازی داخلی برای geofences دایره ای دارد که در اینجا قابل مشاهده است. کد مرجع و توضیحات زیر نقطه شروعی برای پیاده سازی های پیچیده تر است.

Navigation SDK یک کتابخانه بومی Android / iOS است که به برنامه درایور اضافه شده است. مسئول این است:

  • به دست آوردن مکان های ضبط شده از جاده از برنامه ای که آن را اجرا می کند. این دقیق‌تر از FusedLocationProvider (FLP) اندروید است، زیرا از شبکه جاده‌ای Google برای گرفتن مکان‌ها به نزدیک‌ترین بخش جاده‌ای استفاده می‌کند که ETA را بسیار دقیق‌تر می‌کند، و اطلاعات دیگر از FLP.
  • تجربه گام به گام که به رانندگان اجازه می دهد تا با در نظر گرفتن ترافیک بلادرنگ و سایر محدودیت های مسیر، به طور موثر از نقطه A به نقطه B بروند.
  • اجرای رویدادها از طریق شنوندگان رویداد و تماس های ثبت شده.

شنوندگان

Navigation SDK شنونده های زیادی دارد که می توانید از آنها استفاده کنید. برای نام بردن از چند مورد:

  • تغییر مکان از طریق ارائه دهنده RoadSnappedLocation .
  • از طریق ReroutingListener رویدادها را مجدداً تغییر مسیر دهید (کاربر چرخش دور، گردش به چپ و غیره را از دست می دهد و از مسیر توصیه شده منحرف می شود.
  • رویدادهای ورود (کاربر به مقصد برنامه ریزی شده می رسد) از طریق ArrivalListener .
  • مسافت باقیمانده و رویدادهای ETA (در زمان رسیدن راننده به مقصد - بر اساس متر، زمانی که راننده در شرف رسیدن به مقصد است - بر اساس زمان مطلع شوید) هر دو از طریق . RemainingTimeOrDistanceChangedListener

در این راهنما فقط از ارائه دهنده RoadSnappedLocation و LocationListener آن استفاده شده است.

راه حل ژئوفنسینگ سمت مشتری

اکنون بیایید در ساخت قابلیت geofencing سمت مشتری قدم بگذاریم. در مثال زیر، Navigation SDK داریم که در حالت چرخش به نوبه کار می کند و یک چند ضلعی در مسیر تعریف شده است که نشان دهنده ژئوفنس ما است.

نمودار عملکردی
نمودار عملکردی

  1. Geofence ها در BigQuery ذخیره می شوند و توسط باطن شما کشیده می شوند.
  2. پشتیبان به طور دوره ای geofences را به برنامه های درایو منتقل می کند.
  3. Driver پیمایش می کند و برنامه راننده به طور منظم در حال بررسی geofences برای یک ماشه است.
  4. برنامه Driver به پشتیبان یک رویداد ماشه اطلاع می دهد تا بتواند عمل کند.

همانطور که وسیله نقلیه در طول مسیر حرکت می کند، برنامه مرتباً بررسی می کند که آیا چند ضلعی نقض شده است یا خیر. هنگامی که برنامه تشخیص می دهد که از یک geofence عبور کرده است، پیامی در رابط کاربری نمایش داده می شود که می گوید: Geofence نقض شد .

پیکربندی وابستگی ها برای Android-Maps-Utils

این راه حل از Android-Maps-Utils استفاده می کند، یک کتابخانه منبع باز حاوی ابزارهایی که برای طیف گسترده ای از برنامه های کاربردی با استفاده از Google Maps Android API مفید هستند.

این کتابخانه عمومی است و در Github میزبانی می‌شود و می‌توانید به آدرس زیر دسترسی داشته باشید:

  • اندروید : 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 خود، می توانید 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 می توان مشخص کرد، لطفاً اینجا را بررسی کنید.

شما باید چند ضلعی (های) را در حین ایجاد Fragment یا Activity خود تعریف کنید. به عنوان مثال:

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
}

به به‌روزرسانی‌های موقعیت مکانی گوش دهید

پس از تعریف geofences خود، فقط باید یک شنونده به روز رسانی موقعیت مکانی ایجاد کنید تا در رویداد مذکور در Navigation SDK به نام RoadSnappedLocationProvider مشترک شوید که آخرین موقعیت مکانی دستگاه را برمی گرداند.

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 برای بررسی اینکه آیا مکان دریافتی در داخل چند ضلعی از پیش تعریف شده است یا خیر، استفاده کنید. در مثال زیر از چند ضلعی از پیش تعریف شده که نشان دهنده ژئوفنس است استفاده می شود اما در عمل ممکن است چند ضلعی داشته باشید و یک حلقه لازم باشد.

یک رویکرد جایگزین

این سند بر روی یک برنامه کاربردی که با مشتری روبرو است تمرکز می‌کند که نقض geofence سفارشی (چند ضلعی) را بررسی می‌کند. با این حال، سناریوهایی وجود دارد که ممکن است بخواهید چنین بررسی هایی را در باطن خود انجام دهید.

این بدان معنی است که برنامه به‌روزرسانی‌های مکان را به یک باطن گزارش می‌کند و این بک‌اند سپس بررسی می‌کند که آیا آن وسیله نقلیه چند ضلعی خاصی را نقض کرده است، بنابراین برای تأیید اعتبار به برنامه مشتری وابسته نیست.

یک راه حل ممکن به صورت زیر خواهد بود:

[محیط اجرا] معماری geofencing سمت سرور

معماری نمونه ای که رویکرد سمت سرور را برای geofencing نشان می دهد.

راه حل سمت سرور
راه حل سمت سرور

  1. برنامه درایور، با استفاده از Driver SDK، به‌روزرسانی‌های مکان را به Fleet Engine ارسال می‌کند. به‌روزرسانی‌های مکان و پیمایش درون برنامه‌ای از طریق Navigation SDK انجام می‌شود.
  2. Fleet Engine آن به‌روزرسانی‌ها را به Cloud Logging یا Pub/Sub خروجی می‌دهد.
  3. پشتیبان آن سیگنال های مکان را جمع آوری می کند.
  4. Geofence ها در Big Query برای تجزیه و تحلیل توسط Backend ذخیره می شوند.
  5. پس از راه اندازی geofence، هشدارها به برنامه Driver ارسال می شود.

در این معماری از Driver SDK و Fleet Engine استفاده شده است. Fleet Engine می‌تواند به‌روزرسانی‌های PubSub را منتشر کند و ورودی‌های گزارش را در Cloud Logging ایجاد کند. در هر دو مورد، مکان وسیله نقلیه قابل بازیابی است.

پس از آن بخش پشتیبان می‌تواند صف PubSub را زیر نظر بگیرد یا گزارش‌ها را بخواند و به‌روزرسانی‌های خودرو را تماشا کند. سپس، هر زمان که یک به‌روزرسانی اتفاق می‌افتد (یا هر چند ثانیه، هر چند دقیقه، با توجه به بحرانی بودن آن)، باطن می‌تواند توابع BigQuery GIS را فراخوانی کند تا مشخص کند که آیا یک وسیله نقلیه در داخل یا خارج از geofences قرار دارد. در صورتی که یک یا چند geofences نقض شده باشد، backend می تواند عمل کند و خطوط لوله داخلی یا سایر گردش های کاری مرتبط را راه اندازی کند.

نتیجه گیری

ژئوفنسینگ ابزار قدرتمندی است که می توان از آن برای اهداف مختلف استفاده کرد. کسب و کارها می توانند از geofencing برای هدف قرار دادن کاربران نهایی با تبلیغات و تبلیغات مرتبط، ارائه خدمات مبتنی بر مکان و بهبود امنیت و ایمنی استفاده کنند.

Navigation SDK شنوندگان رویدادهای مفیدی را فراهم می کند که می توانند بسیاری از لحظات مهم را در طول سفر تشخیص دهند. شرکت‌ها معمولاً برای موارد استفاده خاص به ژئوفنس‌های سفارشی نیاز دارند. در این سند ما راهی برای رسیدن به این هدف نشان دادیم، اما احتمالات بی پایان است. ما مشتاقانه منتظریم تا ببینیم چه چیزی به ذهن شما خطور می کند.

اقدامات بعدی

پیشنهاد برای مطالعه بیشتر: