Die Datenübertragungsraten sind abhängig von der Spezifikation bzw. der Bluetooth-Version des jeweiligen Produkts. Die Übertragungsrate hat sich während der ersten drei Versionen nicht gesteigert, sie wurde erst mit der Bluetooth-Spezifikation Version 2.0 erhöht. Ein Überblick über die Übertragungsraten, sowie die grossen Änderungen/Probleme, der jeweilgen Bluetooth-Versionen ist in [Tab.: 2.2] dargestellt.
Klassifikation Reichweite Sendeleistung Klasse 1 100 m 100 mW Klasse 2 40 m 2.5 mW Klasse 3 10 m 1 mW Tabelle 2.1: Reichweiten der einzelnen Bluetooth Klassen (Vgl. : [Wik06b])
Der Datentransport innerhalb der Bluetooth-Architektur sowie sämtliche Betriebsmodi folgen dem selben generischen Ansatz. Dieser generische Ansatz ist mit Hilfe einer Schichtenarchitektur realisiert, die in [Abb.: 2.1] dargestellt, und mit dem OSI-Schichtenmodell vergleichbar ist.
Bluetooth-Version Maximale Datenübertragungsrate Änderung/Problem 1.0 und 1.0B 723.2 Kbit/s Enthält Sicherheitsprobleme 1.1 723.2 Kbit/s Indikator für die Signalstärke hinzugefügt Received Signal Strength Indicator (RSSI) 1.2 723.2 Kbit/s Adaptive Frequency-Hopping spread spectrum (AFH) eingeführt; reduziert Interferenzen mit anderen Funktechnologien (z. B. WLAN) 2.0 2.1 Mbit/s Etwa dreifache Datenübertragungsgeschwindigkeit durch Enhanced Data Rate (EDR) Tabelle 2.2: Datenübertragungsraten von Bluetooth (Vgl. : [Wik06b, Versionen])
Abbildung 2.1: Allgemeine Datentransport Architektur von Bluetooth (Vgl. : [Blu03, Architecture, S.25; PDF, S. 101])





Die Authentifizierung beider Geräte erfolgt in zwei Schritten, das heisst es wird eine gegenseitige Authentifizierung beider Geräte vorgenommen. In direktem Anschluss der Authentifizierung des Geräts A bei Gerät B wird die Authentifizierung in entgegengesetzter Richtung vorgenommen10 (Vgl. : [Blu03, Security Specification, S. 758; PDF, S. 914]).
Entität Grösse Bluetooth Device Address (BD_ADDR) 48 Bit Privater Schlüssel des Benutzers (Authentifizierung) 128 Bit Privater Schlüssel des Benutzers (Verschlüsselung) 8-128 Bit Pseudozufallszahl (RAND) 128 Bit Tabelle 2.3: In Authentifizierung und Verschlüsselung involvierte Entitäten (Vgl. : [Blu03, Security Specification, S. 749; PDF, S. 907 Tabelle 1.1])
Die Spezifikation des GAP beschäftigt sich hauptsächlich damit, zu beschreiben, welchem Zweck die unteren Schichten des Bluetooth Protokollstapels dienen (LC und LMP). Um Sicherheitsbezogene Alternativen zu diskutieren, wurden ebenfalls höhere Ebenen mit einbezogen (L2CAP, RFCOMM und OBEX) [Blu03, Generic Access Profile, S. 181; PDF: S. 1129].Abbildung 2.2: GAP Schichtenmodell (Vgl.: Abbildung 2.1: Profile stack covered by this profile, S. 181 [Blu03])
Die spezifizierten Werte der Zugriffskennzeichner LIAC und GIAC sind auf der Bluetooth Homepage12 zu finden [Blu06].
Auffindbarkeitszustand Beschreibung Non-discoverable mode Ist das Gerät in diesem Zustand, so kann es von einer Suchanfrage nicht gefunden werden. Ein Bluetooth-Gerät in diesem Zustand wird als “Stilles Gerät” (silent device) bezeichnet. Limited discoverable mode (LIAC) Das Gerät ist für einen beschränkten Zeitraum oder bis zum Eintritt eines bestimmten Ereignisses auffindbar. Es sollte allerdings nicht länger als eine vordefinierte Zeit in diesem Zustand bleiben (timeout). Ist ein Gerät in diesem Zustand, antwortet es auf Suchanfragen die den Limited Dedicated Inquiry Access Code (LIAC) verwenden. General discoverable mode (GIAC) Das Gerät befindet sich in einem dauerhaft auffindbaren Zustand. Ist ein Gerät in diesem Zustand, antwortet es auf Suchanfragen die den General/Unlimited Inquiry Access Code (GIAC) verwenden. Tabelle 2.4: Auffindbarkeitszustände eines Bluetooth-Geräts [M+05, Generic Access Profile, S. 189ff; PDF, S.1137ff]
Die J2ME Architektur folgt also prinzipiell dem in [Abb.: 2.4] dargestellten Aufbau. Die einzelnen Schichten der Architektur (CLDC [Kapitel 2.3] und MIDP [Kapitel 2.4]) werden im Folgenden genauer beschrieben.


