|
@ -25,30 +25,29 @@ |
|
|
|
|
|
|
|
|
== Smart Parking |
|
|
== Smart Parking |
|
|
Το "Smart Parking" Έξυπνο πάρκινγκ βασίζεται στη διαδικασία όπου η κατάσταση του πάρκινγκ κοινοποιείται |
|
|
Το "Smart Parking" Έξυπνο πάρκινγκ βασίζεται στη διαδικασία όπου η κατάσταση του πάρκινγκ κοινοποιείται |
|
|
μέσω ενός συνόλου hardware και software στο διαδίκτυο και έτσι πετυχαίνουμε η κατάσταση του να είναι διαθέσιμη |
|
|
μέσω ενός συνόλου hardware και software στο διαδίκτυο έτσι ώστε να πετυχουμε η κατάσταση του να είναι διαθέσιμη |
|
|
"accesable" από το διαδίκτυο. Αυτό το χαρακτηριστικό κάνει αυτό το αντικειμένο μέρος του διαδικτύου και του κόσμου IoT. |
|
|
"accesable" από το διαδίκτυο. Αυτό το χαρακτηριστικό κάνει αυτό το αντικειμένο μέρος του διαδικτύου και του κόσμου του IoT. |
|
|
|
|
|
|
|
|
*Η υλοποίηση του Smart Parking χωρίζεται σε 3 βασικά μέρη:* |
|
|
*Η υλοποίηση του Smart Parking χωρίζεται σε 4 βασικά μέρη:* |
|
|
|
|
|
|
|
|
* Το 1~ο~ μέρος αποτελείται από ένα σύνολο αισθητήρων που εγκαθιστούντε σε κάθε θέση parking (sensor), τα οποία αποτελούνται |
|
|
* Το 1~ο~ μέρος αποτελείται από ένα σύνολο αισθητήρων (ultrasonic) που εγκαθιστούντε σε κάθε θέση parking (sensor) και |
|
|
από έναν αισθητήρα μέτρησης απόστασης (ultrasonic) και έναν μικροελεγκτή (Arduino Uno), έτσι ώστε να ανιχνεύει και να κωδικοποιεί |
|
|
έναν μικροελεγκτή (Arduino Uno), έτσι ώστε να ανιχνεύει και να κωδικοποιεί για μία συγκεκριμένη θέση έαν υπάρχει |
|
|
για μία συγκεκριμένη θέση έαν υπάρχει κάποιο όχημα ή όχι. |
|
|
κάποιο όχημα ή όχι. |
|
|
|
|
|
|
|
|
* Το 2~ο~ μέρος αποτελείται από την συσκευή gateway σε Raspberry Pi1, η οποία διαβάζει στη σειριακή του |
|
|
* Το 2~ο~ μέρος αποτελείται από τον συσκευή gateway σε Raspberry Pi1, η οποία διαβάζει στη σειριακή του |
|
|
τη πληροφορία από το Arduino Uno, που κάνει sense μία θέση parking, και στέλνει αυτή την πληροφορία |
|
|
τη πληροφορία από το Arduino Uno, που κάνει "sense" μία θέση parking, και στέλνει αυτή την πληροφορία |
|
|
σε έναν web server με χρήση REST API. |
|
|
σε έναν web server με χρήση REST API. |
|
|
|
|
|
|
|
|
* To 3~o~ μέρος αποτελείται από τον WEB Server ο οποίος αποτελείται από ένα process γραμμένο σε python που υλοποιεί |
|
|
* To 3~o~ μέρος αποτελείται από τον WEB Server ο οποίος αποτελείται από ένα process γραμμένο σε python. Το proccess αυτό υλοποιεί |
|
|
ένα REST API έτσι ώστε να μπορεί να αποθηκεύει την κατάσταση κάθε θέσης parking σε μία δομή λίστας με χαρακτηριστικό |
|
|
έναν REST API WEB Server έτσι ώστε να μπορεί να αποθηκεύει την κατάσταση κάθε θέσης parking σε μία δομή λίστας με χαρακτηριστικό |
|
|
κλειδί τον κωδικό κάθε θέσης parking. |
|
|
κλειδί τον κωδικό κάθε θέσης parking. |
|
|
|
|
|
|
|
|
* Το 4~o~ μέρος αποτελείται από την διεπαφή (Interface), με την οποία μέσω web σελίδας βλέπει κανείς την κατάσταση |
|
|
* Το 4~o~ μέρος αποτελείται από την διεπαφή χρήστη (Interface), η οποία μέσω WEB σελίδας βλέπει κανείς την κατάσταση |
|
|
του parking, δηλαδή πόσες και ποιές θέσεις μέσα στον χώρο είναι ελεύθερες. |
|
|
του parking, δηλαδή πόσες και ποιές θέσεις μέσα στον χώρο είναι ελεύθερες. |
|
|
|
|
|
|
|
|
=== Parking Sensor Node |
|
|
=== Parking Sensor Node (1~ο~ μέρος) |
|
|
|
|
|
|
|
|
==== Υλικά Κόμβου |
|
|
==== Υλικά Κόμβου |
|
|
* 1 x Bread-Board |
|
|
|
|
|
* 1 x Arduino Uno |
|
|
* 1 x Arduino Uno |
|
|
* 1 x Red led |
|
|
* 1 x Red led |
|
|
* 1 x Blue led |
|
|
* 1 x Blue led |
|
@ -56,10 +55,10 @@ |
|
|
* 1 x Ultrasonic Sensor |
|
|
* 1 x Ultrasonic Sensor |
|
|
|
|
|
|
|
|
==== Υλοποίηση του Parking Sensor |
|
|
==== Υλοποίηση του Parking Sensor |
|
|
Σε κάθε θέση parking υπάρχει ένας κόμβος απότελούμενος από ένα Arduino και έναν αισθητήρα |
|
|
Σε κάθε θέση parking υπάρχει ένας κόμβος που αποτελείται από ένα Arduino Uno και έναν αισθητήρα |
|
|
απόστασης (ultrasonic) εγκατεστημένος πάνω στο Arduino. Η λειτουργία αυτού βασίζεται στη |
|
|
απόστασης (ultrasonic) εγκατεστημένος πάνω σε μικροελεγκτή Arduino Uno. Η λειτουργία αυτού βασίζεται στη |
|
|
μέτρηση της απόστασης από τον κόμβο μέχρι κάποιο αντικείμενο (αυτοκίνητο) που εμποδίζει τη θέση του parking |
|
|
μέτρηση της απόστασης από τον κόμβο μέχρι κάποιο αντικείμενο (πιθανό αυτοκίνητο) που εμποδίζει τη θέση του parking, |
|
|
και την εξαγωγή της κατάσταασης της αυτής της θέσης στη σειριακή θύρα του Arduino. |
|
|
καθώς και την εξαγωγή της κατάσταασης αντίστοιχης θέσης στη σειριακή θύρα του Arduino. |
|
|
|
|
|
|
|
|
[.float-group] |
|
|
[.float-group] |
|
|
-- |
|
|
-- |
|
@ -87,9 +86,10 @@ image::Photos/arduino2.jpg[300,200] |
|
|
==== Διασύνδεση Κόμβου |
|
|
==== Διασύνδεση Κόμβου |
|
|
Ο κόμβος αυτός συνδέεται με ένας "Gateway" κόμβο (βασισμένος σε Raspberry Pi) ο οποίος είναι υπεύθυνος για την |
|
|
Ο κόμβος αυτός συνδέεται με ένας "Gateway" κόμβο (βασισμένος σε Raspberry Pi) ο οποίος είναι υπεύθυνος για την |
|
|
μετάδοση της πληροφορίας που αφορά την διαθεσιμότητα της θέσης του parking στο διαδίκτυο. Η πληροφορία αυτή |
|
|
μετάδοση της πληροφορίας που αφορά την διαθεσιμότητα της θέσης του parking στο διαδίκτυο. Η πληροφορία αυτή |
|
|
λαμβάνεται στον "Gateway" κόμβο οποίος στη συνέχεια την αποκωδικοποιεί και την αποστέλει στον WEB server μέσω του διαδικτύου. |
|
|
λαμβάνεται στον "Gateway" κόμβο ο οποίος στη συνέχεια την αποκωδικοποιεί και την αποστέλει στον WEB server μέσω του διαδικτύου. |
|
|
|
|
|
|
|
|
=== Gateway Node |
|
|
|
|
|
|
|
|
=== Gateway Node (2~ο~ μέρος) |
|
|
|
|
|
|
|
|
==== Υλικά Κόμβου |
|
|
==== Υλικά Κόμβου |
|
|
* 1 x Raspberry Pi 1 |
|
|
* 1 x Raspberry Pi 1 |
|
@ -100,19 +100,29 @@ image::Photos/arduino2.jpg[300,200] |
|
|
|
|
|
|
|
|
==== Υλοποίηση και Προγραμματισμός |
|
|
==== Υλοποίηση και Προγραμματισμός |
|
|
Η υλοποίηση αποτελείται από την εγκατάσταση του Raspbian OS στο Raspberry και τη δημιουργία ενός proccess |
|
|
Η υλοποίηση αποτελείται από την εγκατάσταση του Raspbian OS στο Raspberry και τη δημιουργία ενός proccess |
|
|
σε γλώσσα python το οποίο διαβάζει από την σειριακή θύρα του την πληροφορία που λαμβάνει από το Arduino με |
|
|
σε γλώσσα Python. Το process αυτό διαβάζει από την σειριακή θύρα του την πληροφορία που λαμβάνει από το αντίστοιχο Arduino Uno με |
|
|
την μορφή <κωδικός θέσης>#<διαθεσιμότητα 0 ή 1>. Ύστερα αποκωδικοποιεί αυτή την πληροφορία η οποία περιγράφει τον κωδικό της θέσης |
|
|
την μορφή <κωδικός θέσης>#<διαθεσιμότητα 0 ή 1>. Ύστερα αποκωδικοποιεί αυτή την πληροφορία η οποία περιγράφει τον κωδικό της θέσης |
|
|
και την διαθεσιμότητα της και την αποστέλει μέσω ενός REST API με την μέθοδο POST σε έναν WEB Server. |
|
|
και την διαθεσιμότητα της και την αποστέλει μέσω ενός REST API με την μέθοδο POST σε έναν WEB Server. Τα δεδομέμα μας σε αυτήν |
|
|
|
|
|
την επικοινωνία παίρνουν μία μορφή JSON (JavaScript Object Notation). |
|
|
|
|
|
|
|
|
==== Διασύνδεηση στο Διαδίκτυο |
|
|
==== Διασύνδεηση στο Διαδίκτυο |
|
|
Ο κόμβος Gateway έχει διασύνδεση με το διαδίκτυο μέσω ενός καλωδίου Ethernet (UTP) έτσι ώστε να μπορέσει |
|
|
Ο κόμβος Gateway έχει διασύνδεση με το διαδίκτυο μέσω ενός καλωδίου Ethernet (UTP) έτσι ώστε να μπορέσει |
|
|
να στείλει την πληροφορία |
|
|
να στείλει την πληροφορία στο διαδίκτυο. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
== Server Node (3~ο~ μέρος - Κεντρικός Server όπου κρατά την κατάσταση της κάθε θέσης του Parking) |
|
|
|
|
|
Ο κόμβος αυτός υλοποιεί ένα process γραμμένο σε γλώσσα προγραμματισμού Python 3. Αυτό το process εκτελεί ένα |
|
|
|
|
|
REST API έτσι ώστε να μπορούν να επικοινωνούν εύκολα πολλοί Gateway κόμβοι. Στην είσοδό του και στην έξοδό του |
|
|
|
|
|
τα δεδομένα μας έχουν την μορφή JSON. |
|
|
|
|
|
|
|
|
== Server Node (Κεντρικός Server όπου κρατά την κατάσταση της κάθε θέσης του Parking) |
|
|
Ο server αποθηκεύει όλα τα απαραίτητα δεδομένα σε μία Βάση δεδομένων MySQL, η οποία διαθέτει ένα πίνακα. |
|
|
Ο κόμβος αυτός υλοποιεί ένα process γραμμένο σε γλώσσα προγραμματισμού Python 3. |
|
|
Ο πίνακας κρατά όλα τα απαραίτητα πεδία που είναι: |
|
|
|
|
|
|
|
|
|
|
|
* Τον κωδικό της θέσης parking |
|
|
|
|
|
* Την διαθεσιμότητά της αντίστοιχης θέση (0 ή 1) |
|
|
|
|
|
|
|
|
=== Εκτέλεση του Process στο Cloud |
|
|
=== Εκτέλεση του Process στο Cloud |
|
|
Για την εκτέλεση του process χρησιμοποιούμε την πλατφόρμα IAAS (Infrastructure as a Service) |
|
|
Για την εκτέλεση του process χρησιμοποιούμε μία πλατφόρμα IAAS (Infrastructure as a Service) ονόματι |
|
|
link:++https://www.heroku.com/platform++[Heroku], για την οποιά μπορούμε να βρούμε περεταίρω πληροφορίες στον σύνδεσμο |
|
|
link:++https://www.heroku.com/platform++[Heroku], για την οποιά μπορούμε να βρούμε περεταίρω πληροφορίες στον σύνδεσμο |
|
|
παραπάνω. |
|
|
παραπάνω. |
|
|
|
|
|
|
|
@ -124,12 +134,35 @@ image::Photos/itops-pizza_as_a_service.png[1000,800] |
|
|
-- |
|
|
-- |
|
|
|
|
|
|
|
|
Για την διαδικασία του deployment εκτελούμε ένα σύνολο βημάτων τα οποία αποτελούνται από την αντιγραφή του κώδικα |
|
|
Για την διαδικασία του deployment εκτελούμε ένα σύνολο βημάτων τα οποία αποτελούνται από την αντιγραφή του κώδικα |
|
|
σε ένα reposetory του link:++https://github.com/++[GitHub] και την δημιουργία ενός project στην πλατφόρμα για το |
|
|
σε ένα reposetory του link:++https://github.com/oulievancs/serverNode++[GitHub] και την δημιουργία ενός project στην πλατφόρμα για το |
|
|
τρέξιμο του process. link:++https://stackabuse.com/deploying-a-flask-application-to-heroku/++[περισσότερα] |
|
|
τρέξιμο του process. link:++https://stackabuse.com/deploying-a-flask-application-to-heroku/++[περισσότερα]. Ακόμα |
|
|
|
|
|
εγκαθισούμε στο project που μόλις φτιάξαμε μία MySQL βάση δεδομένων για να μπορούμε να αποθηκεύσουμε τα δεδομένα μας. |
|
|
|
|
|
|
|
|
|
|
|
==== Deployment |
|
|
* Το πρώτο πράγμα που χρειαζόμαστε είναι όλες οι απαραίτητες βιβλιοθήκες που χρησιμοποιεί ο κώδικας, έτσι |
|
|
* Το πρώτο πράγμα που χρειαζόμαστε είναι όλες οι απαραίτητες βιβλιοθήκες που χρησιμοποιεί ο κώδικας, έτσι |
|
|
ώστε να γνωρίζει το Heroku τι να μας προσφέρει. Αυτό επιτυγχάνεται με την αρχειοθέτηση αυτών σε ένα αρχείο |
|
|
ώστε να γνωρίζει το Heroku τι να μας προσφέρει. Αυτό επιτυγχάνεται με την αρχειοθέτηση αυτών σε ένα αρχείο |
|
|
ονόματι re |
|
|
ονόματι requirements.txt . |
|
|
|
|
|
|
|
|
|
|
|
* Έπειτα την δημιουργία ενός αρχείου που περιγράφει το που βρίσκεται η κύρια συνέρτησή μας (main) για την |
|
|
|
|
|
έναρξη του process. Αυτό το αρχείο ονομάζεται Procfile . Στο αρχείο αυτό αναφέτεται ένα gunicorn module. |
|
|
|
|
|
Ο gunicorn είναι ένας Python HTTP WEB server. Αυτό ουσιαστικά είναι ο ο πυρήνας για την εκτέλεση του API μας. |
|
|
|
|
|
|
|
|
|
|
|
* Έπειτα με μια απομακρυσμένη σύνδεση στη βάση μας της οποίας τα στοιχεία πρόσβασης γαίνονται στο Heroku, |
|
|
|
|
|
πραγματοποιούμε μία σύνδεση και δημιουργούμε τον πίνακά μας για την αποθήκευση. |
|
|
|
|
|
|
|
|
|
|
|
==== REST API |
|
|
|
|
|
Το REST API ουσιαστικά σηκώνει δύο υπηρεσίες. Αυτές είναι: |
|
|
|
|
|
|
|
|
|
|
|
* / [GET]: που πας επιστρέφει για κάθε θέση του parking αν είναι διαθέσιμη ή όχι κωδικοποιημένα με 0 ή 1. |
|
|
|
|
|
Στο response τα δεδομένα μας παίρνουν μορφή JSON. Τα δεδομένα που επιστρέφει γίνονται fetch από τη βάση δεδομένων. |
|
|
|
|
|
|
|
|
|
|
|
* /parkingStatus [POST]: που μας επιτρέπει να αλλάξουμε την κατάσταση μίας θέσης parking. Το POST των δεδομένων |
|
|
|
|
|
στο body γίνεται με την JSON αναπαράστασή τους έτσι ώστε να μπορέσει ο Server να τα επεξεργαστεί, ο οποίος στη |
|
|
|
|
|
συνέχεια αποθηκεύει την νέα θέση στη Βάση δεδομένων. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
== Διεπαφή Χρήστη (4~ο~ μέρος) |
|
|
|
|
|
Η διεπαφή του χρήσρη π |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
== Autonomous Parking |
|
|
== Autonomous Parking |
|
|