Home » M2M GSM - Nokia - Aplicom 12i - TBOX Teltonika » Τηλεδιαχείριση ηλεκτρομηχανολογικού εξοπλισμού αντλιοστασίων – Μία M2M/Client-Server εφαρμογή

Τηλεδιαχείριση ηλεκτρομηχανολογικού εξοπλισμού αντλιοστασίων – Μία M2M/Client-Server εφαρμογή


Τηλεδιαχείριση ηλεκτρομηχανολογικού εξοπλισμού αντλιοστασίων – Μία M2M/Client-Server εφαρμογή

Περίληψη

Η παρούσα δημοσίευση αφορά ένα απλοποιημένο σύστημα τηλεδιαχείρισης – τηλεελέγχου του ηλεκτρομηχανολογικού εξοπλισμού που είναι εγκατεστημένος σε κάποιο αντλιοστάσιο ύδρευσης – αποχέτευσης. Με απλές προγραμματιστικές τεχνικές δημιουργούμε έναν πληροφοριοδότη εντός του αντλιοστασίου, ο οποίος παρακολουθεί την κατάσταση του εξοπλισμού και σε τακτά διαστήματα ενημερώνει το κέντρο ελέγχου (π.χ. το γραφείο της υπηρεσίας), κάνοντας χρήση του διαδικτύου και του GSM δικτύου κινητής τηλεφωνίας. Παρουσιάζεται ο ηλεκτρονικός εξοπλισμός που απαιτείται για την υλοποίηση του συστήματος και ο κώδικας σε γλώσσα JAVA που αναλαμβάνει να μεταδίδει την πληροφορία μέσω του διαδικτύου και του GSM δικτύου. Το σύστημα ανήκει στην ευρεία ομάδα Μ2Μ (machine to machine) ηλεκτρονικών εφαρμογών και δουλεύει ως Client-Server (πελάτης – εξυπηρέτης).

Clipboard01

Απαιτούμενος εξοπλισμός

#Ένα PC με υποστήριξη προγραμματισμού σε περιβάλλον J2EE και σύνδεση στο INTERNET

#Λογισμικό Eclipse Indigo με plugin το EclipseMe και Obfuscator το Proguard, πρότυπες συσκευές κινητών από το WTK 2.5.2 και το Nokia Concept Simulator 1.0 και βιβλιοθήκη την Nokia 12 SDK

#Λογισμικό Nokia ή Aplicom Configurator για την μεταφορά του εκτελέσιμου κώδικα στο GSM modem

#Λογαριασμό στο www.noip.com για παροχή DNS υπηρεσίας

#Ένα GSM modem με υποστήριξη προγραμματισμού σε περιβάλλον J2ME (nokia 12 ή aplicom 12)

#Μία κάρτα SIM με δυνατότητα σύνδεσης στο INTERNET μέσω GPRS

#Έναν (ή δύο) μετατροπέα TCP-IP/RS232 (π.χ. WizNet 110SR)

Κέντρο ελέγχου ως Server

Εγκατάσταση του www.noip.com

Η ενέργεια αυτή είναι άκρως απαραίτητη διότι θα βοηθήσει να λυθεί το εξής πρόβλημα: όταν συνδέουμε σε μία τηλεφωνική adsl γραμμή τον ρούτερ που μας έδωσε ο πάροχος του ιντερνετ, την στιγμή που του δίνουμε ρεύμα, ξεκινάει μία αυτόματη διαδικασία πιστοποίησης username και password (όπως τα έδωσε ο πάροχος και τα καταχωρήσαμε στη μνήμη του ρούτερ). Εάν η διαδικασία πιστοποίησης είναι επιτυχής τότε ο ρούτερ μας αποκτάει μία μοναδική διαδικτυακή διεύθυνση αναγνώρισης (IP) της μορφής ΧΧΧ.ΧΧΧ.ΧΧΧ.ΧΧΧ, όπου Χ αριθμητικό ψηφίο. Κάθε φορά που επανεκινούμε το ρούτερ ή μετά από ορισμένες ημέρες λειτουργίας, ο πάροχος μας προσδίδει νέα διεύθυνση ΙΡ. Αυτό σημαίνει ότι εάν μία άλλη απομακρυσμένη συσκευή θέλει να συνδεθεί με το δικό μας ρούτερ, μέσω του διαδικτύου, θα πρέπει να βρεθεί ένας τρόπος ώστε η συσκευή να γνωρίζει αυτή τη νέα διεύθυνση ΙΡ.

