BCSphere入門教程01:Immediate Alert
*寫在前面
智慧硬體開發的起點是智慧硬體,在本教程中的每一章節,首先會列出您的藍芽智慧硬體所需要支援的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的時候,會帶入兩個‘環境變數’分別是DEVICEADDRESS
和DEVICETYPE
,分別代表選中的裝置地址和對應的裝置型別,也可以這樣新建在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-00805f9b34fb
Service的物件陣列,因為這一章中的硬體只有一個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的操作。
相關文章
- BCSphere入門教程目錄
- BCSphere入門教程02:操作 Characteristic
- BCSphere入門教程06:使用Cordova標準模組
- BCSphere入門教程04:使用iBeacon介面
- BCSphere入門教程:導言和知識準備
- BCSphere入門教程03:掃描周圍裝置
- BCSphere入門教程05:標準Profile與自定義Profile
- oracle 正常關閉shutdown immediate與開啟open資料庫alertOracle資料庫
- shutdown immediate alert出現SHUTDOWN: waiting for active calls to complete.AI
- 《MySQL 入門教程》第 01 篇 MySQL 簡介MySql
- Iptables入門教程
- vue入門教程Vue
- Redux入門教程Redux
- Electron入門教程
- Aseprite入門教程
- Twisted 入門 教程
- flask入門教程Flask
- Maven入門教程Maven
- awk 入門教程
- HBase入門教程
- Jmeter入門教程JMeter
- Elasticsearch入門教程Elasticsearch
- SnapKit入門教程APK
- Tmux入門教程UX
- Docker 入門教程Docker
- Thrift 入門教程
- Vuex入門教程Vue
- CMake入門教程
- RabbitMQ入門教程MQ
- mybatis入門教程MyBatis
- Git入門教程Git
- docker入門教程Docker
- tcpdump教程入門TCP
- Circos入門教程
- Vim入門教程
- OpenStack 入門教程
- React 入門教程React
- Webpack 入門教程Web