BCSphere入門教程01:Immediate Alert

李治發表於2014-07-21

*寫在前面

智慧硬體開發的起點是智慧硬體,在本教程中的每一章節,首先會列出您的藍芽智慧硬體所需要支援的Service,請您確保硬體可以正常的讀寫特徵值,並確認硬體功能正常。可以使用bcsphere-core-dev或者LightBlue對您的硬體進行功能的測試。

硬體最小支援

Service: Immediate Alert
UUID: 00001802-0000-1000-8000-00805f9b34fb

Characteristic: Immediate Alert
UUID: 00002a26-0000-1000-8000-00805f9b34fb
Property: Write || WriteWithoutResponse
Function: 寫入Hex值0,裝置停止發出聲音;寫入Hex值1,裝置發出聲音;


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

  • 學習到如何使用bc.js連線一個裝置
  • 學習到如何使用bc.js的介面來操作GATT進行資料的寫入
  • 通過一個使用HTML展現的Button來對特徵值進行操作

Immediate Alert 是Bluetooth4.0定義的最簡單的一個智慧硬體Service,它只使用到了一個Characteristic。硬體如果支援此Service,那麼向其中包含的Characteristic寫入一個值,那麼裝置應當可以發出對應的響聲。

Device物件

Device物件是一切GATT操作的基礎物件,使用它可以進行連線、查詢Service等操作。Device物件中包括很多屬性,比如裝置廣播包、裝置生產廠商資訊等等,具體可以參考這裡
建立一個Device物件可以用如下的語句:

var device = new BC.Device({deviceAddress:"20:CD:39:AD:65:20",type:"BLE"});

新建一個Device的時候,其deviceAddress和type是必須傳入的,在BCSphere中,選中某個裝置進入您的webapp的時候,會帶入兩個‘環境變數’分別是DEVICEADDRESSDEVICETYPE,分別代表選中的裝置地址和對應的裝置型別,也可以這樣新建在BCSphere的掃描頁面選中的裝置:

var device = new BC.Device({deviceAddress:DEVICEADDRESS,type:DEVICETYPE});

教程中例子的除錯環境是Android,因此可以獲得裝置的MAC地址。IOS會給每個裝置指定一個UUID,不同的IOS裝置上對同一個智慧裝置賦予的UUID是不一樣的,因此對於IOS裝置,其Device物件應當由bc.js的掃描介面生成,但為了保持教程的清晰性,此章不涉及掃描介面的介紹。
注:當然這並不是說在操作Device的時候必須知道其具體的藍芽地址和裝置型別,通過bc.js提供的掃描介面也可以自動的生成裝置物件陣列,掃描介面的使用將在第三章進行介紹。

新建出一個device物件後,我們就可以使用它進行對裝置的連線了,任何對裝置的操作必須在連線裝置之後才可以進行:

device.connect(function(){  
         alert("device is already connected well!");
    },function(){
         alert("connect error!");
});

連線過後傳入了兩個函式作為引數,是分別處理裝置連線成功和出錯的回撥函式。 Device物件還擁有兩個事件,分別是連線建立和連線斷開的事件,可以在device物件建立後使用如下程式碼監聽這 兩個事件,當所連線的裝置連線狀態發生變化的時候(比如裝置距離太遠而斷開),會呼叫註冊在對應事件上的回撥函式來進行處理。

device.addEventListener("deviceconnected",function(device){
        alert("device:" + s.deviceAddress + "is connected successfully!");
});
device.addEventListener("devicedisconnected",function(device){
        alert("device:" + device.deviceAddress + "is connected successfully!")
});

Service物件:

與裝置建立連線之後,就可以通過Device的discoverServices介面查詢裝置中所包含的服務了,具體Service物件中的結構參看此處

device.connect(function(){  
    device.discoverServices(function(){
        var service = device.getServiceByUUID("1802")[0];
        alert("The Service UUID is" + service.uuid);
    },function(){
        alert("discoverServices error!");
    });
},function(){
    alert("connect error!");
});

值得注意的是,如果一個service是標準的service,其UUID可以簡寫為32位的UUID。由於在裝置中可能出現同一個UUID的Service,因此getServiceByUUID("1802")介面返回的是一個UUID為00001802-0000-1000-8000-00805f9b34fbService的物件陣列,因為這一章中的硬體只有一個UUID為1802的Service,因此我們取其中第一個Service進行操作getServiceByUUID("1802")[0]
在呼叫discoverServices介面成功過後,Device物件中將填充一個欄位,你可以通過迭代device.services這個陣列來獲取該裝置中所有的service。(同理service中有characteristic的陣列,characteristic中有descriptor的陣列,後面不再贅述)。

Characteristic物件

特徵值物件是操作的重點物件,Service包括一個discoverCharacteristics的介面,獲取到對應的Characteristic物件後,可以呼叫其方法對Characteristic進行‘write/read/subscribe’的操作,具體介面可以參看這裡

    var device = new BC.Device({deviceAddress:"20:CD:39:AD:65:20",type:"BLE"});
    device.connect(function(){
        device.discoverServices(function(){
            var service = device.getServiceByUUID("1802")[0];
            service.discoverCharacteristics(function(){
                var character = service.getCharacteristicByUUID("2a26")[0];
                character.write("Hex","01",function(data){
                    alert(JSON.stringify(data));
                },function(){
                    alert("write error!");
                });
            },function(){
                alert("discoverCharacteristics error!");
            });
        },function(){
            alert("discoverServices error!");
        });
    },function(){
        alert("connnect error!");
    });

當然如果希望更快一點獲取到characteristic物件並進行操作,可以使用bc.js中Device類提供的prepare介面,呼叫此介面成功後,硬體裝置中的所有服務結構都會被填充到device物件中,但對於服務較多的硬體來說,呼叫prepare介面可能會造成操作的延遲,在開發的過程中可以酌情選擇:

    var device = new BC.Device({deviceAddress:"20:CD:39:AD:65:20",type:"BLE"});
    device.connect(function(){
        device.prepare(function(){
            var service = device.getServiceByUUID("1802")[0];
            var character = service.getCharacteristicByUUID("2a26")[0];
            character.write("Hex","01",function(data){
                alert(JSON.stringify(data));
            },function(){
                alert("write error!");
            });
        },function(){
            alert("device prepare error!");
        });
    },function(){
        alert("connnect error!");
    });

總結

至此,您已經可以使用BCSphere對一個您想要操作的裝置進行特徵值的寫入了。關於結合web頁面的具體例子,請參看本章提供的原始碼。下一章將著重介紹對Characteristic的操作。

相關文章