= Υπολογιστική Νέφους και Υπηρεσίες - Εργασία Εξαμήνου
Καραβίδας Γεώργιος cse242017107@uniwa.gr - Θεοδωρόπουλος Διονύσιος cs171208@uniwa.gr
:toc: right
:toc-title: Πίνακας περιεχομένων
:toclevels: 4
:source-highlighter: highlightk
:icons: font
:sectnums:

{empty} +

== Περιγραφή Εφαρμογής

=== Γενική Περιγραφή

Σκοπός της εφαρμογής είναι η προσομοίωση ενός έξυπνου οδικού δικτύου σε περιβάλλον docker. Στόχος του έξυπνου οδικού δικτύου είναι η ελαχιστοποίηση της συμφόρησης 
ρυθμίζοντας κατάλληλα τους φωτεινούς σηματοδότες λαμβάνοντας υπόψιν τις θέσεις των οχημάτων μέσω των αισθητήρων κίνησης. Τα κύρια στοιχεία του οδικού δικτύου(φωτεινοί
σηματοδότες, αισθητήρες κίνησης, οχήματα) προσομοιώνονται μέσω εκτέλεσης προγράμματος σε ξεχωριστό container. Για την αποθήκευση της τρέχουσας κατάστασης των κύριων στοιχείων 
του οδικού δικτύου δημιουργείται container το οποίο εκτελεί μία υπηρεσία διαχείρησης βάσεων δεδομένων και για την ανάγνωση/εγγραφή από/στις βάσεις δεδομένων δημιουργείται 
container το οποίο θέτει σε λειτουργία ένα REST API παρέχοντας κατάλληλα URI's. Ένα πρόγραμμα συντονιστής ρυθμίζει την κατάσταση των φωτεινών σηματοδότων με βάση
τις τιμές των αισθητήρων και ένας web server παρέχει μία ιστοσελίδα στον χρήστη μέσω της οποίας μπορεί να εισάγει νέα οχήματα και να παρατηρεί την κατάσταση του έξυπνου 
οδικού δικτύου. Τέλος ένα πρόγραμμα Node js εκτελείται στο επίπεδο του host(εκτός docker) και δημιουργεί containers ανάλογα με την είσοδο του χρήστη μέσω της web εφαρμογής.
Συνολικά δημιουργούνται 52 containers κατά την εκκίνηση της εφαρμογής:

* 1 container για το σύστημα διαχείρησης βάσεων δεδομένων
* 1 container για το REST API
* 8 containers για τους φωτεινούς σηματοδότες
* 40 containers για τους αισθητήρες κίνησης
* 1 container για τον κόμβο συντονιστή
* 1 container για τον web server

Κατά την διάρκεια εκτέλεσης της εφαρμογής μπορούν να δημιουργηθούν containers ανάλογα με την είσοδο του χρήστη μέσω της web εφαρμογής για την προσομοίωση των οχημάτων. Τα
container των οχημάτων σταματάνε όταν το όχημα φτάσει στον προορισμό του.


=== Τοπολογία Οδικού Δικτύου

Η τοπολογία που σχεδιάστηκε για την αναπαράσταση του οδικού δικτύου είναι η ακόλουθη(οι φωτεινοί σηματοδότες σχεδιάζονται στην web εφαρμογή)

image::web_server/src/images/street.png[]

