Bluetooth – Suche nach Geräten und Services


 

Suche nach Geräten und Services

Die Methode query() erzeugt einen Thread, der zunächst die nach dem Bewegungsmuster vorgegebene Zeit wartet und danach die Device Discovery durch den Aufruf von

agent.startInquiry(DiscoveryAgent.GIAC, new Listener());

anstößt – falls nicht schon eine Device Discovery läuft, eine Verbindung zu einem anderen Gerät besteht oder gerade versucht wird, eine unterbrochene Verbindung wiederherzustellen. Diese Zustände werden durch Flags der Klasse BluetoothLayer festgelegt. Das übergebene Listener-Objekt implementiert die entsprechenden Callback-Methoden des DiscoveryListener-Interfaces zur Reaktion auf gefundene Geräte, gefundene Services, den Abschluss der Device Discovery sowie der Service Discovery.

Nachdem ein Gerät vom DiscoveryAgent gefunden wurde, wird durch den Aufruf der Methode deviceDiscovered() der inneren Klasse Listener darauf reagiert, welche vorher als Callback-Objekt übergeben wurde. Falls das Gerät nicht auf den Ausschlusslisten blackListedDevices und knownDevices gefunden wurde, wird ein Objekt der Klasse EndPoint erzeugt, welches im Vektor pendingEndPoints für die spätere Suche nach Services gespeichert wird. Die Endpoints im Vector sind inaktiv, das heisst die Sender- und Readerthreads wurden nicht gestartet.

Nachdem die Gerätesuche abgeschlossen ist, ruft der DiscoveryAgent die Listener-Methode inquiryCompleted() auf, welche wiederum ein Objekt der inneren Klasse DoServiceDiscovery(), die von TimerTask abgeleitet ist, erzeugt. Im Sekundentakt wird nun, falls nicht schon eine Verbindung besteht, der pendingEndpoints – Vector in einer Schleife abgearbeitet und auf jedem Endpoint eine Service Discovery durch den DiscoveryAgent durchgeführt.

endpt.transId = agent.searchServices(null,new UUID[]{uuid},

endpt.remoteDev,new Listener());

Da mehrere, gleichzeitige Service Discoverys derzeit auf vielen Endgeräten Probleme verursachen wird auf den Abschluss der Service-Discovery gewartet. Nach dem durchsuchen aller EndPoints wird der pendingEndpoint – Vektor geleert.

Auf das Ergebnis der Service Discovery reagiert wieder das Objekt der Klasse Listener, diesmal durch die Methoden serviceDiscovered() auf einen gefundenen Service und serviceSearchCompleted() auf den Abschluss der Service Discovery.

Auf den Abschluss der Service Discovery auf einem Gerät reagiert die Methode serviceSearchCompleted(), sie durchsucht die Hashtable serviceRecordToEndPoint nach dem gesuchten Service und baut, falls er gefunden wurde, eine Verbindung zum Server auf.

Damit unnötige Verbindungen vermieden werden, ist es für den Client möglich, das Profil bzw. das Kennwort der anderen Person bereits vor der Verbindung auszulesen. Ausserdem umgeht man so das eventuell nötige Pairing der Geräte, falls die Sicherheitseinstellungen der Verbindung nicht übernommen wurden (Siehe Kapitel 3.4.2). Hierfür wird das Profil bzw. Passwort in der Service Description des Service Records, beim Erzeugen des lokalen Bluetooth-Servers, gespeichert.

Durch den Aufruf von rec.populateRecord(attrlist) fragt der Client die Attribute des Services ab, da nur die minimal nötigen Attribute beim ServiceSearch übertragen werden. Das übergebene Array attrlist[] enthält die jeweiligen Bezeichner für die Abzufragende Information, in diesem Fall ist nur die Service Description vonnöten, hierfür ist der Wert 0x101.

attrList[0] = 0x101;

if (rec.populateRecord(attrList)){

log(“servicedescription laden”);

DataElement descriptionDataElement = rec.getAttributeValue(0x101);

String desc = (String) descriptionDataElement.getValue();

Wenn das Profil oder Kennwort passend ist, wird ein EndPoint-Objekt aus der Hashtable serviceRecordToEndpoint erzeugt. Das StreamConnection-Objekt des EndPoints wird zugeordnet, die Service-URL des Servers, zu dem gerade die Verbindung aufgebaut wurde gespeichert, um bei einem Verbindungsabbruch zu diesem URL zu connecten. Abschliessend werden der Sender und der Receiverthread des Endpoints gestartet und der BluetoothLayer auf den Zustand „paused“ gesetzt. Da nur eine gleichzeitige Verbindung zu einem Client in den Anforderungen vorgesehen ist, wird der lokale Server des als Client verbundenen Endgeräts mit durch den Aufruf der Methode server.close(), geschlossen.



Ähnliche Artikel zu "Bluetooth – Suche nach Geräten und Services":


Wenn Du noch Fragen zum Thema Bluetooth – Suche nach Geräten und Services hast, dann schreib einfach einen Kommentar - oder schau dir meine Buchtipps an:

Wie ist DEINE Meinung zum Thema Bluetooth – Suche nach Geräten und Services?

Schreib sie einfach als Kommentar:




karbacher.org © Bluetooth – Suche nach Geräten und Services