Το πρόβλημα αυτό επιλύεται χρησιμοποιώντας μία διαδικτυακή υπηρεσία (DNS) στην οποία δηλώνουμε κατά κάποιο τρόπο την σύνδεσή μας για να παρακολουθείται οποιαδήποτε αλλαγή στην IP. Ο καλύτερος τρόπος είναι αυτό να γίνεται μέσα από το ρούτερ, δηλαδή το ρούτερ να υποστηρίζει μία τέτοια ενέργεια (βλ. φωτό). Στην περίπτωσή μας χρησιμοποιείται ένα παλιό ρούτερ, το philips cga3600n te, το οποίο υποστηρίζει αυτή τη δυνατότητα, μόνο όμως για τις επί πληρωμή υπηρεσίες http://www.dyndns.org και http://www.tzodns.com.

Clipboard02

Αν το ρούτερ δεν υποστηρίζει τέτοια υπηρεσία τότε θα πρέπει να υπάρχει ένας υπολογιστής, συνεχώς συνδεμένος με το τοπικό δίκτυο του ρούτερ, στον οποίο θα είναι εγκατεστημένη μία ειδική εφαρμογή που ενημερώνει την διαδικτυακή υπηρεσία (DNS) για την τρέχουσα ΙΡ του ρούτερ. Πρώτη μας ενέργεια είναι να δημιουργήσουμε λογαριασμό στο www.noip.com, το οποίο παρέχει την επιθυμητή υπηρεσία χωρίς πληρωμή. Πατάμε το πράσινο πλήκτρο Sign Up Now

Clipboard02

εμφανίζεται η επόμενη σελίδα στην οποία καταχωρούμε το username, password και το email στο οποίο θα σταλεί ειδικός σύνδεσμος ενεργοποίησης του λογαριασμού.

Clipboard02

Εάν τα στοιχεία δώθηκαν σωστά εμφανίζεται η οθόνη επιβεβαίωσης, η οποία μας ενημερώνει ότι πρέπει να πάμε στο email μας

Clipboard02

για να ενεργοποιήσουμε τον λογαριασμό. Στην περίπτωσή μας χρησιμοποιήθηκε hotmail, και το περιεχόμενο όταν ανοίξουμε το email θα μοιάζει ως εξής:

Clipboard02

Μετά την ενεργοποίηση του λογαριασμού μας στο www.noip.com, μπαίνουμε στην κεντρική του σελίδα, δίνουμε username και password και επιλέγουμε στην πάνω αριστερή γωνία Hosts/Redirects για να δημιουργήσουμε κάποια αντιστοίχηση. Εάν έχουμε δημιουργήσει παλιότερες αντιστοιχήσεις αυτές θα απεικονισθούν όπως στην παρακάτω φωτογραφία.

Clipboard02

Υπάρχει ένας περιορισμός εδώ, επιτρέπονται μέχρι 3 αντιστοιχήσεις, λογικό μιας και επιλέξαμε την υπηρεσία χωρίς πληρωμή. Βέβαια προσφέρονται πακέτα με περισσότερες δυνατότητες, κατόπιν πληρωμής. Πατώντας το κουμπάκι Add a Host εμφανίζεται η ακόλουθη εικόνα.

Clipboard02

Αν κοιτάξουμε προσεκτικά θα δούμε ότι έχει αναγνωριστεί η τρέχουσα IP μας και η ιστοσελίδα περιμένει να δώσουμε στην θέση Hostname μία κωδική ονομασία που επιθυμούμε. Φροντίζουμε ως Host Type να είναι επιλεγμένη η επιλογή DNS Host (A) και πατάμε το κουμπί Add Host τέρμα κάτω στην γωνία δεξιά της ιστοσελίδας. Αυτό ήταν! Όποια ΙΡ και να λάβει το ρούτερ μας, δεν μας ενοχλεί αφού το μόνο που χρειάζεται να θυμόμαστε είναι η πλήρης γραμματική αντιστοίχηση, δηλαδή η πλήρης αντιστοίχηση hostname.zapto.org “δείχνει” στο δικό μας ρούτερ ανεξάρτητα από το ποιά είναι η τρέχουσα ΙΡ του και ανεξάρτητα από το ποιόν υπολογιστή (είτε βρίσκεται στο τοπικό δίκτυο είτε βρίσκεται σε άλλη χώρα) προσπαθήσουμε να “δούμε” το ρούτερ μας. Για την ακρίβεια, χρειάζεται ένα βήμα ακόμη, ώστε να ισχύει το παραπάνω συμπέρασμα. Χρειάζεται ο μηχανισμός που σε τακτά διαστήματα θα ενημερώνει την DNS υπηρεσία για την τρέχουσα ΙΡ του ρούτερ μας. Ο μηχανισμός αυτός απαιτεί από εμάς 3 στοιχεία: username, password και την πλήρη αντιστοίχηση που δημιουργήσαμε στο λογαριασμό μας εντός του www.noip.com. Ο μηχανισμός αυτός είναι το ίδιο το ρούτερ, αν υποστηρίζει αυτή την δυνατότητα ή το λογισμικό που προσφέρει δωρεάν η υπηρεσία DNS (βλ. φωτό).

Clipboard02

