2017-05-09 5 views
0

Ich versuche den Abstand zwischen einem Eddy Stone Beacon und dem aktuellen Benutzer in Android-Gerät zu finden. Was ich bisher gemacht habe, ist, dass ich Code geschrieben habe, um den nächsten Beacon zu finden, und es hat funktioniert. Um weiter zu machen, brauche ich einen Vorschlag, wie ich das erreichen kann. Verwenden einiger Formel? So verwenden Sie Google Maps Bitte geben Sie, was kann ich genau das tun ..Android: Ermitteln der Entfernung zwischen dem aktuellen Standort des Benutzers und einem Beacon

import android.os.Bundle; 
import android.support.v7.app.AppCompatActivity; 
import android.util.Log; 

import com.estimote.sdk.Beacon; 
import com.estimote.sdk.BeaconManager; 
import com.estimote.sdk.Region; 
import com.estimote.sdk.SystemRequirementsChecker; 

import java.util.List; 

public class MainActivity extends AppCompatActivity { 
private final String TAG = MainActivity.class.getSimpleName(); 

private BeaconManager mBeaconManager; 
private Region mRegion; 


@Override 

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    mBeaconManager = new BeaconManager(this); 

    mBeaconManager.setRangingListener(new BeaconManager.RangingListener() { 
     @Override 
     public void onBeaconsDiscovered(Region region, List<Beacon> list) { 

      if (!list.isEmpty()) { 


       Log.d(TAG, "onBeaconsDiscovered: " + list.size()); 
       Beacon nearestBeacon = list.get(0); 
       Log.d(TAG, "UUID: " + nearestBeacon.getProximityUUID()); 

       Log.d(TAG, "Strength: " + nearestBeacon.getRssi()); 
      } 
     } 
    }); 
    mRegion = new Region("Ranged Region", null, null, null); 
} 

@Override 
protected void onResume() { 
    super.onResume(); 
    SystemRequirementsChecker.checkWithDefaultDialogs(this); 
    mBeaconManager.connect(new BeaconManager.ServiceReadyCallback() { 
     @Override 
     public void onServiceReady() { 
      mBeaconManager.startRanging(mRegion); 
     } 
    }); 
} 


@Override 
protected void onPause() { 
    mBeaconManager.stopRanging(mRegion); 
    super.onPause(); 

} 

}

Edited MainActivity

@Override 

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    mBeaconManager = new BeaconManager(this); 

    mBeaconManager.setRangingListener(new BeaconManager.RangingListener() { 
     @Override 
     public void onBeaconsDiscovered(Region region, List<Beacon> list) { 

      if (!list.isEmpty()) { 


       Log.d(TAG, "onBeaconsDiscovered: " + list.size()); 
       Beacon nearestBeacon = list.get(0); 

       UUID beaconId = nearestBeacon.getProximityUUID(); 
       int strength = nearestBeacon.getRssi(); 
       int minNumber = nearestBeacon.getMinor(); 
       int majorNumber = nearestBeacon.getMajor(); 
       int txPower = nearestBeacon.getMeasuredPower(); 

       Log.d(TAG, "UUID: " + nearestBeacon.getProximityUUID()); 
       Log.d(TAG, "Strength: " + nearestBeacon.getRssi()); 

       Log.d(TAG, "MinNum " + nearestBeacon.getMinor()); 
       Log.d(TAG, "MaxNum: " + nearestBeacon.getMajor()); 
       Log.d(TAG, "Tx: " + nearestBeacon.getMeasuredPower()); 

       double distance; 

       if (strength == 0) { 
        distance = -1.0; 
        Log.d(TAG, "dis1: " + distance); 
       } 

       double ratio = strength * 1.0/txPower; 
       if (ratio < 1.0) { 
        distance = Math.pow(ratio, 10); 
        Log.d(TAG, "dis2: " + distance); 

       } else { 
        double accuracy = (0.89976) * Math.pow(ratio, 7.7095) + 
        0.111; 
        distance = accuracy; 
        Log.d(TAG, "dis3: " + distance); 

       } 


      } 
     } 
    }); 

    mRegion = new Region("Ranged Region", null, null, null); 
} 

@Override 
protected void onResume() { 
    super.onResume(); 
    SystemRequirementsChecker.checkWithDefaultDialogs(this); 
    mBeaconManager.connect(new BeaconManager.ServiceReadyCallback() { 
     @Override 
     public void onServiceReady() { 
      mBeaconManager.startRanging(mRegion); 
     } 
    }); 
} 


@Override 
protected void onPause() { 
    mBeaconManager.stopRanging(mRegion); 
    super.onPause(); 
} 

}

Antwort

0

Die Estimote API stellt eine Utils.computeAccuracy Methode Abstand zur Bake zu berechnen . In der Version 1.0.0 des API, UTILS Dies bewegt RegionUtils.computeAccuracy

mBeaconManager.setRangingListener(new BeaconManager.RangingListener() { 
    @Override 
    public void onBeaconsDiscovered(Region region, List<Beacon> list) { 
     if (!list.isEmpty()) { 
      Beacon nearestBeacon = list.get(0); 
      double distance = com.estimote.sdk.Utils.computeAccuracy(nearestBeacon); 
     } 
    } 
}); 

ich glaube, das basierend auf der Signaltheorie berechnet wird durch den Vergleich der empfangenen Signalstärke und die erwartete Signalstärke im Datenpaket übertragen. Je niedriger das Signal, desto weiter entfernt vom Beacon. Wie @davidgyoung erwähnt, ist dies nur eine grobe Entfernungsschätzung. Unterschiedliche Geräte (Telefone und Beacons) haben wenig unterschiedliche Funkgeräte und damit unterschiedliche Messungen. Auch die Umgebung zwischen Telefon und Beacon macht Unterschiede. Ich empfehle diesen Artikel zu verstehen: https://altbeacon.github.io/android-beacon-library/distance-calculations.html

+0

Vielen Dank. Nun, da ich die Entfernung gefunden habe, aber mit dem hartkodierten Best-Fit-Kurvenwert. Bitte schau auf meine Bearbeitung. Wie berechnet man den besten Kurvenwert? Jede Hilfe wäre wirklich nützlich. –

+0

Siehe aktualisierte Antwort ... – Dietatko

Verwandte Themen