Η τοπολογία του οδικού δικτύου σχεδιάστηκε με τέτοιο τρόπο ώστε κάθε όχημα να μπορεί να καταλήξει από οποιαδήποτε κατεύθυνση εκκίνησης(Ανατολικά, Δυτικά, Βόρεια, Νότια) σε
οποιαδήποτε κατεύθυνση προορισμού. Για αυτόν τον λόγο η τοπολογία αποτελείται από τέσσερις δρόμους με κάθε δρόμο να αποτελείται από τρεις λωρίδες. Κατά σύμβαση τα οχήματα
που θέλουν να κινηθούν ευθεία τοποθετούνται στην μεσαία λωρίδα κατά την άφιξη τους. Αντίστοιχα τα οχήματα που θέλουν να κινηθούν αριστερά τοποθετούνται στην αριστερή λωρίδα
και τα οχήματα που θέλουν να κινηθούν δεξιά τοποθετούνται στην δεξία λωρίδα. Επομένως σύμφωνα με τον τρόπο που έχει σχεδιαστεί η τοπολογία, στις δεξιές λωρίδες μπορεί να τοποθετηθεί
παλλόμενο φανάρι καθώς δεν υπάρχει κίνδυνος σύγκρουσης με οχήματα που ακολουθούν διαφορετική πορεία. Για αυτό τον λόγο στις δεξιές λωρίδες των δρόμων δεν τοποθετούνται αισθητήρες
κίνησης(κάνοντας την εφαρμογή πιο ελαφριά από απόψη επεξεργαστικής ισχύς) και δεν δημιουργείται container για την προσομοίωση του φωτεινού σηματοδότη καθώς δεν μεταβάλλεται η κατάσταση
του. Η αναπαράσταση των παλλόμενων φαναριών γίνεται μόνο στην web εφαρμογή.

Για τις ανάγκες προσομοίωσης των αισθητήρων κίνησης και των οχημάτων, το οδικό δίκτυο έχει χωριστεί σε διακριτές τιμές που αντιστοιχούν σε φυσικές θέσεις. Κάθε φυσική θέση αντιστοιχεί σε
ένα πενταψήφιο αριθμό με το πρώτο most significant digit του αριθμού να καθορίζει τον δρόμο και το δεύτερο most significant digit να καθορίζει την λωρίδα στην οποία αντιστοιχεί η θέση.
Τα 3 least singificant digits του αριθμού καθορίζουν που βρίσκεται η θέση στην συγκεκριμένη λωρίδα. Επομένως οι διακριτές τιμές του οδικού δικτύου διαμορφώνονται ως εξής:

* Οι θέσεις 11000 έως 11170 αντιστοιχούν στην μεσαία λωρίδα του δρόμου που τα οχήματα κινούνται από Δυτικά προς Ανατολικά(προχωρόντας ευθεία)
* Οι θέσεις 12000 έως 12170 αντιστοιχούν στην αριστερή λωρίδα του ίδιου δρόμου
* Οι θέσεις 13000 έως 13170 αντιστοιχούν στην δεξιά λωρίδα του ίδιου δρόμου

{empty} +

* Οι θέσεις 21000 έως 21170 αντιστοιχούν στην μεσαία λωρίδα του δρόμου που τα οχήματα κινούνται από Ανατολικά προς Δυτικά(προχωρόντας ευθεία)
* Οι θέσεις 22000 έως 22170 αντιστοιχούν στην αριστερή λωρίδα του ίδιου δρόμου
* Οι θέσεις 23000 έως 23170 αντιστοιχούν στην δεξιά λωρίδα του ίδιου δρόμου

{empty} +

* Οι θέσεις 31000 έως 31170 αντιστοιχούν στην μεσαία λωρίδα του δρόμου που τα οχήματα κινούνται από Βόρεια προς Νότια(προχωρόντας ευθεία)
* Οι θέσεις 32000 έως 32170 αντιστοιχούν στην αριστερή λωρίδα του ίδιου δρόμου
* Οι θέσεις 33000 έως 33170 αντιστοιχούν στην δεξιά λωρίδα του ίδιου δρόμου

{empty} +

* Οι θέσεις 41000 έως 41170 αντιστοιχούν στην μεσαία λωρίδα του δρόμου που τα οχήματα κινούνται από Νότια προς Βόρεια(προχωρόντας ευθεία)
* Οι θέσεις 42000 έως 42170 αντιστοιχούν στην αριστερή λωρίδα του ίδιου δρόμου
* Οι θέσεις 43000 έως 43170 αντιστοιχούν στην δεξιά λωρίδα του ίδιου δρόμου

