BCSphere入門教程04:使用iBeacon介面

李治發表於2014-07-25

上一章提到了Beacon這種只需要對廣播包進行分析的智慧硬體裝置。Beacon被認為是現代商業環節中取代二維碼實現O2O閉環的重要互動技術之一。iBeacon是蘋果提出的一種Beacon標準,可以用來進行測微距、定位、標識微地理位置等諸多功能,其廣播包資料格式及詳細介紹可以參考維基百科,本文不再贅述。BCSphere Framework中使用org.bcsphere.ibeacon模組來支援iBeacon資料的掃描和獲取,本章將深入介紹iBeacon在BCSphere中的介面和使用方法。

硬體最小支援

支援iBeacon格式的廣播,準確的說是讓裝置在Manufacture Data裡面填入如下格式的廣播byte(此處只是格式示例):

04 3E 2A 02 01 00 01 FC ED 16 D4 EE D6 1E 02 01 06 1A(前面是常規智慧硬體廣播包部分)
FF(FF代表後面是Manufacture Data)
4C 00 02 15(0215是iBeacon的識別碼,所有在Manufacture Data前幾位發出0215的裝置都被認為是iBeacon廣播)
B9 40 7F 30 F5 F8 46 6E AF F9 25 55 6B 57 FE 6D ED(黑體部分是iBeacon的Proximity UUID)
FC D4(FCD4是iBeacon的major值)
16 B6(16B6是iBeacon的minor值)
B4(B4是iBeacon的訊號發出強度值,用來作為和RSSI一起測距的基準)


使用iBeacon模組

引入iBeacon模組非常簡單,首先在index.html頁面中按照如下順序加入script標籤:

    <script type="text/javascript" src="http://115.29.149.19:3000/framework/org.underscorejs.underscore/underscore.js"></script>
    <script type="text/javascript" src="http://115.29.149.19:3000/framework/org.bcsphere.bluetooth/bluetoothapi.js"></script>
    <script type="text/javascript" src="http://115.29.149.19:3000/framework/org.bcsphere/bc.js"></script>
    <script type="text/javascript" src="http://115.29.149.19:3000/framework/org.bcsphere.ibeacon/ibeaconapi.js"></script>
    <script type="text/javascript" src="http://115.29.149.19:3000/framework/org.bcsphere/ibeacon.js"></script>
    <script type="text/javascript" charset="utf-8" src="js/index.js"></script>

在index.js的deviceready事件中通過cordova.require來引入模組:

document.addEventListener('deviceready',function(){
        var BC = window.BC = cordova.require("org.bcsphere.bcjs");
        var BC = window.BC = cordova.require("org.bcsphere.ibeacon");
},false);

org.bcsphere.ibeacon模組和所有和BC相關的模組一樣,匯出的都是附加更多介面後的BC物件。

監聽iBeacon事件

iBeacon掃描和停止掃描介面都註冊在了BC.IBeaconManager上,例如使用一個switch控制元件來進行開關:

$('#scanOnOff').change(function(){
    var state = $("#scanOnOff").val();
    if(state == 1){
        BC.IBeaconManager.StartIBeaconScan();
    }else if(state == 0){
        BC.IBeaconManager.StopIBeaconScan();
    }
});  

StartIBeaconScan 介面接收三個引數,分別是proximity UUID,major,minor。如果不傳入任何引數,那麼預設掃描所有符合iBeacon廣播包格式的裝置,如果傳入 proximity UUID ,那麼只在掃描到proximity UUID是指定的ibeacon的時候才會觸發newibeacon事件。如果傳入major,那麼只在掃描到proximity UUID,major也是指定的ibeacon的時候才會觸發newibeacon事件。minor也是同理。

在bcready事件中可以註冊監聽新掃描到iBeacon事件的函式:

document.addEventListener('bcready',function(){
        BC.iBeaconManager.addEventListener("newibeacon",function(event){
            var newibeacon = event.target;
            newibeacon.addEventListener("ibeaconproximityupdate",function(){
                alert(newibeacon.proximity);
            });
            newibeacon.addEventListener("ibeaconaccuracyupdate",function(){
                alert(newibeacon.accuracy);
            });            
        });
},false);

注意:和BC.Bluetooth和BC.bluetooth一樣,BC.IBeaconManager中註冊了類的“靜態”掃描介面,BC.iBeaconManager中包括了物件導向的事件觸發,以及掃描到的ibeacon的集合。您可以通過迭代BC.iBeaconManager.ibeacons來遍歷掃描到的ibeacon。還可以使用BC.iBeaconManager.ibeacons[iBeaconID]來直接獲取到對應的ibeacon物件,iBeaconID是proximityUUID+major+minor的字串拼接,方便您對ibeacon的操作。

每次獲取到新的ibeacon時,都會通過newibeacon事件獲取到新的ibeacon物件,並通過註冊在ibeacon上的事件來監聽ibeacon距離的變化。

BC.IBeacon類繼承於BC.Device類,因此掃描到iBeacon後,您可以像操作普通智慧裝置一樣對iBeacon進行連線,並通過BC.Device的介面來操作其中的特徵值。當然,每個iBeacon中包括proximity UUID major minor欄位,具體格式可以參考ibeacon.js中的註釋。

ibeaconproximityupdate事件代表某個ibeacon離正在掃描iBeacon的智慧手機的距離發生了變化newibeacon.proximity是一個int型別的值,1代表距離在0-30釐米之間,2代表距離在30釐米到2米之間,3代表距離在2米之外。

ibeaconaccuracyupdate事件代表ibeacon更加精細的距離變化,由於RSSI會受各種情況干擾,因此基本上每次獲得的廣播包都會導致ibeacon精細距離變化,此事件會被頻繁觸發,請謹慎使用。

本章介紹了BCSphere支援的iBeacon介面,今後的版本會增加iBeacon的功能(比如支援多個region),敬請關注BCSphere社群的詳細動態。本章同樣提供了原始碼

下一章我們將介紹Profile的使用。

相關文章