User Permission Gültigkeitszeitraum blanket Gültig für jede Ausführung der MIDlet-Applikation bis sie deinstalliert oder die Rechte vom Benutzer geändert werden. session Gültig vom Start eines MIDlets, bis zu dessen Termination. Der “session” Modus ist verpflichtet, den Benutzer beim oder vor dem ersten Aufruf einer geschützten Funktion einen Dialog anzuzeigen, in dem der Benutzer entweder den Zugriff gestattet oder ablehnt. Bei einem erneuten Start des MIDlets muss diese Abfrage erneut erfolgen. oneshot Eine Interaktion mit dem Benutzer ist bei jedem Zugriff auf ein geschütztes API notwendig. Tabelle 2.5: Gültigkeitszeitraum der Rechte eines MIDlets (Vgl. : [VW02, S. 26])
Eigenschaft Beschreibung bluetooth.api.version obex.api.version Version des Java APIs for Bluetooth wireless technology die unterstützt wird. Für die Version 1.1 wird entsprechend “1.1” zurückgeliefert. bluetooth.l2cap.receiveMTU.max Maximum Transfer Unit (MTU) in Empfangsrichtung, die von L2CAP unterstützt wird. Der zurückgelieferte Wert ist dezimal in einem java.lang.String kodiert. bluetooth.connected.devices.max Maximale Anzahl verbundener Geräte. bluetooth.connected.inquiry Kann eine Gerätesuche durchgeführt werden, während das Gerät bereits verbunden ist? bluetooth.connected.page Kann das lokale Gerät eine Verbindung zu einem entfernten Gerät herstellen, wenn das lokale Gerät bereits verbunden ist? bluetooth.connected.inquiry.scan Kann das lokale Gerät auf eine Suchanfrage antworten, während es mit einem anderen Gerät verbunden ist? bluetooth.connected.page.scan Kann das lokale Gerät eine Verbindung von einem anderen Gerät annehmen, während es bereits mit einem anderen Gerät verbunden ist? bluetooth.master.switch Ist der master/slave Wechsel erlaubt? bluetooth.sd.trans.max Maximale Anzahl zeitgleicher Dienstsuchen (Service Discovery) bluetooth.sd.attr.retrievable.max Maximale Anzahl der Service-Attribute die mit einem Service Record empfangen werden können. Tabelle 2.6: Übersicht der Eigenschaften des Geräts (Vgl. [M+05, S. 24, Tabelle 3-2 Device Properties])
Name Beschreibung Zulässige Werte Client oder Server master Gibt an, ob das Gerät master der Verbindung sein muss. true, false Beide authenticate Gibt an, ob das entfernte Gerät authentifiziert werden muss bevor eine Verbindung hergestellt werden kann. true, false Beide encrypt Gibt an, ob die Verbindung verschlüsselt werden muss. true, false Beide authorize Gibt an, ob alle Verbindungen zu diesem Gerät authorisiert werden müssen um den Dienst zu nutzen. true, false Server name Der Name des angebotenen Dienstes, der in der SDDB gespeichert wird. Jeder gültige String Server Tabelle 2.7: Gültige Parameter für RFCOMM Verbindungskennzeichner (Vgl. : [BJJ04, S. 59, Tabelle 4.1 Valid Parameters for RFCOMM Connection Strings])
Da das OBEX Protokoll über verschiedene Transportprotokolle verwendet werden kann, muss der String, der die Verbindung spezifiziert, das Transportprotokoll beinhalten. Die URL, um eine Verbindung zu einem entfernten Gerät herzustellen, hat folgenden Aufbau:
Operation Beschreibung CONNECT Stellt die Verbindung zum Server her. PUT Überträgt Daten vom Client an den Server. GET Überträgt Daten vom Server an den Client. SETPATH Ändert das Arbeitsverzeichnis auf dem Server. ABORT Bricht eine PUT oder GET Operation ab. CREATE-EMPTY Erzeugt ein leeres Objekt mit dem im Header angegebenen Namen auf dem Server. PUT-DELETE Löscht das im Header angegebene Objekt auf dem Server. DISCONNECT Beendet die Verbindung zum Server. Tabelle 2.8: OBEX Operationen
Der Aufbau der Bibliothek ist relativ simpel gehalten. Das >>oop<< Paket beinhaltet lediglich das Interface der Bibliothek sowie die Konstanten. Das >>util<< Paket beinhaltet Klassen, die zur Realisierung der Bibliothek notwendig waren. Das >>impl<< Paket beinhaltet diejenigen Klassen, welche die Übertragung der Daten letzten Endes realisieren. Das >>exceptions<< Paket enthält die von der OOP Bibliothek definierten Ausnahmen. Die Funktionalität der Klassen der jeweiligen Pakete wird im folgenden erläutert.
Durch Implementierung des IObexObjectPassing Interfaces ist zusätzlich eine einfache Weiterverarbeitung der Daten möglich, sollen diese persistent auf dem Gerät gespeichert werden. Begründet werden kann dies durch die Limiterung, welchen den mobilen Endgeräten auferlegt ist. Da sie laut der CLDC keine Kenntnis eines Dateisystems vorweisen müssen18, ist ein alternativer Mechanismus im MIDP zur Verfügung gestellt worden; das RMS19. Lese- und Schreiboperationen auf das RMS können jedoch ausschliesslich in Byte-Strömen durchgeführt werden. Durch die Implementierung der IObexObjectPassing Schnittstelle sind die Entitätsobjekte bereits auf diese Aufgabe vorbereitet. Auf den Umgang mit dem RMS soll an dieser Stelle jedoch nicht näher eingegangen werden20.
„Es werden funktionale Abstraktionen in Form von Operationssignaturen bereitgestellt, die das >>Was<<, aber nicht das >>Wie<< festlegen. Eine Schnittstelle besteht also im Allgemeinen nur aus Operationssignaturen, d. h. sie besitzt keine Operationsrümpfe und keine Attribute. Schnittstellen können jedoch in Vererbungsstrukturen verwendet werden. Eine Schnittstelle ist äquivalent zu einer Klasse, die keine Attribute und ausschließlich abstrakte Operationen besitzt.“ [Bal00, S. 817]Da in der Java Programmiersprache allerdings der Mechanismus der Mehrfachvererbung nicht vorgesehen ist, wäre die Modellierung als abstrakte Basisklasse für den Programmierer unvorteilhaft gewesen, da eine Schnittstelle, im Gegensatz zur abstrakten Basisklasse, auf n-ter Stufe der Erbhierarchie implementiert werden kann, wohingegen die abstrakte Basisklasse an der Wurzel der Erbhierarchie implementiert werden müsste.
Die Klassen ObjectPusher, ObjectReceiver und BulkObjectPusher aus [Abb.: 3.5] stellen dabei die in [Abb.: 3.4] als Concrete Subject bezeichnete Klasse dar.
Die Funktionalität der im >>impl<< Paket enthaltenen Klassen ist folgende:
Nach der Erzeugung des ObjectPusher Objekts ruft es, durch die interne Thread-Erzeugung, die Methode run() auf, in der die eigentliche Arbeit des Objekts verrichtet wird.
Die Testreihe konnte auf Grund mangelnder Hardware nicht auf zwei reale Mobiltelefone ausgedehnt werden. Der Versuch mit Hilfe der Bibliothek Daten von einem Laptop auf ein Mobiltelefon zu übertragen, schlug ebenfalls fehl. Das entfernte Gerät konnte weder vom Laptop noch vom Mobiltelefon aus gefunden werden.
Testbeschreibung Erwartetes Ergebnis Test Erfüllt Es wird versucht ein Objekt zu übertragen, dass die Schnittstelle IObexObjectPassing nicht implementiert. Die Übertragung wird abgebrochen. Ja Sind die Daten am Empfangsgerät korrekt rekonstruiert worden? Korrekte Rekonstruktion der Daten. Ja Es existieren zwei Geräte auf denen der Server ObjectReceiver gestartet wurde. Die Implementierung informiert den Anwender, dass mehrere Geräte verfügbar sind. Nein26 Es wird versucht zu senden, jedoch ist am Empfangsgerät keine ObjectReceiver Instanz erzeugt worden. Die Methode OOPFinder.getConnectionURL() liefert null. Ja Wird nach einer abgelehnten Verbindung durch das BCC eine erneute Rückfrage an den Benutzer gestellt? Rückfrage wird erneut gestellt. Nein27 Besteht die Möglichkeit ObjectReceiver und BulkObjectPusher parallel auf einem Gerät zu instanziieren? Beide können parallel gestartet werden. Ja Tabelle 3.1: Während der Entwicklung durchgeführte Testfälle
Die Struktur des Zustandsautomaten wird im Code durch die an den Zustandübergängen in [Abb.: 4.1] annotierten Methoden realisiert. Das Betriebssystem ist dadurch in der Lage beim Eintreffen eines externen Ereignisses, wie z. B. einem eingehenden Anruf, die Methode pauseApp() aufzurufen, durch die das MIDlet bis zu Fortführung pausiert wird. [Listing 1] zeigt ein einfaches „Hello World“ MIDlet um den Sachverhalt zu verdeutlichen.
Die [Abb.: 4.2] zeigt den Flow Designer für ein „Hello World“ Projekt. Wie zu sehen ist, verbindet man den Startpunkt der Applikation direkt mit der nach dem Start des MIDlets anzuzeigenden Form. Wird der mit Exit beschriftete Button des MIDlets gedrückt, terminiert die Applikation. Die Handhabung der Netbeans IDE, bezüglich der Applikationsentwicklung im J2ME Umfeld, soll an dieser Stelle nicht weiter vertieft werden4.
Da innerhalb der Applikation keine Möglichkeit besteht die zu übertragenden Daten zu manipulieren bzw. zu setzen, werden die Daten innerhalb des Programmcodes direkt zugewiesen. Die Konfiguration eines Person Objekts, das die Schnittstelle IObexObjectPassing implementiert, erfolgt wie in Listing [Listing 2] gezeigt. Das Beispiel zeigt wie zwei Person Objekte konfiguriert, und anschliessend mit der Klasse BulkObjectPusher versendet werden können.
[Auf beiden Telefonen muss zunächst das Programm mittels “Launch” gestartet werden.]
[Anzeige nach dem Programmstart.]
[>>1<< Der Server muss gestartet werden.]
[>>1<< Der Start des Servers muss einmalig bestätigt werden, da ein Zugriff auf das Bluetooth API erfolgt.]
[>>1<< Die vorhandenen Daten sollen angezeigt werden.]
[>>1<< Es sind keine Daten verfügbar, mit “Back” verlassen]
[>>2<< Daten sollen übertragen werden.]
[>>2<< Zum senden “Send” wählen.]
[>>2<< Der Zugriff auf das Bluetooth API muss einmalig bestätigt werden.]
[>>2<< Die Übertragung wird bestätigt, mit “Done” verlassen.]
[>>1<< Empfangene Daten können angezeigt werden.]
Abbildung 4.4: Ablauf der Beispielapplikation
Als nächstes zeigt sich einem der Dialog aus [Abb.: A.2], in dem man einen Projektordner, sowie einen Namen für das Projekt spezifiziert. Die Erzeugung des „Hello MIDlets“ kann deaktiviert werden, bleibt jedoch in diesem Beispiel aktiv.
Der Dialog kann jetzt mit einem Klick auf „Finish“ beendet werden. Anschliessend zeigt sich einem [Abb.: A.3].
Nachdem die Applikation erzeugt wurde, wird gemäss der Projektorganisation aus [Kapitel 4.2] eine Entitäsbibliothek erzeugt. Durch die Tastenkombination >>Strg+Shift+n<< wird erneut der „New Project“ Dialog geöffnet. Diesmal fällt die Auswahl jedoch auf „Mobil“→„Mobile Class Library“, wie in [Abb.: A.4] zu sehen ist.
Man spezifiziert für die Bibliothek, wie in [Abb.: A.5] gezeigt, ebenfalls einen Namen und einen Projektordner und beendet den Dialog mit einem Klick auf „Finish“.
Der vorzufindene Arbeitsplatz sieht nun aus wie in [Abb.: A.6] dargestellt.
Als nächstes muss die OOP Bibliothek Netbeans bekannt gemacht werden. Dies geschieht über den „Library Manager“ der durch die Tastenkombination >>Alt+t+l<< geöffnet werden kann. In dem folgenden Dialog selektiert man „Mobile Libraries“, und klickt auf „New Library“, woraufhin ein neuer Dialog erscheint, in dem der Name der Bibliothek eingetragen werden muss (siehe [Abb.: A.7]).
Ist dieser Schritt abgeschlossen muss der Bibliotheksbezeichnung noch ein Java-Archiv (JAR) hinzugefügt werden. Dies geschieht durch einen Klick auf „Add JAR“. In dem aufkommenden Dialog muss nun die JAR-Datei der OOP Bibliothek von dem lokalen Dateisystem gewählt werden (ObexObjectPassing.jar). Ist dieser Schritt abgeschlossen, zeigt sich einem [Abb.: A.8]
Die Bibliothek ist Netbeans nun bekannt und kann in den der IDE bekannten Projekten verwendet werden. Die Bibliothek muss zunächst dem Entitätsprojekt zugeordnet werden. Dazu klickt man mit der rechten Maustaste auf das Entitätsprojekt, und selektiert, wie in [Abb.: A.9] gezeigt „Libraries & Resources“. Dort ordnet man die Bibliothek mit einem Klick auf „Add Library“ dem Projekt zu.
Nachdem die Bibliothek mit einem Klick auf „Add Library“ und „Ok“ hinzugefügt wurde, muss die Entitätsbibliothek dem J2ME Projekt zugeordnet werden. Dazu wählt man , nach einem Rechtsklick auf das J2ME Projekt „Properties“→„Libraries & Resources“. Das Entitätsprojekt kann nun, mit einem Klick auf „Add Project“ vom lokalen Dateisystem gewählt werden (siehe [Abb.: A.10]).
Damit die OOP Bibliothek auch in der J2ME-Anwendung zur Verfügung steht muss sie, nach dem obligatorischen Rechtsklick, und der Wahl von „Properties“→„Libraries & Resources“, mit der Selektion von „Add Library“ hinzugefügt werden.
Nach einem Klick auf „Add Library“→„Ok“ ist die Bibliothek korrekt in das Projekt eingebunden worden. Ab diesem Zeitpunkt kann entwickelt werden.
|
|
This document was translated from LATEX by HEVEA.