Ausgabe
Ich möchte die Werbe-Millisekunden der Geräte erhalten, indem ich die beiden Zeitstempel desselben Geräts subtrahiere. Aber beide Zeitstempel haben den gleichen Wert. Könnte jemand helfen?
override fun onScanResult(callbackType: Int, result: ScanResult) {
val timeStampFirst = result.timestampNanos
val tag = deviceMap.computeIfAbsent(result.device.address) {
val newTag = BleTag(result.device.name ?: "Unbekannt", result.device.address, result.rssi , result.scanRecord?.bytes, result.timestampNanos,"0 Sek.")
deviceList.add(newTag)
newTag
}
tag.name = result.device.name ?: "Unbekannt"
tag.rssi = result.rssi
tag.advertisementData = result.scanRecord?.bytes
tag.timeStampFirst = result.timestampNanos
deviceList.forEach {
if(it.mac == result.device.address){
val timeStampSecond = result.timestampNanos
val advertisementMillis = timeStampSecond - timeStampFirst
Log.e("Advertisement ms", advertisementMillis)
}
}
Log.e(resultTime.toString(),"")
deviceList.sortBy {
result.rssi
}
recyclerView.adapter?.notifyDataSetChanged()
//menu.findItem(R.id.count).title = "Geräte: " + deviceList.size
super.onScanResult(callbackType, result)
}
Lösung
Um das Problem und die Lösung zu zeigen, habe ich sämtlichen Quellcode auskommentiert, der nicht für die Berechnung des Zeitintervalls zwischen zwei aufeinanderfolgenden Werbeanzeigen benötigt wird.
override fun onScanResult(callbackType: Int, result: ScanResult) {
val timeStampFirst = result.timestampNanos
// val tag = deviceMap.computeIfAbsent(result.device.address) {
// val newTag = BleTag(result.device.name ?: "Unbekannt", result.device.address, result.rssi , result.scanRecord?.bytes, result.timestampNanos,"0 Sek.")
// deviceList.add(newTag)
// newTag
// }
// tag.name = result.device.name ?: "Unbekannt"
// tag.rssi = result.rssi
// tag.advertisementData = result.scanRecord?.bytes
// tag.timeStampFirst = result.timestampNanos
// deviceList.forEach {
// if(it.mac == result.device.address){
val timeStampSecond = result.timestampNanos
// will always be ZERO
val advertisementMillis = timeStampSecond - timeStampFirst
Log.e("Advertisement ms", advertisementMillis)
// }
// }
// Log.e(resultTime.toString(),"")
// deviceList.sortBy {
// result.rssi
// }
// recyclerView.adapter?.notifyDataSetChanged()
//menu.findItem(R.id.count).title = "Geräte: " + deviceList.size
// super.onScanResult(callbackType, result)
}
Da Sie für beide Zeitstempel den Wert der aktuellen Anzeige verwenden, ist das Ergebnis immer 0.
Aber auch das Objekt aus der DeviceList hilft nicht weiter, da es bereits die Daten aus der aktuellen Werbung enthält.
Im Pseudocode müssten Sie Folgendes tun, um das Intervall zwischen zwei aufeinanderfolgenden Anzeigen zu finden:
onNewAdvertismentReceived
If Broadcaster seen before
Retrieve timestamp from the advertisment beforehand
Calculate the interval from both timestamps(old,new)
Else
First time Broadcaster seen
Not possible to calculate interval
Fi
Beantwortet von – Risto
Antwort geprüft von – Terry (FixError Volunteer)