{empty} +

Τα οχήματα τοποθετούνται σε μία θέση αναλόγα με το σημείο εκκίνησης και προχωράνε αυξάνοντας την θέση τους αφού λάβουν υπόψιν τα οχήματα που βρίσκονται μπροστά τους, την 
κατάσταση του φωτεινού σηματοδότη αν βρίσκονται σε μεσαία ή αριστερή λωρίδα και τον προορισμό τους. Στα οχήματα η τιμή της θέσης συμβολίζει το που ξεκινάει το όχημα ως φυσικό
αντικείμενο και για αυτόν τον λόγο θεωρείται ότι κάθε όχημα καταλαμβάνει συνολικά 9 θέσεις ξεκινώντας από την τρέχουσα τιμή της θέσης του(π.χ. ένα όχημα με τρέχουσα θέση την 11000
θεωρείται ότι καταλαμβάνει τις θέσεις 11000-11008). Για κάθε όχημα ορίζεται το σημείο εκκίνησης και το σημείο προορισμού με βάση τις κατευθύνσεις που εισάγονται από τον χρήστη
μέσω της web εφαρμογής. Ακολουθούν οι 12 πορείες που μπορεί να ακολουθήσει ένα όχημα:


* Κατεύθυνση Εκκίνησης: Δυτικά, Κατεύθυνση Προορισμού: Ανατολικά | Σημείο(Θέση) Εκκίνησης: 11000, Σημείο Προορισμού: 11170
* Κατεύθυνση Εκκίνησης: Δυτικά, Κατεύθυνση Προορισμού: Βόρεια | Σημείο Εκκίνησης: 12000, Σημείο Προορισμού: 42170
* Κατεύθυνση Εκκίνησης: Δυτικά, Κατεύθυνση Προορισμού: Νότια | Σημείο Εκκίνησης: 13000, Σημείο Προορισμού: 33170

{empty} +

* Κατεύθυνση Εκκίνησης: Ανατολικά, Κατεύθυνση Προορισμού: Δυτικά | Σημείο Εκκίνησης: 21000, Σημείο Προορισμού: 21170
* Κατεύθυνση Εκκίνησης: Ανατολικά, Κατεύθυνση Προορισμού: Νότια | Σημείο Εκκίνησης: 22000, Σημείο Προορισμού: 32170
* Κατεύθυνση Εκκίνησης: Ανατολικά, Κατεύθυνση Προορισμού: Βόρεια |Σημείο Εκκίνησης: 23000, Σημείο Προορισμού: 43170

{empty} +

* Κατεύθυνση Εκκίνησης: Βόρεια, Κατεύθυνση Προορισμού: Νότια | Σημείο Εκκίνησης: 31000, Σημείο Προορισμού: 31170
* Κατεύθυνση Εκκίνησης: Βόρεια, Κατεύθυνση Προορισμού: Ανατολικά | Σημείο Εκκίνησης: 32000, Σημείο Προορισμού: 12170
* Κατεύθυνση Εκκίνησης: Βόρεια, Κατεύθυνση Προορισμού: Δυτικά | Σημείο Εκκίνησης: 33000, Σημείο Προορισμού: 23170

{empty} +

* Κατεύθυνση Εκκίνησης: Νότια, Κατεύθυνση Προορισμού: Βόρεια | Σημείο Εκκίνησης: 41000, Σημείο Προορισμού: 41170
* Κατεύθυνση Εκκίνησης: Νότια, Κατεύθυνση Προορισμού: Δυτικά | Σημείο Εκκίνησης: 42000, Σημείο Προορισμού: 22170
* Κατεύθυνση Εκκίνησης: Νότια, Κατεύθυνση Προορισμού: Ανατολικά | Σημείο Εκκίνησης: 43000, Σημείο Προορισμού: 13170

{empty} +

