6 Jan 2010, 1:08pm
Allgemein
by mweber
leave a comment

Spezifikationen

Ein paar neue Gedanken zu den Fernfühlern und der Versuch, mal ein paar “Spezifikationen” fest zu legen.

Also, es sollen ja 5 Fernfühler werden. Das sind eigentlich zu wenige, dass jeder ein einzelnes Neuron eines Netzes darstellt. Andererseits wäre das wiederum auch sehr spannend, es trotzdem zu realisieren. Insofern wäre jeder Fernfühler in gewisser Weise ein Neuron oder eigentlich die Repräsentation des 2D-Vektors eines Gewichts in einer SOM. Weiterhin sollen die Fernfühler ja auf Geräusche reagieren. Wenn man hier ein Protokoll integriert, dass die Fernfühler sich sozusagen austauschen können, dann könnte man das neuronale Netz direkt mit den Fernfühlern implementieren.

Folgende Schritte müssten dabei ablaufen:

  1. Die Fernfühler hören ein bestimmtes Geräusch, das sie anzieht.
  2. Die Fernfühler tauschen sich über Geräusche darüber aus, welcher der nächste Fernfühler ist (sozusagen das Gewinnerneuron).
  3. Mit den üblichen Lernregeln lernt dann jeder Fernfühler abhängig vom Abstand zum Gewinner und vom Abstand zur Geräuschquelle sein eigenes Gewicht neu.

Dies bedeutet natürlich, dass da auch eine gewisse Synchronisation statt finden muss. Es wird also schon ein Protokoll benötigt, das man in die Geräusche, die die Fernfühler machen, einbaut. Dieses sollte zumindest beinhalten, in welchem Zustand / welchem Schritt sich der jeweilige Fernfühler gerade befindet und welche ID der Fernfühler hat.

Auf diese Art und Weise ist keine zentrale Instanz, also z.B. ein Server oder ähnliches mehr notwendig. Die Fernfühler selbst bilden das neuronale Netz. Weiterhin kann jeder Fernfühler ein Bluetooth-Modul enthalten. Dadurch können sich Besucher der Ausstellung mit einem der Fernfühler verbinden und sozusagen dessen Sicht auf das Netz sehen. Das ist evtl. auch deshalb spannend, da ja aufgrund der Ungenauigkeiten des Trackings mit Geräuschen und auch evtl. Fehlern bei der Übertragung die Sicht eines Fernfühlers unterschiedlich sein kann zu den Sichten der anderen Fernfühler.  Sicht bedeutet dabei für mich, dass jeder Fernfühler eine komplette Repräsentation des Netzes enthält, die aber nur seine Sicht auf die Welt, so wie er sie wahrnimmt, darstellt.

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:

  1. LocalDevice localDevice = LocalDevice.getLocalDevice();
  2. localDevice.setDiscoverable(DiscoveryAgent.GIAC);
  3. StreamConnectionNotifier scnot =
  4. (StreamConnectionNotifier) Connector.open
  5. (“btspp://localhost:50b813d0;authenticate=false;encrypt=false;name=netact”);
  6. System.out.println(“Waiting for connection …”);
  7. StreamConnection scon = scnot.acceptAndOpen();
  8. System.out.println(“Got connection”);
  9. InputStream is = scon.openInputStream();
  10. 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.

 
  
 
  • Letzte Artikel

  • Kategorien

  • Archiv