Ausgangspunkt für die Suche von Bluetoothgeräten ist die Klasse DiscoveryAgent
. Sie erlaubt die Suche nach Geräten und Diensten. Dabei wird die Suche im Hintergrund ausgeführt und blockiert nicht die Applikation. Wird ein Gerät oder ein Dienst gefunden, dann wird dies über ein Listener, dem DiscoveryListener,
mitgeteilt.
Der Entwickler implementiert diesen Listener und übergibt ihn beim Start der Suche. Die JABWT-Implementierung ruft die Methoden dieses Listeners auf und übermittelt gefundene Geräte (Klasse RemoteDevice
) bzw. Dienste (Interface ServiceRecord
) als Übergabeparameter. Mit Hilfe dieser Objekte erhält man den Connection String (den wir ja nicht mehr hartcodieren möchten )

Im nachfolgenden Beispiel wird zunächst eine Suche nach Geräten mit der major device class “peripheral” ausgeführt. Anschliessend wird auf einem gefundenen Gerät die Suche nach dem RFCOMM-Dienst gestartet.
Beispielcode:
-
…
-
DiscoveryListener listener= new DiscoveryListener() {
- public void deviceDiscovered(RemoteDevice remoteDevice, DeviceClass deviceClass) {
-
// Ein Bluetoothgerät wurde gefunden.
-
// Filterung nach Major Device Class “Peripheral”
-
if ((deviceClass.getMajorDeviceClass() & 0x500) != 0) {
-
// Speichern des remoteDevice in eine Liste
-
}
-
…
-
}
-
public void servicesDiscovered(int i, ServiceRecord[] sr) {
-
// Ein oder mehrere Dienste wurden gefunden.
-
int reqSecurity = ServiceRecord.NOAUTHENTICATE_NOENCRYPT;
-
boolean mustBeMaster = false;
-
String connectionURL = sr[0].getConnectionURL(reqSecurity, mustBeMaster);
-
…
-
}
-
-
public void serviceSearchCompleted(int transactionID, int responseCode) {
-
// Abschluss der Suche nach Diensten.
-
if (responseCode == DiscoveryListener.SERVICE_SEARCH_ERROR) {
-
// Suche war nicht erfolgreich -> Fehlerbehandlung
-
}
-
…
-
}
-
-
public void inquiryCompleted(int discType) {
-
// Abschluss der Suche nach Geräten.
-
if (discType == DiscoveryListener.INQUIRY_ERROR) {
-
// Suche war nicht erfolgreich -> Fehlerbehandlung
-
}
-
…
-
}
-
}
-
-
LocalDevice local = LocalDevice.getLocalDevice();
-
DiscoveryAgent agent = local.getDiscoveryAgent();
-
-
// Suche nach Geräten starten
-
agent.startInquiry(DiscoveryAgent.GIAC, listener);
-
…
-
-
// Suche nach RFCOMM Dienst (0x0003) auf einem bereits gefundenen Gerät starten
-
UUID[] uuidSet = new UUID[] { new UUID(0x0003) };
-
int[] attrSet = null; // null, weil uns nur die Default Attribute interessieren
-
agent.searchServices(attrSet, uuidSet, remoteDevice, listener);