Οι αισθητήρες κίνησης τοποθετούνται σε μία συγκεκριμένη σταθερή θέση πριν από το φωτεινό σηματοδότη της λωρίδας τους. Σε κάθε λωρίδα τοποθετούνται πέντε αισθητήρες στη σειρά για την ανίχνευση πέντε οχημάτων. 
Οι αισθητήρες λειτουργούν συμμετρικά σε σχέση με τα οχήματα. Επομένως ένα αισθητήρας καλύπτει ένα εύρος 9 τιμών από την θέση του και 8 θέσεις πριν. Για να γίνει πιο κατανοητός ο τρόπος σχεδιασμού, έστω ένας αισθητήρας 
που βρίσκεται στη θέση 11008 και ένα όχημα που βρίσκεται στην θέση 11000. Στην συγκεκριμένη περίπτωση ο αισθητήρας ανιχνεύει το όχημα καθώς οι μπροστά ρόδες του οχήματος βρίσκονται πάνω από τον αισθητήρα. Στην συνέχεια 
το όχημα κινείται και βρίσκεται πλέον στην θέση 11008. Σε αυτήν την περίπτωση ο αισθητήρας ανιχνεύει πάλι το όχημα καθώς οι πίσω ρόδες του οχήματος βρίσκονται πάνω από τον αισθητήρα. Τέλος το όχημα κινείται λίγο ακόμα και 
βρίσκεται πλέον στην θέση 11009. Σε αυτό το σενάριο ο αισθητήρας που βρίσκεται στην θέση 11008 δεν ανιχνεύει το όχημα καθώς τον έχει προσπεράσει. Οι αισθητήρες κίνησης έχουν τοποθετηθεί με τέτοιο τρόπο έτσι ώστε όταν ένα 
όχημα προσπερνάει έναν αισθητήρα να βρίσκεται στο εύρος τιμών ανίχνευσης του επόμενου. Ακολουθούν οι θέσεις αισθητήρων για τις μεσαίες και αριστερές λωρίδες των δρόμων:

* Λωρίδα 11000: 11008 11017 11026 11035 11044
* Λωρίδα 12000: 12008 12017 12026 12035 12044
* Λωρίδα 21000: 21008 21017 21026 21035 21044
* Λωρίδα 22000: 22008 22017 22026 22035 22044
* Λωρίδα 31000: 31008 31017 31026 31035 31044
* Λωρίδα 32000: 32008 32017 32026 32035 32044
* Λωρίδα 41000: 41008 41017 41026 41035 41044
* Λωρίδα 42000: 42008 42017 42026 42035 42044

{empty} +

Οι φωτεινοί σηματοδότες αντιστοιχούν σε μία λωρίδα(είτε μεσαία είτε αριστερή). Η τρέχουσα κατάσταση τους καθορίζεται από τον κόμβο συντονιστή ο οποίος έχει καθολική εικόνα του οδικού
δικτύου.


== Υλοποίηση Κόμβων Εφαρμογής

Όλοι οι κόμβοι της εφαρμογής εκτός από τον entry handler εκτελούνται ως container στο περιβάλλον docker. Όλα τα containers εκτός από το container που εκτελεί την υπηρεσία 
διαχείρσης βάσεων δεδομένων βασίζονται στο αντίστοιχο Dockerfile. Εκτελώντας το script εκκίνησης της εφαρμογής(start.sh) δημιουργούνται τα εξής docker images για τους αντίστοιχους
κόμβους, μεταφέροντας τα κατάλληλα αρχεία:

* Κόμβος REST API -> cloud_computing_project_api
* Κόμβοι Φωτεινού Σηματοδότη -> cloud_computing_project_traffic_light
* Κόμβοι Αισθητήρων Κίνησης -> cloud_computing_project_sensor
* Κόμβοι Οχημάτων -> cloud_computing_project_vehicle
* Κόμβος Συντονιστή -> cloud_computing_project_coordinator
* Κόμβος web_server -> cloud_computing_project_web_server

=== Κόμβος Διαχείρησης Βάσεων Δεδομένων

