5

我对 iBeacon 还很陌生,但我花了一天时间尝试使用 iBeacon 获取信息和工作的 Android 应用程序。

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

我的问题是范围一直在波动,没有逻辑。例如,将手机(在本例中为 Nexus 5,原始 rom,未修改)放置在距 iPad 半米远的地方,我可以采取以下措施:

  • 0.01m
  • 0.03m
  • 0.07m
  • 0.48m
  • 0.01m
  • 0.02m

等等

当我使用另一台装有 AirLocate 的 iPad 时,它提供了更稳定和真实的测量结果。排除信标作为问题的根源。

我已经使用 Nexus 7 2013(原始 rom,未修改)进行了测试,我遇到了同样的问题。我已经阅读了 wifi 会导致问题,所以我禁用了它,但它仍然是一样的。我对 Play Store 上的 Radius Networks 应用程序也有同样的问题:iBeacon Locate

我想知道其他人是否对这个库有问题?我能做些什么来帮助解决这个问题吗?您知道我可以使用的另一个不会导致此类问题的库吗?

任何帮助表示赞赏。先感谢您。

4

1 回答 1

13

您看到的很大一部分变化是 Android 是由于 Android 允许从蓝牙 LE 访问信号强度测量的方式受到限制造成的。不幸的是,如果不对 Android 进行更改,对此将无能为力。

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

Android iBeacon 库中的算法与 iOS CoreLocation 中的算法不同,因为 iOS CoreLocation 实现是闭源的。目的是它们的行为方式相似。Android iBeacon 库基于 80% 测量值的 10 秒运行平均值(例如,顶部和底部 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 库在前台时每 1.1 秒执行一次蓝牙扫描,因此允许每 1.1 秒进行一次测量。因此,如果您有一个每秒传输 30 次的 iBeacon(就像 iOS 设备充当 iBeacon 一样),iOS 将能够在 10 秒内获得 300 个样本,而 Android 只有 9 个。这解释了为什么估计有更高的噪声在安卓上。再说一次,如果不改变操作系统,几乎没有什么可以做的。

根据您的用例,您可以通过在较长时间内实现包含更多样本的自定义计算来减少 Android 上距离估计中的噪音。仅当您的用例不需要在估算中快速更新时,这才是合适的。如果您对此感兴趣,您可以在开源库中打开一个功能请求。

于 2014-01-24T18:48:32.047 回答