Ich arbeite an der Entfernungsschätzung von BLE Beacons vom Android-Handy. Ich habe meine eigenen Algorithmen zur Entfernungsschätzung basierend auf RSSI entwickelt. (Ich werde bald die Entfernungsberechnungsalgorithmen in Form einer Bibliothek ausrollen). Für Berechnungen benötigt Telefon eine große Anzahl von Werbepaketen von den Beacons herum.Infinite Android BLE Scan für BLE-Beacon-Pakete
Bis jetzt habe ich den Code mit normalen Praktiken für BLE-Scannen getestet. Ab sofort habe ich den Code für die Ziel-API Level 19 geschrieben. Nachfolgend ist ein Teil des Codes, an dem ich gerade arbeite, wo ich den Scan nach Beacons starte und nach 10s stoppe.
private void scanLeDevice(final boolean enable) {
if (enable) {
handler.postDelayed(new Runnable() {
@Override
public void run() {
bluetoothAdapter.stopLeScan(LEScanCallback);
}
}, 10000L);
bluetoothAdapter.startLeScan(LEScanCallback);
}
}
private BluetoothAdapter.LeScanCallback LEScanCallback =
new BluetoothAdapter.LeScanCallback() {
@Override
public void onLeScan(final BluetoothDevice bluetoothDevice, int rssi, byte[] scanRecord){
display(rssi);
//append to an arrayList for further processing
}
};
Derzeit bin ich die meisten Dinge auf UI thread.I tun, um alle Funktionen in der folgenden Art und Weise zu erreichen, indem mehr Threads zu schaffen.
- UI Thread sollte frei von allen Berechnungen oder LeScans gehalten werden.
- PacketReaderThread - Ein separater Thread zum Scannen von Paketen und Anhängen sie an eine ArrayList (ich werde unnötige Daten von ArrayList wischen nach dem Verbrauch in Algorithmen). Anstatt den Scan nach einer bestimmten Zeit anzuhalten, möchte ich den Scan für unbegrenzte Zeit eingeschaltet lassen, um in Echtzeit weiterarbeiten zu können, sofern die App läuft. Also könnte ich IntentService dafür verwenden.
- DistanceCalculatorThread (oder AsyncTask) - ArrayList-Objekt (mit gescannten Paketen) wird zwischen diesem und dem PacketReaderThread zum Entnehmen/Löschen von Datenpaketen synchronisiert und über die Abstandsberechnung zur UI informiert.
sah ich die Implementierung von BluetoothAdapter.LeScanCallback auf Grepcode ich Fragen habe folgende.
- Ist BluetoothAdapter.LeScanCallback implizit gebunden/to main/UI-Thread gebunden oder ist es einem anderen Thread tragbar?
- Wenn ich beide Implementierungen des obigen Codes in einen anderen Thread verschiebe, wird der Callback an diesem Thread arbeiten oder wird er an den main/ui Thread gebunden? (Da ich Paket-Scannen auf separaten Thread brauche, muss ich wissen über BluetoothAdapter.startLeScan (LEScanCallback) und BluetoothAdapter.LeScanCallback)
(Hinweis - Ich habe bereits gefolgt this question, in dieser Frage der Antwort-Sucher selbst besagt, dass Rückruf ist auf Hauptthread, so dass ich nicht die tatsächliche Antwort bekommen. auch altBeacon Spezifikationen und studierte ihre Referenz App, es nutzt auch CycledScan Mechanismus mit Scan-Stop-scanAgain Weg)
Ja, ich habe gute Ergebnisse. RSSI zum Distanzmapping konvergiert schneller als Locate;) Sie haben diese Bibliothek so gut geschrieben, ich habe sie studiert. Danke für die Antwort David, also werde ich LooperThread benutzen. Wenn Sie eine offizielle Dokumentation zu den Rückrufen finden, lassen Sie es bitte wissen. Und wir werden definitiv diskutieren, sobald ich die Demo in ein paar Wochen fertig habe. – Tejas