Ο κόμβος διαχείρησης βάσεων δεδομένων αποτελεί ένα microservice το οποίο τρέχει MongoDB. Στην MongoDB δημιουργούνται οι βάσεις δεδομένων traffic_lights_db, sensors_db και vehicles_db στις οποίες αποθηκεύεται η
τρέχουσα κατάσταση των φαναριών, των αισθητήρων κίνησης και των οχημάτων αντίστοιχα. Για την ανάγνωση και εγγραφή δεδομένων στην MongoDB τα προγράμματα δεν πραγματοποιούν απευθείας σύνδεση αλλά
πραγματοποιούν αιτήματα στο REST API. Επομένως η MongoDB κατά την διάρκεια εκτέλεσης της εφαρμογής επικοινωνεί μόνο με το REST API. 

=== Κόμβος REST API

Το REST API της εφαρμογής τοποθετείται ανάμεσα στη Βάση Δεδομένων και τους υπόλοιπους κόμβους. Αποτελεί εφαρμογή Node js και για την υλοποίηση του χρησιμοποιήθηκαν τα modules mongodb, cors και express. Μέσω του module
mongodb πραγματοποιείται η σύνδεση στη βάση δεδομένων καθώς και η ανάγνωση/εγγραφή δεδομένων από/σε αυτή. Το module cors ενεργοποιεί το cross origin resource sharing έτσι ώστε η web εφαρμογή να μπορεί να διαβάσει
δεδομένα για την τρέχουσα κατάσταση των στοιχείων του έξυπνου οδικού δικτύου και να τα αναπαραστήσει. Η εφαρμογή Node js παρέχει κατάλληλα URI's στους υπόλοιπους κόμβους μέσω του module express το οποίο αποτελεί web 
framework. Τα URI's της εφαρμογής Node js είναι τα εξής:

* /:database/subscribe

Οι τιμές που μπορεί να πάρει η παράμετρος database είναι "traffic_lights_db", "sensors_db", "vehicles_db". Οι κόμβοι στέλνουν αίτημα στο συγκεκριμένο URI όταν εκκινείται το πρόγραμμα τους για να καταγραφούν ως οντότηα στην
στην κατάλληλη βάση δεδομένων. Ως απάντηση επιστρέφεται το ID που τους ορίστηκε στην βάση δεδομένων. Στην συνέχεια του προγράμματος τους οι κόμβοι μπορούν να χρησιμοποιήσουν το συγκεκριμένο ID για να πραγματοποιήσουν
διάφορες ενέργειες όπως να ενημερώσουν την βάση για την τρέχουσα κατάσταση τους.

{empty} +

* /:database/update

Οι τιμές που μπορεί να πάρει η παράμετρος database είναι "traffic_lights_db", "sensors_db", "vehicles_db". Οι κόμβοι στέλνουν αίτημα στο συγκεκριμένο URI για να ενημερώσουν την τρέχουσα κατάσταση τους. Ο κόμβος συντοντιστής
συγκεκριμένα ρυθμίζει την κατάσταση των φαναριών χρησιμοποιώντας μέσω αυτού το URI.

{empty} +

* "/:database/read"

Οι τιμές που μπορεί να πάρει η παράμετρος database είναι "traffic_lights_db", "sensors_db", "vehicles_db". Οι κόμβοι στέλνουν αίτημα στο συγκεκριμένο URI για να ενημερωθούν για την τρέχουσα κατάσταση των στοιχείων του οδικού
δικτύου. Ο κόμβος συντονιστής διαβάζει τις τιμές των αισθητήρων για να καθορίσει ποια λωρίδα πρέπει να αποκτήσει προτεραιότητα.

{empty} +

* "/:database/discover"

Οι τιμές που μπορεί να πάρει η παράμετρος database είναι "vehicles_db". Το συγκεκριμένο URI χρησιμοποιείται μόνο από τους κόμβους αισθητήρων. Οι αισθητήρες πραγματοποιούν αιτήματα στο URI για να αντιληφθούν αν υπάρχει κάποιο
όχημα στο εύρος θέσεων που καλύπτουν.

