BCSphere入門教程03:掃描周圍裝置

李治發表於2014-07-23

Bluetooth4.0優化了之前的掃描功能,讓搜尋周圍裝置的速度有了很大的提升,並且節約了功耗。基於Bluetooth4.0的這個特性,湧現出了IBeacon/Estimote等很多隻基於Bluetooth廣播包的智慧硬體應用。本章將重點介紹使用bc.js提供的掃描介面來掃描周邊的裝置,並深入介紹掃描到的Device物件中包含的資訊。

硬體最小支援

Service: Device Information
UUID: 0000180a-0000-1000-8000-00805f9b34fb

Characteristic 較多,這裡為了節約篇幅不再詳細羅列,具體可以參考Bluetooth4.0 的 Device Information 標準Profile
Function: Device Information Profile包括了軟硬體版本資訊,製造商分銷商等資訊,用於區別不同的裝置。


通過本章的學習,您可以:

  • 學習到如何呼叫bc.js的掃描介面,並獲得自動生成的Device物件
  • 學習到如何呼叫Device物件的介面讀取Device的Information,廣播包及訊號強度(RSSI)等資訊
  • 通過一個使用HTML展現的頁面來開啟掃描,並展示出獲得到的周圍的裝置列表

StartScan介面

Scan介面註冊在了BC.Bluetooth上,呼叫BC.Bluetooth.StartScan(),即可開啟掃描。對於Android裝置,如果向StartScan中不傳入任何引數,那麼預設首先進行5秒鐘的BLE掃描,再進行12秒鐘的Classical掃描(可以掃描到2.1的裝置),如果中途不關閉掃描,那麼每17秒鐘進行一次這樣的混合掃描。如果是IOS裝置,那麼僅僅是BLE的掃描。如果希望Android只掃描BLE裝置那麼傳入字串“LE”即可,如果希望其只掃描Bluetooth2.1的裝置,傳入“Classical”即可。

function StartScan(){
    BC.Bluetooth.StartScan("LE"); //只開啟BLE的掃描
}

開啟掃描之後,bc.js底層會通過newdevice這個事件來將掃描到的裝置物件傳遞給處理函式。這個事件被註冊在了BC.bluetooth物件上。

document.addEventListener('bcready', onBCReady, false);  

function onBCReady() {
    BC.bluetooth.addEventListener("newdevice",function(event){
        var newDevice = event.target;
        newDevice.addEventListener("deviceconnected",function(arg){
            alert(newDevice.deviceAddress +" is connected!");                
        });
        newDevice.addEventListener("devicedisconnected",function(arg){
            alert(newDevice.deviceAddress+" is disconnected!");    
        });            
    });
}

注意:BC.Bluetooth和BC.bluetooth並不是同一個物件,BC.Bluetooth物件上主要註冊了一些全域性靜態的函式,而BC.bluetooth物件是在bc.js載入時new出來的一個物件,上面註冊了物件事件以及裝置列表等需要動態載入的物件。

StopScan介面

StopScan介面不接收引數,呼叫過後會關閉所有型別的掃描。

function StopScan(){
    BC.Bluetooth.StopScan();
}

獲取Device物件相關資訊

掃描到的Device物件都被儲存在BC.bluetooth.devices這個字典中,可以用device的Address來獲取指定的Device物件:

function(deviceAddress){
    var device = BC.bluetooth.devices[deviceAddress];
    alert(device.deviceAddress);
    alert(device.deviceName);
}

Device物件如果由StartScan介面獲取,那麼可以得到該裝置的廣播包。其廣播包封裝成了一個字典,可以使用JSON.stringify來檢視此Device都包含哪些廣播包欄位。廣播包欄位中IBeacon使用到了ManufacturerData這個欄位,此欄位比較特殊,其值為一個DataValue物件,因此可以像第二章中所提到的呼叫格式轉化方法,或者直接使用javascript方法對manufacturerData.value直接進行處理。

function seeADVData(deviceAddress){
    var device = BC.bluetooth.devices[deviceAddress];
    alert(JSON.stringify(device.advertisementData));
    if(device.advertisementData.manufacturerData){
        alert("ManufacturerData(Hex):" + device.advertisementData.manufacturerData.getHexString()+"\n"+ 
          "ManufacturerData(ASCII):" + device.advertisementData.manufacturerData.getASCIIString()+"\n"+ 
          "ManufacturerData(Unicode):" + device.advertisementData.manufacturerData.getUnicodeString());
    }
}

在裝置連線過後,還可以通過Device物件提供的getDeviceInfo介面檢視它的Device Information Profile中的資訊,從Device Information Service包含的特徵值中讀取的資料都將放在Device物件的欄位當中。

function getDeviceInfo(device){
    device.discoverServices(function(){
        device.getDeviceInfo(function(){
            alert("System ID:"+device.systemID.getHexString()+"\n"+
                  "Model Number:"+device.modelNum.getASCIIString()+"\n"+
                  "Serial Number:"+device.serialNum.getASCIIString()+"\n"+
                  "Firmware Revision:"+device.firmwareRevision.getASCIIString()+"\n"+
                  "Hardware Revision:"+device.hardwareRevision.getASCIIString()+"\n"+
                  "Software Revision:"+device.softwareRevision.getASCIIString()+"\n"+
                  "Manufacturer Name:"+device.manufacturerName.getASCIIString());                
        },function(){
            alert("get device Information error!");
        });
    },function(){
        alert("discover service error!");
    });
}

關於訊號強度(RSSI)

訊號強度是藍芽裝置用來檢測裝置和手機端距離的重要數值,基於RSSI可以用於定位、測距等多種應用場景。在連線裝置之前,每一個廣播包中都會帶有當前的訊號強度,當裝置連線過後,可以通過Device物件提供的getRSSI介面來獲取當前的RSSI:

function getRSSI(device){
    device.getRSSI(function(rssi){
        alert(rssi);
    });
}

至此,您已經可以呼叫BC.Bluetooth物件來實現開啟關閉掃描的功能,並操作掃描到的Device物件了。本章同樣提供了對應的原始碼
為了更深一步操作掃描到的裝置廣播包,下一章將介紹BCSphere提供的IBeacon掃描功能。

相關文章