2017-01-20 3 views
0

Disclaimer: Neuling für Android-Programmierung.Altbeacon-Bibliothek: RSSI mehr als einmal pro Sekunde aktualisieren

Hallo allerseits, Ich versuche, eine App zu entwerfen, um die Position eines Smartphones mit Altbeacon-Bibliothek zu verfolgen. Die Beacons, die ich verwende, sind so eingestellt, dass sie alle 100ms werben (nicht verbindbare Werbung). Da die Bibliothek standardmäßig nach 1,1s sucht, würde man erwarten, mehrere Werbepakete zu erhalten. Stattdessen empfange ich nur ein Paket pro Scan im Protokoll, so dass das Auffrischen des RSSI ziemlich langsam ist (eines pro Sekunde). Mit der Standard-Android-Bibliothek (Einstellung SCAN_MODE_LOW_LATENCY) kann ich den ble-Callback kontinuierlich erreichen und den RSSI mehrmals in der Sekunde aktualisieren.

Ist es möglich, dasselbe mit Altbeacon Bibliothek zu tun? Meine Beispielanwendung sieht wie folgt aus:

public class MainActivity extends AppCompatActivity implements BeaconConsumer{ 


protected static final String TAG = "info"; 
private BeaconManager beaconManager; 
private HashSet<Beacon> beaconsSeen = new HashSet<Beacon>(); 

Region region1 = new Region("region1", "xx:xx:xx:xx:xx:xx"); 
Region region2 = new Region("region2", "xx:xx:xx:xx:xx:xx"); 
Region region3 = new Region("region3", "xx:xx:xx:xx:xx:xx"); 
Region region4 = new Region("region4", "xx:xx:xx:xx:xx:xx"); 
Region region5 = new Region("region5", "xx:xx:xx:xx:xx:xx"); 
Region region6 = new Region("region6", "xx:xx:xx:xx:xx:xx"); 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    RangedBeacon.setSampleExpirationMilliseconds(5000); //collects signal measurements over 5 seconds, throws out the top 10% and bottom 10% of 
    // measurements, and averages the rest 
    beaconManager = BeaconManager.getInstanceForApplication(this); 
    // To detect proprietary beacons, you must add a line like below corresponding to your beacon 
    // type. Do a web search for "setBeaconLayout" to get the proper expression. 
    beaconManager.getBeaconParsers().add(new BeaconParser(). 
      setBeaconLayout("m:2-3=0215,i:4-19,i:20-21,i:22-23,p:24-24")); 
    beaconManager.bind(this); 
} 
@Override 
protected void onDestroy() { 
    super.onDestroy(); 
    beaconManager.unbind(this); 
} 
@Override 
public void onBeaconServiceConnect() { 
    beaconManager.addRangeNotifier(new RangeNotifier() { 
     @Override 
     public void didRangeBeaconsInRegion(Collection<Beacon> beacons, Region region) { 
      for (Beacon beacon : beacons) { 
       Log.i(TAG, "I see a beacon "+beacon.getBluetoothAddress()+" with rssi: "+beacon.getRssi()+" dBm about "+beacons.iterator().next().getDistance()+" meters away."); 
      } 
     } 
    }); 

    try { 
     beaconManager.startRangingBeaconsInRegion(region1); 
     beaconManager.startRangingBeaconsInRegion(region2); 
     beaconManager.startRangingBeaconsInRegion(region3); 
     beaconManager.startRangingBeaconsInRegion(region4); 
     beaconManager.startRangingBeaconsInRegion(region5); 
     beaconManager.startRangingBeaconsInRegion(region6); 
    } catch (RemoteException e) { } 
} 

Mein Telefon ein Xiaomi Redmi Note 2 mit Android 5.0.2.

Danke.

Antwort

0

Die Bibliothek sendet nur einen Rückruf an didRangeBeaconsInRegion für jeden Messzyklus (basierend auf einem Scan von 1,1 Sekunden standardmäßig). Dies gilt unabhängig davon, wie viele Pakete empfangen werden, und die einzelnen RSSI-Messwerte werden intern nachverfolgt.

Sie können die Häufigkeit von Rückrufen erhöhen, indem Sie die Länge des Zyklus verringern. Der folgende Code ändert den Scanzyklus auf 100 ms, sodass Sie in diesem Intervall zahlreiche Aktualisierungen erhalten.

beaconManager.setForegroundScanPeriod(100l); 
beaconManager.updateScanPeriods(); 
+0

Hallo, ich habe schon versucht, diesen Code zu verwenden, ich habe vergessen, es in der Frage zu schreiben. Leider, wenn ich die Scan-Periode unter 200 (z. B. 110ms) einstelle, verliert die App viele Pakete und manchmal stürzt sogar das Bluetooth des Smartphones ab (ich muss das Telefon neu starten, damit es wieder funktioniert). Was meinst du mit "RSSI Lesungen werden intern nachverfolgt"? – skateskate

+0

Ich habe noch eine andere Frage: Ich habe einige Ihrer Antworten gelesen, in denen Sie gesagt haben, dass Sie das Werbeintervall des Beacons nicht verringern sollten, um mehr statistische Stichproben zu erhalten. Aber wenn der Callback alle 1,1 Sekunden aufgerufen wird, erhalte ich immer einen neuen RSSI pro Callback und verschwende die anderen. Hab ich recht? Also konnte ich das Werbeintervall nicht senken, um Batterie des Leuchtfeuers zu sparen? Vielen Dank. – skateskate

+0

Es hört sich so an, als könnte der Bluetooth-Stack auf Ihrem Gerät nicht oft mit dem Neustart von Scans umgehen, was bedauerlich ist. Ist das Android 4.x? Wenn Android 5.x-Scanning-APIs verfügbar sind, muss die Bibliothek nicht bei jedem Zyklus einen Scan anhalten und neu starten. Intern verfolgt die Bibliothek die laufende durchschnittliche RSSI für Entfernungsschätzungen, und dieser laufende Durchschnitt berücksichtigt * alle * der Messwerte von allen erfassten Paketen, einschließlich mehrerer in einem einzelnen Entfernungszyklus. Dies wird in einer privaten Mitgliedsvariablen von 'Beacon' gespeichert, die' mRunningAverageRssi' genannt wird. – davidgyoung

Verwandte Themen