Nav SDK टूल की मदद से मोबाइल एसेट ट्रैक करने के लिए, जियोफ़ेंस क्लाइंट-साइड को ट्रिगर करें

इस दस्तावेज़ में बताया गया है कि क्लाइंट-साइड जियोफ़ेंसिंग क्या है, इसका इस्तेमाल कब करना चाहिए, और इसे मोबाइल ऐप्लिकेशन में इस्तेमाल के उदाहरणों पर कैसे लागू किया जाता है. इसमें यह भी बताया गया है कि Google Navigation SDK का इस्तेमाल करके, Android पर कोई उदाहरण कैसे लागू किया जा सकता है.

जियोफ़ेंस की पहचान करने की सुविधा वाला Nav SDK
जियोफ़ेंस का पता लगाने की सुविधा वाला Nav SDK

कंपनियों को अक्सर यह जानने की ज़रूरत होती है कि कोई मोबाइल डिवाइस किसी खास इलाके में कब आता है या कब जाता है. इसके लिए, वर्चुअल भौगोलिक सीमाएं या जियोफ़ेंस बनाए जाते हैं. इससे सॉफ़्टवेयर को यह पता चलता है कि जब कोई डिवाइस किसी सीमा को पार करता है, तब इवेंट ट्रिगर करने हैं.

किसी वाहन के सीमा पार करने की जानकारी कई मामलों में ज़रूरी होती है. जैसे:

  • ग्राहकों की दिलचस्पी बढ़ाना: कारोबार, जियोफ़ेंसिंग का इस्तेमाल करके, उपयोगकर्ताओं को खास ऑफ़र, इवेंट या नए प्रॉडक्ट के बारे में पुश नोटिफ़िकेशन भेज सकते हैं.
  • सुरक्षा: कारोबार, संवेदनशील जगहों के आस-पास वर्चुअल बाउंड्री बनाने के लिए, जियोफ़ेंसिंग का इस्तेमाल कर सकते हैं. जैसे, डेटा सेंटर या गोदाम. साथ ही, अगर कोई व्यक्ति उस जगह में प्रवेश करता है या उसे छोड़ता है, तो सुरक्षा कर्मियों को सूचना दे सकते हैं.
  • परिवहन: कारोबार, वाहनों की जगह की जानकारी ट्रैक करने के लिए जियोफ़ेंसिंग का इस्तेमाल कर सकते हैं. साथ ही, रास्तों और शेड्यूल को ऑप्टिमाइज़ कर सकते हैं.

इसलिए, यह ज़रूरी है कि आपको पता हो कि क्लाइंट के लिए उपलब्ध ऐप्लिकेशन में उन ज़ोन (पॉलीगॉन) को कैसे दिखाया जाए. इस ऐप्लिकेशन को डिवाइस की जगह की जानकारी ट्रैक करनी चाहिए और यह देखना चाहिए कि क्या डिवाइस ने किसी जियोफ़ेंस का उल्लंघन किया है.

दायरा

इस दस्तावेज़ में, क्लाइंट-साइड पर जियोफ़ेंसिंग लागू करने के बारे में बताया गया है . इसका मतलब है कि क्लाइंट ऐप्लिकेशन में यह होना चाहिए:

  1. उन पॉलीगॉन की जानकारी जिनके हिसाब से उल्लंघन की जांच करनी है;
  2. उपयोगकर्ता की जगह की रीयल-टाइम जानकारी
  3. यह लॉजिक यह पता लगाने के लिए होता है कि मौजूदा जगह, किसी पॉलीगॉन के अंदर है या बाहर.

इस गाइड में Android के उदाहरण शामिल हैं. हालांकि, iOS पर भी ऐसा ही किया जा सकता है. Android Location Service में, गोलाकार जियोफ़ेंस के लिए पहले से मौजूद सुविधा होती है. इसके बारे में यहां देखा जा सकता है. नीचे दिया गया रेफ़रंस कोड और जानकारी, ज़्यादा जटिल सेटअप के लिए शुरुआती जानकारी है.

Navigation SDK, ड्राइवर ऐप्लिकेशन में जोड़ी गई एक नेटिव Android / iOS लाइब्रेरी है. यह इन कामों के लिए ज़िम्मेदार है:

  • सड़क के हिसाब से जगह की जानकारी को ऐक्सेस करने वाले ऐप्लिकेशन से जगह की जानकारी पाना. यह Android के FusedLocationProvider (FLP) से ज़्यादा सटीक है. ऐसा इसलिए, क्योंकि यह Google के सड़क नेटवर्क का इस्तेमाल करके, जगहों को सड़क के सबसे नज़दीकी सेगमेंट पर स्नैप करता है. इससे पहुंचने का अनुमानित समय (ईटीए) ज़्यादा सटीक होता है. साथ ही, यह FLP से मिली अन्य जानकारी का भी इस्तेमाल करता है.
  • ड्राइवरों को एक जगह से दूसरी जगह पर जाने के लिए, बारी-बारी से निर्देश मिलते हैं. इसमें रीयल-टाइम में ट्रैफ़िक और रास्ते से जुड़ी अन्य पाबंदियों को ध्यान में रखा जाता है.
  • इवेंट लिसनर और रजिस्टर किए गए कॉलबैक के ज़रिए इवेंट ट्रिगर करना.

लिसनर

