2014-01-24 31 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