2015-06-11 11 views
10

Ich schreibe eine BLE-Anwendung, wo zu verfolgen, ob Peripheriegeräte Werbung oder hat zu stoppen.Get BLE Scan ohne Filter duplizieren UUID

Ich folgte getting peripherals without duplications dies und BLE Filtering behaviour of startLeScan() und ich stimme hier völlig überein.

Um es durchführbar zu machen, habe ich einen Timer gehalten, der nach einer bestimmten Zeit (3 Sekunden) erneut nach Peripheriegeräten sucht. Aber mit neuen Gerät auf dem Markt verfügbar (mit 5.0 Update), einige Zeit Re-Scan brauchen etwas Zeit, um Peripheriegeräte zu finden.

Irgendwelche Vorschläge oder wenn jemand dies erreicht hat?

+0

haben gedacht, dass du dafür irgendeine Art von Lösung aus? – Shubham

+1

Nicht lieben, lassen Sie mich wissen, wenn Sie irgendwelche R & D in dieser Richtung getan haben. – CoDe

Antwort

3

Erstes Szenario: Verbund Devices

Wir wissen, dass, wenn ein bond gemacht wird, dann die meisten der im Handel erhältlichen Geräte directed advertisements in während des Wieder Verbindung senden. In solchen Situationen können Sie laut BLE 4.0-Spezifikation diese Geräte nicht mit einem BLE-Sniffer scannen.

Zweites Szenario: anschließbare Geräte

Peripheriegeräte sind in der Regel in diesem Modus, wenn sie zunächst in der Reset-Phase ist. Die Zentrale sendet einen connect Initiator als Antwort auf ein advertisement Paket. Dieses Szenario bietet Ihnen viel Flexibilität, da Sie mit zwei vorherrschenden Konfigurationsoptionen spielen können, um die Verbindungszeit zu ändern. Diese sind: slavelatency auf der Peripherie und conninterval auf der zentralen. Nun, ich weiß nicht, wie viel Aufwand es braucht, um es auf der Android-Plattform funktionieren zu lassen, aber wenn Sie den Bluez BLE-Stack und ein konfigurierbares Peripheriegerät wie ein TI-Sensor-Tag verwenden, können Sie mit diesen Werten herumspielen.

Drittes Szenario: Beacon Geräte

Da das ist, was Ihre Frage dreht sich um, nach der BLE-Architektur gibt es keine Parameter zu spielen. In diesem Szenario ist das zentrale Gerät nur ein dummes Gerät, das der Gnade ausgeliefert ist, wenn ein Peripheriegerät beschließt, sein Beaconing-Signal zu senden.

Referenz:

http://www.amazon.com/Inside-Bluetooth-Communications-Sensing-Library/dp/1608075796/ref=pd_bxgy_14_img_z

http://www.amazon.com/Bluetooth-Low-Energy-Developers-Handbook/dp/013288836X/ref=pd_bxgy_14_img_y

+1

Ich denke, es gibt keine Möglichkeit, conninterval von Central zu setzen, oder zumindest gibt es keinen API-Zugriff auf App-Ebene in Android ..refer http://stackoverflow.com/q/21398766/2624806 Ich fragte vor. Irgendein Vorschlag hier! – CoDe

+1

Nun, ich bin nicht sicher, wie flexibel Sie werden können, wenn Sie tiefer in die C-Implementierung des Bluetooth-Treibers im Android-Quellcode eintauchen (vorausgesetzt, es gibt eine einfache Implementierung). Aber um Flexibilität zu gewinnen, verwende ich 'bluez', was mir die Kontrolle gibt, mit' LL_CONNECTION_UPDATE_REQ' zu spielen, wodurch ich das 'conninterval' von der Zentrale aus aktualisieren kann. – Jerry

4

Klingt wie Sie eher in Scan-Anzeigen interessiert sind als an Geräte anschließen. Dies ist die "Beobachterrolle" in Bluetooth Low Evergy und entspricht der "Broadcaster" -Rolle, die besser als Beacon bekannt ist. (Bluetooth Core 4.1 Teil 1 Teil A Abschnitt 6.2)

