android - Radius Networks 的 ibeacon 测距波动

标签 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.48m
  • 0.01米
  • 0.02米

等等

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

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

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

感谢任何帮助。提前谢谢你。

最佳答案

您看到的很大一部分变化是 Android 是由于 Android 允许从低功耗蓝牙访问信号强度测量的方式的限制造成的。不幸的是,如果不对 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 上,Bluetooth LE Scan API 每次扫描仅允许测量一次信号强度。在 iOS 上,可以对播放的每个广告进行不同的测量。默认情况下,Android iBeacon 库在前台时每 1.1 秒执行一次蓝牙扫描,因此每 1.1 秒允许一次测量。因此,如果您有一个每秒传输 30 次的 iBeacon(就像充当 iBeacon 的 iOS 设备那样),iOS 将能够在 10 秒内获得 300 个样本,而 Android 只有 9 个。这解释了为什么估计有更高的噪音在安卓系统上。而且,如果不更改操作系统,对此几乎无能为力。

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

关于android - Radius Networks 的 ibeacon 测距波动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21338031/

相关文章:

android - OpenTok 需要 android.hardware.camera.autofocus?

android - AltBeacon onBeaconServiceConnect 未调用

android - 室内导航信标

android - 如何在 Android 上使用室内信标实时映射

java - 在 AsyncTask 中安全地调用 getActivity()

android - Android 中的 IPTV 播放器应用程序

android - 在 Animation 类中找不到名称为 mListener 的字段

android - Snackbar 隐藏 FloatingActionButton

android - 如何为 kontakt.io sdk 实现后台服务?

android - 使用 Radius Networks Pro iBeacon SDK 的后台 BLE 触发器