[FIXED] Bluetooth LE – ScanResult gibt denselben Zeitstempel für dasselbe Gerät zurück

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)

0 Shares:
Leave a Reply

Your email address will not be published. Required fields are marked *

You May Also Like