Εγκαθιστώντας το λογισμικό στον υπολογιστή, με την βοήθεια του οποίου κάναμε την παραπάνω διαδικασία και δίνοντας username, password έχουμε τελειώσει με τον μηχανισμό συνεχούς ενημέρωσης της ΙΡ (βλ. φωτό).

Clipboard02

Ρύθμιση του ρούτερ – Άνοιγμα πόρτας (port forwarding)

Το ερώτημα που τίθεται τώρα είναι πως μπορούμε να αποκτήσουμε πρόσβαση στον υπολογιστή μας από έναν άλλο υπολογιστή, π.χ. εγκατεστημένο στη Νέα Υόρκη? Για να γίνει αυτό θέλει ακόμη λίγη δουλειά. Για την ακρίβεια πρέπει πρώτα να καθορίσουμε το είδος της πρόσβασης, δηλαδή θέλουμε να μπορούμε να κάνουμε τα πάντα σαν να εργαζόμασταν πραγματικά πάνω στον υπολογιστή μας, θέλουμε απλώς να έχουμε πρόσβαση σε ορισμένους φακέλους με αρχεία, θέλουμε απλώς να στείλουμε κάποια δεδομένα στον υπολογιστή και αυτός αφού τα επεξεργαστεί να μας ανταπαντήσει? Πολλά θα μπορούσαν να είναι τα θέλω μας. Ανεξάρτητα όμως από τα θέλω μας, πριν φύγουμε για τη Νέα Υόρκη θα πρέπει να “πούμε” στο ρούτερ μας ότι θέλουμε να αφήσει μία “πόρτα” ανοιχτή και ότι αυτή η πόρτα πρέπει να οδηγεί στον υπολογιστή μας.

Clipboard02

Το παραπάνω στιγμιότυπο δείχνει ποιά είναι η μορφή του πίνακα μέσα στον οποίο μπορούμε να δηλώσουμε ποιές πόρτες θέλουμε να αφήσει ανοιχτές το ρούτερ μας. Τα περισσότερα ρούτερ πλέον έχουν τέτοιο πίνακα, που μπορούμε να τον εμφανίσουμε βρίσκοντας την επιλογή ΝΑΤ και την υποεπιλογή Virtual Server. Στην στήλη LAN IP δίνονται οι τοπικές διευθύνσεις των δικτυακών συσκευών που “βλέπει” το ρούτερ. Για να πούμε δηλαδή στο ρούτερ ότι θέλουμε να έχει ανοιχτή την πόρτα 7000 με σκοπό να δούμε απομακρυσμένα τον υπολογιστή μας μέσα από αυτή θα πρέπει να γνωρίζουμε την τοπική δικτυακή ΙΡ του υπολογιστή μας.

Clipboard02

Αυτό είναι σχετικά εύκολο, στα Windows XP για παράδειγμα μπορούμε να εμφανίσουμε την παραπάνω εικόνα με απλό αριστερό κλικ στο εικονίδιο της τοπικής σύνδεσης, κάτω δεξιά στην οθόνη. Έτσι μαθαίνουμε ποιά ΙΡ έδωσε το ρούτερ στον υπολογιστή μας. Στην περίπτωσή μας η τοπική ΙΡ του υπολογιστή είναι 192.168.123.100. Υπάρχει όμως ο κίνδυνος, εάν και άλλες δικτυακές συσκευές είναι συνδεμένες στο τοπικό δίκτυο του ρούτερ, μετά από κάποια επανεκίνηση του ρούτερ να αλλάξει η τοπική ΙΡ του υπολογιστή, οπότε η πόρτα να δείχνει άλλη συσκευή πλέον. Αυτό αποφεύγεται με το να δώσουμε στατική ΙΡ στον υπολογιστή μας.

Clipboard01

Ακόμη όμως δεν πρέπει να φύγουμε για τη Νέα Υόρκη. Πρέπει να εκπαιδεύσουμε τον υπολογιστή μας να “ακούει” τα κουδουνίσματα στην πόρτα με αριθμό 7000 να ελέγχει ποιός είναι και να απαντάει αναλόγως. Αυτό επιτυγχάνεται με την εγκατάσταση στον υπολογιστή ενός λογισμικού τύπου Server. Περισσότερες λεπτομέρειες παρακάτω. Τώρα μπορούμε να φύγουμε ταξίδι, μην ξεχάσουμε όμως τον υπολογιστή κλειστό, θα πρέπει να παραμείνει ενεργός.

Παραδείγματα απομακρυσμένης πρόσβασης