In der Regel aktivieren Sie passives Scannen, suchen nach ADV_IND-Paketen, die von Beacons gesendet werden. Diese können eine UUID enthalten oder nicht. Alternativ können Sie einen aktiven Scan durchführen, indem Sie SCAN_REQ senden, zu dem Sie möglicherweise einen SCAN_RSP erhalten. Viele Geräte verwenden in ADV_IND und SCAN_RSP unterschiedliche Werbeinhalte, um die Menge an Informationen zu erhöhen, die ausgestrahlt werden können - Sie könnten beispielsweise eine UUID128 in die ADV_IND und anschließend den Gerätenamen in SCAN_RSP einfügen. (Bluetooth Core 4.1 Vol 2 Teil E Abschnitt 7.8.10)

Jetzt müssen Sie "weggehen" definieren - erwarten Sie, dass die Werbung stoppt oder verschwindet?Sie erhalten mit jeder Anzeige eine Empfangssignalstärkeanzeige "RSSI" (Bluetooth Core 4.1 Vol. 2 Part E Section 7.7.65.2) - so funktioniert die iBeacon-Positionierung und es gibt reichlich Unterstützung für Beacon-Empfänger in Android.

Alternativ warten Sie für N Sekunden für eine Anzeige, die alle T Sekunden wo N> 2T übertragen werden soll. Der Nachteil des zeitgesteuerten Ansatzes besteht darin, dass das Empfangen eines Beacons wahrscheinlich nicht dasselbe ist, wie wenn man einen schwachen Beacon empfängt. um sicher zu gehen, brauchen Sie N, um groß zu sein, und das hat Auswirkungen auf die Latenz zwischen dem Broadcaster ausgeschaltet oder außerhalb der Reichweite und Ihre App erkennt es.

Noch eine Sache - achten Sie darauf, dass Werbung stoppt, wenn etwas an ein Peripheriegerät angeschlossen wird (wenn Sie wirklich nach Peripheriegeräten suchen) ein weiterer guter Grund, RSSI zu überwachen.

+2

Ja, Sie haben Recht, Connecting ist kein Problem, und ich stimme zu, dass die meisten von Ihnen erwähnt werden. In meinem Fall werben Client-Peripheriegeräte für eine bestimmte Zeit und das zentrale Gerät (Android-Gerät) scannt. Jetzt scannen einige Android-Telefone (wie S5, Nx-5) fortlaufende Pakete und antworten darauf ** kontinuierlich auf App-Ebene **. Aber ein Teil des Telefons (wie Nx-4) könnte kontinuierlich scannen, aber nicht auf ** DUPLICATE PACKET (d. H. Das gleiche Gerät) antworten ** .. und das ist ein Problem hier. Irgendwelche Eingaben hier! – CoDe

3

Bearbeiten: Ich habe vergessen, haben Sie versucht, den Werbetreibenden auf nicht verbindbar zu setzen? Auf diese Weise können Sie doppelte Scan-Ergebnisse erhalten

Ich habe mit einem ähnlichen Problem, das heißt, zuverlässig die RSSI-Werte mehrerer Werbegeräte im Laufe der Zeit zu verfolgen.

Es ist traurig, der zuverlässigste Weg, den ich fand, ist nicht nett, ziemlich dreckig und Batterie verbrauchend. Es scheint aufgrund der Anzahl der Android-Geräte, die BLE unterschiedlich am zuverlässigsten behandeln.

Ich starte LE-Scan, sobald ich einen Rückruf bekomme, setze ich ein Flag, um zu stoppen und den Scan erneut zu starten. Auf diese Weise arbeiten Sie um das DUPLICATE_PACKET Filter Problem seit es wird zurückgesetzt, wann immer Sie einen neuen Scan starten.

Die ScanResults dump ich in eine SQL-Datenbank, die ich alle x Sekunden verkleinern und auswerten kann.

Es sollte einfach sein, die Schrumpfung an Ihren Anwendungsfall anzupassen, d. H. Einträge älter als X zu entfernen und dann nach einem Gerät zu suchen, um herauszufinden, ob Sie in den letzten X Sekunden ein ScanResult erhalten haben. nicht jedoch zu niedrig, dass die X-Wert setzen, da man berücksichtigen muss, dass Sie immer noch eine Menge von Werbung Paketen auf Android LE verlieren Scan, im Vergleich zu einem BLE Scan dh bluez ..

Edit: Ich kann hinzufügen einige Informationen, die ich bereits gefunden habe, um die Leistung bei der Werbeermittlung zu beschleunigen. Dazu gehört das Ändern und Kompilieren der Bluedroid-Quellen und des Root-Zugriffs auf das Gerät. Am einfachsten wäre es, einen vollständigen Android selbst zu bauen, d.h. Cyanogenmod.

Wenn ein LE-Scan läuft, sendet das Bluetooth-Modul die Scan-Sesponse über HCI an den Bluedroid-Stack. Dort werden verschiedene Überprüfungen durchgeführt, bis es schließlich an das Java onScanResult(...) übergeben wird, auf das über JNI zugegriffen wird.

Durch den Vergleich des Protokolls der hci-Daten vom Bluetooth-Modul (kann in /etc/bluetooth/bt_stack.conf aktiviert werden) mit Debug-Ausgabe im Bluedroid-Stack sowie der Java-Seite habe ich festgestellt, dass viele Werbe-Pakete werden verworfen, vor allem in einigen Schecks. ich verstehe nicht wirklich, abgesehen davon, dass es etwas mit der Bluedroid-Abfrage-Datenbank zu tun hat Aus der Dokumentation von ScanResult sehen wir, dass der ScanRecord die Werbungsdaten sowie die Scan-Antwortdaten enthält.Es kann also sein, dass Android den Bericht blockiert, bis er die Scan-Antwortdaten erhalten hat/bis klar ist, dass keine Scan-Antwortdaten vorhanden sind. Dies konnte ich jedoch nicht überprüfen.

Da ich nur an schnellen Updates auf dem RSSI dieser Pakete interessiert bin, kommentierte ich das einfach auschecken. Es scheint so, dass jedes einzelne Paket, das ich vom Bluetooth-Moduly von hci erhalte, an die Java-Seite weitergegeben wird.

In Datei btm_ble_gap.c in Funktion BOOLEAN btm_ble_update_inq_result(tINQ_DB_ENT *p_i, UINT8 addr_type, UINT8 evt_type, UINT8 *p) Kommentar aus to_report = FALSE; in der folgenden Prüfung auf Linie beginnend 2265.

/* active scan, always wait until get scan_rsp to report the result */ 
if ((btm_cb.ble_ctr_cb.inq_var.scan_type == BTM_BLE_SCAN_MODE_ACTI && 
    (evt_type == BTM_BLE_CONNECT_EVT || evt_type == BTM_BLE_DISCOVER_EVT))) 
{ 
    BTM_TRACE_DEBUG("btm_ble_update_inq_result scan_rsp=false, to_report=false,\ 
          scan_type_active=%d", btm_cb.ble_ctr_cb.inq_var.scan_type); 
    p_i->scan_rsp = FALSE; 
    // to_report = FALSE; // to_report is initialized as TRUE, so we basically leave it to report it anyways. 
} 
else 
    p_i->scan_rsp = TRUE; 
+1

** Start-Stop-Scanning: ** Ich habe es versucht, aber es hängt BLE-Stack und muss dann ** Bluetooth ON/OFF ** jedes Mal dann. Eine andere Sache, die ich beobachte, dauert das erneute Scannen einige Zeit (einige 1-2 Sekunden), um das gleiche Gerätewerbungs-Paket zu erkennen. ** Regard ROM Build: ** Ich könnte es versuchen, aber das war ich für die Anwendungsebene erforderlich. Eine Änderung der OS-Quelle auf einer beliebigen Ebene wird hier nicht helfen. Ich schätze Ihre Bemühungen, lassen Sie mich wissen, wenn andere Vorschläge. – CoDe

+0

1-2 Sekunden ist etwas seltsam in Bezug auf die User Experience-Anwendung, die ich entwickle. Es zwingt den Benutzer, ein anderes Steuerelement auszuwählen. Nun, ich habe auf Samsung-S5 und Nexus-5 getestet, kontinuierliche Datenpaket erhalten, d. H. Paket duplizieren. Auf der anderen Seite antwortet Nexus-4 nicht auf doppelte Pakete. ** In Bezug auf den Werbetreibenden ** sendet er ein Datenpaket für eine definierte Sekunde (<1 Min), sobald es mit ** conninterval ** von 20 Sekunden eingeschaltet wird. Ich verwende einen TI-basierten BLE-Sensor. – CoDe