2014-10-20 88 views
0

我們正在嘗試使用Altbeacon庫來滿足下一個研究案例: 我們希望將幾個IBeacons放置在它們之間距離不超過3米的房間或走廊中,並且我們希望獲得最近的Ibeacon基於掃描信標的用戶電話。 我們首先嚐試建造一個只有一個燈塔的區域,每個區域都是封閉的,這意味着當你進入一個區域時,你不可能同時在其他區域,並且當你離開一個區域,你輸入下一個最接近的一個,等等。但這不是圖書館實施的方法。 我們想知道在Altbeacon庫中是否有任何方法來應用我們的方法,或者是否需要某種補丁來滿足我向您介紹的研究案例。Ibeacon地區封閉集?

+0

我不知道Altbeacon庫,但是如果它與其他信標庫一樣,則應該使用信標而不是監視區域來查找最近的信標。 – 2014-10-20 09:39:08

+0

使用此庫,您只能在特定區域內的信標範圍內找到距離該區域最近的區域(假設有兩個或更多)。我們想讓申請只進入最近的地區,當進入時,我們不會離開它,直到其他地區離我們更近。 – 2014-10-20 09:50:12

+0

「地區」僅在您的應用程序提供的代碼級別的Android上存在,包括此庫。就Android而言,BLE數據包內容是任意數據,並且您的選項是開放的。但是,如果您想與iOS兼容,則需要儘可能少地使用區域,因爲一次可以查找的區域數量有嚴格的限制。 – 2014-10-21 16:11:17

回答

0

來實現這一目標最簡單的方法是將範圍使用單個區域的所有信標,並開始爲:

@Override 
public void onBeaconServiceConnect() { 
    try { 
     // Set up a region that matches all of your beacons. You may want to replace the first 
     // null with a UUID that all your beacons share. 

     Region allBeaconsRegion = new Region("all beacons", null, null, null); 
     beaconManager.startRangingBeaconsInRegion(mAllBeaconsRegion); 
     beaconManager.setRangeNotifier(this);  

    } catch (RemoteException e) { 
     Log.e(TAG, "Cannot connect to beacon service"); 
    } 
} 

請注意,如果您使用的是帶有RegionBootstrap一個自定義的應用程序類,你可以把上面代碼中的didEnterRegion方法代替了onBeaconServiceConnect方法。

一旦你開始測距,你將會得到一個每秒一次的回調信號和一列所有可見的信標。您可以添加代碼,以確定哪一個是最接近:

@Override 
public void didRangeBeaconsInRegion(Collection<Beacon> beacons, Region arg1) { 
    Beacon closestBeacon = null; 

    for (Beacon beacon : beacons) { 
      if (closestBeacon == null) { 
       closestBeacon = beacon; 
      } 
      else { 
       if (closestBeacon.getDistance() > beacon.getDistance()) { 
        closestBeacon = beacon; 
       } 
      } 
    } 

    // Do Something with closestBeacon here   
} 

請記住,最接近的信標可以來回變化,由於無線電噪聲,所以你可能需要添加額外的邏輯,以防止最接近的燈塔翻轉來回頻繁。