Navigation SDK में कई लिसनर होते हैं, जिनका इस्तेमाल किया जा सकता है. इनमें से कुछ के नाम यहां दिए गए हैं:

  • RoadSnappedLocation प्रोवाइडर के ज़रिए जगह की जानकारी में बदलाव.
  • ReroutingListener की मदद से, इवेंट को फिर से रूट करें. जैसे, उपयोगकर्ता यू-टर्न, बाईं ओर मुड़ने वगैरह के निर्देशों को अनदेखा करता है और सुझाए गए रास्ते से भटक जाता है.
  • ArrivalListener के ज़रिए, गंतव्य पर पहुंचने से जुड़े इवेंट (उपयोगकर्ता, प्लान किए गए गंतव्य पर पहुंच गया है).
  • बची हुई दूरी और पहुंचने का अनुमानित समय (ड्राइवर के मंज़िल पर पहुंचने से पहले सूचना पाएं - मीटर के हिसाब से, ड्राइवर के मंज़िल पर पहुंचने से पहले सूचना पाएं - समय के हिसाब से) दोनों .RemainingTimeOrDistanceChangedListener के ज़रिए उपलब्ध हैं

इस गाइड में, सिर्फ़ RoadSnappedLocationProvider और उसके LocationListener का इस्तेमाल किया गया है.

क्लाइंट-साइड जियोफ़ेंसिंग की सुविधा

अब हम क्लाइंट-साइड जियोफ़ेंसिंग की सुविधा बनाने का तरीका जानेंगे. यहां दिए गए उदाहरण में, Navigation SDK को टर्न-बाय-टर्न मोड में काम करते हुए दिखाया गया है. साथ ही, रास्ते में एक पॉलीगॉन को दिखाया गया है, जो हमारे जियोफ़ेंस को दिखाता है.

फ़ंक्शनल डायग्राम
फ़ंक्शनल डायग्राम

  1. जियोफ़ेंस, BigQuery में सेव किए जाते हैं और आपके बैकएंड से पुल किए जाते हैं.
  2. बैकएंड, समय-समय पर ड्राइव ऐप्लिकेशन को जियोफ़ेंस भेजता है.
  3. ड्राइवर नेविगेट करता है और ड्राइवर ऐप्लिकेशन, ट्रिगर के लिए नियमित रूप से जियोफ़ेंस की जांच करता है.
  4. Driver ऐप्लिकेशन, ट्रिगर इवेंट की सूचना बैकएंड को देता है, ताकि वह कार्रवाई कर सके.

गाड़ी के रास्ते पर चलने के दौरान, ऐप्लिकेशन यह जांच करता रहता है कि पॉलीगॉन का उल्लंघन तो नहीं हुआ है. जब ऐप्लिकेशन को पता चलता है कि वह जियोफ़ेंस से बाहर निकल गया है, तो यूज़र इंटरफ़ेस (यूआई) पर एक मैसेज दिखता है. इसमें लिखा होता है: जियोफ़ेंस का उल्लंघन हुआ.

Android-Maps-Utils के लिए डिपेंडेंसी कॉन्फ़िगर करना

यह समाधान, Android-Maps-Utils का इस्तेमाल करता है. यह एक ओपन-सोर्स लाइब्रेरी है. इसमें ऐसे यूटिलिटी फ़ंक्शन होते हैं जो Google Maps Android API का इस्तेमाल करने वाले कई ऐप्लिकेशन के लिए काम के होते हैं.

यह लाइब्रेरी सार्वजनिक है और इसे 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
}

जगह की जानकारी के अपडेट सुनना

जियोफ़ेंस तय करने के बाद, आपको सिर्फ़ एक लोकेशन अपडेट लिसनर बनाना होगा. इससे 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 का इस्तेमाल किया जा सकता है. इससे यह पता लगाया जा सकता है कि मिली हुई जगह की जानकारी, पहले से तय किए गए पॉलीगॉन के अंदर है या नहीं. नीचे दिए गए उदाहरण में, पहले से तय किए गए पॉलीगॉन का इस्तेमाल किया गया है. यह पॉलीगॉन, जियोफ़ेंस को दिखाता है. हालांकि, असल में आपके पास एक से ज़्यादा पॉलीगॉन हो सकते हैं और आपको लूप की ज़रूरत पड़ सकती है.

अन्य तरीका

इस दस्तावेज़ में, क्लाइंट के लिए उपलब्ध ऐसे ऐप्लिकेशन के बारे में बताया गया है जो कस्टम जियोफ़ेंस (बहुभुज) के उल्लंघन की जांच करता है. हालांकि, कुछ ऐसे मामले हो सकते हैं जिनमें आपको अपने बैकएंड पर इस तरह की जांच करनी पड़ सकती है.

इसका मतलब है कि ऐप्लिकेशन, जगह की जानकारी के अपडेट को बैकएंड को रिपोर्ट करेगा. इसके बाद, यह बैकएंड यह जांच करेगा कि वाहन ने किसी पॉलीगॉन का उल्लंघन किया है या नहीं. इस तरह, पुष्टि करने के लिए क्लाइंट ऐप्लिकेशन पर निर्भर नहीं रहना पड़ेगा.

इस समस्या को ऐसे हल किया जा सकता है:

[Execution Environment] Server side geofencing architecture

जियोफ़ेंसिंग के लिए सर्वर साइड के तरीके को दिखाने वाले आर्किटेक्चर का उदाहरण.

सर्वर-साइड सलूशन
सर्वर-साइड समाधान

  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, काम के इवेंट लिसनर उपलब्ध कराता है. ये लिसनर, यात्रा के दौरान कई अहम पलों का पता लगा सकते हैं. कंपनियों को अक्सर इस्तेमाल के कुछ खास मामलों के लिए, कस्टम जियोफ़ेंस की ज़रूरत होती है. इस दस्तावेज़ में, हमने इसे लागू करने का एक तरीका बताया है. हालांकि, इसे कई तरीकों से लागू किया जा सकता है. हमें यह देखने का इंतज़ार रहेगा कि आपने क्या बनाया है.

अगली कार्रवाइयां

इसके बारे में और पढ़ें: