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;
haben gedacht, dass du dafür irgendeine Art von Lösung aus? – Shubham
Nicht lieben, lassen Sie mich wissen, wenn Sie irgendwelche R & D in dieser Richtung getan haben. – CoDe