{empty} +

* "/:database/look"

Οι τιμές που μπορεί να πάρει η παράμετρος database είναι "traffic_lights_db", "vehicles_db". Το συγκεκριμένο URI χρησιμοποιείται μόνο από τους κόμβους οχημάτων. Τα οχήματα πραγματοποιούν αιτήματα στο URI για να αντιληφθούν
αν υπάρχει κάποιο σταματημένο όχημα μπροστά τους και πρέπει να σταματήσουν. Επίσης ελέγχουν την κατάσταση του φωτεινού σηματοδότη της λωρίδας στην οποία βρίσκονται για να αποφασίσουν αν θα πρέπει να περάσουν ή να σταματήσουν.

{empty} +

* "/:database/delete"

Οι τιμές που μπορεί να πάρει η παράμετρος database είναι "vehicles_db". Το συγκεκριμένο URI χρησιμοποιείται μόνο από τους κόμβους οχημάτων. Τα οχήματα που φτάνουν στον προορισμό τους πραγματοποιούν αίτημα
στο URI έτσι ώστε να διαγραφεί η εγγραφή που τους αντιστοιχεί στη βάση δεδομένων πριν σταματήσει το container.

{empty} +

=== Κόμβοι Φωτεινού Σηματοδότη

Οι κόμβοι φωτεινού σηματοδότη έχουν υλοποιηθεί σε python. Κατά την εκκίνηση του container ορίζεται ως command line argument η λωρίδα στην οποία τοποθετείται ο φωτεινός σηματοδότης. Στην συγκεκριμένη εφαρμογή οι κόμβοι 
δεν πραγματοποιούν κάτι άλλο πέρα από το να διαβάζουν την τιμή της τρέχουσας κατάστασης τους, την οποία ορίζει ο κόμβος συντονιστής. Σε μια υλοποίηση στον πραγματικό κόσμο, το ενσωματομένο σύστημα του φωτεινού σηματοδότη 
θα έπρεπε να πραγματοποιήσει τις κατάλληλες ενέργειες σε επίπεδο υλικού με βάση την καινούργια του κατάσταση.

=== Κόμβοι Αισθητήρων Κίνησης

Οι κόμβοι αισθητήρων κίνησης έχουν υλοποιηθεί σε python. Κατά την εκκίνηση του container ορίζεται ως command line argument η θέση στην οποία τοποθετείται ο αισθητήρας. Οι αισθητήρες πραγματοποιούν αίτημα στο REST API κάθε 100 ms 
για να μάθουν αν βρίσκεται κάποιο όχημα στο εύρος θέσεων που καλύπτουν. Σε περίπτωση που αλλάξει η τιμή του αισθητήρα, ενημερώνει την εγγραφή του στην βάση δεδομένων "sensors_db" με κατάλληλο αίτημα στο REST API.

=== Κόμβοι Οχημάτων

Οι κόμβοι οχημάτων έχουν υλοποιηθεί σε python. Κατά την εκκίνηση του container ορίζονται ως command line arguments το σημείο εκκίνησης και το σημείο προορισμού του οχήματος(μέσω της web εφαρμογής). Τα οχήματα ελέγχουν κάθε 200 ms
αν μπορούν να προχωρήσουν αυξάνοντας την θέση τους κατά 1 με βάση τα δεδομένα που λαμβάνουν μέσω αιτημάτων στο REST API. Για να καθορίσουν αν μπορούν να πραγματοποιήσουν την κίνηση λαμβάνουν υπόψιν τα οχήματα που βρίσκονται μπροστά τους και 
την κατάσταση του φωτεινού σηματοδότη αν βρίσκονται σε μεσαία ή αριστερή λωρίδα. Επίσης ελέγχουν αν θα πρέπει να μεταβάλλουν την θέση τους κατάλληλα για να εισέλθουν σε διαφορετική λωρίδα-δρόμο μετά την πραγματοποίηση στροφής. Αφού φτάσουν στον προορισμό 
τους, τα οχήματα πραγματοποιούν αίτημα στο REST API έτσι ώστε να διαγραφεί η εγγραφή που τους αντιστοιχεί στη βάση δεδομένων πριν σταματήσει το container.