Στην περίπτωσή μας, ο υπολογιστής στον οποίο εφαρμόστηκε η παραπάνω διαδικασία είναι μέλος ενός τοπικού δικτύου με άλλες 2 τουλάχιστον δικτυακές συσκευές. Μία από αυτές συλλέγει τα δεδομένα φωτοβολταϊκής εγκατάστασης (Sunny Webbox) και η άλλη είναι δικτυακός δίσκος (Airlive WMU 6500FS). Σε κάθε μία από αυτές τις συσκευές υπάρχει εγκατεστημένος web server που ακούει και απαντά σε μία συγκεκριμένη πόρτα. Π.χ. ο δίσκος ακούει στην πόρτα 2005 και το webbox στην πόρτα 15000. Από τη Νέα Υόρκη, δίνοντας σε κάποιον browser την διεύθυνση hostname.zapto.org:πόρτα, όπου πόρτα=2005 ή 15000.

Clipboard02

ιστοσελίδα που εμφανίζεται με την κλήση hostname.zapto.org:15000

Clipboard02

ιστοσελίδα που εμφανίζεται με την κλήση hostname.zapto.org:2005

Εγκατάσταση του WTK 2.5.2

Πηγαίνουμε στην επόμενη διεύθυνση: http://download.oracle.com/otn/java/sun_java_wireless_toolkit/2.5.2_01/sun_java_wireless_toolkit-2.5.2_01-win.exe. Αν δεν έχουμε λογαριασμό στην Oracle δημιουργούμε έναν με σκοπό να μας επιτραπεί το κατέβασμα του αρχείου sun_java_wireless_toolkit-2.5.2_01-win.exe. Εκτελούμε το κατεβασμένο αρχείο και δηλώνουμε τον φάκελο εγκατάστασης των περιεχομένων. Θυμόμαστε τον φάκελο αυτό γιατί θα χρειαστεί να τον δηλώσουμε κατά την διάρκεια της παραμετροποίησης του Eclipse παρακάτω.

146007

Εγκατάσταση του Nokia Concept Simulator 1.0 (357)

Πρόκειται για λογισμικό προσομοίωσης που έχει κατασκευάσει η Nokia για τον έλεγχο του κώδικα πριν τον μεταφέρουμε εντός του TBOX 12. Αφού εγκαταστήσουμε τον φάκελο με τα αρχεία του στον σκληρό δίσκο, εντοπίζουμε τον υποφάκελο devices του υποφακέλου wtklib του αρχικού φακέλου εγκατάστασης του WTK 2.5.2. Εκεί μέσα μεταφέρουμε όλο τον φάκελο του προσομοιωτή.

fig03-2-149386

Εγκατάσταση του Proguard

Μεταφερόμαστε στην διεύθυνση http://sourceforge.net/projects/proguard/files/ για να κατεβάσουμε την τελευταία σταθερή έκδοση του Proguard. Αποσυμπιέζουμε το κατεβασμένο αρχείο σε κάποιον φάκελο, τον οποίο θυμόμαστε για να τον δηλώσουμε παρακάτω στο eclipse.

screenshot_gui1

Εγκατάσταση του Eclipse Indigo και EclipseMe

Αφού κατεβάσουμε το indigo στον υπολογιστή (αυτόν που θα παίξει τον ρόλο του Server) αποσυμπιέζουμε τον υποφάκελο eclipse στον σκληρό δίσκο, π.χ. C:\eclipse, και εκτελούμε το αρχείο C:\eclipse\eclipse.exe. Με αυτό τον τρόπο φορτώνεται το περιβάλλον ανάπτυξης λογισμικού σε κώδικα Java. Εκκρεμεί το να ενεργοποιήσουμε το περιβάλλον J2ME, που είναι κατάλληλο για την κατασκευή κώδικα σε κινητά τηλέφωνα. Από το μενού επιλέγουμε Help->Install New Software και στο κουτί διαλόγου Install, στην  θέση Work with εισάγουμε την διεύθυνση http://eclipseme.org/updates, πατάμε το πλήκτρο Add και στο κουτί διαλόγου Add Repository δίνουμε ένα όνομα στην θέση Name. Πατώντας το πλήκτρο OK γίνεται αυτόματη ανίχνευση της διαθέσιμης για

Clipboard02

εγκατάσταση έκδοσης του eclipseme (βλ. φωτό). Τσεκάρουμε στην λίστα το eclipseme, αφήνουμε τις υπόλοιπες παραμέτρους ως έχουν, πατάμε το πλήκτρο Next, περιμένουμε να γίνει ο απαραίτητος έλεγχος εξαρτήσεων, ξαναπατάμε Next, διαβάζουμε τους όρους άδειας χρήσης, αν συμφωνούμε τσεκάρουμε την επιλογή I accept the terms of the license agreement για να απελευθερωθεί το πλήκτρο Finish, το οποίο πατάμε για να ξεκινήσει η εγκατάσταση.

Clipboard01

Στην κάτω δεξιά γωνία της οθόνης ενημερωνόμαστε για την πορεία της εγκατάστασης (βλ. φωτό).

Clipboard02

