BCSphere入門教程02:操作 Characteristic

李治發表於2014-07-22

特徵值(Characteristic)是GATT中的核心物件,Service/Descriptor其實都是為了對Characteristic進行操作而準備的。特徵值在BLE中支援很多型別的操作(比如:write/writeWithoutResponse/ read/notify/indicate等等),但為了簡化GATT Client的實現,bc.js將其劃分為了四種操作:write/read/ subscribe/unsubscribe。下面就通過一個例子來展示如何使用bc.js來操作特徵值。

硬體最小支援

Service : Custom Service
UUID: 0000fff0-0000-1000-8000-00805f9b34fb

Characteristic : Custom Characteristic
UUID: 0000fff1-0000-1000-8000-00805f9b34fb
Property: Write && Read
Function: 可以寫入資料,並且可以讀出上一次寫入的資料。初始值為0

Characteristic : Custom Characteristic
UUID: 0000fff4-0000-1000-8000-00805f9b34fb
Property: Notify || Indicate
Function: 每5秒鐘向訂閱端傳送一次notify或者indicate,資料為某一固定值即可


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

  • 學習到如何寫入/讀取/訂閱/取消訂閱一個特徵值
  • 學習到如何使用DataValue物件來操作讀取和訂閱到的資料
  • 通過一個使用HTML展現的頁面來對特徵值進行各種操作

Write

Write方法由手機端向裝置端寫入一個資料。介面需要指定兩個引數,分別是寫入型別和寫入的值,這個資料可以指定五種型別,分別是:'hex'/'ascii'/'unicode'/'raw'/'base64'。分別可以寫入由string表示的16進位制的值;由string表示的ASCII字串;由string表示的UNICODE字串;由Uint8Array(javascript用來操作二進位制資料的型別)表示的原始byte陣列;和由string表示的由base64編碼過後的字串。 獲取到需要操作的characteristic物件(獲取流程參見第一章)後,寫入一個值非常簡單:

function write(){
    characteristic.write("Hex","01FFAD",function(){
        alert("write success!");
    },function(){
        alert("write error!");
    });
}

Read

和Write介面一樣,Read介面也需要獲取Characteristic物件之後進行操作:

function read(){
    characteristic.read(function(data){
        alert(JSON.stringify(data));
    },function(){
        alert("read error!");
    });
}

Subscribe

當某個Characteristic的值發生變化,需要通知手機端的時候會觸發註冊在Characteristic物件上的函式,並將需要通知的值傳遞給手機端進行處理。通過呼叫Characteristic物件的subscribe函式來訂閱這個通知(這個資料通知使用notify和indicate傳送給手機端都可以觸發subscribe介面註冊的回撥函式)。

function subscribe(){
    characteristic.subscribe(function(data){
        alert(JSON.stringify(data));
    });
}

Unsubscribe

如果希望取消訂閱一個特徵值,那麼呼叫unsubscribe函式即可:

function unsubscribe(){
    characteristic.unsubscribe(function(){
        alert("unsubscribe success");
    },function(){
        alert("unsubscribe error!");
    });
},

DataValue物件

為了方便app開發者使用javascript對讀取或者訂閱到的資料進行操作,bc.js抽象出了DataValue物件來方便您對資料格式的轉換和操作。Read和Subscribe的回撥函式傳入的data是一個JSON物件,其中包括讀取裝置的ID(deviceAddress);讀取的Service在裝置中的下標索引(serviceIndex);讀取的Characteristic在Service中的下標索引(characteristicIndex);資料獲取到的時間戳(date);獲取到的值(value)。其中獲取到的值(value)是一個DataValue的物件。
比如在Read介面的回撥中:

function read(){
    characteristic.read(function(data){
        alert(data.value.getHexString()); //轉化為十六進位制的字串,並顯示
        alert(data.value.getUnicodeString()); //轉化為Unicode的字串,並顯示
        alert(data.value.getASCIIString()); //轉化為ASCII的字串,並顯示
        alert(data.date);  //資料獲取到的時間
    },function(){
        alert("read error!");
    });
}

如果希望獲取DataValue封裝的原始值(ArrayBuffer),並使用javascript原生的二進位制操作方法處理ArrayBuffer的資料,使用data.value.value獲得即可。DataValue支援的介面和包含的具體欄位可以參考這裡

至此,您已經可以使用bc.js的介面對特徵值進行各種操作,並使用DataValue來進行資料處理了!本章同樣提供了對應的原始碼

下一章,我們將介紹bc.js中提供的掃描介面,並進一步詳細的介紹Device物件。

相關文章