原文网址:http://www.ituring.com.cn/article/117570

写在前面

智能硬件开发的起点是智能硬件,在本教程中的每一章节,首先会列出您的蓝牙智能硬件所需要支持的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的操作。

【转】BCSphere入门教程01:Immediate Alert--不错的更多相关文章

  1. 【Zigbee技术入门教程-01】Zigbee无线组网技术入门的学习路线

    [Zigbee技术入门教程-01]Zigbee无线组网技术入门的学习路线 广东职业技术学院  欧浩源 一.引言    在物联网技术应用的知识体系中,Zigbee无线组网技术是非常重要的一环,也是大家感 ...

  2. ExtJS入门教程01,Window如此简单,你怎能不会?

    这是一系列ExtJS教程,今天的是第一篇,主要介绍ExtJS中Window的基本用法.希望大家能够支持! 来吧,创建一个漂亮的弹出窗 var win = Ext.create("Ext.Wi ...

  3. 【CC2530入门教程-01】IAR集成开发环境的建立与项目开发流程

    [引言] 本系列教程就有关CC2530单片机应用入门基础的实训案例进行分析,主要包括以下6部分的内容:1.CC2530单片机开发入门.2.通用I/O端口的输入和输出.3.外部中断初步应用.4.定时/计 ...

  4. 【CC2530入门教程-01】CC2530微控制器开发入门基础

    [引言] 本系列教程就有关CC2530单片机应用入门基础的实训案例进行分析,主要包括以下6部分的内容:[1]CC2530微控制器开发入门基础.[2]通用I/O端口的输入和输出.[3]外部中断初步应用. ...

  5. 大爽Python入门教程 0-1 安装python

    大爽Python入门公开课教案 点击查看教程总目录 一 如何找到下载地址并下载 下面展示找到下载地址的方法步骤 嫌步骤太慢可直接跳到第4步, 查看详细下载地址 使用搜索引擎搜索python 打开搜索结 ...

  6. Angular系列----AngularJS入门教程01:AngularJS模板 (转载)

    是时候给这些网页来点动态特性了——用AngularJS!我们这里为后面要加入的控制器添加了一个测试. 一个应用的代码架构有很多种.对于AngularJS应用,我们鼓励使用模型-视图-控制器(MVC)模 ...

  7. 一步步Cobol 400 上手自学入门教程01 - 基础概念

    先学习基础概念 1.COBOL字符:包含: User-defined words 用户定义字符 ŸSystem-names ŸReserved words 关键字 2.用户定义字符User-defin ...

  8. javascript入门教程01

    1.javascript中变量的声明和赋值的三种方式 (1)先声明后赋值 var width; width=5; (2)同时声明和赋值变量 var width=5; var x,y,z=10; (3) ...

  9. MFC入门教程01 Windows编程基础

随机推荐

  1. Oracle start with.connect by prior子句实现递归查询

    Oracle中的select语句可以用start with...connect by prior子句实现递归查询,connect by 是结构化查询中用到的,其基本语法是: select ... fr ...

  2. OC 知识点回顾

    /* 字符串: NSString  不可变字符串  字符串对象的内容不能修改,字符串的指针可以改变 NSMutableString 可变字符串   可以修改字符串对象的内容,继承自NSString , ...

  3. UIImageView的图片拉伸

    iOS 8:UIView Stretching设置 使用小图片当变长输入框或类似QQ聊天文字背景效果时,需要拉伸图片.UIImage提供了三个可完成此任务的方法: resizableImageWith ...

  4. Mysql JDBC 连接串参数说明

    MySQL的 JDBC URL 格式 for  Connector/J 如下例: jdbc:mysql://[host:port],[host:port].../[database][?参数名1][= ...

  5. IOS 学习笔记 2015-03-20 OC-集合-数组

    [NSArray] 一 定义 1 不可变数组 2 oc中数组的元素可以是任何对象 3 数字中装有元素的地址 二 初始化 NSArray *变量 = [[NSArry alloc] initWithOb ...

  6. Make Ubuntu 14.04 Fullscreen and virtualbox

    sudo apt-get remove libcheese-gtk23 sudo apt-get install xserver-xorg-core sudo apt-get install virt ...

  7. IE6 png 透明 (三种解决方法)

    FF和IE7已经直接支持透明的png图了,下面这个主要是解决IE6下透明PNG图片有灰底的 ====================================================== ...

  8. jquery 之效果

    // jquery 之效果 .css()既可以获取值,如 .css('fontSize'), 又可以设置内置属性,既可用驼峰式,也可以用连字符版,如 .css('background-color', ...

  9. 使用JS实现鼠标滚轮事件

    网站需要实现鼠标滚轮滚一下,页面向下滑向下一个锚点,由于前面有个一样式必须用jQuery1.3.2,而好多滚轮事件都使用了更高版本的jQuery,于是就从网上找了找 <script type=& ...

  10. 清理SQL多余登录信息

    服务器列表.登陆帐户.密码等信息都记录在 %AppData%\Microsoft\Microsoft SQL Server\100\Tools\Shell\SqlStudio.bin (2008)%A ...