Είναι πιθανό κατά την εγκατάσταση να προκύψει θέμα ασφαλείας λόγω εγκατάστασης ανυπόγραφου περιεχομένου (βλ. φωτό). Αναγκαστικά πατάμε το πλήκτρο ΟΚ για να συνεχιστεί η εγκατάσταση. Με αυτό τον τρόπο το eclipseme εγκαταστάθηκε μέσα στο eclipse ως plugin. Στο τέλος της εγκατάστασης επιλέγουμε να γίνει επανεκίνηση για να γίνει σωστή παραμετροποίηση του eclipseme μέσα στο περιβάλλον εργασίας.

Clipboard01

Η ίδια διαδικασία ακολουθείται για την εγκατάσταση άλλων plugin. Στην περίπτωσή μας δεν απαιτείται κάποιο πρόσθετο plugin.

Στην συνέχεια, αφού κλείσουμε το eclipse, θα πρέπει να προσθέσουμε μία παράμετρο μέσα στο αρχείο config.ini, το οποίο βρίσκεται στην θέση c:\eclipse\configuration\.

Clipboard01

Ελέγχουμε αν υπάρχει ήδη η παράμετρος osgi.framework.extensions= οπότε σε αυτή την περίπτωση προσθέτουμε την φράση ,eclipseme.core.hooks (μαζί με το κόμμα μπροστά) στο τέλος του αρχείου, δημιουργούμε μία κενή γραμμή πατώντας Enter και σώζουμε το αρχείο. Εάν δεν υπάρχει ήδη η παράμετρος osgi.framework.extensions= τότε προσθέτουμε στο τέλος του αρχείου osgi.framework.extensions=eclipseme.core.hooks (δεν ξεχνάμε την κενή γραμμή στο τέλος).

Κάνοντας επανεκκίνηση στο eclipse, μέσα από το μενού επιλέγουμε Window->Preferences και από το δέντρο επιλογών επιλέγουμε J2ME->Device Management.

Clipboard02

Πατάμε το κουμπί Import και στο νέο παράθυρο διαλόγου πατάμε το κουμπί Browse.

Clipboard02

Μέσα από αυτή τη διαδικασία βρίσκουμε και δηλώνουμε τον φάκελο στον οποίο εγκαταστάθηκε το WTK 2.5.2.

Clipboard02

Πατάμε ΟΚ και στο προηγούμενο παράθυρο Import Devices πατάμε το κουμπί Refresh με σκοπό να ανιχνευθούν όλες οι συσκευές που πιθανόν υπάρχουν στο WTK 2.5.2.

Clipboard02

Όπως φαίνεται στην ανωτέρω φωτό, ανιχνεύθηκαν 5 συσκευές, 4 εκ των οποίων είναι εγκατεστημένες στο WTK 2.5.2 από προεπιλογή και μία (η Nokia_12_IMP_1_0_Concept_Simulator_1_0) που προσθέσαμε εμείς. Πατάμε ΟΚ και στο παράθυρο Preferences τσεκάρουμε την συσκευή Nokia_12_IMP_1_0_Concept_Simulator_1_0.

Clipboard02

Στο ίδιο παράθυρο, από τις δενδροειδείς επιλογές, επιλέγουμε Java->Debug και φροντίζουμε οι επιλογές Suspend execution on uncaught exceptions και Suspend execution on compilation errors να μην είναι τσεκαρισμένες και η τιμή του Debugger timeout να είναι 15000ms. Τις υπόλοιπες επιλογές αφήνουμε όπως προεπιλέχθηκαν.

Clipboard02

Στο ίδιο παράθυρο, από τις δενδροειδείς επιλογές, επιλέγουμε J2ME->Packaging->Obfuscation και δηλώνουμε τον φάκελο στον οποίο εγκαταστάθηκε το Proguard.

Clipboard02

(υπό συνεχή διόρθωση)

Αντλιοστάσιο ως Client

Στοιχεία για το GSM modem

Nokia 12 Datasheet ( Marketing PDF ) (429)
Aplicom Configurator v2.70 (439)
Nokia Concept Simulator 1.0 (357)
Development Board Specifications (466)
Nokia 12 Software Developers Guide (669)
Nokia 12 IMLET Programming Guide (591)
Sun Java Wireless Toolkit 2.5.2_01 (270)
Aplicom 12 GSM Module Specs (507)
Nokia 12 User Control Mode Guide (392)
Nokia 12 Hardware Integration Manual (515)
Sun J2SDK 1.4.1.02 ( Windows ) (267)
Nokia 12 Interface Definition Reference Guide (398)
Nokia 12 AT Command Guide v2.1 (744)
Nokia 12 SDK ( Re-released by Aplicom ) (388)

Nokia12_GSM_Module_feature_1 T-BoxN12R – Data sheet (450kB PDF)
Nokia12_GSM_Module_feature_1 T-BoxN12R – First Steps (450kB PDF)
Nokia12_GSM_Module_feature_1 T-BoxN12R – User Manual (490kB PDF)
Nokia12_GSM_Module_feature_1 T-BoxRelay – Data sheet (1.24MB PDF) 