=== Κόμβος Συντονιστή

Ο κόμβος συντονιστής έχει υλοποιηθεί σε python. Ο ρόλος του κόμβου συντονιστή είναι να ρυθμίζει κατάλληλα τους φωτεινούς σηματοδότες έτσι ώστε να ελαχιστοποιείται η συμφόρηση στο έξυπνο οδικό δίκτυο. Κάθε δευτερόλεπτο ο συντονιστής διαβάζει τις τιμές
των αισθητήρων μέσω κατάλληλου αιτήματος στο REST API. Στην συνέχεια υπολογίζει το άθροισμα των αισθητήρων κάθε λωρίδας και ορίζει μία τιμή προτεραιότητας σε κάθε λωρίδα λαμβάνοντας υπόψιν το άθροισμα των αισθητήρων, το χρόνο αναμονής των οχημάτων σε κόκκινο φανάρι 
και πριν από πόσο χρόνο άναψε πράσινο σε μία λωρίδα(αν είναι στην συγκεκριμένη κατάσταση ο φωτεινός σηματοδότης). Με αυτόν τον τρόπο ορίζεται ο φωτεινός σηματοδότης με τη πρώτη προτεραιότητα ο οποίος θα πρέπει να μεταβεί σε κατάταση πράσινου. Στην συνέχεια
υπολογίζεται η λωρίδα με την δεύτερη μεγαλύτερη προτεραιότητα. Για τον υπολογισμό της δεύτερης μεγαλύτερης προτεραιότητας λαμβάνονται υπόψιν μόνο οι τρεις λωρίδες για τις οποίες δεν υπάρχει η πιθανότητα σύγκρουσης με την λωρίδα η οποία έχει την πρώτη προτεραιότητα.
Σε περίπτωση που μία λωρίδα δεν έχει την πρώτη ή την δεύτερη προτεραιότητα και το φανάρι της είναι σε κατάσταση πράσινο, το φανάρι της μεταβαίνει σε κατάσταση πορτοκαλί και ένας μετρητής ξεκινάει να μετράει αντίστροφα. Όταν ο μετρητής γίνει 0 το φανάρι της λωρίδας
μεταβαίνει σε κατάσταση κόκκινο. Στο πρόγραμμα πραγματοποιούνται οι κατάλληλοι έλεγχει έτσι ώστε να μην αλλάζουν τα φανάρια την κατάσταση τους σε πράσινο όταν υπάρχουν 2 φανάρια που βρίσκονται σε κατάσταση πορτοκαλί. Αυτό συμβαίνει για να αποφευχθούν τυχόν συγκρούσεις
καθώς ενδέχεται κάποια οχήματα να μην έχουν προλάβει να περάσουν από την διασταύρωση.

=== Κόμβος Web Server

Ο κόμβος web server έχει υλοποιηθεί με nginx. Παρέχει μία web εφαρμογή στην διεύθυνση 127.0.0.1/8080 όπου ο χρήστης μπορεί να εισάγει νέα οχήματα στο έξυπνο οδικό δίκτυο και να παρατηρεί την κατάσταση του.

=== Κόμβος Entry Handler

Ο κόμβος entry handler αποτελεί ένα πρόγραμμα Node js το οποίο τρέχει στο επίπεδο του host(εκτός docker) και αναμένει αιτήματα από την web εφαρμογή με σκοπό να δημιουργεί containers οχημάτων
με βάση τις επιλογές του χρήστη. Τα containers που δημιουργούνται από το Node js πρόγραμμα εισάγονται στο ίδιο δίκτυο με τα υπόλοιπα containers που έχουν δημιουργηθεί κατά την εκκίνηση
της εφαρμογής.

