Modifica: Ho dimenticato, hai provato a impostare l'inserzionista su non collegabile? In questo modo dovresti essere in grado di ottenere risultati di scansione duplicati
Mi sto occupando di un problema simile, cioè, monitorare in modo affidabile i valori RSSI di più dispositivi pubblicitari nel tempo.
È triste, il modo più affidabile che ho trovato non è bello, piuttosto sporco e consuma molta batteria. Sembra a causa del numero di dispositivi Android che gestiscono BLE in modo diverso il più affidabile.
Avvio scansione LE, non appena ottengo una richiamata ho impostato un flag per interrompere e avviare nuovamente la scansione. In questo modo si aggira il problema DUPLICATE_PACKET con il filtro poiché esso ripristina ogni volta che si avvia una nuova scansione.
Gli ScanResults eseguo il dump in un dl sqlite che si restringono e valutano ogni x secondi.
Dovrebbe essere facile adattare il restringimento al proprio caso d'uso, ovvero rimuovere le voci più vecchie di X, quindi interrogare l'esistenza di un dispositivo per scoprire se si è ricevuto un ScanResult negli ultimi X secondi. Tuttavia Non mettere questo valore X troppo basso, come si deve tener conto che si perde ancora un sacco di pacchetti di pubblicità su Android le scan, rispetto ad una scansione BLE su IE bluez ..
Edit: posso aggiungere alcune informazioni che ho già trovato per velocizzare le prestazioni sulla scoperta di pubblicità. Si tratta di modificare e compilare i sorgenti bluedroid e l'accesso root al dispositivo. Il più semplice sarebbe costruire un android completo da soli, ad esempio Cyanogenmod.
Quando una scansione LE è in esecuzione, il modulo Bluetooth invia la risposta di scansione tramite HCI allo stack bluedroid. Ci sono vari controlli fino a quando non viene finalmente consegnato a Java onScanResult(...)
a cui si accede tramite JNI.
Confrontando il log dei dati hci inviati dal modulo bluetooth (può essere abilitato in /etc/bluetooth/bt_stack.conf) con l'output di debug nello stack bluedroid e nel lato Java ho notato che un sacco di pacchetti pubblicitari vengono scartati, specialmente in alcuni assegni.
Non capisco davvero, oltre a ciò ha qualcosa a che fare con il database di inchiesta bluedroid
Dalla documentazione di ScanResult vediamo che ScanRecord include i dati di annuncio più i dati di risposta di scansione.Quindi potrebbe essere che Android blocchi il rapporto fino a quando non ha ricevuto i dati di risposta della scansione/finché non è chiaro che non ci sono dati di risposta di scansione. Questo non ho potuto verificare, tuttavia una possibilità.
Dato che sono interessato solo a aggiornamenti rapidi sul RSSI di quei pacchetti, ho semplicemente commentato il check out. Sembra che ogni singolo pacchetto che ottengo dal bluetooth moduly di hci sia passato al lato Java.
Nel file di btm_ble_gap.c in funzione BOOLEAN btm_ble_update_inq_result(tINQ_DB_ENT *p_i, UINT8 addr_type, UINT8 evt_type, UINT8 *p)
commento fuori to_report = FALSE;
nel seguente controllo di partenza sulla linea 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;
hai capito ogni tipo di soluzione per questo? – Shubham
Non caro, fammi sapere se hai svolto attività di ricerca e sviluppo in questa direzione. – CoDe