Nokia12_GSM_Module_feature_1 Nokia 12 – Data sheet (410kB PDF)
Nokia12_GSM_Module_feature_1 Nokia 12 – Hardware integration manual (820kB PDF)
Nokia12_GSM_Module_feature_1 Nokia 12 – Software developers guide (1.42MB PDF)
Nokia12_GSM_Module_feature_1 Nokia 12 – API definition reference guide (1.27MB PDF)
Nokia12_GSM_Module_feature_1 Nokia 12 – Properties reference guide (1.02MB PDF)
Nokia12_GSM_Module_feature_1 Nokia 12 – User control mode (SMS) guide (860kB PDF)
Nokia12_GSM_Module_feature_1 Nokia 12 – Remote I/O control (SMS) guide (900kB PDF)
Nokia12_GSM_Module_feature_1 Nokia 12 – IMlet programming guide (1.76MB PDF)
Nokia12_GSM_Module_feature_1 Nokia 12 – IMP Concept Simulator installation guide (280kB PDF)

Nokia12_GSM_Module_feature_1 Using AT commands to send and receive SMS from a computer
Nokia12_GSM_Module_feature_1 Step-by-step J2ME IMlet development primer for T-Box controllers 

Clipboard01

Clipboard01

Clipboard01

1

(υπό συνεχή διόρθωση)

Προγραμματισμός – Κατασκευή του κώδικα σε JAVA
Έχοντας εκτελέσει τα παραπάνω βήματα για το στήσιμο του εξοπλισμού και του απαραίτητου λογισμικού, είμαστε έτοιμοι να παράγουμε κώδικα σε JAVA, να τον δοκιμάσουμε και αποσφαλματοποιήσουμε.
Κώδικας java στην μνήμη του Tbox Nokia 12

Οι επεξηγήσεις δίνονται μέσα στις γραμμές του κώδικα ως σχόλια κλεισμένα εντός της συμβολοσειράς /* */

package com.nokia.m2m.sdk.examples.http;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import javax.microedition.io.Connector;
import javax.microedition.io.HttpConnection;
import javax.microedition.io.StreamConnection;
import javax.microedition.midlet.MIDlet;
import javax.microedition.midlet.MIDletStateChangeException;

import com.nokia.m2m.imp.iocontrol.IOControl;

