Ermitteln, ob ein BLE-Gerät mit Android verbunden werden kann

8

Ich arbeite an einem Projekt zur Konfiguration von Beacons. Eine bestimmte Zeit nach dem Einschalten wird ein Beacon unkonfigurierbar, bis es aus dem Netz geschaltet wird. Um eine Liste der konfigurierbaren Beacons anzuzeigen, betrachte ich bestimmte Merkmale (Bluetooth-Gerätename, bestimmte Herstellerdaten im Werbepaket). Ich muss auch wissen, ob es "verbindbar" ist, ich. e. Wenn die PDU Geben Sie in das BLE-Werbepaket für das Gerät, dass es verbindbar ist. Ich habe die Android-Bluetooth-Klassen hoch und niedrig sowohl in Android 4. X und 5. X gesucht und konnte nichts finden, die mir diese Informationen sagen.

Ich stelle fest, dass eine Möglichkeit, die Beacon-Verbindungsfähigkeit zu bestimmen, darin besteht, sich mit ihr zu verbinden, z.B. g .: device.connectGatt(...) . Allerdings habe ich gesehen, dass es mehr als zwei Minuten dauert, bevor ein Callback zu onConnectionStateChange mit STATE_DISCONNECTED zurückkommt. Außerdem können sich viele dieser Beacons in einer Umgebung befinden, und die Verbindung zu jedem einzelnen, der könnte konfigurierbar sein, wäre ineffizient.

Das iOS-Äquivalent dieses Attributs finden Sie im advertisementData -Wörterbuch unter dem Schlüssel CBAdvertisementDataIsConnectable in der CBCentralManagerDelegate -Rückrufmethode centralManager:didDiscoverPeripheral:advertisementData:RSSI .

Die Frage ist also: Gibt es auf Android eine Möglichkeit, festzustellen, ob ein BLE-Gerät aus Werbedaten oder Scan-Ergebnissen oder ... "connectable" ist oder nicht?

    
mharper 12.02.2015, 01:11
quelle

2 Antworten

7

UPDATE: AS der finalisierten APIs im Android O SDK hat die ScanResult -Klasse (die selbst ab Android 5.0 hinzugefügt wurde) jetzt die isConnectable() -Methode. Das Erkennen verbindlicher Werbung ist nur unter Android 8.0 möglich. Hier finden Sie weitere Informationen: Ссылка

Vor Android 8.0 ist das leider nicht möglich.

Eine verbindbare Werbung wird durch das PDU-Header-Byte 0 bestimmt. Sie können dies in der folgenden Beispielstruktur sehen:

%Vor%

Das Problem liegt auf Geräten vor Anroid 8.0, die Android-Scanning-APIs geben Ihnen keinen Zugriff auf diese Header. Sie erhalten genau drei Felder beim Rückruf von Android 4.x:

%Vor%

Das Scan-Daten-Byte-Array beginnt nach den oben genannten Header-Bytes. Und was ich von der BluetoothDevice -Definition sehen kann, sagen keine der Felder oder Methoden, ob es sich um eine verbindbare Werbung handelt - die Klasse ist nur ein Container für die Bluetooth-MAC-Adresse mit Methoden zum Ausführen von Funktionen auf dem Bluetooth-Stack. Und es gibt keine Methoden in IBluetooth.aidl , die die private Schnittstelle zum Bluetooth-Stack sind (und was BluetoothDevice aufruft, um ihre Informationen zu erhalten), die dieses Flag erhalten können.

Es sieht so aus, als ob diese Information vor dem Android 8.0 nicht vom BlueDroid-Stack an die Java-Ebene weitergegeben wird.

    
davidgyoung 12.02.2015, 04:18
quelle
4

Es sollte möglich sein, da das nRF Master Control Panel von Nordic dies tut.

Nach einigem Graben denke ich, dass ich weiß, wie es das macht. Ich bin mir nicht sicher, ob es der richtige Weg ist.

Ich habe versucht, den LE Advertiser zu verwenden und das Gerät als verbindbar zu definieren. In der nordischen App wird ein Gerät als verbindbar festgelegt, abhängig von den Bytes, die bei scanResult.getFlags () gefunden wurden.

Ich habe festgestellt, dass dieser Code für meine Geräte funktioniert:

%Vor%     
user3934907 04.03.2015 01:25
quelle

Tags und Links