2016-08-29 6 views

Antwort

1

Wie Sie bereits erwähnt haben, berechnet CoreLocation die vergangenen Signalmessungen, um eine accuracy Berechnung (Entfernungsschätzung in Metern) zu erhalten. Der für die Mittelung verwendete Algorithmus ist unveröffentlicht, aber meine Messungen haben eine Verzögerung gezeigt, die sich nach ungefähr 20 Sekunden stabilisiert. Ich habe keinen Unterschied in der Verzögerung zwischen näher oder weiter weg bemerkt.

Sie haben keine Kontrolle über dieses Mittelungsintervall. Das einzige, was Sie tun können, ist RSSI selbst über den gewünschten Zeitraum zu mitteln. Sie können dann eine benutzerdefinierte Berechnung verwenden, um den durchschnittlichen RSSI in die Entfernung zu konvertieren.

Dazu müssen Sie Beacons haben, die alle die gleiche Sendeleistung haben, da Sie keinen Zugriff auf die gemessene Leistungskalibrierungskonstante in der Beacon-Werbung haben. (Apple erlaubt das Lesen dieses Wertes nicht.). Stattdessen muss diese Konstante in Ihrer Kundenabstandsberechnung fest codiert sein.

können Sie Beispielcode sehen, dass dies hier tut:

+(double) distanceForRSSI:(double)rssi forPower:(int)txPower { 
    // use coefficient values from spreadsheet for iPhone 4S 
    double coefficient1 = 2.922026; // multiplier 
    double coefficient2 = 6.672908; // power 
    double coefficient3 = -1.767203; // intercept 

    if (rssi == 0) { 
    return -1.0; // if we cannot determine accuracy, return -1.0 
    } 

    double ratio = rssi*1.0/txPower; 
    double distance; 

    if (ratio < 1.0) { 
    distance = pow(ratio,10); 
    } 
    else { 
    distance = (coefficient1)*pow(ratio,coefficient2) + coefficient3; 
    } 

    if (distance < 0.1) { 
    NSLog(@"Low distance"); 
    } 

    return distance; 
} 

https://github.com/AltBeacon/ios-beacon-tools/blob/master/ios-beacon-tools/RNLBeacon%2BDistance.m

+0

Ihr Code verwendet CoreBluetooth [[RNLBeaconScanner sharedBeaconScanner] calibratedRSSIFor: self]; Wenn ich mich nicht irre, CB funktioniert nicht im Hintergrund, so dass wir diesen Code nur im Vordergrund verwenden können. –

+0

Ja, der Beispielcode verwendet CoreBluetooth, aber das ist nicht das, was ich Ihnen vorschlage. Ich schlage einfach vor, dass Sie die benutzerdefinierte Entfernungsberechnung (in meiner obigen Antwort eingefügt) aus diesem Codebeispiel mit CoreLocation wiederverwenden. Sie müssen den Durchschnitt des RSSI aus dem 'didRangeBeacons: inRegion' Callback für die letzten 5 Callbacks sammeln (Sie können die Zeit wie gewünscht ändern) und dann diese durchschnittliche RSSI in die gezeigte Methode übertragen. – davidgyoung

+0

David, aber wie kann ich verstehen, ist es das gleiche Beacon oder ein anderes, wenn zwei Beacons Majors und Minderjährigen gleich sind? Ja, ich dachte darüber nach, meine eigene Art der Kalibrierung zu machen, aber das Problem in einem einzigartigen Schlüssel. –

Verwandte Themen