Bluetooth-Gedoens
So, nachdem ich mich mit Bluetooth auf Java rumgeaergert habe, will ich hier mal meine Ergebnisse dazu schreiben.
Das Szenario sieht folgendermassen aus: Ein normaler Desktop-Computer mit Java SE 1.6.0u10 dient als Server, als Betriebssystem kommt Windows XP SP3 oder Linux (OpenSUSE 11.0) zum Einsatz. Dieser soll die SOM enthalten und alle per Bluetooth angeschlossenen Benutzer des Systems koordinieren. Fuer die Benutzer des Systems soll ein auf Java ME basierendes Programm auf Handys laufen. Dazu wird das Sun WTK 2.5.2 verwendet. Das Java ME Programm enthaelt eine Visualisierung der SOM und eine Moeglichkeit mit der SOM zu interagieren.
Folgender Sourcecode wird im Wesentlichen auf dem Server ausgefuehrt:
- LocalDevice localDevice = LocalDevice.getLocalDevice();
- localDevice.setDiscoverable(DiscoveryAgent.GIAC);
- StreamConnectionNotifier scnot =
- (StreamConnectionNotifier) Connector.open
- (“btspp://localhost:50b813d0;authenticate=false;encrypt=false;name=netact”);
- System.out.println(“Waiting for connection …”);
- StreamConnection scon = scnot.acceptAndOpen();
- System.out.println(“Got connection”);
- InputStream is = scon.openInputStream();
- OutputStream os = scon.openOutputStream();
Auf dem Client, also dem Handy laeuft nun Code, um alle Devices und deren Services aufzuspueren. Der Server-Rechner wird dabei auch gefunden und auch alle vom System installierten Services, allerdings nicht der eigene, neue Service. Dadurch kann ich auch nicht zum Server connecten, denn ich habe keine weiteren Informationen ueber den selbst kreierten Service. Die obige URL enthaelt die UID des Services, ueber den man auch explizit auf dem Client nach dem Service suchen kann, leider wird dieser aber nicht gefunden. Es hilft auch nichts, authenticate oder encrypt auf true zu setzen. Im Gegenteil, das verwendete Bluecove als Bluetooth-Implementierung fuer Java SE kann das sogar gar nicht.
Letztlich habe ich keine Loesung gefunden. Was hilft, ist den Server in C/C++ zu schreiben (derzeit fuer Linux). Dort wird dann keine UID, sondern direkt ein sogenannter Channel (eine Art Port, wenn man es mit z.B. TCP/IP vergleicht) angegeben. Der gleiche Port wird dann auch im Java-Programm auf dem Handy verwendet. Dadurch muss man nur noch nach dem Device suchen, das den Server darstellt, was auch einwandfrei funktioniert. Danach kann man direkt zu dem Channel auf dem Device connecten und es scheint alles wunderbar zu funktionieren.