Java APIs for Bluetooth Wireless Technology

Die Java APIs für Bluetooth ermöglichen es, auf Bluetooth Hardware zuzugreifen. Es werden Funktionen bereitgestellt

• zur Discovery von entfernten Geräten und Services,
• zur Registrierung von Services auf dem lokalen Gerät,
• zur Service Implementierung und
• zur Client Implementierung.


Als Protokolle zwischen Clients und Servern können

• RFCOMM (bidirektionale Datenströme zwischen Client und Server),
• L2CAP (Logical Link Control and Adaptation Protocol) und
• OBEX (Object Exchange Protocol)

genutzt werden.


Discovery

Für die Discovery von Services wird das LocalDevice, ein DiscoveryListener und der DiscoveryAgent benötigt. Das LocalDevice repräsentiert das lokale Bluetooth Gerät, der Discovery Agent führt die Discovery durch, und der DiscoveryListener empfängt Nachrichten über den Fortgang der Discovery. Nach der Discovery kann der Connect String für einen Service anhand der UUID des Services ermittelt werden.

    LocalDevice localdevice = LocalDevice.getLocalDevice();
    DiscoveryListenerImpl listener = new DiscoveryListenerImpl();
    DiscoveryAgent agent = localdevice.getDiscoveryAgent();
    agent.startInquiry(DiscoveryAgent.GIAC, listener);
    listener.waitForCompletion();
    UUID uuid = ... UUID erzeugen ...
    String connectstring = agent.selectService(uuid, ServiceRecord.NOAUTHENTICATE_NOENCRYPT, false);


public class DiscoveryListenerImpl implements DiscoveryListener
{
    ...
    /*
     * @see javax.bluetooth.DiscoveryListener#inquiryCompleted(int)
     */
    public synchronized void inquiryCompleted(int type)
    {
        notify();
    }
    /**
     * Method waitForCompletion
     *
     * @throws InterruptedException
     */
    public synchronized void waitForCompletion() throws InterruptedException
    {
        wait();
    }
}


Registrieren von Services

Services werden impliziert registriert, wenn bei Connector.open eine lokale URL angegeben wird. Teil der URL ist das Protokoll (z.B. bt_spp für RFCOMM oder bt_goep für OBEX) und die UUID anhand der der Service von den Clients identifiziert werden kann. Der Connector erzeugt Notifier Objekte, die für die Service Implementierung genutzt werden.

(StreamConnectionNotifier) Connector.open("bt_spp://localhost:<UUID>;name=<Name>;");
(SessionNotifier) Connector.open("bt_goep://localhost:<UUID>");


Implementieren von Services

Services bestehen aus einer while Scheife, in der die acceptAndOpen Methode des Notifiers aufgerufen wird. Im Falle eines OBEX Services hat die acceptAndOpen Methode einen Parameter vom Typ ServerRequestHandler. Eine Subklasse von ServerRequestHandler wird benutzt, um auf die OBEX Anfragen zu reagieren. Dazu überschreibt man die Methoden

• onAuthenticationFailure,
• onConnect,
• onDelete,
• onDisconnect,
• onGet,
• onPut und / oder
• onSetPath.

Anders wird bei RFCOMM verfahren. Hier erzeugt die acceptAndOpen Methode eine StreamConnection. Anhand der Methoden openInputStream und openOutputStream kann man die Streams erhalten, auf denen Daten vom und zum Client strömen.


Implementieren von Clients

Der Connect String, der im Rahmen der Discovery ermittelt wurde, wird als Argument für Connector.open verwendet. Abhängig vom Protokoll erhält man eine passende Subklasse von Connection. Im Fall von RFCOMM erhält man eine StreamConnection, die die Ein- und Ausgabeströme zum Server enthält. Bei OBEX liefert der Connector eine ClientSession. Die ClientSession wird benutzt, um die Verbindung herzustellen (connect), Verbindungen zu trennen (disconnect), Objekte auf dem Server zu löschen (delete) oder um Operation Objekte zu erzeugen (get, put). Operation Objekte werden benutzt, um Daten bereitzustellen oder zu empfangen.