Το συγκεκριμένο project υλοποιεί μία μέθοδο επικοινωνίας publish/subscribe χρησιμοποιώντας τον [**RabbitMQ Broker**](https://www.rabbitmq.com/).
Η υλοποίηση αυτή μεταξύ άλλων προσθέτει λειτουργίες όπως, η εγγραφή των ληφθέντων τιμών σε μια βάση με σκοπό την απεικόνισή τους και την αποστολή των ίδιων τιμών σε έναν απομακρυσμένο server για την περαιτέρω επεξεργασία τους.
- Κατεβάζουμε το repo απο το site του swarmlab [link](https://git.swarmlab.io:3000/PurpleRose/RabbitMQ_IoT_Project). Έχουμε στα χέρια μας 5 φακέλους, έναν για κάθε κομμάτι που θα πρέπει να στήσουμε.
## Αrduino
Ξεκινώντας με το Arduino, θα πρέπει να το συνδέσουμε με τον υπολογιστή μας και μέσο της πλατφόρμας Arduino IDE(αν δεν υπάρχει την κατεβάζουμε και την εγκαθιστούμε [link](https://www.arduino.cc/en/software)) να περάσουμε τον κώδικα που βρίσκεται στο αρχείο **readTempValuesFromArduino.ino** στο Arduino.
Πιθανό πρόβλημα κατά τη μεταφορά του κώδικα στο Arduino:
[can't open device "/dev/ttyUSB0": Perm. denied (Linux permissions)]
Λύση:
Ανοίγουμε το τερματικό του συστήματός μας και πληκτρολογούμε:
sudo chmod ugo+w /dev/ttyUSB0
> Την ίδια εντολή πρέπει να τρέξουμε και στο raspberry όταν θα το
> συνδέσουμε με το Αrduino.
#### Σύνδεση του αισθητήρα με το Arduino
Όπως φαίνεται και πιο πάνω στην εικόνα της αρχιτεκτονικής, ο αισθητήρας έχει τρία πόδια **(Vcc, Gnd , values).**
Συνδέουμε λοιπόν το μεσαίο πόδι του αισθητήρα με την αναλογική υποδοχή **Α0 (όπως φαίνεται και στον κώδικα)**
για να μπορούμε να παίρνουμε τις τιμές του, το αριστερό του πόδι στη **τάση (Vcc)** και το δεξί του πόδι στη **γείωση (Gnd)**.
**(1)** Με βάση τον κώδικα για το Arduino μπορούμε να αλλάξουμε το **pin** για τις τιμές του αισθητήρα απο **Α0** σε όποια αναλογική επαφή θέλουμε και αντίστοιχα αλλάζουμε και το **pin** στο κώδικα.
**(2)** Αντίστοιχα μπορούμε να αλλάξουμε τη τιμή στη συνάρτηση **delay** με σκοπό την πιο συχνή ή την πιο αραιή δειγματοληψία.
**(3)** Πατάμε το κουμπί για **compile** και αν δεν υπάρχουν λάθοι στο κώδικα...
**(4)** Πατάμε το κουμπί για **upload** στο Arduino.
## Raspberry
### Producer
Υλοποιούμε τα βήματα σχετικά με το Raspberry που βρίσκονται [εδώ](http://docs.swarmlab.io/SwarmLab-HowTos/labs/IoT/SensorNode2Server.adoc.html) προκειμένου να έχουμε πρόσβαση στη συσκευή.
Εφόσον είμαστε μέσα στη συσκευή μεταφέρουμε τα αρχεία που κατεβάσαμε απο το **repo** και βρίσκονται μέσα στο φάκελο **MyProducer** (producer.js, package.json).
Στη συνέχεια τρέχουμε την εντολή:
npm install
Για να μας κατεβάσει στη συσκευή όλα τα dependencies που χρειάζεται το script producer.js για να τρέξει σωστά.
Και τέλος τρέχουμε την εντολή:
sudo chmod ugo+w /dev/ttyUSB0
Για να μπορεί να στείλει το Arduino δεδομένα μέσο της σειριακής επαφής.
Αν δεν υπάρχει η **ttyUSB0** επαφή για επικοινωνία στο Raspberry τότε τρέχουμε:
ls /dev/tty*
Για να δούμε όλες τις επαφές του Raspberry και σε ποιά είναι συνδεδεμένο το Arduino.
Επαναλαμβάνουμε την εντολη αλλαγής δικαιωμάτων με τη κατάλληλη επαφή.
## Docker
Για να μπορέσουν οι υπόλοιπες υπηρεσίες να τρέχουν θα χρειαστεί να εγκαταστήσουμε το **Docker** και το **Docker Compose** στον τοπικό μας υπολογιστή [link](https://www.docker.com/).
### Consumer
Κατευθυνόμαστε στο φάκελο MyConsumer και ανοίγουμε ένα τερματικό.
Στη συνέχεια τρέχουμε την εντολή:
docker build -t myconsumer .
Η συγκεκριμένη εντολή θα δημιουργήσει ένα **docker image** το οποίο περιέχει ότι χρειάζεται το script consumer.js για να τρέξει.
Στη συνέχεια μπορούμε να τρέξουμε την εντολή:
docker run -it -p 5673:5673 myconsumer
Για να σηκώσουμε έναν **container** απο το συγκεκριμένο **image** για την υπηρεσία του **consumer**.
> Όπως φαίνεται απο την εντολή **run** κάνουμε **expose** τη πόρτα
> **5673** απο τον υπολογιστή μας στην πόρτα **5673** του **container**.
Τέλος ελέγχουμε αν ο container τρέχει με την εντολή:
docker ps
### Server
Την ίδια διαδικασία ακολουθούμε και για την υπηρεσία του **server**.
Κατευθυνόμαστε στο φάκελο MyServer και ανοίγουμε ένα τερματικό.
Στη συνέχεια τρέχουμε την εντολή:
docker build -t atticaregionserver .
Η συγκεκριμένη εντολή θα δημιουργήσει ένα **docker image** το οποίο περιέχει ότι χρειάζεται το script server.js για να τρέξει.
Στη συνέχεια μπορούμε να τρέξουμε την εντολή:
docker run -it -p 4000:4000 atticaregionserver
Για να σηκώσουμε έναν **container** απο το συγκεκριμένο **image** για την υπηρεσία του **server**.
> Όπως φαίνεται απο την εντολή **run** κάνουμε **expose** τη πόρτα
> **4000** απο τον υπολογιστή μας στην πόρτα **4000** του **container**.
Τέλος ελέγχουμε αν ο container τρέχει με την εντολή:
docker ps
### RabbitMQ
Η επόμενη υπηρεσία που θα χρειαστούμε είναι ο **RabbitMQ broker**.
Απο όλες τις λειτουργίες του **RabbitMQ** (fanout κτλπ) εμείς θα χρησιμοποιήσουμε την **Direct exchange**.
Μπορούμε απο εδώ να κάνουμε **overview** την διαδικασία του **produce** και **consume** βλέποντας τα γραφήματα, τις ταχύτητες **consume** και **produce** στο **tab Queues** , τα **connection** που έχουμε και τα **channels**.
Επιπλέον μπορούμε αν θέλουμε να φτιάξουμε έναν δικό μας χρήστη στο **tab Admin**.
3) Στη συνέχεια επιλέγουμε τον χρήστη που φτιάξαμε και το **panel Set permission**, στην επιλογή **Virtual Host** επιλέγουμε **"/"** ώστε να γίνει **admin** ο χρήστης και πατάμε το κουμπί **Set permission**.
### Grafana & InfluxDB
Σε αυτό το σημείο εκτός απο τα **images** του **Grafana** και της **InfluxDB** θα χρειαστούμε και ένα **δίκτυο** προκειμένου να μπορεί να δει αυτόματα το **Grafana** τη βάση.
Όπως φαίνεται και στο παραπάνω αρχείο με το **yml file** σηκώνονται δυο **containers(InfluxDB,Grafana)** οι οποίοι χρησιμοποιούν το κοινό **bridge network** και τα **volumes.**
Εφόσον σηκωθούν οι containers με την εντολή:
docker exec -it influxdb_container sh
Μπορούμε να πάρουμε **shell** μέσα στον container της **InfluxDB**.
Αμέσως μετά πληκτρολογούμε **influx** για να μεταβούμε στο **shell** της **InfluxDB**.
Απο τα αρχεία του κώδικα θα παρουσιαστούν **τα πιο σημαντικά σημεία του** με σκοπό την κατανόηση του τρόπου λειτουργίας (όχι δηλώσεις μεταβλητών κτλπ).
4) Δημιουργεία ενός κενού javascript object με σκοπό να το γεμίσουμε με το όνομα του αισθητήρα και της τιμή που διαβάστηκε απο την σειριακή πόρτα (εφαρμογή της μεθόδου slice για να κόψουμε το "\r" απο τα δεδομένα που διαβάζονται στην σειριακή πόρτα).
1) Αρχικοποίηση των ρυθμίσεων της βάσης με σκοπό να μπορώ να γράψω και να διαβάσω απο αυτή.
Οι τιμές που καταγράφονται στη βάση έχουν το measurement temp , είναι τύπου float και περιγράφονται απο το tag sensor (θα μπορούσε το tag να έχει πολλές τιμές π.χ. building1 , floor2 , room55 με σκοπό να προσδιορίσουμε ακριβώς τη θέση της προερχόμενης τιμής).
4) Έλεγχος των τιμών ανά ζευγάρια των δύο και υπολογισμός αν υπάρχει ποσοστιαία αύξηση ή μείωση αντίστοιχα μεταξύ των τιμών. Αν υπάρχει , τροποποιείται σε αντίστοιχη μορφή το κείμενο του mail.