public class HTTPIMlet extends MIDlet {
OutputStream os = null;
InputStream is = null;
StreamConnection sc = null;
HttpConnection httpconn = null;
DataInputStream httpin = null;
DataOutputStream httpout = null;
String glbl=””;
IOControl ioc;
boolean timer_on=false;

public void startApp() throws MIDletStateChangeException {
try {

/*Ανοίγουμε την σειριακή θύρα com3 του Tbox Nokia 12 με ρυθμό μετάδοσης δεδομένων 115200 bits/sec και δυνατότητα ανάγνωσης – εγγραφής*/
sc = (StreamConnection) Connector.open(“comm:3;baudrate=115200”, Connector.READ_WRITE);

/*Ανοίγουμε την ροή os αποστολής δεδομένων στην com3*/
os = sc.openOutputStream();

/*Ανοίγουμε την ροή is λήψης δεδομένων από την com3*/
is = sc.openInputStream();

/*Ανοίγουμε το στιγμιότυπο ioc αναφοράς και ρύθμισης κατάστασης εισόδων – εξόδων του Tbox Nokia 12*/
ioc=IOControl.getInstance();

/*Περιμένουμε 30.000 milisecond για να δωθεί ο απαραίτητος χρόνος στην κάρτα sim να συνδεθεί με το GSM δίκτυο*/
Thread.sleep(30000);
}

/*Η ροή του κώδικα μεταφέρεται εδώ εάν συμβεί οποιοδήποτε σφάλμα, πχ σφάλμα ανάγνωσης-εγγραφής στην com3*/
catch (Exception e) {}

/*Έναρξη της παράλληλης διεργασίας blinker, αναβοσβήνει περιοδικά 2 εξόδους*/

new Thread(new blinker()).start();

/*Έναρξη της παράλληλης διεργασίας nokiaserver, στέλνει δεδομένα στην διεύθυνση http://mez5.no-ip.org:15101 κάθε πέντε λεπτά, και ανεβάζει πληροφορίες αποσφαλμάτωσης στην com3*/
new Thread(new nokiaserver()).start();

/*Έναρξη της παράλληλης διεργασίας timer, ανεβάζει πληροφορίες τρέχοντος χρόνου στην com3 κάθε 5 δευτερόλεπτα*/
new Thread(new timer()).start();
}

class timer implements Runnable {
public void run(){
long mil1=0;
long mil=0;

/*Έναρξη κυκλικής διεργασίας*/
while (true) {

/*ο δείκτης timer_on είναι δημόσιος, οπότε η τιμή του μπορεί να μεταβληθεί από άλλες διεργασίες και να επηρεαστεί η ροή αυτής της διεργασίας*/

/*Εάν ο δείκτης timer_on είναι false τότε μηδένισε το χρονόμετρο*/
if (timer_on==false) {
mil=System.currentTimeMillis();
mil1=mil;
}

/*Εάν ο δείκτης timer_on είναι true και έχουν περάσει πέντε δευτερόλεπτα από τον προηγούμενο κύκλο τότε ανέβασε στην com3 τον χρόνο που πέρασε από τον μηδενισμό*/
if (((System.currentTimeMillis()-mil1)>=5000) && (timer_on==true)) {
mil1=System.currentTimeMillis()-mil;

/*Στείλε την πληροφορία του χρόνου στην com3*/
log(String.valueOf(mil1/1000));
mil1=System.currentTimeMillis();
}
}
}
}

class nokiaserver implements Runnable {
public void run(){

/*Έναρξη κυκλικής διεργασίας*/
while (true) {
try {

/*Στείλε στην com3 σήμα ότι εκτελείται η διεργασία send_mez5_signals*/
log(“\n”+System.currentTimeMillis()+” send_mez5_signals start”);

/*Εκτέλεσε την διεργασία send_mez5_signals*/
send_mez5_signals(“http://mez5.no-ip.org:15101”, paramscollect(), “”);

/*Στείλε στην com3 σήμα ότι ολοκληρώθηκε η διεργασία send_mez5_signals και πως ξεκίνησε ένα timeout 5 λεπτών*/
log(System.currentTimeMillis()+” sleeping-starting timer”);

/*timeout 5 λεπτών*/
Thread.sleep(5*60000);

/*θέσε timer_on=false, επηρεάζει την διεργασία timer μηδενίζοντας το χρονόμετρο, σταματά η αποστολή χρόνου στην com3*/
timer_on=false;
log(System.currentTimeMillis()+” wokeup”);
}
catch (InterruptedException e) {

/*Συνέβη σφάλμα, στείλε την πληροφορία στην com3*/
log(System.currentTimeMillis()+” InterruptedException “+e.getMessage());

/*θέσε timer_on=false, επηρεάζει την διεργασία timer μηδενίζοντας το χρονόμετρο, σταματά η αποστολή χρόνου στην com3*/
timer_on=false;}
catch (IOException e) {

/*Συνέβη σφάλμα, στείλε την πληροφορία στην com3*/
log(System.currentTimeMillis()+” IOException “+e.getMessage());

/*θέσε timer_on=false, επηρεάζει την διεργασία timer μηδενίζοντας το χρονόμετρο, σταματά η αποστολή χρόνου στην com3*/
timer_on=false;}
}
}
}

/*Διεργασία αποστολής δεδομένων του client προς τον server*/

public void send_mez5_signals(String url, String props, String msg) throws IOException {

/*Άνοιξε μία σύνδεση τύπου http και ενημέρωσε σχετικά την πόρτα com3*/
httpconn = (HttpConnection) Connector.open(url);log(System.currentTimeMillis()+” open”);

/*Προετοίμασε τις επικεφαλίδες του πακέτου http*/
httpconn.setRequestMethod(HttpConnection.POST);
httpconn.setRequestProperty(“Content-Type”,”application/x-www-form-urlencoded”);
httpconn.setRequestProperty(“User-Agent”, “HttpMidlet/0.2”);

/*Συμπεριέλαβε και την αναφορά εισόδων-εξόδων στην επικεφαλίδα*/
httpconn.setRequestProperty(“Custom-Property”,props);
httpconn.setRequestProperty(“Content-length”, “” + msg.getBytes().length);

/*Άνοιξε μία ροή εξόδου δεδομένων τύπου http και ενημέρωσε σχετικά την πόρτα com3*/
httpout = httpconn.openDataOutputStream();log(System.currentTimeMillis()+” openDataOutputStream”);

/*Γράψε τα δεδομένα στην ροή εξόδου*/
httpout.write(msg.getBytes());

/*Σπρώξε τα δεδομένα και ενημέρωσε σχετικά την πόρτα com3*/
httpout.flush();log(System.currentTimeMillis()+” flush”);

/*θέσε timer_on=true, επηρεάζει την διεργασία timer ξεκινώντας την αποστολή χρόνου στην com3*/
timer_on=true;

/*Άνοιξε μία ροή εισόδου δεδομένων και ενημέρωσε σχετικά την πόρτα com3, θέλει προσοχή γιατί μπλοκάρει μέχρι να εισέλθουν-αναγνωσθούν δεδομένα, αυτό θα γίνει μόνο αν o server πήρε το πακέτο και απάντησε θετικά, το μπλοκάρισμα δεν διαρκεί επάπειρον, φαίνεται ότι μετράται χρόνος 240 δευτερολέπτων και εγείρεται σφάλμα σύνδεσης με τον server, γεγονός που σημαίνει ότι η ροή διακόπτεται εδώ όταν εμφανίζεται τέτοιο σφάλμα*/
httpin = httpconn.openDataInputStream();log(System.currentTimeMillis()+” openDataInputStream”);
if (httpconn != null) {
try {
httpconn.close();log(System.currentTimeMillis()+” httpconn.close”);
} catch (Exception ignored) {}
}
if (httpout != null) {
try {
httpout.close();log(System.currentTimeMillis()+” httpout.close”);
} catch (Exception ignored) {}
}
if (httpin != null) {
try {
httpin.close();log(System.currentTimeMillis()+” httpin.close”);
} catch (Exception ignored) {}
}
}

class blinker implements Runnable {
public void run() {
while (true) {
try {
ioc.setDigitalOutputPin(9,true);Thread.sleep(500);
ioc.setDigitalOutputPin(9,false);Thread.sleep(500);
}
catch (Exception e) {}
}
}
}

public String paramscollect(){
glbl=””;
try {
for (int i=1;i<4;i++) {
glbl=glbl+”ANIN”+i+”/”+ioc.getAnalogInputPin(i)+”; “;
}
for (int i=5;i<=11;i++) {
if ((ioc.getDigitalInputPin(i))==true){
glbl=glbl+”IN”+i+”/1; “;
} else {
glbl=glbl+”IN”+i+”/0; “;
}
}
for (int i=2;i<=9;i++) {
if ((ioc.getDigitalOutputPin(i))==true){
glbl=glbl+”OUT”+i+”/1; “;
} else {
glbl=glbl+”OUT”+i+”/0; “;
}
}
} catch (Exception e) {}
return glbl;
}

private void log(String msg) {
if (os != null && msg != null) {
msg=”\n”+msg;
try {os.write(msg.getBytes());}
catch (IOException ignored) { }
}
}
/*Η διεργασία http_close δεν χρησιμοποιείται στην εκτέλεση του κώδικα είναι όμως απαραίτητη*/
public void http_close(){
}

public void pauseApp() {
}

public void destroyApp(boolean arg0) throws MIDletStateChangeException {
}
}

Καταγραφές αποσφαλμάτωσης client

1381238171000 send_mez5_signals start
1381238175000 open
1381238175000 openDataOutputStream
1381238175000 flush
1381238179000 openDataInputStream
1381238179000 httpconn.close
1381238179000 httpout.close
1381238179000 httpin.close
1381238179000 sleeping-starting timer
5
10
15
20
25
30
35
40
45
50
55
60
65
70
75
80
85
90
95
100
105
110
115
120
125
130
135
140
145
150
155
160
165
170
175
180
185
190
195
200
205
210
215
220
225
230
235
240
245
250
255
260
265
270
275
280
285
290
295
300
1381238479000 wokeup

1381238479000 send_mez5_signals start
1381238483000 open
1381238483000 openDataOutputStream
1381238483000 flush
5
10
15
20
25
30
35
40
45
50
55
60
65
70
75
80
85
90
95
100
105
110
115
120
125
130
135
140
145
150
155
160
165
170
175
180
185
190
195
200
205
210
215
220
225
230
235
240
245
1381238731000 IOException null

1381238731000 send_mez5_signals start
1381238735000 open
1381238735000 openDataOutputStream
1381238735000 flush
5
10
15
20
25
30
35
40
45
50
55
60
65
70
75
80
85
90
95
100
105
110
115
120
125
130
135
140
145
150
155
160
165
170
175
180
185
190
195
200
205
210
215
220
225
230
235
240
245
1381238982000 IOException null

1381238982000 send_mez5_signals start
1381238987000 open
1381238987000 openDataOutputStream
1381238987000 flush
1381238990000 openDataInputStream
1381238990000 httpconn.close
1381238990000 httpout.close
1381238990000 httpin.close
1381238990000 sleeping-starting timer
5
10
15
20
25
30
35
40
45
50
55
60
65

Καταγραφές του server

8/10/2013 1:29:54 ìì
count=1
Custom-Property:ANIN1/0; ANIN2/0; ANIN3/0; IN5/0; IN6/1; IN7/0; IN8/0; IN9/0; IN10/0; IN11/0; OUT2/0; OUT3/0; OUT4/0; OUT5/0; OUT6/0; OUT7/0; OUT8/0; OUT9/0;

_______________________________________________________________________________________________________________________
Διευθ. Τεχν. Υπηρ. ΔΕΥΑ Καλλικράτειας
Χατζηλιόντος Ι. Χριστόδουλος
Χημικός Μηχανικός ΠΕ7/Βαθμός Γ
Msc Περ. Σχ. Έργων Υποδομής

/*Ανοίγουμε την ροή αποστολής δεδομένων στην com3*/


Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: