# जियोफेंस ![इस पाठ का स्केच नोट अवलोकन](../../../../../translated_images/lesson-14.63980c5150ae3c153e770fb71d044c1845dce79248d86bed9fc525adf3ede73c.hi.jpg) > स्केच नोट [नित्या नरसिम्हन](https://github.com/nitya) द्वारा। बड़े संस्करण के लिए छवि पर क्लिक करें। यह वीडियो जियोफेंस और Azure Maps में उनका उपयोग करने के तरीके का अवलोकन देता है, जो इस पाठ में कवर किए जाएंगे: [![Microsoft Developer IoT शो से Azure Maps के साथ जियोफेंसिंग](https://img.youtube.com/vi/nsrgYhaYNVY/0.jpg)](https://www.youtube.com/watch?v=nsrgYhaYNVY) > 🎥 वीडियो देखने के लिए ऊपर दी गई छवि पर क्लिक करें ## पूर्व-पाठ प्रश्नोत्तरी [पूर्व-पाठ प्रश्नोत्तरी](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/27) ## परिचय पिछले 3 पाठों में, आपने IoT का उपयोग करके अपने खेत से प्रसंस्करण केंद्र तक उत्पाद ले जाने वाले ट्रकों का पता लगाया। आपने GPS डेटा कैप्चर किया, इसे क्लाउड में संग्रहीत किया, और इसे मानचित्र पर विज़ुअलाइज़ किया। आपकी आपूर्ति श्रृंखला की दक्षता बढ़ाने का अगला कदम यह है कि जब ट्रक प्रसंस्करण केंद्र के पास पहुंचे, तो आपको एक अलर्ट मिले, ताकि अनलोडिंग के लिए आवश्यक टीम फोर्कलिफ्ट और अन्य उपकरणों के साथ तैयार हो सके। इस तरह वे जल्दी से अनलोड कर सकते हैं, और आपको ट्रक और ड्राइवर के इंतजार के लिए भुगतान नहीं करना पड़ेगा। इस पाठ में आप जियोफेंस के बारे में जानेंगे - परिभाषित भू-स्थानिक क्षेत्र जैसे कि प्रसंस्करण केंद्र के 2 किमी के भीतर का क्षेत्र, और यह जांचने का तरीका कि GPS निर्देशांक जियोफेंस के अंदर हैं या बाहर, ताकि आप देख सकें कि आपका GPS सेंसर किसी क्षेत्र में पहुंचा है या उसे छोड़ा है। इस पाठ में हम कवर करेंगे: * [जियोफेंस क्या हैं](../../../../../3-transport/lessons/4-geofences) * [जियोफेंस को परिभाषित करना](../../../../../3-transport/lessons/4-geofences) * [जियोफेंस के खिलाफ बिंदुओं का परीक्षण करना](../../../../../3-transport/lessons/4-geofences) * [सर्वरलेस कोड से जियोफेंस का उपयोग करना](../../../../../3-transport/lessons/4-geofences) > 🗑 यह इस प्रोजेक्ट का अंतिम पाठ है, इसलिए इस पाठ और असाइनमेंट को पूरा करने के बाद, अपनी क्लाउड सेवाओं को साफ करना न भूलें। असाइनमेंट पूरा करने के लिए आपको सेवाओं की आवश्यकता होगी, इसलिए पहले इसे पूरा करना सुनिश्चित करें। > > यदि आवश्यक हो तो निर्देशों के लिए [अपने प्रोजेक्ट को साफ करने की गाइड](../../../clean-up.md) देखें। ## जियोफेंस क्या हैं जियोफेंस वास्तविक दुनिया के भौगोलिक क्षेत्र के लिए एक आभासी परिधि है। जियोफेंस सर्कल हो सकते हैं, जो एक बिंदु और त्रिज्या के रूप में परिभाषित होते हैं (उदाहरण के लिए, किसी इमारत के चारों ओर 100 मीटर चौड़ा सर्कल), या एक बहुभुज जो किसी क्षेत्र को कवर करता है, जैसे स्कूल ज़ोन, शहर की सीमाएँ, या विश्वविद्यालय या कार्यालय परिसर। ![Microsoft कंपनी स्टोर के चारों ओर एक सर्कुलर जियोफेंस और Microsoft वेस्ट कैंपस के चारों ओर एक बहुभुज जियोफेंस के कुछ उदाहरण](../../../../../translated_images/geofence-examples.172fbc534665769f6e1a1ddcf75e3b25183cd10354c80cc603ba44b635390e1a.hi.png) > 💁 आपने पहले से ही जियोफेंस का उपयोग किया हो सकता है, बिना इसे जाने। यदि आपने iOS रिमाइंडर्स ऐप या Google Keep में किसी स्थान के आधार पर रिमाइंडर सेट किया है, तो आपने जियोफेंस का उपयोग किया है। ये ऐप्स दिए गए स्थान के आधार पर जियोफेंस सेट करेंगे और जब आपका फोन जियोफेंस में प्रवेश करेगा तो आपको अलर्ट करेंगे। ऐसे कई कारण हैं जिनकी वजह से आप यह जानना चाहेंगे कि कोई वाहन जियोफेंस के अंदर है या बाहर: * **अनलोडिंग की तैयारी** - साइट पर वाहन के पहुंचने की सूचना मिलने से टीम अनलोडिंग के लिए तैयार हो सकती है, जिससे वाहन के इंतजार का समय कम हो जाता है। इससे ड्राइवर कम समय में अधिक डिलीवरी कर सकता है। * **कर अनुपालन** - कुछ देश, जैसे न्यूज़ीलैंड, सार्वजनिक सड़कों पर डीजल वाहनों के वजन के आधार पर रोड टैक्स लगाते हैं। जियोफेंस का उपयोग करके आप सार्वजनिक और निजी सड़कों पर तय की गई दूरी को ट्रैक कर सकते हैं। * **चोरी की निगरानी** - यदि कोई वाहन केवल एक निश्चित क्षेत्र में रहना चाहिए, जैसे कि खेत पर, और वह जियोफेंस छोड़ देता है, तो यह चोरी हो सकता है। * **स्थान अनुपालन** - कार्य स्थल, खेत या फैक्ट्री के कुछ हिस्से कुछ वाहनों के लिए प्रतिबंधित हो सकते हैं, जैसे कि कृत्रिम उर्वरक और कीटनाशक ले जाने वाले वाहनों को जैविक उत्पाद उगाने वाले क्षेत्रों से दूर रखना। यदि जियोफेंस में प्रवेश किया जाता है, तो वाहन अनुपालन से बाहर है और ड्राइवर को सूचित किया जा सकता है। ✅ क्या आप जियोफेंस के अन्य उपयोगों के बारे में सोच सकते हैं? Azure Maps, जिसे आपने पिछले पाठ में GPS डेटा को विज़ुअलाइज़ करने के लिए उपयोग किया था, आपको जियोफेंस को परिभाषित करने और फिर यह जांचने की अनुमति देता है कि कोई बिंदु जियोफेंस के अंदर है या बाहर। ## जियोफेंस को परिभाषित करना जियोफेंस को GeoJSON का उपयोग करके परिभाषित किया जाता है, जैसे पिछले पाठ में मानचित्र में जोड़े गए बिंदु। इस मामले में, `Point` मानों के `FeatureCollection` के बजाय, यह `Polygon` वाले `FeatureCollection` को शामिल करता है। ```json { "type": "FeatureCollection", "features": [ { "type": "Feature", "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.13393688201903, 47.63829579223815 ], [ -122.13389128446579, 47.63782047131512 ], [ -122.13240802288054, 47.63783312249837 ], [ -122.13238388299942, 47.63829037035086 ], [ -122.13393688201903, 47.63829579223815 ] ] ] }, "properties": { "geometryId": "1" } } ] } ``` बहुभुज पर प्रत्येक बिंदु को एक सरणी में देशांतर और अक्षांश जोड़ी के रूप में परिभाषित किया जाता है, और ये बिंदु एक सरणी में होते हैं जिसे `coordinates` के रूप में सेट किया जाता है। पिछले पाठ में `Point` के लिए, `coordinates` एक सरणी थी जिसमें 2 मान होते थे, अक्षांश और देशांतर। `Polygon` के लिए, यह 2 मानों (देशांतर, अक्षांश) वाली सरणियों की एक सरणी है। > 💁 याद रखें, GeoJSON बिंदुओं के लिए `देशांतर, अक्षांश` का उपयोग करता है, न कि `अक्षांश, देशांतर` का। बहुभुज निर्देशांक सरणी में हमेशा बहुभुज पर बिंदुओं की संख्या से 1 अधिक प्रविष्टि होती है, जिसमें अंतिम प्रविष्टि पहले के समान होती है, जो बहुभुज को बंद करती है। उदाहरण के लिए, एक आयत के लिए 5 बिंदु होंगे। ![निर्देशांक के साथ एक आयत](../../../../../translated_images/polygon-points.302193da381cb415f46c2c7a98496ee4be05d6c73d21238a89721ad93e121233.hi.png) ऊपर दी गई छवि में, एक आयत है। बहुभुज निर्देशांक शीर्ष-बाएँ 47,-122 से शुरू होता है, फिर दाएँ 47,-121 तक जाता है, फिर नीचे 46,-121 तक, फिर बाएँ 46,-122 तक, फिर शीर्ष-बाएँ पर वापस जाता है। इससे बहुभुज में 5 बिंदु होते हैं - शीर्ष-बाएँ, शीर्ष-दाएँ, नीचे-दाएँ, नीचे-बाएँ, फिर इसे बंद करने के लिए शीर्ष-बाएँ। ✅ अपने घर या स्कूल के चारों ओर एक GeoJSON बहुभुज बनाने का प्रयास करें। [GeoJSON.io](https://geojson.io/) जैसे टूल का उपयोग करें। ### कार्य - जियोफेंस को परिभाषित करें Azure Maps में जियोफेंस का उपयोग करने के लिए, पहले इसे आपके Azure Maps खाते में अपलोड करना होगा। अपलोड करने के बाद, आपको एक अद्वितीय ID प्राप्त होगी जिसका उपयोग आप जियोफेंस के खिलाफ बिंदु का परीक्षण करने के लिए कर सकते हैं। Azure Maps में जियोफेंस अपलोड करने के लिए, आपको मैप्स वेब API का उपयोग करना होगा। आप [curl](https://curl.se) नामक टूल का उपयोग करके Azure Maps वेब API को कॉल कर सकते हैं। > 🎓 Curl एक कमांड लाइन टूल है जो वेब एंडपॉइंट्स के खिलाफ अनुरोध करता है। 1. यदि आप Linux, macOS, या Windows 10 के हाल के संस्करण का उपयोग कर रहे हैं, तो संभवतः आपके पास पहले से ही curl इंस्टॉल है। इसे जांचने के लिए अपने टर्मिनल या कमांड लाइन से निम्नलिखित चलाएँ: ```sh curl --version ``` यदि आपको curl के लिए संस्करण जानकारी नहीं दिखती है, तो आपको इसे [curl डाउनलोड पृष्ठ](https://curl.se/download.html) से इंस्टॉल करना होगा। > 💁 यदि आप Postman के साथ अनुभव रखते हैं, तो आप इसे पसंद करते हैं तो इसका उपयोग कर सकते हैं। 1. एक GeoJSON फ़ाइल बनाएं जिसमें एक बहुभुज हो। आप इसे अपने GPS सेंसर का उपयोग करके परीक्षण करेंगे, इसलिए अपने वर्तमान स्थान के चारों ओर एक बहुभुज बनाएं। आप इसे मैन्युअल रूप से ऊपर दिए गए GeoJSON उदाहरण को संपादित करके बना सकते हैं, या [GeoJSON.io](https://geojson.io/) जैसे टूल का उपयोग कर सकते हैं। GeoJSON में एक `FeatureCollection` होना चाहिए, जिसमें `geometry` प्रकार `Polygon` के साथ एक `Feature` हो। आपको **ज़रूर** `geometry` तत्व के समान स्तर पर एक `properties` तत्व जोड़ना होगा, और इसमें एक `geometryId` होना चाहिए: ```json "properties": { "geometryId": "1" } ``` यदि आप [GeoJSON.io](https://geojson.io/) का उपयोग करते हैं, तो आपको इस आइटम को खाली `properties` तत्व में मैन्युअल रूप से जोड़ना होगा, या तो JSON फ़ाइल डाउनलोड करने के बाद, या ऐप में JSON संपादक में। यह `geometryId` इस फ़ाइल में अद्वितीय होना चाहिए। आप एक ही GeoJSON फ़ाइल में `FeatureCollection` में कई `Features` के रूप में कई जियोफेंस अपलोड कर सकते हैं, जब तक कि प्रत्येक का `geometryId` अलग हो। यदि वे अलग-अलग समय पर अलग-अलग फ़ाइलों से अपलोड किए गए हैं, तो बहुभुजों का `geometryId` समान हो सकता है। 1. इस फ़ाइल को `geofence.json` के रूप में सहेजें, और इसे अपने टर्मिनल या कंसोल में सहेजे गए स्थान पर नेविगेट करें। 1. GeoFence बनाने के लिए निम्नलिखित curl कमांड चलाएँ: ```sh curl --request POST 'https://atlas.microsoft.com/mapData/upload?api-version=1.0&dataFormat=geojson&subscription-key=' \ --header 'Content-Type: application/json' \ --include \ --data @geofence.json ``` URL में `` को अपने Azure Maps खाते के API कुंजी से बदलें। URL का उपयोग `https://atlas.microsoft.com/mapData/upload` API के माध्यम से मानचित्र डेटा अपलोड करने के लिए किया जाता है। कॉल में `api-version` पैरामीटर शामिल है जो यह निर्दिष्ट करता है कि Azure Maps API का कौन सा संस्करण उपयोग करना है। अपलोड किया गया डेटा प्रारूप `geojson` के रूप में सेट है। यह POST अनुरोध को अपलोड API पर चलाएगा और प्रतिक्रिया हेडर की एक सूची लौटाएगा जिसमें `location` नामक एक हेडर शामिल है: ```output content-type: application/json location: https://us.atlas.microsoft.com/mapData/operations/1560ced6-3a80-46f2-84b2-5b1531820eab?api-version=1.0 x-ms-azuremaps-region: West US 2 x-content-type-options: nosniff strict-transport-security: max-age=31536000; includeSubDomains x-cache: CONFIG_NOCACHE date: Sat, 22 May 2021 21:34:57 GMT content-length: 0 ``` > 🎓 जब किसी वेब एंडपॉइंट को कॉल करते हैं, तो आप कॉल में पैरामीटर पास कर सकते हैं `?` जोड़कर, उसके बाद `key=value` के रूप में कुंजी-मूल्य जोड़े, और कुंजी-मूल्य जोड़े को `&` से अलग कर सकते हैं। 1. Azure Maps इसे तुरंत प्रोसेस नहीं करता है, इसलिए आपको यह जांचने की आवश्यकता होगी कि अपलोड अनुरोध समाप्त हुआ है या नहीं। `location` हेडर में दिए गए URL का उपयोग करके GET अनुरोध करें। आपको अपने Azure Maps खाते के API कुंजी को URL के अंत में जोड़ना होगा, `&subscription-key=` जोड़कर, `` को अपनी API कुंजी से बदलें। निम्नलिखित कमांड चलाएँ: ```sh curl --request GET '&subscription-key=' ``` `` को `location` हेडर के मान से बदलें, और `` को अपने Azure Maps खाते के API कुंजी से बदलें। 1. प्रतिक्रिया में `status` के मान की जांच करें। यदि यह `Succeeded` नहीं है, तो एक मिनट प्रतीक्षा करें और फिर से प्रयास करें। 1. एक बार जब स्थिति `Succeeded` के रूप में वापस आ जाए, तो प्रतिक्रिया से `resourceLocation` देखें। इसमें GeoJSON ऑब्जेक्ट के लिए अद्वितीय ID (UDID) का विवरण होता है। UDID वह मान है जो `metadata/` के बाद आता है, और `api-version` को शामिल नहीं करता। उदाहरण के लिए, यदि `resourceLocation` था: ```json { "resourceLocation": "https://us.atlas.microsoft.com/mapData/metadata/7c3776eb-da87-4c52-ae83-caadf980323a?api-version=1.0" } ``` तो UDID होगा `7c3776eb-da87-4c52-ae83-caadf980323a`। इस UDID की एक प्रति रखें क्योंकि आपको जियोफेंस का परीक्षण करने के लिए इसकी आवश्यकता होगी। ## जियोफेंस के खिलाफ बिंदुओं का परीक्षण करना एक बार जब बहुभुज Azure Maps में अपलोड हो जाता है, तो आप यह जांचने के लिए एक वेब API अनुरोध कर सकते हैं कि कोई बिंदु जियोफेंस के अंदर है या बाहर। आप इस अनुरोध में जियोफेंस के UDID और परीक्षण किए जाने वाले बिंदु के अक्षांश और देशांतर को पास करते हैं। जब आप यह अनुरोध करते हैं, तो आप `searchBuffer` नामक एक मान भी पास कर सकते हैं। यह Maps API को बताता है कि परिणाम लौटाते समय कितनी सटीकता होनी चाहिए। इसका कारण यह है कि GPS पूरी तरह से सटीक नहीं है, और कभी-कभी स्थान मीटर या उससे अधिक तक गलत हो सकते हैं। डिफ़ॉल्ट रूप से सर्च बफर 50 मीटर है, लेकिन आप इसे 0 मीटर से 500 मीटर तक सेट कर सकते हैं। API कॉल से परिणाम लौटाए जाने पर, परिणाम का एक हिस्सा `distance` होता है, जो जियोफेंस के किनारे के सबसे नजदीकी बिंदु तक की दूरी को मापता है। यदि बिंदु जियोफेंस के बाहर है तो यह मान सकारात्मक होता है, और यदि यह अंदर है तो नकारात्मक। यदि यह दूरी सर्च बफर से कम है, तो वास्तविक दूरी मीटर में लौटाई जाती है, अन्यथा मान 999 या -999 होता है। 999 का मतलब है कि बिंदु जियोफेंस से सर्च बफर से अधिक बाहर है, और -999 का मतलब है कि यह सर्च बफर से अधिक अंदर है। ![50 मीटर सर्च बफर के साथ एक जियोफेंस](../../../../../translated_images/search-buffer-and-distance.e6a79af3898183c7b2ef6fbf12271b8b34afd23969bb946962b1b18d3d2635e8.hi.png) ऊपर दी गई छवि में, जियोफेंस में 50 मीटर का सर्च बफर है। * जियोफेंस के केंद्र में एक बिंदु, जो सर्च बफर के अंदर है, की दूरी **-999** है। * सर्च बफर से बाहर एक बिंदु की दूरी **999** है। * जियोफेंस के अंदर और सर्च बफर के अंदर एक बिंदु, जो जियोफेंस से 6 मीटर दूर है, की दूरी **6 मीटर** है। * जियोफेंस के बाहर और सर्च बफर के अंदर एक बिंदु, जो जियोफेंस से 39 मीटर दूर है, की दूरी **39 मीटर** है। जियोफेंस के किनारे तक की दूरी जानना महत्वपूर्ण है, और वाहन के स्थान के आधार पर निर्णय लेते समय अन्य जानकारी जैसे GPS रीडिंग, गति और सड़क डेटा के साथ इसे संयोजित करना आवश्यक है। उदाहरण के लिए, कल्पना करें कि GPS रीडिंग दिखाती है कि एक वाहन एक सड़क पर चल रहा था जो अंततः जियोफेंस के पास जाती है। यदि एक GPS मान गलत है और वाहन को जियोफेंस के अंदर रखता है, जबकि वहां कोई वाहन पहुंच नहीं है, तो इसे अनदेखा किया जा सकता है। ![GPS ट्रेल दिखा रहा है कि एक वाहन Microsoft कैंपस के पास 520 पर गुजर रहा है, जिसमें सड़क के साथ GPS रीडिंग हैं, सिवाय एक के जो कैंपस पर है, जियोफेंस के अंदर](../../../../../translated_images/geofence-crossing-inaccurate-gps.6a3ed911202ad9cabb66d3964888cec03a42c61d5b8f536ad5bdc99716b370f5.hi.png) ऊपर दी गई छवि में, Microsoft कैंपस के एक हिस्से पर एक जियोफेंस है। लाल रेखा एक ट्रक को 520 के साथ चलते हुए दिखाती है, जिसमें GPS रीडिंग्स को दिखाने के लिए वृत्त हैं। इनमें से अधिकांश सटीक हैं और 520 के साथ हैं, लेकिन एक गलत रीडिंग जियोफेंस के अंदर है। यह रीडिंग सही नहीं हो सकती - ट्रक के लिए 520 से अचानक कैंपस में मुड़ने और फिर वापस 520 पर जाने का कोई रास्ता नहीं है। जियोफेंस की जांच करने वाला कोड परिणामों पर कार्रवाई करने से पहले पिछली रीडिंग्स को ध्यान में रखना होगा। ✅ GPS रीडिंग को सही मानने के लिए आपको कौन सा अतिरिक्त डेटा जांचने की आवश्यकता होगी? ### कार्य - जियोफेंस के खिलाफ पॉइंट्स का परीक्षण करें 1. वेब API क्वेरी के लिए URL बनाकर शुरू करें। इसका प्रारूप है: ```output https://atlas.microsoft.com/spatial/geofence/json?api-version=1.0&deviceId=gps-sensor&subscription-key=&udid=&lat=&lon= ``` `` को अपने Azure Maps खाते के API कुंजी से बदलें। `` को पिछले कार्य से जियोफेंस के UDID से बदलें। `` और `` को उस अक्षांश और देशांतर से बदलें जिसे आप परीक्षण करना चाहते हैं। यह URL `https://atlas.microsoft.com/spatial/geofence/json` API का उपयोग करता है, जो GeoJSON का उपयोग करके परिभाषित जियोफेंस को क्वेरी करता है। यह `1.0` API संस्करण को लक्षित करता है। `deviceId` पैरामीटर आवश्यक है और इसे उस डिवाइस का नाम होना चाहिए जिससे अक्षांश और देशांतर आता है। डिफ़ॉल्ट सर्च बफर 50 मीटर है, और आप इसे `searchBuffer=` नामक एक अतिरिक्त पैरामीटर पास करके बदल सकते हैं, `` को मीटर में सर्च बफर दूरी पर सेट कर सकते हैं, 0 से 500 तक। 1. इस URL पर GET अनुरोध करने के लिए curl का उपयोग करें: ```sh curl --request GET '' ``` > 💁 यदि आपको `BadRequest` प्रतिक्रिया कोड मिलता है, जिसमें यह त्रुटि है: > > ```output > Invalid GeoJSON: All feature properties should contain a geometryId, which is used for identifying the geofence. > ``` > > तो आपका GeoJSON `properties` सेक्शन में `geometryId` के बिना है। आपको अपना GeoJSON ठीक करना होगा, फिर ऊपर दिए गए चरणों को दोहराकर इसे फिर से अपलोड करना होगा और नया UDID प्राप्त करना होगा। 1. प्रतिक्रिया में `geometries` की एक सूची होगी, प्रत्येक बहुभुज के लिए एक जो GeoJSON का उपयोग करके जियोफेंस बनाने के लिए परिभाषित किया गया है। प्रत्येक ज्यामिति में 3 महत्वपूर्ण फ़ील्ड होते हैं: `distance`, `nearestLat` और `nearestLon`। ```output { "geometries": [ { "deviceId": "gps-sensor", "udId": "7c3776eb-da87-4c52-ae83-caadf980323a", "geometryId": "1", "distance": 999.0, "nearestLat": 47.645875, "nearestLon": -122.142713 } ], "expiredGeofenceGeometryId": [], "invalidPeriodGeofenceGeometryId": [] } ``` * `nearestLat` और `nearestLon` जियोफेंस के किनारे पर एक बिंदु के अक्षांश और देशांतर हैं जो परीक्षण किए जा रहे स्थान के सबसे करीब है। * `distance` परीक्षण किए जा रहे स्थान से जियोफेंस के किनारे के सबसे करीब बिंदु तक की दूरी है। नकारात्मक संख्या जियोफेंस के अंदर, सकारात्मक बाहर। यह मान 50 (डिफ़ॉल्ट सर्च बफर) से कम होगा, या 999। 1. जियोफेंस के अंदर और बाहर स्थानों के साथ इसे कई बार दोहराएं। ## सर्वरलेस कोड से जियोफेंस का उपयोग करें अब आप अपने Functions ऐप में एक नया ट्रिगर जोड़ सकते हैं ताकि IoT Hub GPS इवेंट डेटा को जियोफेंस के खिलाफ परीक्षण किया जा सके। ### कंज्यूमर ग्रुप्स जैसा कि आपने पिछले पाठों में देखा है, IoT Hub आपको हब द्वारा प्राप्त किए गए लेकिन संसाधित नहीं किए गए इवेंट्स को फिर से चलाने की अनुमति देगा। लेकिन अगर कई ट्रिगर जुड़े हों तो क्या होगा? यह कैसे जान पाएगा कि किसने कौन से इवेंट्स को संसाधित किया है? उत्तर है कि यह नहीं जान सकता! इसके बजाय आप इवेंट्स को पढ़ने के लिए कई अलग-अलग कनेक्शन परिभाषित कर सकते हैं, और प्रत्येक अप्रयुक्त संदेशों के पुन:प्ले का प्रबंधन कर सकता है। इन्हें *कंज्यूमर ग्रुप्स* कहा जाता है। जब आप एंडपॉइंट से कनेक्ट करते हैं, तो आप निर्दिष्ट कर सकते हैं कि आप किस कंज्यूमर ग्रुप से कनेक्ट करना चाहते हैं। आपके एप्लिकेशन का प्रत्येक घटक एक अलग कंज्यूमर ग्रुप से कनेक्ट होगा। ![एक IoT Hub जिसमें 3 कंज्यूमर ग्रुप्स एक ही संदेशों को 3 अलग-अलग Functions ऐप्स में वितरित कर रहे हैं](../../../../../translated_images/consumer-groups.a3262e26fc27ba2092863678ad57af15c7223416e388a23f330c058cf4358630.hi.png) सिद्धांत रूप में प्रत्येक कंज्यूमर ग्रुप से 5 एप्लिकेशन तक कनेक्ट हो सकते हैं, और वे सभी संदेश प्राप्त करेंगे जब वे आएंगे। यह सुनिश्चित करने के लिए कि सभी कतारबद्ध संदेश सही ढंग से संसाधित किए गए हैं, प्रत्येक कंज्यूमर ग्रुप तक केवल एक एप्लिकेशन की पहुंच होना सबसे अच्छा अभ्यास है। उदाहरण के लिए, यदि आपने अपने Functions ऐप को लोकली लॉन्च किया और इसे क्लाउड में भी चलाया, तो वे दोनों संदेशों को संसाधित करेंगे, जिससे स्टोरेज अकाउंट में डुप्लिकेट ब्लॉब्स संग्रहीत होंगे। यदि आप पहले बनाए गए IoT Hub ट्रिगर के `function.json` फ़ाइल की समीक्षा करते हैं, तो आप इवेंट हब ट्रिगर बाइंडिंग सेक्शन में कंज्यूमर ग्रुप देखेंगे: ```json "consumerGroup": "$Default" ``` जब आप IoT Hub बनाते हैं, तो आपको डिफ़ॉल्ट रूप से `$Default` कंज्यूमर ग्रुप मिलता है। यदि आप एक अतिरिक्त ट्रिगर जोड़ना चाहते हैं, तो आप इसे एक नए कंज्यूमर ग्रुप का उपयोग करके जोड़ सकते हैं। > 💁 इस पाठ में, आप GPS डेटा को स्टोर करने के लिए उपयोग किए गए फ़ंक्शन से अलग जियोफेंस का परीक्षण करने के लिए एक अलग फ़ंक्शन का उपयोग करेंगे। यह दिखाने के लिए कि कंज्यूमर ग्रुप्स का उपयोग कैसे करें और कोड को अलग करें ताकि इसे पढ़ना और समझना आसान हो। एक प्रोडक्शन एप्लिकेशन में आप इसे कई तरीकों से आर्किटेक्ट कर सकते हैं - दोनों को एक फ़ंक्शन पर रखना, स्टोरेज अकाउंट पर एक ट्रिगर का उपयोग करके जियोफेंस की जांच करने के लिए एक फ़ंक्शन चलाना, या कई फ़ंक्शंस का उपयोग करना। कोई 'सही तरीका' नहीं है, यह आपके एप्लिकेशन और आपकी आवश्यकताओं पर निर्भर करता है। ### कार्य - एक नया कंज्यूमर ग्रुप बनाएं 1. अपने IoT Hub के लिए `geofence` नामक एक नया कंज्यूमर ग्रुप बनाने के लिए निम्नलिखित कमांड चलाएं: ```sh az iot hub consumer-group create --name geofence \ --hub-name ``` `` को उस नाम से बदलें जिसे आपने अपने IoT Hub के लिए उपयोग किया था। 1. यदि आप IoT Hub के लिए सभी कंज्यूमर ग्रुप्स देखना चाहते हैं, तो निम्नलिखित कमांड चलाएं: ```sh az iot hub consumer-group list --output table \ --hub-name ``` `` को उस नाम से बदलें जिसे आपने अपने IoT Hub के लिए उपयोग किया था। यह सभी कंज्यूमर ग्रुप्स को सूचीबद्ध करेगा। ```output Name ResourceGroup -------- --------------- $Default gps-sensor geofence gps-sensor ``` > 💁 जब आपने पिछले पाठ में IoT Hub इवेंट मॉनिटर चलाया था, तो यह `$Default` कंज्यूमर ग्रुप से जुड़ा था। यही कारण था कि आप इवेंट मॉनिटर और इवेंट ट्रिगर को एक साथ नहीं चला सकते। यदि आप दोनों को चलाना चाहते हैं, तो आप अपने सभी फ़ंक्शन ऐप्स के लिए अन्य कंज्यूमर ग्रुप्स का उपयोग कर सकते हैं और `$Default` को इवेंट मॉनिटर के लिए रख सकते हैं। ### कार्य - एक नया IoT Hub ट्रिगर बनाएं 1. अपने `gps-trigger` फ़ंक्शन ऐप में एक नया IoT Hub इवेंट ट्रिगर जोड़ें जिसे आपने पिछले पाठ में बनाया था। इस फ़ंक्शन को `geofence-trigger` कहें। > ⚠️ यदि आवश्यक हो तो [प्रोजेक्ट 2, पाठ 5 से IoT Hub इवेंट ट्रिगर बनाने के निर्देशों का संदर्भ लें](../../../2-farm/lessons/5-migrate-application-to-the-cloud/README.md#create-an-iot-hub-event-trigger)। 1. `function.json` फ़ाइल में IoT Hub कनेक्शन स्ट्रिंग को कॉन्फ़िगर करें। `local.settings.json` सभी ट्रिगर्स के बीच साझा किया जाता है। 1. `function.json` फ़ाइल में `consumerGroup` के मान को नए `geofence` कंज्यूमर ग्रुप का संदर्भ देने के लिए अपडेट करें: ```json "consumerGroup": "geofence" ``` 1. आपको इस ट्रिगर में अपने Azure Maps खाते के लिए सब्सक्रिप्शन कुंजी का उपयोग करना होगा, इसलिए `local.settings.json` फ़ाइल में `MAPS_KEY` नामक एक नया प्रविष्टि जोड़ें। 1. सुनिश्चित करें कि यह संदेशों को कनेक्ट और संसाधित कर रहा है। पहले पाठ से `iot-hub-trigger` भी चलेगा और स्टोरेज में ब्लॉब्स अपलोड करेगा। > ब्लॉब स्टोरेज में डुप्लिकेट GPS रीडिंग्स से बचने के लिए, आप क्लाउड में चल रहे Functions ऐप को रोक सकते हैं। ऐसा करने के लिए, निम्नलिखित कमांड का उपयोग करें: > > ```sh > az functionapp stop --resource-group gps-sensor \ > --name > ``` > > `` को उस नाम से बदलें जिसे आपने अपने Functions ऐप के लिए उपयोग किया था। > > आप इसे बाद में निम्नलिखित कमांड के साथ पुनः प्रारंभ कर सकते हैं: > > ```sh > az functionapp start --resource-group gps-sensor \ > --name > ``` > > `` को उस नाम से बदलें जिसे आपने अपने Functions ऐप के लिए उपयोग किया था। ### कार्य - ट्रिगर से जियोफेंस का परीक्षण करें इससे पहले इस पाठ में आपने जियोफेंस को क्वेरी करने के लिए curl का उपयोग किया था ताकि यह देखा जा सके कि कोई बिंदु अंदर या बाहर स्थित है। आप अपने ट्रिगर के अंदर से इसी तरह का वेब अनुरोध कर सकते हैं। 1. जियोफेंस को क्वेरी करने के लिए, आपको इसका UDID चाहिए। `local.settings.json` फ़ाइल में `GEOFENCE_UDID` नामक एक नया प्रविष्टि जोड़ें। 1. नए `geofence-trigger` ट्रिगर से `__init__.py` फ़ाइल खोलें। 1. फ़ाइल के शीर्ष पर निम्नलिखित आयात जोड़ें: ```python import json import os import requests ``` `requests` पैकेज आपको वेब API कॉल करने की अनुमति देता है। Azure Maps में Python SDK नहीं है, आपको इसे Python कोड से उपयोग करने के लिए वेब API कॉल करने की आवश्यकता है। 1. `main` विधि की शुरुआत में निम्नलिखित 2 पंक्तियाँ जोड़ें ताकि Maps सब्सक्रिप्शन कुंजी प्राप्त हो सके: ```python maps_key = os.environ['MAPS_KEY'] geofence_udid = os.environ['GEOFENCE_UDID'] ``` 1. `for event in events` लूप के अंदर, प्रत्येक इवेंट से अक्षांश और देशांतर प्राप्त करने के लिए निम्नलिखित जोड़ें: ```python event_body = json.loads(event.get_body().decode('utf-8')) lat = event_body['gps']['lat'] lon = event_body['gps']['lon'] ``` यह कोड इवेंट बॉडी से JSON को एक डिक्शनरी में परिवर्तित करता है, फिर `gps` फ़ील्ड से `lat` और `lon` निकालता है। 1. `requests` का उपयोग करते समय, curl के साथ लंबे URL बनाने के बजाय, आप केवल URL भाग का उपयोग कर सकते हैं और पैरामीटर को एक डिक्शनरी के रूप में पास कर सकते हैं। कॉल करने के लिए URL को परिभाषित करने और पैरामीटर को कॉन्फ़िगर करने के लिए निम्नलिखित कोड जोड़ें: ```python url = 'https://atlas.microsoft.com/spatial/geofence/json' params = { 'api-version': 1.0, 'deviceId': 'gps-sensor', 'subscription-key': maps_key, 'udid' : geofence_udid, 'lat' : lat, 'lon' : lon } ``` `params` डिक्शनरी में आइटम वे कुंजी-मूल्य जोड़े से मेल खाएंगे जिन्हें आपने वेब API को curl के माध्यम से कॉल करते समय उपयोग किया था। 1. वेब API को कॉल करने के लिए निम्नलिखित पंक्तियाँ कोड में जोड़ें: ```python response = requests.get(url, params=params) response_body = json.loads(response.text) ``` यह URL को पैरामीटर के साथ कॉल करता है, और एक प्रतिक्रिया ऑब्जेक्ट प्राप्त करता है। 1. इसके नीचे निम्नलिखित कोड जोड़ें: ```python distance = response_body['geometries'][0]['distance'] if distance == 999: logging.info('Point is outside geofence') elif distance > 0: logging.info(f'Point is just outside geofence by a distance of {distance}m') elif distance == -999: logging.info(f'Point is inside geofence') else: logging.info(f'Point is just inside geofence by a distance of {distance}m') ``` यह कोड 1 ज्यामिति मानता है, और उस एकल ज्यामिति से दूरी निकालता है। फिर यह दूरी के आधार पर विभिन्न संदेशों को लॉग करता है। 1. इस कोड को चलाएं। आप लॉगिंग आउटपुट में देखेंगे कि GPS निर्देशांक जियोफेंस के अंदर हैं या बाहर, और यदि बिंदु 50 मीटर के भीतर है तो दूरी। इस कोड को अपने GPS सेंसर के स्थान के आधार पर विभिन्न जियोफेंस के साथ आज़माएं, सेंसर को स्थानांतरित करने का प्रयास करें (उदाहरण के लिए मोबाइल फोन से वाईफाई से जुड़े हुए, या वर्चुअल IoT डिवाइस पर विभिन्न निर्देशांक के साथ) ताकि यह परिवर्तन देख सके। 1. जब आप तैयार हों, तो इस कोड को क्लाउड में अपने Functions ऐप पर तैनात करें। नई एप्लिकेशन सेटिंग्स को तैनात करना न भूलें। > ⚠️ यदि आवश्यक हो तो [प्रोजेक्ट 2, पाठ 5 से एप्लिकेशन सेटिंग्स अपलोड करने के निर्देशों का संदर्भ लें](../../../2-farm/lessons/5-migrate-application-to-the-cloud/README.md#task---upload-your-application-settings)। > ⚠️ यदि आवश्यक हो तो [प्रोजेक्ट 2, पाठ 5 से अपने Functions ऐप को क्लाउड में तैनात करने के निर्देशों का संदर्भ लें](../../../2-farm/lessons/5-migrate-application-to-the-cloud/README.md#task---deploy-your-functions-app-to-the-cloud)। > 💁 आप इस कोड को [code/functions](../../../../../3-transport/lessons/4-geofences/code/functions) फ़ोल्डर में पा सकते हैं। --- ## 🚀 चुनौती इस पाठ में आपने एक बहुभुज के साथ एक GeoJSON फ़ाइल का उपयोग करके एक जियोफेंस जोड़ा। आप एक ही समय में कई बहुभुज अपलोड कर सकते हैं, जब तक कि उनके पास `properties` सेक्शन में अलग-अलग `geometryId` मान हों। एक GeoJSON फ़ाइल के साथ कई बहुभुज अपलोड करने का प्रयास करें और अपने कोड को समायोजित करें ताकि यह पता लगाया जा सके कि GPS निर्देशांक किस बहुभुज के सबसे करीब हैं या उसमें हैं। ## पोस्ट-लेक्चर क्विज़ [पोस्ट-लेक्चर क्विज़](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/28) ## समीक्षा और स्व-अध्ययन * जियोफेंस और उनके कुछ उपयोग मामलों के बारे में अधिक पढ़ें [विकिपीडिया पर जियोफेंसिंग पेज](https://en.wikipedia.org/wiki/Geo-fence) पर। * Azure Maps जियोफेंसिंग API के बारे में अधिक पढ़ें [Microsoft Azure Maps Spatial - Get Geofence दस्तावेज़](https://docs.microsoft.com/rest/api/maps/spatial/getgeofence?WT.mc_id=academic-17441-jabenn) पर। * कंज्यूमर ग्रुप्स के बारे में अधिक पढ़ें [Microsoft Docs पर Azure Event Hubs में फीचर्स और टर्मिनोलॉजी - इवेंट कंज्यूमर्स दस्तावेज़](https://docs.microsoft.com/azure/event-hubs/event-hubs-features?WT.mc_id=academic-17441-jabenn#event-consumers) पर। ## असाइनमेंट [Twilio का उपयोग करके सूचनाएं भेजें](assignment.md) **अस्वीकरण**: यह दस्तावेज़ AI अनुवाद सेवा [Co-op Translator](https://github.com/Azure/co-op-translator) का उपयोग करके अनुवादित किया गया है। जबकि हम सटीकता सुनिश्चित करने का प्रयास करते हैं, कृपया ध्यान दें कि स्वचालित अनुवाद में त्रुटियां या अशुद्धियां हो सकती हैं। मूल भाषा में उपलब्ध मूल दस्तावेज़ को प्रामाणिक स्रोत माना जाना चाहिए। महत्वपूर्ण जानकारी के लिए, पेशेवर मानव अनुवाद की सिफारिश की जाती है। इस अनुवाद के उपयोग से उत्पन्न किसी भी गलतफहमी या गलत व्याख्या के लिए हम उत्तरदायी नहीं हैं।