GUI Entwicklung eines Labor-ServiceSystems zur Darstellung von Überwachungsdaten und grafischer Auswertung eingereicht am 12.01.2011 von Martin Guse | Voßstraße 65 |18059 Rostock Matrikel-Nr.: 5200097 Betreuer: Dipl.-Wirt.--Ing. Benjamin Wagner Dipl.-Ing. Christian Fabian Betreuender Hochschullehrer: Prof. Dr.-Ing. Dirk Timmermann Projektarbeit Fakultät für Informatik und Elektrotechnik Inhaltsverzeichnis Abbildungsverzeichnis...............................................................................................................iv Tabellenverzeichnis.....................................................................................................................v 1. Einleitung.....................................................................................................................................1 1.1 Thematischer Hintergrund und Zielstellung..............................................................................1 1.2 Gliederung der Arbeit................................................................................................................1 2. Grundlagen..................................................................................................................................3 2.1 Sensor Web Enablement............................................................................................................3 2.1.1 Sensor Observation Service...............................................................................................4 2.1.2 SensorML – Sensor Model Language................................................................................8 2.1.3 O&M – Observation and Measurements..........................................................................10 2.2 Web-2.0-Anwendungsentwicklung mit dem Google Web Toolkit..........................................12 2.2.1 GWT Java-nach-JavaScript-Kompiler.............................................................................13 2.2.2 GWT Development Mode...............................................................................................14 2.2.3 Google Web Toolkit API-Klassenbibliothek....................................................................16 2.2.4 GWT-Einstieg an einem kleinen Beispiel........................................................................18 2.3 Das User-Interface-Framework ExtGWT................................................................................23 2.3.1 Widgets des ExtGWT.......................................................................................................24 2.4 OX-Framework als Bindeglied zwischen Sensor Observation Service und Java-Servlet.......25 3. SOSGui – Grafisches Benutzerinterface zur Datenabfrage und Visualisierung für ein ortsbasiertes Servicesystem......................................................................................................28 3.1 Das Einsatzumfeld – Hard- und Software für das ortsbasierte Servicesystem........................29 3.1.1 Sensorknoten und Fox-Board als Datenquelle für den Sensor Observation Service.......30 3.1.2 SOS-Implementierung von 52° North..............................................................................33 3.1.3 UroSweClient als Container für die grafische Oberfläche...............................................33 3.1.4 UroSweClient-Portlet-Schnittstelle für die GUI..............................................................34 3.2 SOSGui – Struktur der Quellen...............................................................................................37 3.2.1 Serverpaket der SOSGui..................................................................................................38 3.2.2 Clientpaket der SOSGui...................................................................................................38 3.3 SOSGui – Klassenentwurf.......................................................................................................39 3.3.1 Serverpaket.......................................................................................................................39 3.3.2 Clientpaket.......................................................................................................................40 4. Zusammenfassung und Ausblick.............................................................................................42 Anhang.......................................................................................................................................43 Literaturverzeichnis..................................................................................................................52 iii Abbildungsverzeichnis Abbildung 2.1: OpenGIS-Spezifikationen des Sensor Web Enablement.............................................3 Abbildung 2.2: Profile des Sensor Observation Service und die dazugehörigen Operationen............4 Abbildung 2.3: Schema einer GetCapabilities Antwort.......................................................................5 Abbildung 2.4: Inhalt eines SensorML-Dokumentes...........................................................................9 Abbildung 2.5: Struktur eines SensorML-Dokumentes.....................................................................10 Abbildung 2.6: Elemente eines O&M-Dokumentes...........................................................................11 Abbildung 2.7: Elemente des result-Abschnittes in einem O&M-Dokument....................................12 Abbildung 2.8: GWT-Kernkomponenten...........................................................................................13 Abbildung 2.9: Verzeichnisstruktur eines war-Files...........................................................................14 Abbildung 2.10: GWT Development Mode window.........................................................................15 Abbildung 2.11: Browser-Fenster mit GWT-Beispiel-Anwendung...................................................16 Abbildung 2.12: GWT-Projekt-Struktur.............................................................................................18 Abbildung 2.13: Klassen für den RPC-Service..................................................................................20 Abbildung 2.14: GWT-Beispiel nach Ausführung eines RPC............................................................23 Abbildung 2.15: Widget-Beispiele im Ext GWT Explorer Demo......................................................24 Abbildung 2.16: Drei-Stufen-Architektur des OX-Frameworks........................................................26 Abbildung 3.1: Ablauf eines Versuches..............................................................................................28 Abbildung 3.2: Frontend der SOSGui................................................................................................29 Abbildung 3.3: Struktur eines Sensornetzes.......................................................................................30 Abbildung 3.4: Zusammenwirken der Komponenten eines Sensorknotens.......................................30 Abbildung 3.5: Sensorknoten aus Battery Board und Target Board..................................................31 Abbildung 3.6: UroSweClient als Container für die GUI..................................................................34 Abbildung 3.7: Ablauf beim Zugriff auf eine Funktion der Oberfläche............................................35 Abbildung 3.8: SOSGui Paketstruktur...............................................................................................37 Abbildung 3.9: SOSGui Schichten des Serverpaketes.......................................................................38 Abbildung 3.10: SOSGui Schichten des Clientpaketes......................................................................39 iv Tabellenverzeichnis Tabelle 2.1: Antwort-Felder des Observation Offering........................................................................6 Tabelle 2.2: Parameter für die DescribeSensor-Operation...................................................................7 Tabelle 2.3: Parameter der GetObservation-Operation........................................................................8 Tabelle 2.4: GWT-Widget-Sammlung................................................................................................17 Tabelle 3.1: Funktionen zur Messwertanalyse 1................................................................................28 Tabelle 3.2: Funktionen zur Messwertanalyse 2................................................................................29 Tabelle 3.3: Hardware des eZ430-RF2480 Demo Kit........................................................................31 Tabelle 3.4: Interne Peripherie des MSP430F2274............................................................................32 v 1. Einleitung 1. Einleitung 1.1 Thematischer Hintergrund und Zielstellung Die Laborautomatisierung in einem Analytiklabor soll Operationen wie Temperieren und Dosieren sowie Überwachen von Messwerten automatisiert durchführen. Ziele der Automatisierung ist die Senkung von Kosten durch eine Parallelisierung der Laborprozesse sowie Erhöhung der Reproduzierbarkeit durch immer gleich bleibende Arbeitsschritte. Diese Anforderungen erfordern eine Spezialisierung der Automatisierungseinrichtung. Dem gegenüber steht, dass eine schnelle Wiederverwendbarkeit des Laborreaktors eine gewisse Flexibilität der Messeinrichtung erfordert um die unterschiedlichen Prozessparameter mit notwendigen Genauigkeit zu erfassen. Durch eine Automatisierung von Prozessabläufen ist der Mensch nicht mehr direkt am Prozess beteiligt. Dies erfordert eine nachvollziehbare, durchgängige Überwachung. Um diesen Erfordernissen zu genügen, wurde im Rahmen der Diplomarbeit von Dipl.-Wirt. Ing. Benjamin Wagner ein ortsbasiertes Servicesystem entwickelt [1], welches die Arbeit des Laborpersonals unterstützen soll. Die geforderte Flexibilität der Messeinrichtung wurde durch den Einsatz von drahtlosen Sensorknoten in einem Sensornetzwerk sicher gestellt. Diese Sensorknoten sollen Parameter der Umgebung, wie zum Beispiel die Temperatur, Kohlenmonoxid- oder Wasserstoffgehalt, erfassen. Da die Sensoren über eine Funkschnittstelle die Messwerte an eine Basisstation übertragen, ist es notwendig, dass diese Sensorknoten über ein Verfahren zur Ortsbestimmung verfügen, um jedem Messwert auch einem Messzeitpunkt zuordnen zu können. Ziel dieser Arbeit ist die Entwicklung einer grafische Oberfläche, die es dem Laborpersonal ermöglicht unkompliziert auf aktuelle und historische Messwerte des Sensornetzwerkes zuzugreifen. Dieses grafische Benutzerinterface soll sich in die, im Rahmen einer Vorentwicklung entstandenen Oberfläche einbinden. Dazu ist die Portletarchitektur1 des Gesamtsystems entsprechend zu erweitern. Die Umsetzung erfolgte mit Hilfe des Google Web Toolkits als JavaScript-Anwendung, die in jedem Webbrowser lauffähig ist. Um eine ansprechendes und einheitliches Design der Oberfläche zu erhalten, wurde auf die Bibliothek ExtGWT zurück gegriffen. Der Nutzer soll die Möglichkeit erhalten Sensordaten visualisiert darzustellen. Die ExtGWT-Bibliothek bietet hier eine einfache Möglichkeit Messwerte als Diagramm zu anschaulich zu machen. Durch umfassende Auswertemöglichkeiten soll der Anwender in die Lage versetzt werden, auch nicht offensichtliche Zusammenhänge zwischen verschiedenen Messkurven zu erkennen. 1.2 Gliederung der Arbeit Basis für diese Arbeit bildet der Sensor Observation Service als Bestandteil der Sensor Web Enablement. Kapitel 2.1 liefert eine Einordnung dieses Service in das Sensor Web Enablement. Kapitel 2.1.1 befasst sich genauer mit dem Sensor Observation Service und dessen Operationen. In den anschließenden beide Kapiteln werden die Informationsschemas des Sensor Web Enablement beleuchtet, die vom Sensor Observation Service verwendet werden. 1In einer Portletarchitektur können beliebige Komponenten einer Benutzeroberfläche kombiniert werden. Portlets stellen Codefragmente zur Verfügung, die auf einer Portalseite zusammengefügt werden. 1 1. Einleitung In Kapitel 2.2 wird das Google Web Toolkit beschrieben, welches die Basis für die Visualisierung bildet. Der Java nach JavaScript-Kompiler ist die Hauptkomponente des GWT und wird in Kapitel 2.2.1 beschrieben. Anschließend wird auf die Entwicklung von GWT-Anwendungen mit Hilfe des GWT Development Mode eingegangen. Ein weitere Bestandteil des Google Web Toolkit ist dessen Klassenbibliothek. Kapitel 2.2.3 beleuchtet diese. Im letzten Kapitel über das Google Web Toolkit wird eine kleine Beispielanwendung vorgestellt, die die in vorherigen Kapiteln beschriebenen Mittel einsetzt. Für die Gestaltung der Oberfläche wird das User Interface Framework ExtGWT von Sencha Inc. benutzt. Eine Übersicht liefert Kapitel 2.3. Die Widgets des Frameworks und deren Arbeitsweise beschreibt Kapitel 2.3.1. Als letztes Kapitel der Grundlagen wird das OWS Access Framework von 52° North untersucht. Es ist das Bindeglied zwischen dem Sensor Observation Service und der GWT-Gui. Ziel dieser Arbeit ist ein Grafisches Benutzerinterface in der Laborautomatisierung. In Kapitel 3 wird die Umsetzung und die Probleme dabei beschrieben. Zuerst wird ein Überblick über die zu Grunde liegende Hard- und Software gegeben. Die Datenquelle ist Thema in Kapitel 3.1.1. Der Leser soll in die Lage versetzt werden, die Struktur der Daten im Sensor Observation Service zu verstehen, um sie später erweitern zu können. Der SOS ist nur die Spezifikation einer Schnittstelle. Kapitel 3.1.2 liefert Informationen über die Implementation. Die letzten beiden Kapitel befassen sich mit dem UroSweClient, der diese Gui am Ende aufnehmen soll. Besonders wichtig ist hier das Kapitel 3.1.4, wo die Schnittstelle zur Einbindung der Oberfläche beschrieben wird. Die Struktur der Anwendung wird in 3.2 beschrieben. Jeweils ein Kapitel widmet sich dem Serverpaket und eines dem Clientpaket. Auf die Quellen und deren Besonderheiten wird in 3.3 eingegangen. Ergebnisse und Möglichkeiten werden im vierten Kapitel Zusammenfassung und Ausblick beschrieben. 2 2. Grundlagen 2. Grundlagen 2.1 Sensor Web Enablement Ein Sensor Web bietet Zugriff auf das Sensornetzwerk und deren aufgezeichneten Daten durch Nutzung standardisierter Protokolle und Programmierinterfaces. Das Open Geospatial Consortium Inc. begann unter dem Namen Sensor Web Enablement die Entwicklung eines Frameworks aus offenen Standards um auf beliebige Sensordaten aus dem Netz zuzugreifen. Durch Nutzung der Hyper Text Markup Language und dem Hypertext Transfer Protocol ist es möglich beliebige Informationen im Internet zur Verfügung zu stellen. Das Rahmenwerk bietet Schnittstellen um Sensoren zu finden, diese zu steuern sowie Sensordaten auszutauschen. Der Standard benutzt dazu eine Reihe von OpenGIS-Spezifikationen. [2][3] In den Informationsmodellen sind Sensoren oder Messdaten als Metadaten mit ihrer Kodierung gespeichert. Die Servicemodelle beschreiben die angebotenen Dienste durch Nutzung der Informationsmodelle. Abbildung 2.1: OpenGIS-Spezifikationen des Sensor Web Enablement Zur Beschreibung von Sensoren wird das XML-Schema Sensor Model Language eingesetzt. Das SensorML-Dokument enthält Prozessmetadaten, Basisinformationen, räumliche oder zeitliche Einschränkungen, Fähigkeiten und Charakteristiken der Prozesse, Kontaktinformationen sowie Referenzen. Observation & Measurement spezifiziert Beobachtungen und Messungen. Dies können aktuelle (Echtzeit-)Werte sein oder auch abgespeicherte Werte. Auch hier wird XML zur Beschreibung eingesetzt. Die Transducer Markup Language wird genau wie O&M zur Beobachtung und Messung eingesetzt. Durch die Übertragung von Datenblöcken als Cluster eignet es sich gut für die Übertragung von Datenströmen, wie beispielsweise Kameraaufnahmen. 3 2. Grundlagen 2.1.1 Sensor Observation Service Der Sensor Observation Service ist das Kernmodul des Sensor Web Enablement. Um auf Sensoren, Sensordaten und Messwerte zuzugreifen, stehen verschiedene Schnittstellen zur Verfügung. Diese Schnittstellen sind in Profile eingeteilt, das Core Operations Profile, das Transactional Operations Profile und das Enhanced Operations Profile. Für eine dem Standard entsprechende Implementierung ist nur das Core Operations Profile notwendig, die anderen beiden Profile sind hinreichend. In jedem Profil sind Operationen für den Sensor Observation Service definiert. Eine Übersicht der Operationen und Profile ist in der Abbildung 2.2 zu sehen. Die am häufigsten eingesetzte Operation des Core Operations Profile ist GetObservation. Sie liefert auf Anfrage die Beobachtungswerte mit Metadaten. Die Messwerte werden im Observation & Measurement Format kodiert. Um korrekte Anfragen an den SOS stellen zu können, sind Informationen wie zum Beispiel angebotene Operationen, Zeitraum der Messung, beobachtete Phänomene und verfügbare Sensoren notwendig. Die GetCapabilities-Operation liefert diese Informationen als XML-Beschreibung zurück. Abbildung 2.2: Profile des Sensor Observation Service und die dazugehörigen Operationen DescribeSensor liefert Metadaten der Sensoren im SensorML-Format. Der zurückgelieferte Datensatz enthält die Sensor ID, Position des Sensors oder auch die beobachteten Phänomene. Die verwendeten Informationsmodelle SensorML und O&M sollen in eigenen Kapiteln genauer betrachtet werden. Im Rahmen dieser Arbeit wurden nur die Core-Operationen verwendet. Deshalb werden folgend alle Information zur Anwendung dieser Befehle aufgezeigt. Für ausführliche Infor- 4 2. Grundlagen mationen auch über Transactional Operations Profile- und Enhanced Operations Profile-Anweisungen empfiehlt sich das Studium von [4]. GetCapabilities Diese Operation stellt dem Client Informationen über den spezifizierten Dienst zur Verfügung, und stellt den Einstiegspunkt zum Zusammenstellen von Anfragen an den Sensor Observation Service dar. Es ist der einzige Befehl der HTTP-GET zur Argumentübertragung nutzen kann. Dadurch kann zur Testzwecken der SOS-Server direkt über einen Browser angesprochen werden. Folgende Adresse stellt einen gültigen Aufruf dar. http://localhost:8080/52nSOSv3_WAR/sos?REQUEST=GetCapabilities&SERVICE=SOS Per HTTP-GET werden der Adresse zwei Parameter mitgegeben. Der Wert für das REQUEST-Argument bezeichnet die Operation, die der Sensor Observation Service ausführen soll. Zur Ausführung dieser Operation ist ein zweiter Parameter notwendig. Der SERVICE-Parameter bekommt als Wert immer „SOS“. Die Antwort als XML-Beschreibung ist in Sektionen eingeteilt. Hier von Interesse für den Nutzer sind die Abschnitte OperationMetadata, Filter_Capabilities und Contents. Abbildung 2.3: Schema einer GetCapabilities Antwort Im Abschnitt OperationMetadata sind alle Operationen aufgelistet, die der SOS-Server versteht. Hieran kann die Clientanwendung erkennen, ob neben dem Core-Profile die Befehle weiterer Profile unterstützt werden. Für jeden Befehl sind die Parameter angegeben sowie alle gültige Parameterwerte beschrieben. 5 2. Grundlagen Alle unterstützten Abfrageparameter des Services für die GetObservation-Operation sind im Abschnitt Filter_Capabilities aufgeführt. GetObservation ist die einzige Operation, die diese Art der Filterung unterstützt. Content bietet eine Auflistung aller beobachteten Phänomene. Der Client erhält beispielsweise Informationen wo sich der Sensor befindet, für welche Zeitraum Messwerte vorliegen und unter welcher Adresse diese Daten abgefragt werden können. Dieses Observation Offering enthält Pflichtfelder und optionale Felder, die in der folgenden Tabelle zusammen gefasst sind. Name Definition Pflichtfeld/Häufigkeit intendedApplication Beabsichtigte Verwendung für dieses Offering z.B.: optional innere Sicherheit oder Ressourcenplanung time Zeitraum für den Messwerte vorliegen notwendig / einmal procedure Verweis auf eine oder mehrere Verfahren, einnotwendig / ein- oder schließlich Sensor-Systeme, Instrumente, Simulato- mehrmals ren usw., die Beobachtungen in diesem Offering zur Verfügung stellen. DescribeSensor kann aufgerufen werden, um eine SensorML- oder TML-Beschreibung für jedes System zu erhalten observedProperty Die Phänomene, die durch dieses Offering abge- notwendig / ein- oder fragt werden können mehrmals featureOfInterest Feature oder Feature-Sammlungen, die ein identifi- notwendig / ein- oder zierbares Objekt repräsentiert, auf dem das Sensor- mehrmals System Beobachtungen macht. Bei einem in-situ Sensor kann dies eine Station sein, wo der Sensor seine direkte Umgebung erfasst. Bei Fern-Sensoren entspricht es der Fläche oder des Volumen, wo der Messwertaufnehmer die Messwerte erfasst. Dies kann ein anderer Standort sein, als der des Sensors. responseFormat MIME-Typ der Daten, die die GetObservation-An- notwendig / ein- oder frage zurück gibt. Dies ist mehrmals meist text / xml; Subtyp = "om/1.0.0". resultModel Gibt den Namen des Ergebnistyps der Antwort der GetObservation-Operation zurück. optional responseMode Beschreibt welche Arten von Antworten für dieses Offering möglich sind. optional Tabelle 2.1: Antwort-Felder des Observation Offering DescribeSensor Durch die GetCapabilities-Anweisung erhält man schon einen groben Überblick über alle Prozeduren aus einem Katalog. Diese High-Level-Informationen enthalten aber nur Informationen über die beobachteten Eigenschaften, den Ort oder Kontaktinformationen. 6 2. Grundlagen Genauere Metadaten über die Sensoren erhält man mit der DescribeSensor-Operation. Der Client erhält einen genaue Beschreibung der Sensoren in der Sensor Model Language oder der Transducer Markup Language. Beim Aufruf der Operation werden innerhalb eines XML-Files an den SOS-Server Parameter zum Bestimmen des Ausgabeformates, die Id des gewünschten Sensors, wieder der Service-Identifizierung und die Spezifikationsversion der Operation übertragen. Folgende XML-Code ist eine DescribeSensor-Anfrage an den SOS-Server. <DescribeSensor xmlns="http://www.opengis.net/sos/1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.opengis.net/sos/1.0 http://schemas.opengis.net/sos/1.0.0/sosAll.xsd" service="SOS" outputFormat="text/xml;subtype=&quot;TML/1.0&quot;"version="1.0.0"> <procedure>urn:ogc:object:Sensor:MyOrg:12349</procedure> </DescribeSensor> Listing 2.1: SensorML-Antwort auf eine DescribeSensor-Anfrage Die Tabelle 2.2 beschreibt die Attribute der DescribeSensor-Anfrage. Name Definition Auftreten outputFormat OutputFormat bestimmt das gewünschte Ausgabeformat notwendig der Operation sensorId Die SensorId bestimmt den Sensor von dem die Beschrei- einmal - obligatorisch bung zurück geliefert wird. Der Wert muss einem xlink:href-Attribut einer Procedure entsprechen service Servicetype-Identifikator „SOS“ einmal - obligatorisch version Spezifikationsversion der Operation einmal - obligatorisch Tabelle 2.2: Parameter für die DescribeSensor-Operation Die gültigen Werte für die Parameter erhält man aus der GetCapabilities-Operation. Die Antwort ist ein strukturiertes Dokument, welches als SensorML-Dokument ebenfalls durch das OpenGIS-Konsortium spezifiziert wurde. Im Kapitel 2.1.2 wird auf diese Spezifikation genauer eingegangen. GetObservation Die GetObservation-Operation ist eine Anfrage an den Sensor Observation Service um Beobachtungsdaten strukturiert nach der Observation & Measurement Spezifikation zu Empfangen. Der SOS-Server liefert auf die Anfrage die geforderten Daten oder, wenn dies nicht möglich ist, einen Ausnahmereport. Jede GetObservation-Anweisung enthält den Servicetype-Identifikator und die Version der Spezifikation, nach der die Operation implementiert ist. Weiter ist eine URI des Offerings notwendig. Diese wird meist aus der Id des ObservationOffering der Antwort auf die GetCapabilities-Operation entnommen. Ebenso notwendig sind die Parameter observedProperty, der das beobachtete Phänomen bestimmt, und responseFormat, welcher das Ausgabeformat bestimmt. Auch für diese beiden 7 2. Grundlagen Attribute stehen alle gültige Werte in der Antwort der GetCapabilities-Operation. Alle Parameter sind in der Tabelle 2.3 beschrieben. Name Definition Auftreten service Servicetype-Identifikator „SOS“ Einmal - obligatorisch Version Spezifikationsversion der Operation Einmal - obligatorisch SrsName Definiert ein räumliches Referenzsystem, Einmal - optional welches für alle Geometrischen Angaben benutzt wird. Offering URI für das Angebot im GetCapabilities-Do- Einmal - obligatorisch kument EventTime Bestimmt den Zeitraum, für den Beobachtun- Einmal - optional gen angefordert werden Procedure Bestimmt das Sensorsystem von dem Beob- Einmal - optional achtungen angefordert werden ObservedProperty Bestimmt das Phänomen Ein- oder mehrmals - obligatorisch FeatureOfInterest Einmal - optional Result Hier können OGC-Filter-Ausdrücke verwen- Einmal - optional det werden ResponseFormat Einmal - obligatorisch ResultModel Einmal - optional responseMode Einmal - optional Tabelle 2.3: Parameter der GetObservation-Operation 2.1.2 SensorML – Sensor Model Language Sensoren sind Geräte, die zum erfassen physikalischer Größen genutzt werden. Dabei gibt es eine große Variation von Sensortypen. Die Spanne reicht von einfachen visuellen Thermometern bis zum komplexen Elektronenmikroskop oder einem Erdbeobachtungssatelliten. Die Sensor Model Language liefert nun ein XML-Schema, welches für diese unterschiedlichen Typen ein Definition der geometrischen und dynamischen Charakteristika sowie die Beobachtungsmerkmale möglich macht. SensorML soll allgemeine Sensorinformationen, welche die Analyse der Daten erleichtern, zur Verfügung stellen. Die Verarbeitung und Analyse der Sensormessungen wird unterstützt. Dies XMLSchema ermöglicht eine geografische Zuordnung der gemessenen Daten und liefert Leistungsmerkmale wie beispielsweise Genauigkeit oder Schwellwert. Grundlegende Eigenschaften und Annahmen über die Sensoren werden gesammelt. Eine Übersicht der Informationen, die einem SensorML-Dokument entnommen werden können, liefert die Abbildung 2.4. 8 2. Grundlagen Abbildung 2.4: Inhalt eines SensorML-Dokumentes Ein SensorML-Dokument liefert keine Hardware-Beschreibung eines Sensors, sondern ist vielmehr ein allgemeines Schema zur Beschreibung eines funktionalen Modells des Sensors. Eine allgemeine Beschreibung eines SensorML-Dokumentes kann [5] entnommen werden. Hier sollen nur die für diese Arbeit notwendigen Abschnitte beleuchtet werden. Nach einem Header folgen sechs Bereiche. Das erste Element dient zur Identifikation des Sensors. Eingebettet in <sml:identification> enthält Der Wert dieses Elementes eine URN 2 nach folgendem Schema. urn:ogc:object:feature:Sensor:IFGI:ifgi-sensor-1 Diese URN ist ein dauerhafter, ortsunabhängiger Bezeichner für die Ressource über die gesamte Lebenszeit der Ressource. Sie bleibt gleich, auch wenn sich die Position des Sensors ändert – im Gegensatz zu einer URL3, die den Standort einer Ressource bezeichnet. Ein neuer Sensor am selben Ort bekommt eine neue URN zugeteilt. Das <sml:capabilities> - Element beinhaltet Statusinformationen oder Informationen zur Mobilität des Sensors. Ein Feld mit dem Namen status zeigt an, ob der Sensor gerade Daten sammelt oder nicht. Der Wert ist demnach vom Typ Boolean. Das Statusfeld mobile beschreibt ob der Sensor seine Position verändern kann oder ob er einen festen Standort hat. Die letzte gemessene Position des Sensors kann man dem <sml:position name=“sensorPosition“> -Element entnehmen. Hier wird im Allgemeinen ein Vektor mit den Werten für jede Achse des Koordinatensystems gespeichert. Für jede Achse ist die Bezeichnung, die Einheit der Angabe sowie der Wert abgespeichert. Ein Sensor kann mehrere verschiedene physikalische Werte erfassen. Unter <sml:inputs> ist die Liste aller Phänomene, die dieser Sensor beobachtet, abgelegt. Die Phänomene, die in der Datenbank abgelegt werden, ist unter <sml:outputs> aufgeführt. In dieser Liste aufgeführte Phänomene, müssen auch Angaben enthalten, um die Messwerte für dieses Phänomen von diesem Sensor abfra2 URN – Uniform Resource Name 3 URL – Uniform Resource Locator 9 2. Grundlagen gen zu können. Zu diesem Zweck ist die ID für das Offering sowie eine beschreibende Bezeichnung hinterlegt. Ein SensorML-Dokument enthält noch einen Abschnitt <sml:components>, der aber nicht von der verwendeten Implementierung für der Sensor Observation Service verwendet wird. Folgende Grafik zeigt die Struktur eines SensorML-Dokuments. An Hand des im Anhang befindlichen Beispiels für so ein Dokument lässt sich diese Struktur leicht nachvollziehen. Abbildung 2.5: Struktur eines SensorML-Dokumentes Die Kenntnis von dem Aufbau eines solchen Dokuments, erleichtert das Verständnis für den Zugriff auf die hier gespeicherten Informationen über das eingesetzte Rahmenwerk. 2.1.3 O&M – Observation and Measurements Eine Observation stellt eine Zuordnung einer Anzahl, Dauer oder eines anderen Symbols an einem bestimmten Zeitpunkt oder Zeitraum zu einem Phänomen her. Dazu werden Prozeduren benutzt, welche meistens Instrumente oder Sensoren, aber auch Prozessketten, menschliche Beobachter, Algorithmen oder Simulationen darstellen. Die Schlüsselidee ist, dass Beobachtungsergebnisse Abschätzungen für Werte einer Eigenschaft eines bestimmten feature of interest sind. Beobachtungsbestandteile liefern Zusammenhänge oder Metadaten, welche die Auswertung und Interpretation unterstützen und die Nutzung des Ergebnisses ermöglichen. Wie eine Observation dem Client zur Verfügung gestellt wird, soll im Folgenden beschrieben werden. Diese Informationen ermöglichen den Einsatz eines Parsers um Messwerte zu extrahieren. Der Parser des Frameworks ist hier durch seine allgemeinen Einsatzmöglichkeiten sehr komplex. Deshalb bietet es sich an, bei konkreten Anwendungsfällen die Messwerte durch eigene Funktionen dem Dokument zu entnehmen. 10 2. Grundlagen In Abbildung 2.6 ist der Aufbau eines O&M-Dokumentes, wie ihn eine getObservation-Anfrage zurück liefert, dargestellt. Ein Vergleich mit dem Beispieldokument im Anhang verdeutlicht die Struktur. Abbildung 2.6: Elemente eines O&M-Dokumentes Das von <gml:boundedBy> eingeleitete Element enthält die Angabe eines Rechtecks, wo die Messdaten aufgenommen wurden. Im Bereich <om:samplingTime> findet man Angaben zum Zeitbereich, wann die Messung stattgefunden haben. Hier steht, wenn mehrere Messwerte aufgenommen wurden, wann die erste Messung getätigt wurde und wann die letzte Messung. Unter <om:procedure> wird dem Client die URN der Prozedur, die die Daten liefert, zur Verfügung gestellt. Um Informationen über die Bestandteile einer Messung zur Erhalten, wir das <observedProperty> -Element analysiert. Aus den Angaben lässt sich beispielsweise ermitteln, nach welchem Standard Zeitangaben dokumentiert sind. folgt eine Auflistung aller Feature Of Interests, deren Werte in diesem Dokument zur Verfügung gestellt werden. Dazu wird zu jedem foi hier ID, Name und Position angegeben. <om:featureOfInterest> Der Bereich <om:result> enthält die eigentlichen Messwerte. Abbildung 2.7 veranschaulicht die einzelnen Elemente dieses Abschnittes. 11 2. Grundlagen Abbildung 2.7: Elemente des resultAbschnittes in einem O&M-Dokument Die Anzahl der Messwerte kann man dem Wert im <swe:elementCount>-Element entnehmen. Es stellt die Zeilenanzahl dar, wenn man das Datenarray als Tabelle betrachtet. Im <swe:elementType> ist der Tabellenkopf hinterlegt. Zu jeder Spalte ist hier der Name, die Kodierung sowie eventuelle Einheiten gespeichert. In <swe:values> sind die Zeilen der Tabelle fortlaufend als Zeichenkette hinterlegt. Wie diese Zeichenhkettette in einzelne Element zerlegt werden muss, entnimmt man dem <swe:encoding>-Element. Hier findet man die Trennzeichen, die die einzelnen Zeilen von einander trennen und auch ein Trennzeichen für die Spalten der Tabelle. Da es lokale Unterschiede beim Dezimaltrennzeichen gibt, ist hier auch dieses abgespeichert. Mit diesen Informationen ist es möglich eigene Routinen für die Verarbeitung eines O&M-Dokumentes zu schreiben. Genauere Informationen erhält man durch Studium von [6] und[7]. 2.2 Web-2.0-Anwendungsentwicklung mit dem Google Web Toolkit Interaktive Anwendungen basierend auf Internettechnologien werden heute allgemein als Web-2.0 bezeichnet. Bei der Entwicklung von JavaScript-Code für solche Web-2.0-Anwendungen mangelt es an Komfort. Der Programmierer muss auf die Vorzüge einer integrierte Entwicklungsumgebung wie Hervorhebung von Schlüsselwörtern, Syntax-Prüfung während der Eingabe oder Codeergänzung verzichten. Eine zielgerichtete Fehlersuche ist trotz Unterstützung durch Browser-Plugins kaum möglich. Das Google Web Toolkit erlaubt die Entwicklung von Web-2.0-Applikationen in Java. Typsicherheit und statische Codeanalyse im Compiler sind die Vorzüge dieser Programmiersprache, die den Programmierer bei der Arbeit unterstützen. Der GWT-Compiler übersetzt den Javacode nach JavaScript und erzeugt eine Webseite mit eingebetteter Web-Anwendung. Der generierte Code wird optimiert, so dass das Ergebnis schneller als handgeschriebener Code ist. Dieses auf schnelle Ausführung zugeschnittene JavaScript-Programm ist leider nur noch schlecht lesbar. Das Skript wird auch nicht kleiner durch diese Maßnahmen. GWT-Anwendungen sind browserunabhängig. Es werden die gängigen Browser unterstützt. Für Firefox, Internet Explorer, Opera, Safari, Chrome gibt es eigens angepasste Codeabschnitte. 12 2. Grundlagen Die Oberflächenerzeugung wird mit GWT durch LayoutManager, ähnlich den Frameworks für Desktopanwendungen, unterstützt. Der Web-2.0-Designer muss dazu nicht umständlich mit CSSStilen und Tabellen hantieren. Die Hürden für den Einstieg in die Entwicklung mit dem Google Web Toolkit sind niedrig. Notwendig ist nur ein aktuelles Java Development Kit4 und das aktuelle GWT-Paket5. Von Google wird ein Plugin für die Entwicklungsumgebung Eclipse zur Verfügung gestellt, wodurch das GWT-Framework vollständig in die Umgebung integriert wird. Aber auch für andere Java-IDEs, wie zum Beispiel Netbeans, sind solche Plugins verfügbar. GWT ist eine Sammlung von Tools, die es ermöglichen komplexe JavaScript-Benutzerschnittstellen in Java zu entwickeln. Die Abbildung 2.8 stellt die Kernkomponenten des Frameworks dar. Abbildung 2.8: GWT-Kernkomponenten 2.2.1 GWT Java-nach-JavaScript-Kompiler Das Google Web Toolkit unterstützt zwei Modi, den Production Mode und den Development Mode. Soll eine Anwendung im Production Mode ausgeführt werden, muss sie durch den GWT-CrossCompiler von Java nach JavaScript übersetzt werden. GWT-Anwendungen werden im Production Mode als reiner JavaScript mit HTML ausgeführt. Der GWT-Compiler unterstützt die Mehrzahl der Sprachelemente der Programmiersprache Java. Eine relevante Teilmenge der Java-Laufzeit-Bibliothek (JRE) wird durch die GWT-Laufzeit-Bibliothek emuliert. Wird eine Klasse oder Methode der Java-Laufzeit-Umgebung nicht unterstützt wird eine Fehlermeldung zurück gegeben. Da Java und JavaScript einige Unterschiede aufweisen, kann es zu einigen Problemen bei der Ausführung des kompilierten Codes kommen. Beispielsweise ist keine 1:1-Abbildung der primitiven Datentypen möglich. Unterschiede gibt es auch bei der Ausnahmebehandlung. JavaScript bietet im Gegensatz zu Java ebenfalls keine Möglichkeit der parallelen Thread-Ausführung. Um den GWT-Compiler zu starten wird das Ant-Skript build.xml ausgeführt. Der Compiler erzeugt eine Verzeichnisstruktur, die alle notwendigen Dateien zur Veröffentlichung auf einem Web-Server enthält. Bei Bedarf wird diese Verzeichnisstruktur in einer war-Datei für die Bereitstellung zusammengefasst. Abbildung 2.9 zeigt den Inhalt so eines war-Files. 4 Ein Java Development Kit ist verfügbar unter http://www.oracle.com/technetwork/java/javase/downloads/index.html. 5 Das aktuelle GWT-Paket wird unter http://code.google.com/intl/de-DE/webtoolkit/download.html bereit gestellt. 13 2. Grundlagen Abbildung 2.9: Verzeichnisstruktur eines war-Files Die erste Seite, die der Client besucht, ist welcomeGWT.html. Sie wird als Host-HTML-Seite bezeichnet. Von ihr werden alle Anwendungsdaten geladen. Dazu referenziert ein <script>-Tag die GWT-Anwendungs-Bootstrap-Datei. In der Abbildung 2.9 ist dies die Datei org.yournamehere.Main.nocache.js . Dieses Ladeprogramm entscheidet über die Programmversion, welche geladen wird. Grundlage für diese Entscheidung ist der verwendete Browser und, wenn die Anwendung lokalisiert wurde, auch die Sprachversion des Browsers oder eine anwenderspezifische Auswahlregel. Die einzelnen Programmversionen sind die Dateien mit dem Namensschema <md5>.cache.html. In diesem Beispiel gibt es fünf Versionen, jeweils eine optimierte Variante für einen der bereits erwähnten Webbrowser. 2.2.2 GWT Development Mode Während der Entwicklung wird die GWT-Anwendung im Allgemeinen im Entwicklungsmodus ausgeführt. Hierbei wird die Anwendung direkt innerhalb einer Java Virtual Machine als Java-Byte-Code ausgeführt. Im GWT-Development-Mode ist es möglich Codeabschnitte während der Ausführung zu verändern. Es unterstützt den Entwickler beim Debuggen der Applikation. Abbildung 2.10 zeigt das Fenster des GWT Development Mode. 14 2. Grundlagen Abbildung 2.10: GWT Development Mode window Das Fenster des GWT Development Mode besitzt nach dem Start zwei Tabs. Der erste Reiter dient zum Starten der Module. Weiter zeigt es Informationen, die nicht einem spezifischen Modul zugeordnet werden können. Um den Browser die Anwendung anbieten zu können ist eine Anwendungsserver notwendig. Dies kann der eingebaute Jetty-Server sein, oder ein Eigener. Der zweite Reiter zeigt die Statusnachrichten dieses Anwendungs-Web-Servers an. Für die Darstellung des Benutzerinterfaces wird auch im Development Mode jeder Standard WebBrowser unterstützt. Einzig ein Developer Plugin muss im Browser installiert sein. Über den Button Launch Default Browser wird das Modul in den Browser geladen. Wenn das notwendige Plugin nicht installiert ist, wird ein Hinweis angezeigt, der auch eine Quelle zum Download des Plugins anbietet. Nach dem Laden des Moduls in den Browser, wird ein dritter Tab mit den Logs für diese URL angeboten. Debug-Meldungen lassen sich über die GWT.log()-Methode in diesem Fenster ausgeben. Das Browser-Fenster ist in Abbildung 2.11 dargestellt. 15 2. Grundlagen Abbildung 2.11: Browser-Fenster mit GWT-Beispiel-Anwendung Eine herausragende Eigenschaft des Entwicklungsmodus ist, dass während der Entwicklungsphase der Quellcode geändert werden kann, ohne den Entwicklungsmodus zu beenden. Bei Änderung des Client-Codes muss der Entwickler lediglich die Änderungen speichern und im Browser den ReloadKnopf betätigen. Dadurch wird das Codefragment neu kompiliert. Wurde der Server-Code geändert, muss das Modul neu kompiliert werden und der Restart-Button auf dem Jetty-Tab des GWT Development Modes betätigt werden. Der Anwendungsserver wird nun neu gestartet. Ein Auffrischen des Browsers oder der Neustart des Jetty-Servers sind deutlich schneller als das Beenden und Neustarten des Development Modes. 2.2.3 Google Web Toolkit API-Klassenbibliothek Zum Google Web Toolkit gehört die GWT-API-Klassenbibliothek. Sie stellt dem Programmierer unterschiedliche Funktionalitäten bereit, die hier nur aufgezählt werden sollen. Tiefgreifende Informationen finden sich in [8]. Widgets und Panels des Google Web Toolkits Bestandteil der GWT-API ist ein kleines Paket aus Widgets und Panels zur Gestaltung grafischer Oberflächen. Tabelle 2.4 listet diese auf. 16 2. Grundlagen Widgets Panels • Button • PopupPanel • PushButton • StackPanel • RadioButton • StackLayoutPanel • CheckBox • HorizontalPanel • DatePicker • VerticalPanel • ToogleButton • FlowPanel • TextBox • VerticalSplitPanel • PasswordTextBox • SplitLayoutPanel • TextArea • DockLayoutPanel • Hyperlink • TabPanel • ListBox • TabLayoutPanel • MenuBar • DisclosurePanel • Tree • SuggestBox • RichTextArea • Table • TabBar • DialogBox Tabelle 2.4: GWT-Widget-Sammlung Der Programmierer kann diese dynamischen und wiederverwendbaren UI-Komponenten nutzen um zeitsparend dynamisches Verhalten wie beispielsweise Drag and Drop oder anspruchsvolle Baumstrukturen zu realisieren. Viele sinnvolle Widgets, die nicht in GWT enthalten sind, werden als externe Bibliotheken zur Verfügung gestellt. Das später noch beschriebene ExtGWT ist so eine Bibliothek. Sie ersetzt die GWT-eigenen Widgets komplett. GWT-Internationalisierung Durch GWT wird eine einfache Internationalisierung der Anwendung ermöglicht. Soll eine Anwendung in eine andere Sprache übersetzt werden, müssen zwei Arten von Text angepasst werden, konstante Strings und parametrisierbare Nachrichten. GWT unterstützt diese Arbeit mit drei Techniken, Static String Internationalization, Dynamic String Internationalization und Localizable Interface, die sich in Overhead und Aufwand unterscheiden. [9] Testen von GWT-Anwendungen JUnit ist eine Framework zum Testen von Java-Programmen. GWT liefert eine Integration für dieses Rahmenwerk und ermöglicht so Unit-Tests, die im Development Mode als auch im Production Mode laufen. [10] 17 2. Grundlagen Asynchrone Kommunikation mittels GWT-RPC GWT-Anwendungen laufen als JavaScript im Webbrowser des Endnutzers. Wenn man nun mehr möchte als eine rein im Client ablaufende Applikation, muss man mit dem Web-Server kommunizieren. Gewöhnliche Webapplikationen senden eine Anfrage zum Web-Server und empfangen eine komplette HTML-Seite als Antwort. Im Gegensatz dazu wird bei einer AJAX-Anwendung im Vorfeld das Nutzerinterface übertragen. Zum Senden und Empfangen der Nutzerdaten nutzt man asynchrone Aufrufe. Diese Trennung von Interface und Daten ermöglicht eine flüssige Bedienung, es entstehen keine wahrnehmbaren Pausen durch das nachladen von Daten. Die Bandbreite, die die Anwendung belegt, ist kleiner, da die Benutzeroberfläche nur einmal übermittelt wird. Das Google Web Toolkit stellt zwei Techniken zur asynchronen Kommunikation zur Verfügung, wobei die Wahl der Technik durch die zugrunde liegende Servertechnologie bestimmt wird. Ist die Serverfunktionalität nicht in Java als Servlet implementiert, muss man JSON verwenden. Wenn diese Voraussetzung erfüllt ist, ist die Verwendung von GWT-Remote Procedure Calls die bessere Wahl. [11] GWT-RPC überträgt Java-Objekte zu und vom Server über HTTP. Es ermöglicht transparente Aufrufe von Methoden des Java-Servlets, ohne das sich der Programmierer um Low-Level-Details wie beispielsweise die Serialisierung und Deserialisierung der Objekte kümmern muss. 2.2.4 GWT-Einstieg an einem kleinen Beispiel Für dieses Beispiel wurde die NetBeans-IDE mit dem NetBeans-GWT-Plugin benutzt. Nach dem Erzeugen eines Java-Web-Projektes für das Google Web Toolkit stellt sich die Projektstruktur wie in Abbildung 2.12 da. Abbildung 2.12: GWT-Projekt-Struktur Java-Programme benötigen die main()-Methode als Einsprungpunkt. Bei GWT-Programmen ist die onModulLoad()-Methode vergleichbar zur main()-Methode. Die Hauptklasse einer GWT-Anwendung muss das Interface EntryPoint implementieren. Dieses Interface schreibt die onModulLoad()Methode vor. 18 2. Grundlagen 19 public class MainEntryPoint implements EntryPoint { 20 /** 21 * Creates a new instance of MainEntryPoint 22 */ 23 public MainEntryPoint() { 24 } 25 26 /** 27 * The entry point method, called automatically by loading a module 28 * that declares an implementing class as an entry-point 29 */ 30 public void onModuleLoad() { 31 final Label label = new Label("Hello, GWT!!!"); 32 final Button button = new Button("Click me!"); 33 34 button.addClickHandler(new ClickHandler() { 35 public void onClick(ClickEvent event) { 36 label.setVisible(!label.isVisible()); 37 } 38 }); 39 40 RootPanel.get().add(button); 41 RootPanel.get().add(label); 42 } 43 } Listing 2.2: MainEntryPoint.java In Zeile 31 und 32 wird ein Label und ein Button erzeugt und in Zeile 40 und 41 werden sie dem Hauptpanel hinzugefügt. In der Datei Main.gwt.xml befindet sich die Konfiguration für diese Anwendung. Es enthält zwei Elemente. Das Element inherits bezeichnet die Module von denen dieses Modul erbt. In diesem einfachen Fall ist dies nur das Modul com.google.gwt.user.User aus dem GWT-Rahmenwerk. Das entry-point-Element referenziert die Hauptklasse. 1 <?xml version="1.0" encoding="UTF-8"?> 2 3 <!DOCTYPE module PUBLIC "-//Google Inc.//DTD Google Web Toolkit 1.7.0//EN" "http://google-web-toolkit.googlecode.com/svn/tags/1.7.0/distrosource/core/src/gwt-module.dtd"> 4 5 <module> 6 <inherits name="com.google.gwt.user.User"/> ┋ 15 <entry-point class="org.yournamehere.client.MainEntryPoint"/> ┋ 18 </module> Listing 2.3: Main.gwt.xml Der Inhalt der Datei welcomeGWT.html wurde bereits auf Seite 14 beleuchtet. 19 2. Grundlagen Client-Server-Kommunikationen mittels GWT-RPC Das NetBeans-GWT-Plugin stellt einen Wizard für die Erzeugung eines RPC-Services bereit. Die notwendigen Klassen werden automatisch vom Wizard erzeugt. Abbildung 2.13: Klassen für den RPC-Service Die Klasse GWTService in Listing 2.4 enthält die clientseitige Definition des Service. Dieses Interface erweitert das RemoteService-Interface. 8 9 ┋ 16 17 18 import com.google.gwt.user.client.rpc.RemoteService; import com.google.gwt.user.client.rpc.RemoteServiceRelativePath; public interface GWTService extends RemoteService { public String myMethod(String s); } Listing 2.4: GWTService.java Der Beispielservice bekommt einen String übergeben und liefert einen String zurück. 20 2. Grundlagen 8 import com.google.gwt.user.server.rpc.RemoteServiceServlet; 10 import org.yournamehere.client.sampleservice.GWTService; ┋ 16 public class GWTServiceImpl extends RemoteServiceServlet implements GWTService { 17 public String myMethod(String s) { 18 // Do something interesting with 's' here on the server. 19 return "Server says: " + s; 20 } 21 } Listing 2.5: GWTServiceImpl.java Die GWTServiceImpl-Klasse implementiert serverseitig die Funktionalität des Service. Dazu implementiert die Klasse das Interface GWTService. Im Beispiel wird der empfangene String mit einem vorangestellten „Server says:“ wieder zurückgegeben. 8 import com.google.gwt.user.client.rpc.AsyncCallback; ┋ 14 public interface GWTServiceAsync { 15 public void myMethod(String s, AsyncCallback<String> callback); 16 } Listing 2.6: GWTServiceAsync GWTServiceAsync ist das asynchrone Interface, basierend auf das GWTService-Interface. Es liefert das callback-Objekt, das die asynchrone Kommunikation zwischen Server und Client ermöglicht. 21 2. Grundlagen 7 8 9 10 11 12 13 14 15 ┋ 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 import import import import import import com.google.gwt.core.client.GWT; com.google.gwt.user.client.rpc.AsyncCallback; com.google.gwt.user.client.ui.Label; com.google.gwt.user.client.ui.Button; com.google.gwt.user.client.ui.TextBox; com.google.gwt.user.client.ui.VerticalPanel; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; public class GWTServiceUsageExample extends VerticalPanel { // Create the client proxy. Note that although you are creating the // service interface proper, you cast the result to the asynchronous // version of the interface. The cast is always safe because the // generated proxy implements the asynchronous interface automatically. private GWTServiceAsync gwtService = GWT.create(GWTService.class); private Label lblServerReply = new Label(); private TextBox txtUserInput = new TextBox(); private Button btnSend = new Button("Send to server"); public GWTServiceUsageExample() { add(new Label("Input your text: ")); add(txtUserInput); add(btnSend); add(lblServerReply); // Create an asynchronous callback to handle the result. final AsyncCallback<String> callback = new AsyncCallback<String>() { public void onSuccess(String result) { lblServerReply.setText(result); } public void onFailure(Throwable caught) { lblServerReply.setText("Communication failed"); } }; // Listen for the button clicks btnSend.addClickHandler(new ClickHandler() { public void onClick(ClickEvent event) { // Make remote call. Control flow will continue immediately // and later callback will be invoked when the RPC completes. gwtService.myMethod(txtUserInput.getText(), callback); } } }); } Listing 2.7: GWTServiceUsageExample.java Im Listing 2.7 wird ein Testclient erzeugt. Eine Instanz dieser Klasse erzeugt ein Panel mit einem Eingabefeld,einem Button und einem Label. Die Eingabe wird nach Betätigung des Knopfes an den Server geschickt. Das Label zeigt die Antwort des Servers an. 22 2. Grundlagen In Zeile 27 wird die Service-Proxy-Klasse erzeugt. Eine Instanz dieser Klasse wird durch Aufruf von GWT.create(Class) angelegt. Zeile 40 bis 49 dienen zum Aufsetzen des Callback-Objektes. Die Methode onSuccess() in Zeile 42 wird im Erfolgsfall ausgeführt. Tritt ein Fehler bei der Behandlung des RPC auf, wird die Methode onFailure() in Zeile 46 ausgeführt. Der Aufruf des Remote Procedure Calls erfolgt in Zeile 57. Nach Ersetzen von Zeile 41 und 42 durch RootPanel.get().add(new GWTServiceUsageExample()); in der Datei MainEntryPoint.java ist dieses Beispiel komplett. Abbildung 2.14 zeigt die Browser-Ansicht dieses Beispiels. Abbildung 2.14: GWT-Beispiel nach Ausführung eines RPC 2.3 Das User-Interface-Framework ExtGWT Das Google Web Toolkit ist ein guter Weg für Ajax 6-Anwendung. Aufbauend auf den Stärken von GWT ermöglicht ExtGWT ein Benutzungsgefühl, das dem einer Desktop-Anwendung gleicht. Out of the Box stellt GWT nur ein kleines Sortiment an Basis-Widgets zur Verfügung. Zusätzlich mangelt es an einem Rahmenwerk, dass es dem Entwickler ermöglicht strukturiert große Anwendungen zu programmieren. Da GWT offen und erweiterbar ist, setzt ExtGWT der Firma Sencha Inc. hier an. Dieses Internet Application Framework für Google Web Toolkit liefert eine umfassende Komponentenbibliothek, vergleichbar mit dem, was man für Desktop-Umgebungen nutzt. Das Ergebnis ist eine Programmansicht, die näher an einer Desktop-Anwendung ist als an einer Webseite. Zusätzlich stehen effektive Funktionen zum Arbeiten von lokalen und fernen Daten bereit. Ein Model-View-Controller-Framework ermöglicht die übersichtliche Entwicklung großer Anwendungen. ExtGWT ist eine reine Java-Bibliothek. Es nutzt nur GWT-Methoden und kommt ohne externes JavaScript oder Bibliotheken aus anderen Quellen aus. Kernfunktionen des GWT, wie beispielsweise Remote Procedure Calls, werden voll unterstützt. Für den Nutzer stehen zwei Lizenzmodelle zur Verfügung. Es gibt eine open source Lizenz. Für den, der sich mit den Einschränkungen dieser Lizenz nicht anfreunden kann, gibt es aber auch ein kommerzielles Lizenzmodell. Als Quelle für genauere Informationen bietet sich das ExtGWT Help Center [12] an. Als Beispiel dient nur die ExtGWT Explorer Demo7. 6 Ajax – Asynchronous JavaScript and XML 7 Die ExtGWT Explorer Demo ist zu finden unter: http://www.sencha.com/examples/explorer.html#overview . 23 2. Grundlagen Abbildung 2.15: Widget-Beispiele im Ext GWT Explorer Demo Die Beispiele für die einzelnen Widgets sind leider durch ihre Komplexität nicht so leicht zu durchschauen. Ebenfalls negativ ist, dass als Datenquelle für die Beispiele externe Datengeber-Klassen verwendet werden, die nicht dokumentiert sind. Um einen Eindruck über die Möglichkeiten von ExtGWT zu bekommen, ist das ExtGWT Explorer Demo aber gut geeignet. 2.3.1 Widgets des ExtGWT Das Framework bietet eine große Sammlung an guten und anpassbaren User Interface Widgets. Da es für fast alle möglichen Desktop-Elemente einen Nachbau gibt, ist es leicht möglich ein einheitliche Benutzerführung und Design zu erzeugen. Eine Übersicht über die angebotenen Widgets bietet die ExtGWT Explorer Demo. ExtGWT-Widgets und GWT-Widgets unterscheiden sich in der Handhabung. Die Komponenten werden immer erst bei Bedarf berechnet, im Gegensatz zu GWT, wo die Komponenten sofort nach ihrer Instanziierung erzeugt werden. Dies wird als Lazy Rendering bezeichnet und hat den Vorteil, dass die Komponenten bereits vor der Anzeige konfiguriert werden können. 24 2. Grundlagen LayoutContainer als Container für Widget-Komponenten LayoutContainer bezeichnen einen Container, der Widgets aufnehmen kann und nach einem bestimmten Layout anordnet. Nach dem ein Layout innerhalb eines LayoutContainers zusammengestellt wurde, gibt es drei Möglichkeiten diesen zur Anzeige zu bringen. Die einfachste Variante ist, das Hinzufügen des Containers zur Seite: RootPanel.get().add(container); . RootPanel.get() liefert als Wurzelpanel das <body>-Element des HTML-Dokuments. Wenn der Container bereits gerendert wurde und der Inhalt hat sich geändert, so muss das Layout neu berechnet werden. Dies kann manuell durch Aufruf der Methode container.layout() erfolgen. Erst danach wird die Änderung im Dokument sichtbar. Um komplexe User Interface-Designs zu erstellen, können Container geschachtelt werden. Die letzte Möglichkeit ein Rendering der Komponenten auszulösen, ist das Berechnen des Layouts eines Wurzelcontainers. Beim Rendern des Layouts eines Containers, wird das Layout aller Kinder des Container überprüft. Ist dies nun ebenfalls ein Container, so wird auch für diesen das Layout neu errechnet. 2.4 OX-Framework8 als Bindeglied zwischen Sensor Observation Service und Java-Servlet Voraussetzung für die Entwicklung von Client-Anwendungen für OGC-Web-Services ist die Implementierung einer Schnittstelle, die eine Interaktion mit dem Service-Interface ermöglicht. Mit der Standardisierung der Interaktion für OGC-Web-Services im Jahre 2006 begann auch die Entwicklung des OX-Frameworks unter dem Dach der 52°North open source initiative. Hierbei handelt es sich um ein Software-Rahmenwerk, dessen Architektur die leichte, gekapselte Nutzung von OGCWeb-Services ermöglicht. Es bildet die technologische Basis für Sensor-Web-Anwendungen. Das OX-Framework stellt, im Gegensatz zu vielen anderen Frameworks, eine integrierte Lösung für Client und Server bereit. Es soll eine eingliedernde Sicht auf alle Arten von OGC-Web-Services liefern, um daraus Daten zu verarbeiten und zu visualisieren. Die Vielfalt der verschiedenen Dienste und Datenformate verlangt nach einer flexiblen Architektur. Beim OX-Framework wurden drei Designkonzepte umgesetzt: Dreistufenarchitektur, Plugin-Mechanismen und Listener-Konzept. Die Stufenarchitektur, wie in Abbildung 2.16 zu sehen, reduziert die Komplexität des Rahmenwerks durch Strukturierung in drei Ebenen: Adapter-Subsystem, Core-Subsystem und Utilities-Subsystem. 8 OX-Framework – OGC Web Service Access Framework 25 2. Grundlagen Abbildung 2.16: Drei-Stufen-Architektur des OX-Frameworks Das Adapter-Subsystem enthält die Realisierungen aller Service-Adapter für spezifische OGC-WebServices, beispielsweise SOS. Diese Service-Adapter kommunizieren untereinander über das CoreSubsystem, mittels einem gemeinsamen Datenmodells. Das Utilities-Subsystem enthält Funktionen für UI-Frameworks (zum Beispiel Swing). Der Plugin-Mechanismus ermöglicht das dynamische Anpassen und Erweitern des Frameworks mit notwendigen Service-Adaptern. Durch das Listener-Konzept bietet das OX-Framework ein hohes Maß an Erweiterbarkeit und Transparenz. Der Entwickler hat so die komplette Kontrolle über das Rahmenwerk. [13] Das Listing 2.8 zeigt den Zugriff auf einen SOS-Server durch Nutzung des OX-Frameworks. 26 2. Grundlagen 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 package soshello; import import import import import import import import import import import java.io.FileOutputStream; java.io.IOException; java.util.logging.Level; java.util.logging.Logger; org.n52.oxf.OXFException; org.n52.oxf.owsCommon.ExceptionReport; org.n52.oxf.owsCommon.capabilities.Operation; org.n52.oxf.serviceAdapters.OperationResult; org.n52.oxf.serviceAdapters.ParameterContainer; org.n52.oxf.serviceAdapters.sos.ISOSRequestBuilder; org.n52.oxf.serviceAdapters.sos.SOSAdapter; public class SOSHello { private final static String url="http://localhost:8080/52nSOSv3_WAR/sos"; private final static SOSAdapter sosAdapter = new SOSAdapter(); public static void main(String[] args) throws ExceptionReport, OXFException { ParameterContainer pc = new ParameterContainer(); pc.addParameterShell( ISOSRequestBuilder.GET_CAPABILITIES_SERVICE_PARAMETER, "SOS"); Operation op = new Operation("GetCapabilities",url+"?",url); OperationResult opResult = sosAdapter.doOperation(op, pc); saveResultInFile(opResult); } } private static void saveResultInFile(OperationResult opResult) { try { FileOutputStream out = new FileOutputStream("output.xml"); out.write(opResult.getIncomingResult()); out.flush(); out.close(); } catch (IOException ex) { Logger.getLogger( SOSHello.class.getName()).log(Level.SEVERE, null, ex); } } Listing 2.8: SOSHello.java In der Zeile 17 wird der Adapter für den SOS-Service instanziiert. Über dieses Objekt erfolgt die Kommunikation mit dem Service. Eine Operation wird in Zeile 25 zusammen gestellt. Als Parameter muss die Bezeichnung der Operation und die Adressen für HTTP-GET und HTTP-POST übergeben werden. Die URL, die für das Zusammensetzen dieser Adresse notwendig ist, wird in Zeile 16 in der Konstante url gespeichert. Die Ausführung der Operation erfolgt in Zeile 26. Als Parameter muss die vorher erzeugte Operation übergeben werden und ein ParameterContainer, der aller Parameter der Operation enthält. Der einzig notwendige Parameter für die getCapabilities-Operation ist der Service-Parameter. Dieser wird in Zeile 22 und 23 dem ParameterContainer übergeben. Das Ergebnis der Operation wird in Zeile 27 in einer Datei gespeichert. 27 3. SOSGui – Grafisches Benutzerinterface zur Datenabfrage und Visualisierung für ein ortsbasiertes Servicesystem 3. SOSGui – Grafisches Benutzerinterface zur Datenabfrage und Visualisierung für ein ortsbasiertes Servicesystem Die Anforderung des Laborpersonals an die Auswerte- und Visualisierungsmöglichkeiten des ortsbasierten Servicesystems wurden während einer Befragung ermittelt. Dazu wurden die typischen Arbeitsschritte im Laborumfeld analysiert. Dabei wurden zwei Anwendungsfälle, die von dem grafischen Benutzerinterface unterstützt werden, ermittelt. Im ersten Fall soll aus den Messungen eine Erkenntnis über das eigentliche Messobjekt ermittelt werden. Das heißt, die Probe beeinflusst während der Messreihe direkt ein vom Sensor erfasstes Phänomen. Der Messablauf in Abbildung 3.1 bildet die Grundlage für das Anfordungsprofil. Abbildung 3.1: Ablauf eines Versuches Daraus ergeben sich folgende zu implementierende Funktionen: 1. Aufruf eines Zeitverlaufes als Normverlauf 2. Definition der erlaubten Schwankungsbreite 3. Anzeige des Normverlaufes mit anderem Zeitverlauf zusammen Tabelle 3.1: Funktionen zur Messwertanalyse 1 Der zweite Fall stellt das Gegenteil da. Hier steht die Frage im Raum, wie ein vom Sensor erfasster Umgebungsparameter die Probe beeinflusst. Wenn beispielsweise nach einem Versuch bei einer Probe ein unerwartetes Ergebnis sichtbar wird, kann überprüft werden ob Veränderungen der Probenumgebung mit dem Ergebnis korrelieren. Dazu sind die Funktionen der Tabelle 3.2 notwendig. 28 3. SOSGui – Grafisches Benutzerinterface zur Datenabfrage und Visualisierung für ein ortsbasiertes Servicesystem 1. Aufruf mehrerer Zeitverläufe 2. gemeinsame Anzeige der Zeitverläufe Tabelle 3.2: Funktionen zur Messwertanalyse 2 Für den Fall, dass die Auswertemöglichkeiten nicht genügen, soll eine Exportmöglichkeit integriert werden. Da es sich um Tabellen handelt, bietet sich hier das CSV-Format an. Abbildung 3.2: Frontend der SOSGui Die Abbildung 3.2 zeigt die Oberfläche, wie sie sich dem Laborpersonal darstellt. 3.1 Das Einsatzumfeld – Hard- und Software für das ortsbasierte Servicesystem In dem hier beschriebenen Szenario sind in einem Raum beliebig Sensorknoten verteilt worden. Die Anzahl der Knoten sowie deren Position kann vom Anwender selbst festgelegt werden und kann so den jeweiligen Anforderungen angepasst werden. In [1] werden drei unterschiedliche Szenarien ausführlich beschrieben um die universelle Anwendbarkeit dieser Technik zu verdeutlichen. Diese Sensorknoten übermitteln über eine Funkschnittstelle die Messwerte an eine Basisstation. Diese trägt die Daten in eine Datenbank ein. Die Benutzerschnittstelle fragt bei der Datenbank diese Daten ab um sie dem Nutzer zur Verfügung zu stellen. 29 3. SOSGui – Grafisches Benutzerinterface zur Datenabfrage und Visualisierung für ein ortsbasiertes Servicesystem Abbildung 3.3: Struktur eines Sensornetzes Da dieses Interface für ein vorhandenes Anwendungssystem entwickelt wurde, sollen hier einführend die zugrunde liegenden Techniken und Konzepte beschrieben werden. 3.1.1 Sensorknoten und Fox-Board als Datenquelle für den Sensor Observation Service Anforderungen und Aufbau eines Sensorknotens Der Sensorknoten soll physikalische Phänomene erfassen und Veränderungen schnell zur Weiterverarbeitung zur Verfügung stellen. Da diese Knoten autark agieren, muss die eingesetzte Technik sehr energieeffizient sein. Ein typischer Sensorkonten besteht aus vier Komponenten. Ein oder mehrere Messfühler wandeln physikalische Größen in äquivalente elektrische Signale um. Diese analogen Signale werden von einem Mikrocontroller abgetastet und diskretisiert. Im Mikrocontroller kann auch eine Verarbeitung der Messwerte erfolgen um beispielsweise Störung aus dem Signal zu filtern. Die Messwerte werden über eine Funkschnittstelle zur Basisstation übertragen. Für die Komponenten ist eine unabhängige Stromversorgung notwendig.[14] Abbildung 3.4: Zusammenwirken der Komponenten eines Sensorknotens Das entscheidende Kriterium für die Auswahl der Elemente ist, dass ein möglichst langer autonomer Betrieb möglich ist. 30 3. SOSGui – Grafisches Benutzerinterface zur Datenabfrage und Visualisierung für ein ortsbasiertes Servicesystem Im eZ430-RF2480 Demo Kit von Texas Instruments[15] sind diese Komponenten in einem Paket vereint. Das Demo Kit enthält die im Folgenden aufgelistete Hardware. Anzahl Bezeichnung 3 CC2480 Target Board 1 eZ430 USB Emulator Board 2 AAA eZ430 Battery Board Tabelle 3.3: Hardware des eZ430-RF2480 Demo Kit Als Sensorknoten wird das CC2480 Target Board mit dem AAA eZ430 Battery Board kombiniert. Abbildung 3.5: Sensorknoten aus Battery Board und Target Board Quelle: [15] Auf dem Knoten ist der MSP430F2274 Mikrocontroller mit dem CC2480 Netzwerkprozessor über einen SPI-Bus verbunden. Das Boarddesign ist so gestaltet, dass ein möglichst kleine Fläche bei Nutzung einer Chip-Antenne benötigt wird. Das Target Board stellt eine rot und eine grüne LED zur Verfügung sowie einen Taster. Über den Mikrocontroller stehen fünf GPIO-Anschlüsse zur Verfügung. Hierüber können beispielsweise weitere Sensoren angeschlossen werden. MSP430F2274 Mikrocontroller zur Messwertaufbereitung auf dem Sensorknoten Die MSP430-Mikrocontroller-Familie des Herstellers Texas Instruments ist auf besonders geringen Energieverbrauch ausgelegt. Die Architektur mit fünf Energiesparmodi ist optimal angepasst für den mobilen, batteriebetriebenen Einsatz. Die von Neumann-Architektur des Mikrocontrollers hat eine Busbreite von 16 bit. Der RISC-Befehlssatz des Controllers umfasst 51 Befehle. In der folgenden Tabelle ist die intern zur Verfügung stehende Peripherie aufgelistet. 31 3. SOSGui – Grafisches Benutzerinterface zur Datenabfrage und Visualisierung für ein ortsbasiertes Servicesystem Takterzeugung Intern – Frequenzen bis 26 MHz Intern – Low-Power Low-Frequency Oscillator 32 kHz Crystal High-Frequency Crystal 32x Digital Input/Output 2x 16-Bit Timer Universal Serial Communication Interface UART IrDA SPI I²C™ 10-Bit 200-ksps Analog to Digital Converter Operationsverstärker Brownout Detector Speicher 32KB + 256B Flash 1KB RAM Tabelle 3.4: Interne Peripherie des MSP430F2274 Über den Analog-Digital-Konverter ist auf dem CC2480 Target Board ein Lichtsensor mit dem Mikrocontroller verbunden.[16] Datenübertagung mit Hilfe des CC2480 Z-Accel 2.4 Ghz ZigBee® Processor Speziell für niederbitratige Personal Area Networks wurde die kabellose ZigBee-Technologie standardisiert. Diese Funktechnologie arbeitet im lizenzfreien 2.4 GHz Band. Sie wurde mit besonderem Augenmerk auf kosteneffiziente, energiesparende Anwendung entwickelt. Ein ZigBee-Netzwerk ist ein selbst konfigurierendes, multi-hop-fähiges drahtloses Netzwerk. Dadurch ist es möglich, dass ein Endknoten, der nicht direkt mit der Basisstation kommunizieren kann, über andere Knoten die Daten übermittelt. Für ein ZigBee-Netzwerk sind drei Gerätetypen definiert. Vom Koordinator-Knoten darf nur ein Gerät im Netzwerk vorhanden sein. Als erstes Device startet es das Netzwerk in dem es Kanal und Netzwerk-ID bestimmt. Der Router stellt Netzwerkfunktionen zur Weiterleitung von Daten zur Verfügung. Er erlaubt anderen Knoten dem Netzwerk beizutreten. Nur Endknoten haben keine weiteren Netzwerkfunktionen und können deshalb alle Möglichkeiten zum Energiesparen nutzen um eine lange Batterielaufzeit zu erzielen. Der CC2480-Netzwerkporzessor unterstützt alle Gerätetypen. Er behandelt alle zeitkritischen und rechenaufwendigen Aufgaben des ZigBee-Protokolls und lässt so Kapazitäten des Mikrocontrollers frei für andere Anwendungen. Mikrocontroller und Netzwerkprozessor kommunizieren über den SPI-Bus9 miteinander. Der CC2480 stellt einen Batterie-Monitor und einen Temperatursensor zur 9SPI-Bus - Serial Peripheral Interface: synchroner serieller Datenbus hauptsächlich eingesetzt zur Kommunikation einzelner Komponenten einer Leiterplatte 32 3. SOSGui – Grafisches Benutzerinterface zur Datenabfrage und Visualisierung für ein ortsbasiertes Servicesystem Verfügung. Daneben gibt es noch weiter Peripherie, die aber auf dem Target-Board nicht genutzt werden kann. Das FOX-Board als Basisstation Als Gegenstelle für die Sensorknoten dient ein FOX-Board der Firma ACME Systems [17]. Hierbei handelt es sich um ein eingebettetes System mit kompakten Abmessungen, dass auf geringen Energieverbrauch ausgelegt ist. Ein oben beschriebenes CC2480 Target-Board kombiniert mit dem eZ430-USB-Emulator-Board wird als ZigBee-Netzwerk-Koordinator betrieben und stellt eine Kommunikationsmöglichkeit mit der Basisstation zur Verfügung. Das Linux-System des FOX-Boards läuft auf einem 32 Bit RISC-Prozessor mit 100 MHz. Neben mehreren USB 1.1 -Ports steht eine Ethernetanschluss und weiter Schnittstellen zur Verfügung. Auf dieser Basisstation läuft eine Gateway-Anwendung, die die Daten der Sensorknoten in die Datenbank einträgt. Im Detail beschrieben wird diese Gateway-Anwendung in [14]. Als standardisierte Schnittstelle wird der Sensor Observation Service benutzt. 3.1.2 SOS-Implementierung von 52° North Für den in Kapitel 2.1.1 beschriebenen Sensor Observation Service sind nur die Schnittstelle definiert, nicht aber der Service selber. Es gibt aber mehrere frei verfügbare Umsetzungen für diesen Web-Service. Diese Implementierung sind für verschiedene Programmiersprachen, etwa für Java, C++ oder Python verfügbar. Die Java-Realisierung von 52° North bietet sich hier an, da man aus gleicher Hand das OX-Framework als Schnittstelle für eigene Anwendungen, bekommt. Für den SOS-Server von 52° North ist der Webserver Tomcat notwendig. Für die hier beschriebene Internet-Applikation benötigt man ebenfalls einen Webserver zur Ausführung des Servlets. Auf dem Tomcat-Servlet-Container können also beide Anwendungen ausgeführt werden. Die Implementation unterstützt die Operationen des Core-Profils und darüber hinaus noch einige Operationen des Enhanced Profile. GetResult ermöglicht es, bei konstanten Metadaten, nur Messdaten ohne Metadaten abzufragen. Die Operation GetFeatureOfIntererst liefert die Objekte, dessen Eigenschaften vom Sensor überwacht werden. GetObservationById benötigt als Parameter die Id für eine Beobachtung um die Observation zurückzugeben. Das Transactional Profile wird nicht unterstützt so, dass das Eintragen neuer Sensoren oder Messwerte nicht über die definierten Schnittstellen des SOS erfolgen kann. Dazu muss direkt auf die Datenbank zugegriffen werden. Die Installation des Servers sowie die Dokumentation der Datenbank findet man in [18]. 3.1.3 UroSweClient als Container für die grafische Oberfläche Die im Rahmen der Vorentwicklung entstandenen Funktionalitäten soll durch diese Arbeit erweitert werden. Dazu soll die Portlet-Architektur des UroSweClients erweitert werden. Im Menü SOS connections findet man Menüpunkte zum Anlegen und Löschen von Verbindungen sowie zum Laden einer Verbindung. Die geladene Verbindung wird im SweConfigurationPanel unter der Menüleiste angezeigt. 33 3. SOSGui – Grafisches Benutzerinterface zur Datenabfrage und Visualisierung für ein ortsbasiertes Servicesystem Abbildung 3.6: UroSweClient als Container für die GUI Wie in Abbildung 3.6 zu sehen ist, befindet sich links eine Übersicht, mit welchen Servern die Anwendung verbunden ist. Unter der Server-Adresse findet man einige Buttons, mit denen man Funktionalitäten der Oberfläche aufrufen kann. Die Funktion wird dann als Tab links neben der Verbindungsübersicht geöffnet. 3.1.4 UroSweClient-Portlet-Schnittstelle für die GUI Im Rahmen der Portlet-Architektur soll sich das grafische Benutzerinterface zur Messdatenauswertung in den UroSweClient integrieren. Dazu muss in der vorhandenen Oberfläche ein Button angelegt werden, der einen neuen Tab mit der Gui öffnet. 34 3. SOSGui – Grafisches Benutzerinterface zur Datenabfrage und Visualisierung für ein ortsbasiertes Servicesystem Abbildung 3.7: Ablauf beim Zugriff auf eine Funktion der Oberfläche Das dargestellte Vorgehen in Abbildung 3.7 beginnt mit dem Laden der Verbindung. Dadurch werden die SOSConnectionInfo angelegt. Um einen neuen Button anzulegen, müssen zwei Dateien bearbeitet werden. In der Datei SweGuiConstants.java muss ein neuer Button Identifier eingetragen werden. Diese Konstante bezeichnet später den Funktionstyp, welche aufgerufen werden soll. 17 package org.uro.urosweclient.client.Control; ┋ 26 public class SweGuiConstants { ┋ 43 ///////////////////////////////////////////////////////////////////////// 44 //BUTTON IDENTIFIER ///////////////////////////////////////////////////// 45 public static final String SETTINGS = "Settings"; 46 public static final String DB_MENUE = "SOS connections"; 47 public static final String ADD_DB = "Add SOS connection"; 48 public static final String RM_DB = "Remove SOS connection"; 49 public static final String LOAD_DB = "Load SOS connection"; 50 public static final String CANCEL = "Cancel"; 51 public static final String META = "SOS connection MetaData"; 52 public static final String SERVICE_META = "Show Service MetaData"; 53 public static final String SENSOR_META = "Show Sensor MetaData"; 54 public static final String TIMESERIES = "Timeseries Control"; 55 public static final String TIMESERIES_ADD = "Add new Timeseries"; 56 public static final String TIMESERIES_RM = "Remove Timeseries"; 57 public static final String DESASTER = "Desaster Management"; ┋ 85 } Listing 3.1: ::org.uro.urosweclient.client.Control::SweGuiConstants Für den Button muss eine Methode zum Anlegen in der Datei SweConfigurationPanel.java erzeugt werden. 35 3. SOSGui – Grafisches Benutzerinterface zur Datenabfrage und Visualisierung für ein ortsbasiertes Servicesystem 17 package org.uro.urosweclient.client.view.gui.elements; ┋ 58 public class SweConfigurationPanel extends ContentPanel implements SweViewable { ┋ 232 private class SOSUrlPanel extends ContentPanel implements SweViewable { ┋ 285 286 /** 287 * This function adds all buttons to the SOSUrlPanel.<p> 288 * - MetaData<p> 289 * - TimeSeries<p> 290 * - DesasterManagement<p> 291 */ 292 private void addButtons() { 293 294 this.addMetaDataButton(); 295 this.addTimeSeriesButton(); 296 this.addDesasterButton(); 297 } ┋ 304 private void addMetaDataButton() { 305 //Generate Button 306 Button metadata = new Button(); ┋ 317 //Add actions 318 metaService.addSelectionListener(new SelectionListener<MenuEvent>() { 319 //Generate Tab with MetaDataView 320 321 public void componentSelected(MenuEvent me) { ┋ info.getView().getControl().getEventmanager(). ┋ fireGenerateMetaDataTabView(getId(), SweGuiConstants.SENSOR_META); 323 } 334 }); ┋ 340 this.add(metadata, new VBoxLayoutData(new Margins(0, 0, 5, 0))); 341 } ┋ 529 } 530 } Listing 3.2: Innere Klasse SOSUrlPanel der Klasse ::org.uro.urosweclient.client.view.gui.elemets::SweConfigurationPanel In Zeile 321ff des Listing 3.2 wird auf Tastendruck beispielhaft die Funktion, die mit dem Button Identifier SENSOR-META verbunden ist, aufgerufen. Durch die Methode addButtons() wird die Methode addMetaDataButton() aufgerufen und der Button im SweConfigurationPanel angelegt. Um nun dem Button eine Funktion zuzuordnen, muss die Datei SweServiceMetaDataTab.java angepasst werden. Im Listing der Datei sieht man die Methode createContent(). Diese muss um einen if else-Zweig für den neuen Button Identifier erweitert werden. 36 3. SOSGui – Grafisches Benutzerinterface zur Datenabfrage und Visualisierung für ein ortsbasiertes Servicesystem 17 package org.uro.urosweclient.client.view.gui.elements; ┋ 56 public class SweServiceMetaDataTab extends SweTab { ┋ 82 private void createContent(SOSConnectionInfo sosinfo, String type) { ┋ 91 String tag = ""; 92 93 if (type.equals(SweGuiConstants.SERVICE_META)) { 94 95 tag = "SERVICE METADATA"; 96 97 } else if (type.equals(SweGuiConstants.SENSOR_META)) { 98 99 tag = "SENSOR METADATA"; 100 } ┋ 107 //Generate the ContentPanel 108 ContentPanel cp = new ContentPanel(); 109 cp.setBodyBorder(false); 110 cp.setHeaderVisible(false); 111 cp.setButtonAlign(HorizontalAlignment.CENTER); 112 cp.setLayout(new FitLayout()); 113 cp.setFrame(false); 114 cp.setHeight(this.getView().getTabPanel().getHeight() - 20); 115 cp.setWidth(this.getView().getTabPanel().getWidth()); ┋ 138 //Add data elements to parents 139 cp.add(tree); 140 this.add(cp); 141 } ┋ 240 } Listing 3.3: ::org.uro.urosweclient.client.view.gui.elements::SweServiceMetaDataTab Das ContentPanel, das in Zeile 108 angelegt wird, nimmt entsprechend der Variable tag die geforderte Funktion auf. 3.2 SOSGui – Struktur der Quellen Bei der Entwicklung der Anwendung wurde ein eigenständiges Software-Design umgesetzt. Um sie balastfrei und kompakt zu programmieren, wurde sie als unabhängiger Webservice implementiert. Erst nach Abschluss der Entwicklung wird sie über oben beschriebene Schnittstelle in den UroSweClient integriert. Das Google Web Toolkit gibt als grundsätzliche Struktur zwei Pakete vor. Abbildung 3.8 stellt dies da. Abbildung 3.8: SOSGui Paketstruktur 37 3. SOSGui – Grafisches Benutzerinterface zur Datenabfrage und Visualisierung für ein ortsbasiertes Servicesystem Das Clientpaket enthält das Frontend und das Serverpaket das Java-Servlet. Beide Bestandteile der Rich Internet Applikation kommunizieren über den GWT-RPC-Service mit einander. Client- und Server sind wiederum in Pakete unterteilt. 3.2.1 Serverpaket der SOSGui Schichten sollen Funktionalitäten kapseln, so dass die Implementierung einer Schicht leicht zu ersetzen ist. Dieses System besteht aus drei Schichten, wie Abbildung zeigt. Abbildung 3.9: SOSGui Schichten des Serverpaketes Die Serviceverbindungsschicht bietet Funktionen, die Daten für die Übertragung aufbereitet. Im Clientpaket muss eine passende Gegenstück zu dieser Schicht vorhanden sein. Bei der SOSGui-Applikation wird hier der GWT-RPC-Mechanismus implementiert. In der Datenrepräsentationsschicht werden fachliche Objekt realisiert. Diese Objekte stellen strukturiert Daten für Programmlogik bereit. Wie diese Daten dauerhaft gespeichert werden, ist der Schicht aber nicht bekannt. Dazu ist die Datenspeicherschicht zuständig. Zugriffe auf den SOS-Server zum Lesen werden hier implementiert. 3.2.2 Clientpaket der SOSGui Das Clientpaket ist ebenfalls in drei Schichten unterteilt. Außerhalb dieser Schichten ist der MainEntryPoint angeordnet, da er einen variablen Einsprungpunkt in die Anwendung darstellt (siehe dazu Abbildung 3.10). Während der Entwicklung stellt es den Einsprungpunkt in die GWT-Anwendung dar. Wenn die Gui später in die Portlet-Architektur des Gesamtsystems integriert werden soll , stellt diese Funktion einen Container mit der Gui bereit. Dieser Container wird dann in die Hauptanwendung eingebettet. 38 3. SOSGui – Grafisches Benutzerinterface zur Datenabfrage und Visualisierung für ein ortsbasiertes Servicesystem Abbildung 3.10: SOSGui Schichten des Clientpaketes Das Gegenstück zur Serviceverbindungsschicht des Serverpaketes stellt die Serviceverbindungsschicht des Clientpaketes dar. Obwohl die Datenrepräsentationsschicht von Clientpaket und Serverpaket gleich heißen, enthalten sie doch unterschiedliche Objekte. Im Clientpaket sind hier die Datenobjekte gespeichert, die für Präsentation notwendig sind. Die Präsentationsschicht enthält die grafischen Elemente, die zur Darstellung der Daten benötigt werden. Die Zugehörigkeit der einzelnen Klassen zu einer Schicht und deren Interaktion geht aus den Abbildungen und im Anhang hervor. 3.3 SOSGui – Klassenentwurf 3.3.1 Serverpaket Broker<T> Die generische Klasse Broker<T> enthält die Methode makeObject, die in konkreten Subklassen implementiert werden müssen. Die Methode query benötigt die SOS-Operation, die Adresse das SOS-Servers und die Parameter für die SOS-Operation als Aufrufparameter CapabilityBroker Diese Klasse enthält die Implementierung der makeObject-Methode. Sie hat das Wissen über den genauen Aufbau der getCapabilities-Operation des SOS. Ein CapabilityBroker-Objekt kann nur über getInstance erzeugt werden. Die Methode getCapability liefert das Capability-Object zurück und benötigt als Parameter nur SOSConnection. Wenn nun eine getCapabilities-Operation mit mehr Parametern gewünscht ist, kann man hier eine weitere getCapability-Methode als überladenen Methode implementieren. ObservationBroker und ObservationContentHandler Von der Art der Implementierung unterscheidet sich die Klasse ObservationBroker nur wenig von der Klasse CapabilityBroker. Allerdings benutzt die Methode getObservation zum Zerlegen der Ant39 3. SOSGui – Grafisches Benutzerinterface zur Datenabfrage und Visualisierung für ein ortsbasiertes Servicesystem wort des SOS-Servers nicht die Funktionen des OX-Frameworks. Über die Klasse ObservationContentHandler wird der SAX-Parser benutzt um dem O&M-Dokument die Daten zu entnehmen. Observation, Offering und Capability Diese Klassen bilden die Ergebnis-Objekte der Broker-Klassen. Sie enthalten nur get und set Methoden für die Attribute. SOSConnection SOSConnection enthält die Verbindungsparameter für den SOS-Server. Über den Konstruktor wird das Attribut url mit der Adresse des SOS-Servers gesetzt. GWTServiceImpl Die get-Methoden sind die Implementierung des GWT-RPC. Die Methode iso8601ToDate wandelt das Datumsformat des Sensor Observation Service in ein Date-Objekt. convertStringToDouble wird bisher nicht benutzt. 3.3.2 Clientpaket GWTService und GWTServiceAsync Die Methoden dieser Klasse sind die Gegenstelle des GWT-RPC-Service. GetObservation liefert ein ObservationModel, welches eine Tabelle für die Anzeige enthält. Als Parameter müssen alle notwendigen Parameter der GetObservation-Operation des SOS sowie die URL angegeben werden. GetCapability benötigt nur die URL um ein CapabilityTreeModel zurückzugeben. ObservationModel und ObservationChartModel Diese Klassen sind Daten-Objekte für die Darstellung innerhalb der Gui. Sie enthalten nur get- und set-Methoden für deren Attribute. CapabilityTreeModel CapabilityTreeModel erweitert das BaseTreeModel. Innerhalb des Konstruktors werden die set-Methoden des BaseTreeModels aufgerufen. Mit diesem Objekt lässt sich ein Baum aufbauen, mit dem der CapabilityTreeContainer befüllt wird. DateTimePicker Eine Objekt dieser Klasse realisiert eine Kombination aus Datumsfeld und Zeitfeld. TimeAxis Diese Klasse ist eine Erweiterung der Klasse XAxis und enthält Methoden. 40 3. SOSGui – Grafisches Benutzerinterface zur Datenabfrage und Visualisierung für ein ortsbasiertes Servicesystem EventManager, ISelectListener und OverviewLayoutContainer OverviewLayoutContainer implementiert das Interface ISelectListener. Die Methode addSelectListener() trägt ein Objekt in eine Liste des EventManagers ein. Über die statische Methode getInstance erhält man eine Instanz des EventManagers. Durch einen fireSelectionChanged-Methodenaufruf werden alle Objekte in der Liste über das Selection-Ereignis informiert, die Methode onSelect der Listenobjekte wird aufgerufen. OverviewLayoutContainer teilt die Anzeigefläche für die Gui auf. Sie legt eine ToolBar an, erzeugt ein Tab-Panel für die ObservationTableContent und ein Contentpanel für die CapabilityTreeContainer. ObservationTableContentPanel Diese Container-Klasse enthält die Ansicht einer Tabelle, die die Messwerte anzeigt. CapabilityTreeContainer Hier findet man einen Baum zur Ansicht der Capabilities des SOS-Servers. Unterhalb der Serverbezeichnung werden die Sensoren und darunter die Phänomene, die der Sensor aufzeichnet, zur Auswahl angezeigt. ObservationChartWindow Diese Klasse implementiert ein Fenster, welches die ausgewählten Messwerte im ObservationTableContentPanel, grafisch darstellt. 41 4. Zusammenfassung und Ausblick 4. Zusammenfassung und Ausblick In dieser Arbeit wird dargestellt, welche Möglichkeiten die Verknüpfung unterschiedlicher Techniken wie das Sensor-Web-Enablement mit einer Rich Internet Application bietet. Das Laborpersonal hat die Möglichkeit in einer Flexiblen Umgebung, immer unter einer gleichen Benutzeroberfläche Daten abzurufen. Die Gui bietet einen ersten Überblick über die Daten, in dem es den zeitlichen Verlauf der Sensormesswerte visualisiert. Es stellte sich aber heraus, dass das Abspeichern der Messwerte aus einer JavaScript-Anwendung heraus nicht möglich ist. Durch die Entwicklung mit dem GWT-Compiler, helfen auch die Möglichkeiten vom Google Web Toolkit nicht weiter. Eine Möglichkeit dies zu Implementieren besteht aber durch Einsatz eines Servlets, das die gewünschten Daten aus dem Sensor Observation Service abholt und einen Downloadlink für diese zur Verfügung stellt. Dies zu implementieren war aus zeitlichen Gründen nicht mehr möglich. Die verwendete Technik wird sehr aktiv weiterentwickelt. Während der Bearbeitungsphase wurde für das Google Web Toolkit mehrere Aktualisierungen herausgegeben. Auch das User Interface Framework ExtGWT erschien während der Entwicklung in einer neuen Version, die als Haupteigenschaft die Kompatibilität zum Google Web Toolkit verbesserte. Die vom ExtGWT zur Verfügung gestellten grafischen Elemente ermöglichen den Aufbau einer Gui, die der einer Desktop-Anwendung kaum nachsteht. Da ExtGWT eigene Konzepte zur Programmierung umsetzt ist der Einstieg in dieses Framework wenig intuitiv. Zudem weist das Framework eine schlecht Dokumentation auf. Der Entwickler findet kaum Beispiele, die vom Hersteller herausgegebenen sind sehr komplex und nicht vollständig. Vom Hersteller wird eine Tool vermarktet, was den Aufbau grafischer Oberflächen mittels Gui-Designer ermöglicht. Um schneller und weniger fehleranfällig zu Ergebnissen zu kommen, ist der Einsatz eines solchen Tools anzuraten. Die Möglichkeiten zur Visualisierung der Messwerte durch das ExtGWT-Framework ist begrenzt. Der Einsatz von Alternative, zum Beispiel Google Chart Tools Library, könnte Möglichkeiten wie beispielsweise Hilfslinien oder Drag and Drop innerhalb des Diagramms ermöglichen. Eine grafische Auswahlmöglichkeit der Sensoren über eine Karte ist gerade in einem Umfeld mit mobilen Sensoren interessant. Als Ansatz gibt es hier OpenLayers, in das man auch eigene Karten einbinden kann. Um die Entwicklung weiter voranzutreiben, ist es aber erforderlich über einen umfangreichen Satz an Testdaten zu verfügen. Wenn diese Voraussetzungen erfüllt sind, lassen sich die Möglichkeiten dieser GUI um viele sinnvolle Fähigkeiten erweitern. 42 Anhang Anhang SensorML-Beispiel-Dokument <?xml version="1.0" encoding="ISO-8859-1" standalone="no"?> <sml:SensorML xmlns:sml="http://www.opengis.net/sensorML/1.0.1" xmlns="http://www.opengis.net/sensorML/1.0.1" xmlns:gml="http://www.opengis.net/gml" xmlns:swe="http://www.opengis.net/swe/1.0.1" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.0.1" xsi:schemaLocation="http://www.opengis.net/sensorML/1.0.1 http://schemas.opengis.net/sensorML/1.0.1/sensorML.xsd"> <sml:member> <sml:System> <!--sml:identification element must contain the ID of the sensor--> <sml:identification> <sml:IdentifierList> <sml:identifier> <sml:Term definition="urn:ogc:def:identifier:OGC:uniqueID"> <sml:value> urn:ogc:object:f eature:Sensor:IFGI:ifgi-sensor-1 </sml:value> </sml:Term> </sml:identifier> </sml:IdentifierList> </sml:identification> <!-- sml:capabilities element has to contain status and mobility information --> <sml:capabilities> <swe:SimpleDataRecord> <!-- status indicates, whether sensor is collecting data at the moment (true) or not (false) --> <swe:field name="status"> <swe:Boolean> <swe:value>true</swe:value> </swe:Boolean> </swe:field> <!-- status indicates, whether sensor is mobile (true) or fixed (false) --> <swe:field name="mobile"> <swe:Boolean> <swe:value>false</swe:value> </swe:Boolean> </swe:field> </swe:SimpleDataRecord> </sml:capabilities> <!-- last measured position of sensor --> <sml:position name="sensorPosition"> 43 Anhang <swe:Position referenceFrame="urn:ogc:def:crs:EPSG:4326"> <swe:location> <swe:Vector gml:id="STATION_LOCATION"> <swe:coordinate name="easting"> <swe:Quantity axisID="x"> <swe:uom code="degree"/> <swe:value>7.727958</swe:value> </swe:Quantity> </swe:coordinate> <swe:coordinate name="northing"> <swe:Quantity axisID="y"> <swe:uom code="degree"/> <swe:value>51.883906</swe:value> </swe:Quantity> </swe:coordinate> <swe:coordinate name="altitude"> <swe:Quantity axisID="z"> <swe:uom code="m"/> <swe:value>52.0</swe:value> </swe:Quantity> </swe:coordinate> </swe:Vector> </swe:location> </swe:Position> </sml:position> <!-- list containing the input phenomena for this sensor system --> <sml:inputs> <sml:InputList> <sml:input name="waterlevel"> <swe:ObservableProperty definition="urn:ogc:def:phenomenon:OGC:1.0.30:waterlevel"/> </sml:input> </sml:InputList> </sml:inputs> <!-- list containing the output phenomena of this sensor system; ATTENTION: these phenomena are parsed and inserted into the database; they have to contain offering elements to determine the correct offering for the sensors and measured phenomena --> <sml:outputs> <sml:OutputList> <sml:output name="waterlevel"> <swe:Quantity definition="urn:ogc:def:phenomenon:OGC:1.0.30:waterlevel"> <gml:metaDataProperty> <offering> <id>GAUGE_HEIGHT</id> <name> waterlevel of rivers in North Rhine Westfalia </name> </offering> </gml:metaDataProperty> 44 Anhang <swe:uom code="cm"/> </swe:Quantity> </sml:output> </sml:OutputList> </sml:outputs> <!-- description of components of this sensor system; these are currently not used by the 52N SOS --> <sml:components> <sml:ComponentList> <sml:component name="water sensor"> <sml:Component> <sml:identification> <sml:IdentifierList> <sml:identifier> <sml:Term definition="urn:ogc:def:identifier:OGC:uniqueID"> <sml:value> urn:ogc:object:feature:Sensor:water_level_sensor </sml:value> </sml:Term> </sml:identifier> </sml:IdentifierList> </sml:identification> <sml:inputs> <sml:InputList> <sml:input name="waterlevel"> <swe:ObservableProperty definition="urn:ogc:def:phenomenon:OGC:1.0.30:waterlevel"/> </sml:input> </sml:InputList> </sml:inputs> <sml:outputs> <sml:OutputList> <sml:output name="waterlevel"> <swe:Quantity definition="urn:ogc:def:phenomenon:OGC:1.0.30:waterlevel"> <swe:uom code="cm"/> </swe:Quantity> </sml:output> </sml:OutputList> </sml:outputs> </sml:Component> </sml:component> </sml:ComponentList> </sml:components> </sml:System> </sml:member> </sml:SensorML> 45 Anhang O&M-Beispiel-Dokument <?xml version="1.0" encoding="UTF-8"?> <om:ObservationCollection xmlns:om="http://www.opengis.net/om/1.0" xmlns:gml="http://www.opengis.net/gml" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:sa="http://www.opengis.net/sampling/1.0" gml:id="oc_0" xsi:schemaLocation="http://www.opengis.net/om/1.0 http://schemas.opengis.net/om/1.0.0/om.xsd http://www.opengis.net/sampling/1.0 http://schemas.opengis.net/sampling/1.0.0/sampling.xsd"> <gml:boundedBy> <gml:Envelope srsName="urn:ogc:def:crs:EPSG:4326"> <gml:lowerCorner>52.9 7.52</gml:lowerCorner> <gml:upperCorner>52.9 7.52</gml:upperCorner> </gml:Envelope> </gml:boundedBy> <om:member> <om:Measurement gml:id="o_3"> <om:samplingTime> <gml:TimeInstant xsi:type="gml:TimeInstantType"> <gml:timePosition>2008-0401T17:46:00.000+02:00</gml:timePosition> </gml:TimeInstant> </om:samplingTime> <om:procedure xlink:href="urn:ogc:object:feature:Sensor:IFGI:ifgisensor-1"/> <om:observedProperty xlink:href="urn:ogc:def:phenomenon:OGC:1.0.30:waterlevel"/> <om:featureOfInterest> <sa:SamplingPoint gml:id="foi_1001"> <gml:name>ALBER</gml:name> <sa:position> <gml:Point> <gml:pos srsName="urn:ogc:def:crs:EPSG:4326">52.9 7.52</gml:pos> </gml:Point> </sa:position> </sa:SamplingPoint> </om:featureOfInterest> <om:result uom="cm">70.4</om:result> </om:Measurement> </om:member> <om:member> <om:Measurement gml:id="o_2"> <om:samplingTime> <gml:TimeInstant xsi:type="gml:TimeInstantType"> <gml:timePosition>2008-0401T17:45:00.000+02:00</gml:timePosition> </gml:TimeInstant> </om:samplingTime> <om:procedure xlink:href="urn:ogc:object:feature:Sensor:IFGI:ifgisensor-1"/> <om:observedProperty xlink:href="urn:ogc:def:phenomenon:OGC:1.0.30:waterlevel"/> <om:featureOfInterest> 46 Anhang <sa:SamplingPoint gml:id="foi_1001"> <gml:name>ALBER</gml:name> <sa:position> <gml:Point> <gml:pos srsName="urn:ogc:def:crs:EPSG:4326">52.9 7.52</gml:pos> </gml:Point> </sa:position> </sa:SamplingPoint> </om:featureOfInterest> <om:result uom="cm">40.2</om:result> </om:Measurement> </om:member> <om:member> <om:Measurement gml:id="o_1"> <om:samplingTime> <gml:TimeInstant xsi:type="gml:TimeInstantType"> <gml:timePosition>2008-0401T17:44:00.000+02:00</gml:timePosition> </gml:TimeInstant> </om:samplingTime> <om:procedure xlink:href="urn:ogc:object:feature:Sensor:IFGI:ifgisensor-1"/> <om:observedProperty xlink:href="urn:ogc:def:phenomenon:OGC:1.0.30:waterlevel"/> <om:featureOfInterest> <sa:SamplingPoint gml:id="foi_1001"> <gml:name>ALBER</gml:name> <sa:position> <gml:Point> <gml:pos srsName="urn:ogc:def:crs:EPSG:4326">52.9 7.52</gml:pos> </gml:Point> </sa:position> </sa:SamplingPoint> </om:featureOfInterest> <om:result uom="cm">50.0</om:result> </om:Measurement> </om:member> <om:member> <om:Measurement gml:id="o_6"> <om:samplingTime> <gml:TimeInstant xsi:type="gml:TimeInstantType"> <gml:timePosition>2008-0401T17:49:00.000+02:00</gml:timePosition> </gml:TimeInstant> </om:samplingTime> <om:procedure xlink:href="urn:ogc:object:feature:Sensor:IFGI:ifgisensor-1"/> <om:observedProperty xlink:href="urn:ogc:def:phenomenon:OGC:1.0.30:waterlevel"/> <om:featureOfInterest> <sa:SamplingPoint gml:id="foi_1001"> <gml:name>ALBER</gml:name> <sa:position> <gml:Point> <gml:pos srsName="urn:ogc:def:crs:EPSG:4326">52.9 47 Anhang 7.52</gml:pos> </gml:Point> </sa:position> </sa:SamplingPoint> </om:featureOfInterest> <om:result uom="cm">110.1213</om:result> </om:Measurement> </om:member> <om:member> <om:Measurement gml:id="o_5"> <om:samplingTime> <gml:TimeInstant xsi:type="gml:TimeInstantType"> <gml:timePosition>2008-0401T17:48:00.000+02:00</gml:timePosition> </gml:TimeInstant> </om:samplingTime> <om:procedure xlink:href="urn:ogc:object:feature:Sensor:IFGI:ifgisensor-1"/> <om:observedProperty xlink:href="urn:ogc:def:phenomenon:OGC:1.0.30:waterlevel"/> <om:featureOfInterest> <sa:SamplingPoint gml:id="foi_1001"> <gml:name>ALBER</gml:name> <sa:position> <gml:Point> <gml:pos srsName="urn:ogc:def:crs:EPSG:4326">52.9 7.52</gml:pos> </gml:Point> </sa:position> </sa:SamplingPoint> </om:featureOfInterest> <om:result uom="cm">45.456</om:result> </om:Measurement> </om:member> <om:member> <om:Measurement gml:id="o_4"> <om:samplingTime> <gml:TimeInstant xsi:type="gml:TimeInstantType"> <gml:timePosition>2008-0401T17:47:00.000+02:00</gml:timePosition> </gml:TimeInstant> </om:samplingTime> <om:procedure xlink:href="urn:ogc:object:feature:Sensor:IFGI:ifgisensor-1"/> <om:observedProperty xlink:href="urn:ogc:def:phenomenon:OGC:1.0.30:waterlevel"/> <om:featureOfInterest> <sa:SamplingPoint gml:id="foi_1001"> <gml:name>ALBER</gml:name> <sa:position> <gml:Point> <gml:pos srsName="urn:ogc:def:crs:EPSG:4326">52.9 7.52</gml:pos> </gml:Point> </sa:position> </sa:SamplingPoint> </om:featureOfInterest> 48 Anhang <om:result uom="cm">60.5</om:result> </om:Measurement> </om:member> </om:ObservationCollection> 49 Anhang Klassendiagramm des Serverpaketes 50 Klassendiagramm des Clientpaketes 51 Literaturverzeichnis Literaturverzeichnis [1] Wagner, Benjamin: Ortsbasiertes Service-System für die Laborautomatisierung, Diplomarbeit, Universität Rostock, 2010 [2] OGC White Paper - OGC Sensor Web Enablement: Overview And High Level Architecture, Open Geospatial Consortium Inc., 2007 [3] Klipp, Roman: Sensor Web Standards für proprietäre Messnetze, Diplomarbeit, Berufsakademie Gera - University of Cooperative Education, 2008 [4] OpenGIS® Implementation Standard - Sensor Observation Service, Open Geospatial Consortium Inc., 2007 [5] OpenGIS© Discussion Paper - Sensor Model Language (SensorML)for In-situ and Remote Sensors, Open GIS Consortium Inc., 2002 [6] OpenGIS® Implementation Standard - Observations and Measurements –Part 1 Observation schema, Open Geospatial Consortium Inc., 2007 [7] OpenGIS® Implementation Standard - Observations and Measurements –Part 2 Sampling Features, Open Geospatial Consortium Inc., 2007 [8] Google Web Toolkit API Reference, http://google-webtoolkit.googlecode.com/svn/javadoc/2.1/index.html, Google Inc., geprüft am 10.01.2011 [9] Internationalizing a GWT Application, http://code.google.com/intl/deDE/webtoolkit/doc/latest/tutorial/i18n.html, Google Inc., geprüft am 10.01.2011 [10] Unit Testing GWT Applications with JUnit, http://code.google.com/intl/deDE/webtoolkit/doc/latest/tutorial/JUnit.html, Google Inc., geprüft am 10.01.2011 [11] Communicating with the server, http://code.google.com/intl/deDE/webtoolkit/doc/latest/tutorial/clientserver.html, Google Inc., geprüft am 10.01.2011 [12] Ext GWT Help Center, http://www.sencha.com/helpcenter/index.jsp, Sencha Inc., geprüft am 10.01.2011 [13] Bröring, Arne; Jürrens, Eike Hinderk; Jirka, Simon; Stasch, Christoph: Development of Sensor Web Applications with Open Source Software, 52° North Initiative for Geospatial Open Source Software GmbH, 2009 [14] Heß, Christian: Dienst-orientierte Middleware für die Einbindung von Sensordaten in Anwendungen, Diplomarbeit, Universität Rostock, 2009 [15] User's Guide - eZ430-RF2480 Demonstration Kit, Texas Instruments, 2008 [16] Data Sheet - MSP430x22x2, MSP430x22x4 Mixed Signal Microcontroller, Texas Instruments, 2006 [17] Fox Board LX832 - A complete Linux system in just 66x72mm, http://foxlx.acmesystems.it/?id=4, ACME Systems, geprüft am 10.01.2011 [18] Sensor Web Enablement - Installation Guide for Sensor Observation Service, 52°North Initiative for Geospatial Open Source Software GmbH, 2010 52