ΚΑΤΑΝΕΜΗΜΕΝΟ ΣΥΣΤΗΜΑ ΔΙΑΧΕΙΡΙΣΗΣ ΣΥΣΚΕΥΩΝ ΑΣΗΜΑΚΟΠΟΥΛΟΣ ΣΩΤΗΡΗΣ ΑΜ : 3021 18 Οκτωβρίου 2006
Η εργασία είχε σαν στόχο να δημιουργηθεί ένα κατανεμημένο σύστημα ελέγχου συσκευών μιας κουζίνας.συγκεκριμένα υπάρχει ένας κεντρικός server στον οποίο συνδέοονται οι συσκευές οι οποίες μπορεί να είναι κουζίνα,πλυντήριο πιάτων κ.α.έτσι αυτές οι συσκευές με την επίκλυση των απομακρυσμένων μεθόδων (RMI) μπορούν να επικοινωνούν με τον server χρησιμοποιώντας στην ουσία μεθόδους του.αυτό αποτελεί και μία εισαγωγή στο τι ακριβώς είναι το rmi το οποίο όμως θα εξηγήσω και παρακάτω. RMI :Είναι ένα API με το οποίο η java υλοποιεί τον κατανεμημένο προγραμματισμό.μέσω του rmi ένας client μπορεί να καλέσει μια public μέθοδο του server.πχ να εκτελεί ερωτήματα στην βάση δεδομένων που βρίσκεται στον server χρησιμοποιώντας συναρτήσεις του, μειώνοντας έτσι και την κυλοφοριακή συμφόρηση στο δίκτυο και δημιουργεί μία συνγχρονισμένη εφαρμογή. Πιο συγκεκριμένα το rmi αποτελείται από το επίπεδο σκελετού /στελέχους, το επίπεδο αναφοράς και το επίπεδο μεταφοράς. Επιγραμματικά το στέλεχος δρά σαν υποκατάστατο του server στο μηχάνημα του client ενώ ο σκελετός βρίσκεται στον server και είναι υπεύθυνο για την επικοινωνία με το στέλεχος.αυτό ήταν μια εισαγωγή για το πώς περίπου δουλεύει το rmi.δεν θα προχωρήσω και στα άλλα 2 επίπεδα αλλά θα προχωρήσω λίγο για το τι πρέπει να κάνουμε σε έναν κώδικα για να υλοποιήσουμε τις απομακρυσμένες μεθόδους.. 1.Υλοποιούμε την διασύνδεση remote που που βρίσκεται στο πακέτο java.rmi και απλώς δείχνει ποιες μέθοδοι είναι απομακρυσμένες επιτρέποντας στους clients την πρόσβαση μέσω του rmi:// αφου βέβαια επεκτείνουν την java.rmi.remote 2.Χρησιμοποιούμε την κλάση Naming για την αντιστοιχία ονομάτων με απομακρυσμένα αντικείμενα..
3.Χρησιμοποιούμε την rmi.server η οποία είναι αφηρημένη και ορίζει μεθόδους που χρησιμοποιούνται για την δημιουργία και εξαγωγή αντικειμένων 4.Επίσης κάθε φορά που θέλουμε να δημιουργήσουμε ένα αντικείμενο επεκτείνουμε την κλάση UnicastRemoteObject Αυτή ήταν μια γενική επισκόπηση για το τι πρέπει να κάνουμε σε επίπεδο υλοποίησης. Ας γίνουμε όμως πιο συγκεκριμένοι περιγράφοντας και την δική μας εφαρμογή. Στην αρχή ξεκινήσανε με την δημιουργία της βάσης μας Smart- Devices που βρίσκεται στον server και επικοινωνούμε με αυτή μέσω του jdbc-odbc οδηγού αφού την εισάγουμε στο odbc μέσω του control panel των Windows
Τώρα όσον αφορά την εφαρμογή μας.αυτή αποτελείται από 8 κλάσεις Οι κλάσεις SqlConnection,DatabaseDefinitions και connection_class υλοποιούν την σύνδεση με την βάση.συγκεκριμένα η πρώτη υλοποιεί το real connection με την βάση και την εξαγωγή δεδομένων-εισαγωγή χρησιμοποιώντας τα στοιχεία από τη δεύτερη και τα queries από την τρίτη.απλώς για λόγους ασφαλείας και δομημένου προγραμματισμού βρίσκονται σε ξεχωριστές κλάσεις και αρχεία Στην συνέχεια υλοποιούμε το interface DeviceRMI σύμφωνα και με τα παραπάνω που περιέχει τις μεθόδους του server που μπορούν να καλούν οι συσκευές όπως το να στέλνει τις μετρήσεις κτλ public interface DeviceRMI extends java.rmi.remote int receive_device_info(int devid,string devbrandname,string devmodel,string tupdate) throws java.rmi.remoteexception; void receive_error(int devid,boolean x,int y) throws java.rmi.remoteexception; void receive_temperature(int devid,int temp) throws java.rmi.remoteexception; void make_offline(int devid) throws java.rmi.remoteexception; boolean receive_flag() throws java.rmi.remoteexception; Η κλάση DeviceServer είναι και η κεντρική κλάση του server που δημιουργεί και το αντικείμενο που θα βλεπουν απομακρυσμένα οι συσκευές.η υλοποίηση των απομακρυσμένων μεθόδων(είναι αυτές που επικοινωνούν και με την βάση) βρίσκεται στο DeviceRMIImpl καθώς και άλλες βοηθητικές συναρτήσεις του server. import java.rmi.*; import java.rmi.server.*;
//κλάση που αρχικοποιεί τον server public class DeviceRMIServer // public DeviceRMIServer() // public static void main(string args[]) // System.setSecurityManager(new RMISecurityManager()); try DeviceRMIImpl mydevice; mydevice = new DeviceRMIImpl("myDeviceRMI"); System.out.println("Server ready"); catch(exception e) System.out.println("Exception: " + e.getmessage()); e.printstacktrace();
Περιγραφή της DeviceRMIImpl import java.rmi.remoteexception; import java.rmi.server.unicastremoteobject; import java.text.simpledateformat; import java.util.date; public class DeviceRMIImpl extends UnicastRemoteObject implements DeviceRMI // Fields static int sum_devices; static int test; boolean flag; Date time_now; String output; SimpleDateFormat formatter; // Constructors public DeviceRMIImpl(String string) throws RemoteException // Methods public int receive_device_info(int _int, String string, String string2, String string3) throws RemoteException return 0; public void receive_temperature(int _int, int _int1) throws RemoteException public void receive_error(int _int, boolean _boolean, int _int2) throws RemoteException public boolean receive_flag() throws RemoteException return false; public void make_offline(int _int) throws RemoteException protected String[][] write_rss_file(int _int, int _int1) return null; protected void write_file(string[][] stringarray, int _int) Στην συνέχεια έχουμε την κλάση DeviceRMIClient όπου περιγράφει μια συσκευή Και αφού κάνει μια αναφορά στο DeviceRMI καλεί τις μεθόδους του DeviceRMI mydevice = (DeviceRMI) Naming.lookup("rmi://127.0.0.1/myDeviceRMI");
Επίσης υλοποιήσαμε και την main_server που πάλι τρέχει απομακρυσμένα από τον server και απλώς υλοποιεί ένα περιβάλλον για τον χρήστη για να δει τις μετρήσεις του server κτλ Τέλος,χρησιμοποιήσαμε και το rss πρωτόκολλο για την δημιουργία ενός xml αρχείου όταν η θερμοκρασία μιας συσκευής ανέβει απότομα. Αυτή ήταν μια απλή και συνοπτική περιγραφή του συστηματός μας