|
4 weeks ago | |
---|---|---|
.. | ||
README.md | 4 weeks ago | |
assignment.md | 4 weeks ago |
README.md
Γεωφράγματα
Σκίτσο από τη Nitya Narasimhan. Κάντε κλικ στην εικόνα για μεγαλύτερη έκδοση.
Αυτό το βίντεο παρέχει μια επισκόπηση των γεωφραγμάτων και πώς να τα χρησιμοποιήσετε στους Azure Maps, θέματα που θα καλυφθούν σε αυτή την ενότητα:
🎥 Κάντε κλικ στην παραπάνω εικόνα για να παρακολουθήσετε το βίντεο
Ερωτηματολόγιο πριν την ενότητα
Ερωτηματολόγιο πριν την ενότητα
Εισαγωγή
Στα τελευταία 3 μαθήματα, χρησιμοποιήσατε IoT για να εντοπίσετε τα φορτηγά που μεταφέρουν τα προϊόντα σας από τη φάρμα σας σε έναν κόμβο επεξεργασίας. Καταγράψατε δεδομένα GPS, τα στείλατε στο cloud για αποθήκευση και τα οπτικοποιήσατε σε έναν χάρτη. Το επόμενο βήμα για την αύξηση της αποτελεσματικότητας της εφοδιαστικής σας αλυσίδας είναι να λαμβάνετε ειδοποίηση όταν ένα φορτηγό πρόκειται να φτάσει στον κόμβο επεξεργασίας, ώστε το προσωπικό που χρειάζεται για την εκφόρτωση να είναι έτοιμο με περονοφόρα και άλλο εξοπλισμό μόλις φτάσει το όχημα. Με αυτόν τον τρόπο, η εκφόρτωση γίνεται γρήγορα και δεν πληρώνετε για ένα φορτηγό και οδηγό που περιμένουν.
Σε αυτή την ενότητα θα μάθετε για τα γεωφράγματα - καθορισμένες γεωχωρικές περιοχές, όπως μια περιοχή εντός 2 χιλιομέτρων από έναν κόμβο επεξεργασίας, και πώς να ελέγξετε αν οι συντεταγμένες GPS βρίσκονται εντός ή εκτός ενός γεωφράγματος, ώστε να μπορείτε να δείτε αν ο αισθητήρας GPS σας έχει φτάσει ή φύγει από μια περιοχή.
Σε αυτή την ενότητα θα καλύψουμε:
- Τι είναι τα γεωφράγματα
- Ορισμός ενός γεωφράγματος
- Έλεγχος σημείων σε σχέση με ένα γεωφράγμα
- Χρήση γεωφραγμάτων από serverless κώδικα
🗑 Αυτή είναι η τελευταία ενότητα αυτού του έργου, οπότε μετά την ολοκλήρωση αυτής της ενότητας και της εργασίας, μην ξεχάσετε να καθαρίσετε τις υπηρεσίες cloud σας. Θα χρειαστείτε τις υπηρεσίες για να ολοκληρώσετε την εργασία, οπότε βεβαιωθείτε ότι την ολοκληρώσατε πρώτα.
Ανατρέξτε στον οδηγό καθαρισμού του έργου σας εάν χρειάζεστε οδηγίες για το πώς να το κάνετε.
Τι είναι τα γεωφράγματα
Ένα γεωφράγμα είναι μια εικονική περίμετρος για μια πραγματική γεωγραφική περιοχή. Τα γεωφράγματα μπορεί να είναι κύκλοι που ορίζονται ως ένα σημείο και μια ακτίνα (για παράδειγμα ένας κύκλος με διάμετρο 100 μέτρα γύρω από ένα κτίριο) ή ένα πολύγωνο που καλύπτει μια περιοχή όπως μια σχολική ζώνη, τα όρια μιας πόλης ή μια πανεπιστημιούπολη ή ένα εργοστάσιο.
💁 Ίσως έχετε ήδη χρησιμοποιήσει γεωφράγματα χωρίς να το γνωρίζετε. Εάν έχετε ορίσει μια υπενθύμιση χρησιμοποιώντας την εφαρμογή υπενθυμίσεων iOS ή το Google Keep με βάση μια τοποθεσία, έχετε χρησιμοποιήσει γεωφράγμα. Αυτές οι εφαρμογές δημιουργούν ένα γεωφράγμα με βάση την τοποθεσία που δίνεται και σας ειδοποιούν όταν το τηλέφωνό σας εισέρχεται στο γεωφράγμα.
Υπάρχουν πολλοί λόγοι για τους οποίους θα θέλατε να γνωρίζετε ότι ένα όχημα βρίσκεται εντός ή εκτός ενός γεωφράγματος:
- Προετοιμασία για εκφόρτωση - η λήψη μιας ειδοποίησης ότι ένα όχημα έχει φτάσει στον χώρο επιτρέπει στο προσωπικό να είναι έτοιμο να εκφορτώσει το όχημα, μειώνοντας τον χρόνο αναμονής του οχήματος. Αυτό μπορεί να επιτρέψει στον οδηγό να κάνει περισσότερες παραδόσεις μέσα σε μια μέρα με λιγότερο χρόνο αναμονής.
- Συμμόρφωση με φόρους - ορισμένες χώρες, όπως η Νέα Ζηλανδία, χρεώνουν φόρους δρόμου για οχήματα ντίζελ με βάση το βάρος του οχήματος όταν οδηγούν μόνο σε δημόσιους δρόμους. Η χρήση γεωφραγμάτων σας επιτρέπει να παρακολουθείτε τα χιλιόμετρα που διανύθηκαν σε δημόσιους δρόμους σε αντίθεση με ιδιωτικούς δρόμους σε χώρους όπως φάρμες ή περιοχές υλοτομίας.
- Παρακολούθηση κλοπής - εάν ένα όχημα πρέπει να παραμείνει μόνο σε μια συγκεκριμένη περιοχή, όπως σε μια φάρμα, και φύγει από το γεωφράγμα, μπορεί να έχει κλαπεί.
- Συμμόρφωση τοποθεσίας - ορισμένα μέρη ενός χώρου εργασίας, φάρμας ή εργοστασίου μπορεί να είναι εκτός ορίων για ορισμένα οχήματα, όπως η αποφυγή οχημάτων που μεταφέρουν τεχνητά λιπάσματα και φυτοφάρμακα από χωράφια που καλλιεργούν βιολογικά προϊόντα. Εάν εισέλθει ένα γεωφράγμα, τότε ένα όχημα βρίσκεται εκτός συμμόρφωσης και ο οδηγός μπορεί να ειδοποιηθεί.
✅ Μπορείτε να σκεφτείτε άλλες χρήσεις για τα γεωφράγματα;
Οι Azure Maps, η υπηρεσία που χρησιμοποιήσατε στο προηγούμενο μάθημα για να οπτικοποιήσετε δεδομένα GPS, σας επιτρέπουν να ορίσετε γεωφράγματα και στη συνέχεια να ελέγξετε αν ένα σημείο βρίσκεται εντός ή εκτός του γεωφράγματος.
Ορισμός ενός γεωφράγματος
Τα γεωφράγματα ορίζονται χρησιμοποιώντας GeoJSON, όπως και τα σημεία που προστέθηκαν στον χάρτη στο προηγούμενο μάθημα. Σε αυτή την περίπτωση, αντί να είναι μια FeatureCollection
από τιμές Point
, είναι μια FeatureCollection
που περιέχει ένα Polygon
.
{
"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 σημεία.
Στην παραπάνω εικόνα, υπάρχει ένα ορθογώνιο. Οι συντεταγμένες του πολύγωνου ξεκινούν από την πάνω-αριστερή γωνία στο 47,-122, στη συνέχεια κινούνται δεξιά στο 47,-121, μετά κάτω στο 46,-121, στη συνέχεια δεξιά στο 46,-122 και τέλος επιστρέφουν στο αρχικό σημείο στο 47,-122. Αυτό δίνει στο πολύγωνο 5 σημεία - πάνω-αριστερά, πάνω-δεξιά, κάτω-δεξιά, κάτω-αριστερά και τέλος πάνω-αριστερά για να κλείσει.
✅ Δοκιμάστε να δημιουργήσετε ένα GeoJSON πολύγωνο γύρω από το σπίτι ή το σχολείο σας. Χρησιμοποιήστε ένα εργαλείο όπως το GeoJSON.io.
Εργασία - ορισμός ενός γεωφράγματος
Για να χρησιμοποιήσετε ένα γεωφράγμα στους Azure Maps, πρώτα πρέπει να το ανεβάσετε στον λογαριασμό σας στους Azure Maps. Μόλις ανέβει, θα λάβετε ένα μοναδικό ID που μπορείτε να χρησιμοποιήσετε για να ελέγξετε ένα σημείο σε σχέση με το γεωφράγμα. Για να ανεβάσετε γεωφράγματα στους Azure Maps, πρέπει να χρησιμοποιήσετε το web API των Maps. Μπορείτε να καλέσετε το web API των Azure Maps χρησιμοποιώντας ένα εργαλείο που ονομάζεται curl.
🎓 Το Curl είναι ένα εργαλείο γραμμής εντολών για την εκτέλεση αιτημάτων σε web endpoints
-
Αν χρησιμοποιείτε Linux, macOS ή μια πρόσφατη έκδοση των Windows 10, πιθανότατα έχετε ήδη εγκατεστημένο το curl. Εκτελέστε την παρακάτω εντολή από το τερματικό ή τη γραμμή εντολών για να ελέγξετε:
curl --version
Αν δεν δείτε πληροφορίες έκδοσης για το curl, θα χρειαστεί να το εγκαταστήσετε από τη σελίδα λήψεων του curl.
💁 Αν έχετε εμπειρία με το Postman, μπορείτε να το χρησιμοποιήσετε αντί για το curl αν προτιμάτε.
-
Δημιουργήστε ένα αρχείο GeoJSON που περιέχει ένα πολύγωνο. Θα το δοκιμάσετε χρησιμοποιώντας τον αισθητήρα GPS σας, οπότε δημιουργήστε ένα πολύγωνο γύρω από την τρέχουσα τοποθεσία σας. Μπορείτε είτε να το δημιουργήσετε χειροκίνητα επεξεργάζοντας το παράδειγμα GeoJSON που δίνεται παραπάνω είτε να χρησιμοποιήσετε ένα εργαλείο όπως το GeoJSON.io.
Το GeoJSON πρέπει να περιέχει μια
FeatureCollection
, που περιέχει έναFeature
με μιαgeometry
τύπουPolygon
.Πρέπει ΟΠΩΣΔΗΠΟΤΕ να προσθέσετε ένα στοιχείο
properties
στο ίδιο επίπεδο με το στοιχείοgeometry
, και αυτό πρέπει να περιέχει έναgeometryId
:"properties": { "geometryId": "1" }
Αν χρησιμοποιήσετε το GeoJSON.io, τότε θα πρέπει να προσθέσετε χειροκίνητα αυτό το στοιχείο στο κενό
properties
είτε μετά τη λήψη του αρχείου JSON είτε στον επεξεργαστή JSON της εφαρμογής.Το
geometryId
πρέπει να είναι μοναδικό σε αυτό το αρχείο. Μπορείτε να ανεβάσετε πολλαπλά γεωφράγματα ως πολλαπλάFeatures
στηFeatureCollection
στο ίδιο αρχείο GeoJSON, αρκεί το καθένα να έχει διαφορετικόgeometryId
. Τα πολύγωνα μπορούν να έχουν το ίδιοgeometryId
αν ανέβουν από διαφορετικό αρχείο σε διαφορετική στιγμή. -
Αποθηκεύστε αυτό το αρχείο ως
geofence.json
και μεταβείτε στον φάκελο όπου είναι αποθηκευμένο μέσω του τερματικού ή της κονσόλας σας. -
Εκτελέστε την παρακάτω εντολή curl για να δημιουργήσετε το GeoFence:
curl --request POST 'https://atlas.microsoft.com/mapData/upload?api-version=1.0&dataFormat=geojson&subscription-key=<subscription_key>' \ --header 'Content-Type: application/json' \ --include \ --data @geofence.json
Αντικαταστήστε το
<subscription_key>
στη διεύθυνση URL με το API key του λογαριασμού σας στους Azure Maps.Η διεύθυνση URL χρησιμοποιείται για την αποστολή δεδομένων χάρτη μέσω του API
https://atlas.microsoft.com/mapData/upload
. Η κλήση περιλαμβάνει μια παράμετροapi-version
για να καθορίσει ποιο API των Azure Maps να χρησιμοποιηθεί, ώστε να επιτρέπεται η αλλαγή του API με την πάροδο του χρόνου αλλά να διατηρείται η συμβατότητα προς τα πίσω. Η μορφή δεδομένων που ανεβαίνει ορίζεται ωςgeojson
.Αυτό θα εκτελέσει το αίτημα POST στο API αποστολής και θα επιστρέψει μια λίστα με headers απόκρισης που περιλαμβάνει ένα header που ονομάζεται
location
.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
🎓 Όταν καλείτε ένα web endpoint, μπορείτε να περάσετε παραμέτρους στην κλήση προσθέτοντας ένα
?
ακολουθούμενο από ζεύγη κλειδιού-τιμής ωςkey=value
, χωρίζοντας τα ζεύγη κλειδιού-τιμής με ένα&
. -
Οι Azure Maps δεν επεξεργάζονται αυτό αμέσως, οπότε θα χρειαστεί να ελέγξετε αν το αίτημα αποστολής έχει ολοκληρωθεί χρησιμοποιώντας τη διεύθυνση URL που δίνεται στο header
location
. Κάντε ένα GET αίτημα σε αυτή τη διεύθυνση URL για να δείτε την κατάσταση. Θα χρειαστεί να προσθέσετε το subscription key σας στο τέλος της διεύθυνσης URLlocation
προσθέτοντας&subscription-key=<subscription_key>
στο τέλος, αντικαθιστώντας το<subscription_key>
με το API key του λογαριασμού σας στους Azure Maps. Εκτελέστε την παρακάτω εντολή:curl --request GET '<location>&subscription-key=<subscription_key>'
Αντικαταστήστε το
<location>
με την τιμή του headerlocation
και το<subscription_key>
με το API key του λογαριασμού σας στους Azure Maps. -
Ελέγξτε την τιμή του
status
στην απόκριση. Αν δεν είναιSucceeded
, περιμένετε ένα λεπτό και δοκιμάστε ξανά. -
Μόλις η κατάσταση επιστρέψει ως
Succeeded
, κοιτάξτε τοresourceLocation
από την απόκριση. Αυτό περιέχει λεπτομέρειες για το μοναδικό ID (γνωστό ως UDID) για το αντικείμενο GeoJSON. Το UDID είναι η τιμή μετά τοmetadata/
, χωρίς να περιλαμβάνεται τοapi-version
. Για παράδειγμα, αν τοresourceLocation
ήταν:{ "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, μπορείτε να ελέγξετε ένα σημείο για να δείτε αν βρίσκεται εντός ή εκτός του γεωφράγματος. Αυτό γίνεται με την εκτέλεση ενός αιτήματος web API, περνώντας το UDID του γεωφράγματος και το γεωγραφικό πλάτος και μήκος του σημείου που θέλετε να ελέγξετε.
Όταν κάνετε αυτό το αίτημα, μπορείτε επίσης να περάσετε μια τιμή που ονομάζεται searchBuffer
. Αυτό καθορίζει πόσο ακριβής θα είναι η επιστροφή αποτελεσμάτων. Ο λόγος για αυτό είναι ότι το GPS δεν είναι απόλυτα ακριβές και μερικές φορές οι τοποθεσίες μπορεί να είναι εκτός κατά μερικά μέτρα ή και περισσότερο. Η προεπιλογή για το search buffer είναι 50 μέτρα, αλλά μπορείτε να ορίσετε τιμές από 0 μέτρα έως 500 μέτρα.
Όταν επιστρέφονται αποτελέσματα από την κλήση API, ένα από τα μέρη του αποτελέσματος είναι η distance
που μετράται μέχρι το πλησιέστερο σημείο στην άκρη του γεωφράγματος, με θετική τιμή αν το σημείο βρίσκεται εκτός του γεωφράγματος και αρνητική αν βρίσκεται εντός του γεωφράγματος. Αν αυτή η απόσταση είναι μικρότερη από το search buffer, η πραγματική από
Στην παραπάνω εικόνα, υπάρχει μια γεωγραφική περίφραξη (geofence) που καλύπτει μέρος του campus της Microsoft. Η κόκκινη γραμμή δείχνει ένα φορτηγό που κινείται κατά μήκος της 520, με κύκλους που αντιπροσωπεύουν τις μετρήσεις GPS. Οι περισσότερες από αυτές είναι ακριβείς και βρίσκονται κατά μήκος της 520, με μία ανακριβή μέτρηση μέσα στη γεωγραφική περίφραξη. Δεν υπάρχει περίπτωση αυτή η μέτρηση να είναι σωστή - δεν υπάρχουν δρόμοι που να επιτρέπουν στο φορτηγό να απομακρυνθεί ξαφνικά από την 520, να μπει στο campus και μετά να επιστρέψει στην 520. Ο κώδικας που ελέγχει αυτή τη γεωγραφική περίφραξη θα πρέπει να λάβει υπόψη τις προηγούμενες μετρήσεις πριν ενεργήσει βάσει των αποτελεσμάτων του ελέγχου της γεωγραφικής περίφραξης.
✅ Ποια επιπλέον δεδομένα θα χρειαστείτε για να ελέγξετε αν μια μέτρηση GPS μπορεί να θεωρηθεί σωστή;
Εργασία - έλεγχος σημείων σε σχέση με μια γεωγραφική περίφραξη
-
Ξεκινήστε δημιουργώντας το URL για το ερώτημα του web API. Η μορφή είναι:
https://atlas.microsoft.com/spatial/geofence/json?api-version=1.0&deviceId=gps-sensor&subscription-key=<subscription-key>&udid=<UDID>&lat=<lat>&lon=<lon>
Αντικαταστήστε το
<subscription_key>
με το API key του λογαριασμού σας στο Azure Maps.Αντικαταστήστε το
<UDID>
με το UDID της γεωγραφικής περίφραξης από την προηγούμενη εργασία.Αντικαταστήστε το
<lat>
και το<lon>
με το γεωγραφικό πλάτος και μήκος που θέλετε να ελέγξετε.Αυτό το URL χρησιμοποιεί το API
https://atlas.microsoft.com/spatial/geofence/json
για να ερωτήσει μια γεωγραφική περίφραξη που ορίζεται μέσω GeoJSON. Στοχεύει την έκδοση API1.0
. Η παράμετροςdeviceId
είναι υποχρεωτική και πρέπει να είναι το όνομα της συσκευής από την οποία προέρχονται το γεωγραφικό πλάτος και μήκος.Το προεπιλεγμένο buffer αναζήτησης είναι 50m, και μπορείτε να το αλλάξετε περνώντας μια επιπλέον παράμετρο
searchBuffer=<distance>
, ορίζοντας το<distance>
στην απόσταση buffer αναζήτησης σε μέτρα, από 0 έως 500. -
Χρησιμοποιήστε το curl για να κάνετε ένα GET αίτημα σε αυτό το URL:
curl --request GET '<URL>'
💁 Αν λάβετε έναν κωδικό απόκρισης
BadRequest
, με ένα σφάλμα:Invalid GeoJSON: All feature properties should contain a geometryId, which is used for identifying the geofence.
τότε το GeoJSON σας λείπει το τμήμα
properties
με τοgeometryId
. Θα χρειαστεί να διορθώσετε το GeoJSON σας, και στη συνέχεια να επαναλάβετε τα παραπάνω βήματα για να το ανεβάσετε ξανά και να αποκτήσετε ένα νέο UDID. -
Η απόκριση θα περιέχει μια λίστα από
geometries
, μία για κάθε πολύγωνο που ορίζεται στο GeoJSON που χρησιμοποιήθηκε για τη δημιουργία της γεωγραφικής περίφραξης. Κάθε γεωμετρία έχει 3 πεδία ενδιαφέροντος:distance
,nearestLat
καιnearestLon
.{ "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 (το προεπιλεγμένο buffer αναζήτησης) ή 999.
-
-
Επαναλάβετε αυτό πολλές φορές με τοποθεσίες μέσα και έξω από τη γεωγραφική περίφραξη.
Χρήση γεωγραφικών περιφράξεων από serverless κώδικα
Μπορείτε τώρα να προσθέσετε ένα νέο trigger στην εφαρμογή Functions σας για να ελέγξετε τα δεδομένα GPS του IoT Hub σε σχέση με τη γεωγραφική περίφραξη.
Ομάδες καταναλωτών
Όπως θα θυμάστε από προηγούμενα μαθήματα, το IoT Hub σας επιτρέπει να επαναλάβετε γεγονότα που έχουν ληφθεί από το hub αλλά δεν έχουν επεξεργαστεί. Αλλά τι θα συμβεί αν συνδεθούν πολλαπλά triggers; Πώς θα ξέρει ποιο έχει επεξεργαστεί ποια γεγονότα;
Η απάντηση είναι ότι δεν μπορεί! Αντίθετα, μπορείτε να ορίσετε πολλαπλές ξεχωριστές συνδέσεις για να διαβάσετε τα γεγονότα, και κάθε μία μπορεί να διαχειριστεί την επανάληψη των μη αναγνωσμένων μηνυμάτων. Αυτές ονομάζονται ομάδες καταναλωτών (consumer groups). Όταν συνδέεστε στο endpoint, μπορείτε να καθορίσετε ποια ομάδα καταναλωτών θέλετε να χρησιμοποιήσετε. Κάθε στοιχείο της εφαρμογής σας θα συνδεθεί σε διαφορετική ομάδα καταναλωτών.
Θεωρητικά, έως και 5 εφαρμογές μπορούν να συνδεθούν σε κάθε ομάδα καταναλωτών, και όλες θα λαμβάνουν μηνύματα όταν φτάνουν. Είναι καλή πρακτική να έχετε μόνο μία εφαρμογή να έχει πρόσβαση σε κάθε ομάδα καταναλωτών για να αποφύγετε την επεξεργασία διπλών μηνυμάτων και να διασφαλίσετε ότι κατά την επανεκκίνηση όλα τα μηνύματα που βρίσκονται σε ουρά επεξεργάζονται σωστά. Για παράδειγμα, αν εκκινήσετε την εφαρμογή Functions τοπικά καθώς και στο cloud, και οι δύο θα επεξεργάζονται μηνύματα, οδηγώντας σε διπλά blobs που αποθηκεύονται στον λογαριασμό αποθήκευσης.
Αν ελέγξετε το αρχείο function.json
για το IoT Hub trigger που δημιουργήσατε σε προηγούμενο μάθημα, θα δείτε την ομάδα καταναλωτών στην ενότητα δέσμευσης του event hub trigger:
"consumerGroup": "$Default"
Όταν δημιουργείτε ένα IoT Hub, λαμβάνετε την προεπιλεγμένη ομάδα καταναλωτών $Default
. Αν θέλετε να προσθέσετε ένα επιπλέον trigger, μπορείτε να το κάνετε χρησιμοποιώντας μια νέα ομάδα καταναλωτών.
💁 Σε αυτό το μάθημα, θα χρησιμοποιήσετε μια διαφορετική function για να ελέγξετε τη γεωγραφική περίφραξη από αυτή που χρησιμοποιείται για την αποθήκευση των δεδομένων GPS. Αυτό γίνεται για να δείξουμε πώς να χρησιμοποιείτε ομάδες καταναλωτών και να διαχωρίζετε τον κώδικα ώστε να είναι πιο εύκολο να διαβαστεί και να κατανοηθεί. Σε μια παραγωγική εφαρμογή, υπάρχουν πολλοί τρόποι που μπορείτε να σχεδιάσετε αυτό - βάζοντας και τα δύο σε μία function, χρησιμοποιώντας trigger στον λογαριασμό αποθήκευσης για να εκτελέσετε μια function για να ελέγξετε τη γεωγραφική περίφραξη, ή χρησιμοποιώντας πολλαπλές functions. Δεν υπάρχει "σωστός τρόπος", εξαρτάται από την υπόλοιπη εφαρμογή σας και τις ανάγκες σας.
Εργασία - δημιουργία νέας ομάδας καταναλωτών
-
Εκτελέστε την παρακάτω εντολή για να δημιουργήσετε μια νέα ομάδα καταναλωτών με όνομα
geofence
για το IoT Hub σας:az iot hub consumer-group create --name geofence \ --hub-name <hub_name>
Αντικαταστήστε το
<hub_name>
με το όνομα που χρησιμοποιήσατε για το IoT Hub σας. -
Αν θέλετε να δείτε όλες τις ομάδες καταναλωτών για ένα IoT Hub, εκτελέστε την παρακάτω εντολή:
az iot hub consumer-group list --output table \ --hub-name <hub_name>
Αντικαταστήστε το
<hub_name>
με το όνομα που χρησιμοποιήσατε για το IoT Hub σας. Αυτό θα εμφανίσει όλες τις ομάδες καταναλωτών.Name ResourceGroup -------- --------------- $Default gps-sensor geofence gps-sensor
💁 Όταν εκτελέσατε τον event monitor του IoT Hub σε προηγούμενο μάθημα, συνδέθηκε στην προεπιλεγμένη ομάδα καταναλωτών
$Default
. Αυτός ήταν ο λόγος που δεν μπορείτε να εκτελέσετε τον event monitor και ένα event trigger ταυτόχρονα. Αν θέλετε να εκτελέσετε και τα δύο, τότε μπορείτε να χρησιμοποιήσετε άλλες ομάδες καταναλωτών για όλες τις εφαρμογές functions σας, και να κρατήσετε την$Default
για τον event monitor.
Εργασία - δημιουργία νέου IoT Hub trigger
-
Προσθέστε ένα νέο IoT Hub event trigger στην εφαρμογή
gps-trigger
που δημιουργήσατε σε προηγούμενο μάθημα. Ονομάστε αυτή τη functiongeofence-trigger
.⚠️ Μπορείτε να ανατρέξετε στις οδηγίες για τη δημιουργία ενός IoT Hub event trigger από το project 2, μάθημα 5 αν χρειαστεί.
-
Διαμορφώστε το IoT Hub connection string στο αρχείο
function.json
. Τοlocal.settings.json
είναι κοινό για όλα τα triggers στην εφαρμογή Functions. -
Ενημερώστε την τιμή του
consumerGroup
στο αρχείοfunction.json
ώστε να αναφέρεται στη νέα ομάδα καταναλωτώνgeofence
:"consumerGroup": "geofence"
-
Θα χρειαστεί να χρησιμοποιήσετε το subscription key για τον λογαριασμό σας στο Azure Maps σε αυτό το trigger, οπότε προσθέστε μια νέα καταχώρηση στο αρχείο
local.settings.json
με όνομαMAPS_KEY
. -
Εκτελέστε την εφαρμογή Functions για να διασφαλίσετε ότι συνδέεται και επεξεργάζεται μηνύματα. Το
iot-hub-trigger
από το προηγούμενο μάθημα θα εκτελεστεί επίσης και θα ανεβάσει blobs στην αποθήκευση.Για να αποφύγετε διπλές μετρήσεις GPS στην αποθήκευση blob, μπορείτε να σταματήσετε την εφαρμογή Functions που εκτελείτε στο cloud. Για να το κάνετε αυτό, χρησιμοποιήστε την παρακάτω εντολή:
az functionapp stop --resource-group gps-sensor \ --name <functions_app_name>
Αντικαταστήστε το
<functions_app_name>
με το όνομα που χρησιμοποιήσατε για την εφαρμογή Functions σας.Μπορείτε να την επανεκκινήσετε αργότερα με την παρακάτω εντολή:
az functionapp start --resource-group gps-sensor \ --name <functions_app_name>
Αντικαταστήστε το
<functions_app_name>
με το όνομα που χρησιμοποιήσατε για την εφαρμογή Functions σας.
Εργασία - έλεγχος της γεωγραφικής περίφραξης από το trigger
Νωρίτερα σε αυτό το μάθημα χρησιμοποιήσατε το curl για να ερωτήσετε μια γεωγραφική περίφραξη και να δείτε αν ένα σημείο βρίσκεται μέσα ή έξω. Μπορείτε να κάνετε ένα παρόμοιο web αίτημα μέσα από το trigger σας.
-
Για να ερωτήσετε τη γεωγραφική περίφραξη, χρειάζεστε το UDID της. Προσθέστε μια νέα καταχώρηση στο αρχείο
local.settings.json
με όνομαGEOFENCE_UDID
με αυτή την τιμή. -
Ανοίξτε το αρχείο
__init__.py
από το νέο triggergeofence-trigger
. -
Προσθέστε την παρακάτω εισαγωγή στην κορυφή του αρχείου:
import json import os import requests
Το πακέτο
requests
σας επιτρέπει να κάνετε κλήσεις web API. Το Azure Maps δεν διαθέτει Python SDK, οπότε πρέπει να κάνετε κλήσεις web API για να το χρησιμοποιήσετε από κώδικα Python. -
Προσθέστε τις παρακάτω 2 γραμμές στην αρχή της μεθόδου
main
για να λάβετε το subscription key του Maps:maps_key = os.environ['MAPS_KEY'] geofence_udid = os.environ['GEOFENCE_UDID']
-
Μέσα στο βρόχο
for event in events
, προσθέστε τα παρακάτω για να λάβετε το γεωγραφικό πλάτος και μήκος από κάθε event:event_body = json.loads(event.get_body().decode('utf-8')) lat = event_body['gps']['lat'] lon = event_body['gps']['lon']
Αυτός ο κώδικας μετατρέπει το JSON από το σώμα του event σε dictionary και στη συνέχεια εξάγει το
lat
και τοlon
από το πεδίοgps
. -
Όταν χρησιμοποιείτε το
requests
, αντί να δημιουργείτε ένα μεγάλο URL όπως κάνατε με το curl, μπορείτε να χρησιμοποιήσετε μόνο το μέρος του URL και να περάσετε τις παραμέτρους ως dictionary. Προσθέστε τον παρακάτω κώδικα για να ορίσετε το URL που θα καλέσετε και να διαμορφώσετε τις παραμέτρους: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 }
Τα στοιχεία στο dictionary
params
θα αντιστοιχούν στα ζεύγη κλειδιού-τιμής που χρησιμοποιήσατε όταν καλέσατε το web API μέσω curl. -
Προσθέστε τις παρακάτω γραμμές κώδικα για να καλέσετε το web API:
response = requests.get(url, params=params) response_body = json.loads(response.text)
Αυτό καλεί το URL με τις παραμέτρους και επιστρέφει ένα αντικείμενο απόκρισης.
-
Προσθέστε τον παρακάτω κώδικα κάτω από αυτό:
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')
Αυτός ο κώδικας υποθέτει μία γεωμετρία και εξάγει την απόσταση από αυτή τη μοναδική γεωμετρία. Στη συνέχεια καταγράφει διαφορετικά μηνύματα με βάση την απόσταση.
-
Εκτελέστε αυτόν τον κώδικα. Θα δείτε στην έξοδο καταγραφής αν οι συντεταγμένες GPS βρίσκονται μέσα ή έξω από τη γεωγραφική περίφραξη, με μια απόσταση αν το σημείο βρίσκεται εντός 50m. Δοκιμάστε αυτόν τον κώδικα με διαφορετικές γεωγραφικές περιφράξεις με βάση τη θέση του αισθητήρα GPS σας, δοκιμάστε να μετακινήσετε τον αισθητήρα (για παράδειγμα συνδεδεμένο σε WiFi από κινητό τηλέφωνο ή με διαφορετικές συντεταγμένες στη virtual IoT συσκευή) για να δείτε αυτή την αλλαγή.
-
Όταν είστε έτοιμοι, αναπτύξτε αυτόν τον κώδικα στην εφαρμογή Functions σας στο cloud. Μην ξεχάσετε να αναπτύξετε τις νέες Ρυθμίσεις Εφαρμογής.
⚠️ Μπορείτε να ανατρέξετε στις οδηγίες για την αποστολή Ρυθμίσεων Εφαρμογής από το project 2, μάθημα 5 αν χρειαστεί.
⚠️ Μπορείτε να ανατρέξετε στις οδηγίες για την ανάπτυξη της εφαρμογής Functions από το project 2, μάθημα 5 αν χρειαστεί.
💁 Μπορείτε να βρείτε αυτόν τον κώδικα στον φάκελο code/functions.
🚀 Πρόκληση
Σε αυτό το μάθημα προσθέσατε μία γεωγραφική περίφραξη χρησιμοποιώντας ένα αρχείο GeoJSON με ένα μόνο πολύγωνο. Μπορείτε να ανεβάσετε πολλαπλά πολύγωνα ταυτόχρονα, αρκεί να έχουν διαφορετικές τιμές geometryId
στην ενότητα properties
.
Δοκιμάστε να ανεβάσετε ένα αρχείο GeoJSON με πολλαπλά πολύγωνα και προσαρμόστε τον κώδικά σας για να βρείτε ποιο πολύγωνο είναι πιο κοντά ή περιλαμβάνει τις συντεταγμένες GPS.
Κουίζ μετά το μάθημα
Ανασκόπηση & Αυτομελέτη
- Διαβάστε περισσότερα για τις γεωγραφικές περιφράξεις και κάποιες από τις χρήσεις τους στη σελίδα Geofencing στη Wikipedia.
- Διαβάστε περισσότερα για το API γεωγραφικών περιφράξεων του Azure Maps στη τεκμηρίωση Microsoft Azure Maps Spatial - Get Geofence.
- Διαβάστε περισσότερα για τις ομάδες καταναλωτών στη [τεκμηρίωση χαρακτηριστικών και ορολογίας στο Azure Event Hubs - Event consumers](https://docs.microsoft.com/azure/event-hubs/event-hubs-fe
Αποποίηση ευθύνης:
Αυτό το έγγραφο έχει μεταφραστεί χρησιμοποιώντας την υπηρεσία αυτόματης μετάφρασης Co-op Translator. Παρόλο που καταβάλλουμε προσπάθειες για ακρίβεια, παρακαλούμε να έχετε υπόψη ότι οι αυτοματοποιημένες μεταφράσεις ενδέχεται να περιέχουν λάθη ή ανακρίβειες. Το πρωτότυπο έγγραφο στη μητρική του γλώσσα θα πρέπει να θεωρείται η αυθεντική πηγή. Για κρίσιμες πληροφορίες, συνιστάται επαγγελματική ανθρώπινη μετάφραση. Δεν φέρουμε ευθύνη για τυχόν παρεξηγήσεις ή εσφαλμένες ερμηνείες που προκύπτουν από τη χρήση αυτής της μετάφρασης.