0

Weiß jemand, wie man einen BLE Service von UUID in Android entdecken? Es gibt eine discoverServices() method in Android, aber es scheint keine Möglichkeit zu geben, einen einzelnen Service zu finden, anstatt alle. In Bluetooth dauert die Erkennung aller Dienste sehr lange, während die Erkennung einzelner Dienste auf UUID-Basis nicht so lange dauert. Es dauert noch länger für Android, weil Android auch alle Merkmale und Deskriptoren entdeckt.Entdecken Sie spezifische Bluetooth Low Energy Service von UUID in Android

Antwort

1

TL; DR: kann man nicht - wenn man nicht wirklich hässliche und potentiell gefährliche Hacks machen will.

Es gibt keine einfache Möglichkeit, dies zu tun. Wenn Sie sich ansehen, was discoverServices() auf Nougat macht, werden Sie es als GattService:L1454 aufrufen.

void discoverServices(int clientIf, String address) { 
    enforceCallingOrSelfPermission(BLUETOOTH_PERM, "Need BLUETOOTH permission"); 
    Integer connId = mClientMap.connIdByAddress(clientIf, address); 
    if (DBG) Log.d(TAG, "discoverServices() - address=" + address + ", connId=" + connId); 
    if (connId != null) 
     gattClientSearchServiceNative(connId, true, 0, 0); 
    else 
     Log.e(TAG, "discoverServices() - No connection for " + address + "..."); 
} 

Der Schlüssel hier ist gattClientSearchServiceNative:

gattClientSearchServiceNative(int conn_id, 
           boolean search_all, 
           long service_uuid_lsb, 
           long service_uuid_msb) 

Wenn search_allwahr ist, wird es alles scannen. Wenn nicht, wird nur ein Dienst mit der bereitgestellten UUID und ihren Eigenschaften und Deskriptoren durchsucht.

könnten Sie tatsächlich versuchen und Reflektion verwenden diese direkt einen falsch search_all Parameter und eine gültige UUID vorbei zu nennen, aber das ist eine wirklich schlechte Praxis und Absturz am Ende, wenn eine neue Version und die interne Umsetzung dieser kommt Klassenänderungen.

+0

ist die service_uuid_lsb und service_uuid_msb die lsb und msb für die gesamte 128-Bit-UUID? Irgendeine Idee, warum Google keine API zur Verfügung stellen würde, um dies zu tun? Oder auch nur eine API, um die Services und nicht alle Merkmale und Deskriptoren zu entdecken? –

+0

Ja, sie sind das MSB und LSB der 128bit UUID. Warum würde es das nicht bieten? Meine Vermutung wäre, dass der "langsame" Teil der BLE-Dienste eines Geräts nicht die Servicedaten erhält, sondern sich mit dem Gerät verbindet und die Daten anfordert. Es wäre also schneller, nach allem zu fragen, anstatt nach Service A zu fragen, den Scan zu beenden, dann nach Service B, den Scan zu beenden ... Sie könnten sich wahrscheinlich in AOSPs Google-Gruppe danach erkundigen. –

+0

Danke für die Information. In meinem Fall gibt es nur einen Dienst (von vielen), den ich entdecken möchte, und dann einen (von vielen) für die überwiegende Mehrheit meiner Anwendungsfälle. Allgemeine BLE-Best Practice ist die Verbindung und nur entdecken, was Sie brauchen, und dann wieder trennen. Ich werde definitiv auch auf AOSP fragen, danke! –

Verwandte Themen