2014-01-24 29 views
4

我对iBeacon相当陌生,但我花了一天的时间试图获取信息和一个可用的Android应用程序与iBeacon。Radius Networks的ibeacon范围波动

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

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

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

等等

当我用AirLocate上的另一台iPad时,它给出了一个更稳定和现实的措施。不包括灯塔作为问题的根源。

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

我想知道其他人是否有这个库的问题? 有什么我可以做的,以帮助解决这个问题? 您是否知道另一个我可以使用的库,它不会导致这种问题?

任何帮助表示感谢。先谢谢你。

回答

12

你看到的变化很大一部分是由于Android允许从蓝牙LE访问信号强度测量的方式受到限制。不幸的是,没有对Android进行更改,没有太多可以做的事情。

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

Android iBeacon库中的算法与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上,Bluetooth LE Scan API只允许每次扫描一次信号强度测量。在iOS上,可以针对每个广播播出不同的测量结果。默认情况下,Android iBeacon库在前景中每1.1秒执行一次蓝牙扫描,因此每1.1秒允许一次测量。因此,如果您的iBeacon每秒传输30次(iOS设备充当iBeacons),则iOS将能够在10秒内获得300个样本,而Android仅支持9个。这解释了为什么估计噪声更高在Android上。再说一次,没有操作系统的改变就没有什么可做的了。

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

+0

谢谢你的回答,这使得它更清楚发生了什么事情。然而,当我继续使用我的设备(假设距离10米)时,我测得的距离从1米到20米有很大的变化。 这是正常的吗?我应该有这样重要的变化吗? –

+1

_Serry for double commenting this,I can not edit our last comment._ 为了您的信息在这里是一段时间内的准确性的图表,我站在我的Nexus 5,离ipad迷你广播3米远,作为一个ibeacon。 http://imgur.com/dG7NYi2 –

+0

变化随距离增加是正常的。该图看起来像比我通常在3米处看到的多一点变化,但这可能是由测试位置或其他因素的反射引起的。如果您想深入研究,还可以绘制rssi和距离'iBeacon.getRssi()'的距离。 – davidgyoung