【转】BCSphere入门教程01:Immediate Alert--不错

原文网址: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的操作。

时间: 2024-10-04 02:06:30

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

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

[Zigbee技术入门教程-01]Zigbee无线组网技术入门的学习路线 广东职业技术学院  欧浩源 一.引言    在物联网技术应用的知识体系中,Zigbee无线组网技术是非常重要的一环,也是大家感觉比较难以掌握的一个部分.Zigbee无线组网技术之所以让你感有学习难度,不是因为它真的复杂,而是它看起来很复杂,让人望而止步.另一方面则是Zigbee技术在应用层面上将硬件和软件完成融为一个体系,要求开发人员既要有扎实的硬件技术,又要有清晰的软件思维.    目前,尽管有不少关于Zigbee无线组

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

是时候给这些网页来点动态特性了——用AngularJS!我们这里为后面要加入的控制器添加了一个测试. 一个应用的代码架构有很多种.对于AngularJS应用,我们鼓励使用模型-视图-控制器(MVC)模式解耦代码和分离关注点.考虑到这一点,我们用AngularJS来为我们的应用添加一些模型.视图和控制器. 请重置工作目录: git checkout -f step-2 我们的应用现在有了一个包含三部手机的列表. 步骤1和步骤2之间最重要的不同在下面列出.,你可以到GitHub去看完整的差别. 视图

[转载]AngularJS入门教程01:静态模板

为了说明angularJS如何增强了标准HTML,我们先将创建一个静态HTML页面模板,然后把这个静态HTML页面模板转换成能动态显示的AngularJS模板. 在本步骤中,我们往HTML页面中添加两个手机的基本信息,用以下命令将工作目录重置到步骤1. git checkout -f step-1 请编辑app/index.html文件,将下面的代码添加到index.html文件中,然后运行该应用查看效果. app/index.html <ul> <li> <span>

Ionic2入门教程01:搭建mac开发环境

感谢博友分享?? 原文链接:http://blog.csdn.net/xiang_lix/article/details/51887480 这里我也要总结一下方法: 以前都是在window下开发,现在换mac了又得配置开发环境,像我这种非科班出身的最怕环境什么的了,特别浪费时间,不废话了. 第一步:安装 JDK,在mac OS 10.11新系统中,已经不需要配置JDK环境变量了,下载安装好就行了. 链接:http://www.oracle.com/technetwork/java/javase/

一步步AS400-Cobol 上手自学入门教程01 - 基础概念(原创)

先学习基础概念 1.COBOL字符:包含: User-defined words 用户定义字符 ?System-names ?Reserved words 关键字 2.用户定义字符User-defined words:合法的定义: ? A - Z ? a - z ? 0 - 9 ? - (连字符). 3.系统名 System-names Computer-names ?Language-names ?Implementor-names: Environment-name Assignment-n

javascript入门教程01

1.javascript中变量的声明和赋值的三种方式 (1)先声明后赋值 var width; width=5; (2)同时声明和赋值变量 var width=5; var x,y,z=10; (3)不声明直接赋值 width=5; 2.javascript的数据类型 Undefined:变量被声明后,但未被赋值 boolean:true或false string:用单引号或者双引号来声明的字符串 number:数字类型(包括整数和浮点数[即整数和小数]) object:JavaScript中的

MFC入门教程01 Windows编程基础

安卓开发入门与面试题01(潭州安卓开发入门教程)

今天老师讲到安卓的就业市场,说的我都想去面试了,想看看市面上咱们到底可以拿到什么样的工资,做什么样的行业.说来惭愧,我还只是一个安卓开发的新手,今天就和大家一样,开始我的安卓开发梦想启航.这个是潭州安卓开发入门教程里面最基础的. 从来以为学习安卓的都是为了兴趣,原来还可以为了就业,可是好难,就像咱们Android开发入门视频教程QQ群:175229978里面很多人一样,连面试题是哪一些都不懂,不过今天我分享到群里了,也希望在这里可以帮助更多安卓开发入门的小伙伴们. 1.什么是Activity?

【转载】GBDT(MART) 迭代决策树入门教程 | 简介

      转载地址:http://blog.csdn.net/w28971023/article/details/8240756        GBDT(Gradient Boosting Decision Tree) 又叫 MART(Multiple Additive Regression Tree),是一种迭代的决策树算法,该算法由多棵决策树组成,所有树的结论累加起来做最终答案.它在被提出之初就和SVM一起被认为是泛化能力(generalization)较强的算法.近些年更因为被用于搜索排