Radius Networks的ibeacon范围波动

时间:2014-01-24 16:49:13

标签: android ibeacon-android

我是iBeacon的新手,但我花了一天时间试图通过iBeacon获取信息和一个可用的Android应用程序。

我偶然发现了Android iBeacon Library samples并尝试了一下。我使用了最新的aar文件(0.7.3)并基本上将它们的示例复制/粘贴到一个新项目中。 我使用带有AirLocate的iPad创建了一个灯塔(从开发中心的Apple代码编译)并启动代码。

我的问题是范围一直在波动而没有逻辑。 例如,距离iPad半米远的手机(在这种情况下为Nexus 5,原始ROM,无需修改)给出了以下措施:

  • 0.01米
  • 0.03米
  • 0.07米
  • 0.48米
  • 0.01米
  • 0.02米

当我在其上使用另一台带有AirLocate的iPad时,它会提供更加稳定和逼真的测量。将信标排除在问题的根源之外。

我已经使用Nexus 7 2013(原始ROM,未修改)进行了测试,我遇到了同样的问题。我已经读过wifi可能会导致问题,所以我禁用它但它仍然是相同的。 我在Play商店中也存在与Radius Networks应用程序相同的问题:iBeacon Locate

我想知道其他人是否有这个库的问题? 我能做些什么来帮助解决这个问题吗? 你知道我能用的另一个图书馆不会引起那种问题吗?

任何帮助都表示赞赏。提前谢谢。

1 个答案:

答案 0 :(得分:13)

您看到的变种很大一部分是由于Android允许从蓝牙LE进行接入信号强度测量的方式的限制。不幸的是,如果不对Android进行更改,就没有太多可以做的事情。

在iOS CoreLocation和Android iBeacon Library中,距离估计只是一个估计,而信号强度测量中的噪声波动会导致估计值反弹。

Android iBeacon Library中的算法与iOS CoreLocation中的算法不同,因为iOS CoreLocation实现是封闭源代码。目的是他们以类似的方式行事。 Android iBeacon库基于10秒运行平均值的80%测量值(例如,平均值的顶部和底部10%百分位数被丢弃。)您可以在此处查看计算的详细信息:

protected static double calculateAccuracy(int txPower, double rssi) {
  if (rssi == 0) {
    return -1.0; // if we cannot determine accuracy, return -1.
  }

  double ratio = rssi*1.0/txPower;
  if (ratio < 1.0) {
    return Math.pow(ratio,10);
  }
  else {
    double accuracy =  (0.89976)*Math.pow(ratio,7.7095) + 0.111;    
    return accuracy;
  }
}   

在Android上,蓝牙LE扫描API仅允许每次扫描进行单次信号强度测量。在iOS上,可以为广播的每个广告获得不同的度量。默认情况下,Android iBeacon Library在前景中每1.1秒进行一次蓝牙扫描,因此每1.1秒允许一次测量。因此,如果您的iBeacon每秒传输30次(因为iOS设备充当iBeacons),iOS将能够在10秒内获得300个样本,而Android仅能获得9个。这就解释了为什么估计噪声更高在Android上。而且,在没有操作系统更改的情况下,可以做很少的事情。

根据您的使用情况,您可以通过实施包含更长时间内更多样本的自定义计算来降低Android上距离估算中的噪音。只有在您的用例不需要快速更新估算时,这才适用。如果您对此感兴趣,可以在开源库中open a feature request