Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

11 Commits
 
 
 
 
 
 

Repository files navigation

Distributed Systems Project: GPX Activity Tracker

Αυτό το repository περιέχει την υλοποίηση ενός κατανεμημένου συστήματος πελάτη-εξυπηρετητή (client-server) το οποίο αναλύει αρχεία γεωτοποθεσίας GPX. Το σύστημα επεξεργάζεται σημεία διαδρομής (Waypoints) για να υπολογίσει στατιστικά άσκησης των χρηστών, κατανέμοντας τον φόρτο εργασίας σε πολλαπλούς κόμβους (workers), και παρουσιάζει τα αποτελέσματα μέσω μιας native Android εφαρμογής.

Σκοπός και Λειτουργικότητα

Το σύστημα δέχεται ως είσοδο αρχεία GPX που περιέχουν πληροφορίες διαδρομής (γεωγραφικό πλάτος, μήκος, υψόμετρο και χρόνο). Αξιοποιώντας μια λογική MapReduce, κάνει τα εξής:

  • Κατανομή (Map): Ο Master διαβάζει το αρχείο, εξάγει τα Waypoints (μέσω XML parsing), τα "σπάει" σε μικρότερα κομμάτια (chunks των 6 waypoints) και τα μοιράζει στους Workers.
  • Υπολογισμός: Οι Workers αναλαμβάνουν τον υπολογισμό των επιμέρους μετρικών.
  • Συγκέντρωση (Reduce): Ο Master συγκεντρώνει τα αποτελέσματα και υπολογίζει τα τελικά στατιστικά για τον χρήστη.
  • Συγκριτικά Στατιστικά: Το σύστημα διατηρεί ιστορικό εγγραφών ανά χρήστη και υπολογίζει τον γενικό μέσο όρο όλων των διαδρομών. Προσφέρει τη δυνατότητα σύγκρισης της επίδοσης ενός μεμονωμένου χρήστη σε σχέση με τον συνολικό μέσο όρο του συστήματος.

Μαθηματικά Μοντέλα

Για τον υπολογισμό της απόστασης μεταξύ δύο γεωγραφικών σημείων, το σύστημα (μέσω των Workers) χρησιμοποιεί τον τύπο Haversine. Δεδομένης της ακτίνας της γης $R \approx 6371.0$ km, η απόσταση $d$ υπολογίζεται ως εξής:

$$a = \sin^2\left(\frac{\Delta \phi}{2}\right) + \cos(\phi_1) \cos(\phi_2) \sin^2\left(\frac{\Delta \lambda}{2}\right)$$ $$c = 2 \cdot \text{atan2}\left(\sqrt{a}, \sqrt{1 - a}\right)$$ $$d = R \cdot c$$

Όπου $\phi$ είναι το γεωγραφικό πλάτος (latitude) και $\lambda$ το γεωγραφικό μήκος (longitude) σε ακτίνια.

Αρχιτεκτονική Συστήματος

Το project χωρίζεται σε δύο βασικούς φακέλους:

1. Backend (Java)

Βρίσκεται στον φάκελο 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.

2. Frontend (Android)

Βρίσκεται στον φάκελο 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

  1. Ανοίξτε τον φάκελο BackEnd/Backend στο IDE της επιλογής σας.
  2. Βεβαιωθείτε ότι το αρχείο ρυθμίσεων workers.conf βρίσκεται στο root του project.
  3. Ξεκινήστε πρώτα τους Workers εκτελώντας τις κλάσεις Worker0.java, Worker1.java και Worker2.java.
  4. Εκτελέστε την κλάση Master.java (τρέχει στην πόρτα 9999).

Εκτέλεση Frontend

  1. Ανοίξτε τον φάκελο FrontEnd/Frontend στο Android Studio.
  2. Πραγματοποιήστε συγχρονισμό του Gradle (build.gradle).
  3. Ανοίξτε την κλάση Start.java και βεβαιωθείτε ότι έχετε ρυθμίσει τη σωστή IP διεύθυνση του Master Server (π.χ. αλλάξτε το 192.168.1.28 στην τοπική σας IP, ή σε 10.0.2.2 αν τρέχετε τον κώδικα σε Android Emulator).
  4. Τρέξτε την εφαρμογή στη συσκευή ή τον Emulator σας.

About

A distributed Master-Worker system built with Java and Android that processes GPX files to track and analyze user activity statistics using MapReduce logic.

Topics

Resources

Stars

Watchers

Forks

Releases

Packages

Contributors

Languages