Αυτό το repository περιέχει την υλοποίηση ενός κατανεμημένου συστήματος πελάτη-εξυπηρετητή (client-server) το οποίο αναλύει αρχεία γεωτοποθεσίας GPX. Το σύστημα επεξεργάζεται σημεία διαδρομής (Waypoints) για να υπολογίσει στατιστικά άσκησης των χρηστών, κατανέμοντας τον φόρτο εργασίας σε πολλαπλούς κόμβους (workers), και παρουσιάζει τα αποτελέσματα μέσω μιας native Android εφαρμογής.
Το σύστημα δέχεται ως είσοδο αρχεία GPX που περιέχουν πληροφορίες διαδρομής (γεωγραφικό πλάτος, μήκος, υψόμετρο και χρόνο). Αξιοποιώντας μια λογική MapReduce, κάνει τα εξής:
- Κατανομή (Map): Ο Master διαβάζει το αρχείο, εξάγει τα Waypoints (μέσω XML parsing), τα "σπάει" σε μικρότερα κομμάτια (chunks των 6 waypoints) και τα μοιράζει στους Workers.
- Υπολογισμός: Οι Workers αναλαμβάνουν τον υπολογισμό των επιμέρους μετρικών.
- Συγκέντρωση (Reduce): Ο Master συγκεντρώνει τα αποτελέσματα και υπολογίζει τα τελικά στατιστικά για τον χρήστη.
- Συγκριτικά Στατιστικά: Το σύστημα διατηρεί ιστορικό εγγραφών ανά χρήστη και υπολογίζει τον γενικό μέσο όρο όλων των διαδρομών. Προσφέρει τη δυνατότητα σύγκρισης της επίδοσης ενός μεμονωμένου χρήστη σε σχέση με τον συνολικό μέσο όρο του συστήματος.
Για τον υπολογισμό της απόστασης μεταξύ δύο γεωγραφικών σημείων, το σύστημα (μέσω των Workers) χρησιμοποιεί τον τύπο Haversine. Δεδομένης της ακτίνας της γης
Όπου
Το project χωρίζεται σε δύο βασικούς φακέλους:
Βρίσκεται στον φάκελο BackEnd/Backend και υλοποιεί τη λογική του διακομιστή σε αρχιτεκτονική Master-Worker.
- Master (
Master.java): Ο κεντρικός διακομιστής. Αναλαμβάνει το parsing των GPX αρχείων, τον διαμοιρασμό και τη συγκέντρωση των δεδομένων. - Workers (
Worker.java,Worker0,Worker1,Worker2): Οι κόμβοι που αναλαμβάνουν την παράλληλη εκτέλεση των υπολογισμών. Κάθε Worker δέχεται αιτήματα και δημιουργεί ένα νέο Thread (RequestHandler) για την ασύγχρονη επεξεργασία. - Δεδομένα:
User.java: Μοντέλο που διατηρεί το προφίλ και τα αθροιστικά στατιστικά κάθε χρήστη.Waypoint.java: Αναπαριστά ένα μεμονωμένο γεωγραφικό στίγμα (latitude,longitude,elevation,time).
- Configuration (
workers.conf): Αρχείο ρυθμίσεων που διαβάζεται δυναμικά και περιέχει τις IP διευθύνσεις και τις πόρτες των διαθέσιμων Workers.
Βρίσκεται στον φάκελο FrontEnd/Frontend και αποτελεί τη διεπαφή χρήστη (client). Είναι μια native Android εφαρμογή (com.example.a_myapplication).
- Διαχείριση Σύνδεσης (Singleton Pattern): Η εφαρμογή ξεκινά με την οθόνη
Start.java, η οποία αναλαμβάνει να δημιουργήσει την TCP σύνδεση με τον Master Server (μέσωAsyncTask). Το ενεργό Socket διατηρείται κεντρικά μέσω της κλάσηςSocketManager.java(Singleton), εξασφαλίζοντας ότι η ίδια σύνδεση χρησιμοποιείται σε ολόκληρη την εφαρμογή. - Αρχική Οθόνη (
Home.java): Διαθέτει ενσωματωμένο File Picker για την επιλογή αρχείων.gpxαπό τη συσκευή. Αφού το αρχείο αποσταλεί και επεξεργαστεί, η οθόνη ενημερώνεται δυναμικά με τα συνολικά στατιστικά. Φροντίζει επίσης για τον ασφαλή τερματισμό της σύνδεσης με τον server κατά το κλείσιμο (αποστολή null object). - Οπτικοποίηση Δεδομένων (
Diagram.java): Η εφαρμογή χρησιμοποιεί τη βιβλιοθήκη MPAndroidChart για να δημιουργήσει δυναμικά ραβδογράμματα (Bar Charts). Οι χρήστες μπορούν να αναζητήσουν το όνομά τους και να δουν γραφικά την ποσοστιαία απόκλιση της επίδοσής τους (σε Απόσταση, Ανάβαση και Χρόνο) σε σχέση με τον γενικό μέσο όρο.
- Java Development Kit (JDK)
- Android Studio
- Ανοίξτε τον φάκελο
BackEnd/Backendστο IDE της επιλογής σας. - Βεβαιωθείτε ότι το αρχείο ρυθμίσεων
workers.confβρίσκεται στο root του project. - Ξεκινήστε πρώτα τους Workers εκτελώντας τις κλάσεις
Worker0.java,Worker1.javaκαιWorker2.java. - Εκτελέστε την κλάση
Master.java(τρέχει στην πόρτα 9999).
- Ανοίξτε τον φάκελο
FrontEnd/Frontendστο Android Studio. - Πραγματοποιήστε συγχρονισμό του Gradle (
build.gradle). - Ανοίξτε την κλάση
Start.javaκαι βεβαιωθείτε ότι έχετε ρυθμίσει τη σωστή IP διεύθυνση του Master Server (π.χ. αλλάξτε το192.168.1.28στην τοπική σας IP, ή σε10.0.2.2αν τρέχετε τον κώδικα σε Android Emulator). - Τρέξτε την εφαρμογή στη συσκευή ή τον Emulator σας.