2017-05-09 2 views
0

J'essaie de trouver la distance entre un Eddy Stone Beacon et le courant de l'utilisateur dans l'appareil Android. Ce que j'ai fait jusqu'ici est, j'ai écrit le code pour détecter la balise la plus proche et cela a fonctionné. Pour aller plus loin j'ai besoin de suggestion que comment je peux réaliser ceci. En utilisant une formule? Pour utiliser Maps? S'il vous plaît fournir ce que je peux faire exactement ..Android: Trouver la distance entre l'emplacement actuel de l'utilisateur et une balise

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(); 

} 

}

Edité 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(); 
} 

}

Répondre

0

L'API Estimote fournit une méthode Utils.computeAccuracy pour calculer la distance à la balise . Dans la version 1.0.0 de l'API, ce utils déplacé à 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); 
     } 
    } 
}); 

Je crois que cela est calculé sur la base de la théorie du signal en comparant la puissance du signal reçu et la puissance du signal attendu transmis dans le paquet de données. Le signal le plus bas reçu est le plus éloigné de la balise. Comme @davidgyoung l'a mentionné, il s'agit simplement d'une estimation approximative de la distance. Les différents modèles d'appareils (téléphones et balises) auront peu de radios différentes et donc des mesures différentes. De plus, l'environnement entre le téléphone et la balise fait des différences. Je recommande cet article pour comprendre: https://altbeacon.github.io/android-beacon-library/distance-calculations.html

+0

Merci beaucoup. Maintenant que j'ai trouvé la distance, mais avec la valeur de la courbe ajustée en dur. S'il vous plaît regardez sur mon édition. Comment calculer/obtenir la meilleure valeur de courbe d'ajustement. Toute aide serait vraiment utile. –

+0

Voir la mise à jour ... – Dietatko