原文网址: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. ArcGis for WPF(1)

    这篇文章主要是讲窗体中怎么加载一张在线地图. 第一步:首先引用ESRI.ArcGIS.Client.dll类库. 第二步:在XAML中添加如下代码: <Window x:Class=" ...

  2. ReactNative-----环境搭建(android)

    1.参考文档 http://reactnative.cn/docs/0.26/getting-started.html http://reactnative.cn/docs/0.26/running- ...

  3. Java文件操作 读写操作

    一.Java读取文件 案例1:读取D盘的1.txt文件 编码: File file = new File("D:/1.txt"); FileReader fr = new File ...

  4. Glibc和GCC,ARM-LINUX-GCC的关系

    看到有些贴子/blog上提到「Glibc编译器」,这是个错误的用语.Glibc不是编译器,Glibc不是编译器,Glibc不是编译器.重要的事情说三遍.GCC才是编译器.

  5. e+开发中的各种问题

    1.数据交换后走的查询公式还是controller所配置的公式

  6. 服务器卡死,重启报错: INFO: task blocked for more than 120 seconds

    问题:服务器负载很高,但是CPU利用率不高.服务器经常夯住,网站打不开,SSH连接非常不稳定,输入命令夯住. 重启服务器报错: INFO: task blocked for more than 120 ...

  7. ellang 中进程异步通信中的信箱与保序

    erlang 进程通讯中 执行到 receive 语句时 如果信箱没有消息可以匹配时会暂停等待消息. go() -> register(echo, spawn(test_pid,loop,[]) ...

  8. u-boot和linux的机器码

    先看u-boot的机器码和linux的机器码是在什么地方决定的. 1. u-boot的机器码是在u-boot的board/fs2410/fs2410.c文件里决定的:     /* arch numb ...

  9. YII2数据库操作出现类似Database Exception – yii\db\Exception SQLSTATE

    yii2安装后,连接数据库,必须要安装pdo_mysql扩展

  10. curl采集 根据关键词 获取雅虎竞价排名

    之前写过curl批处理采集数据,这里贴上完整版本,代码很简单,废话不说,上代码,新手欢迎指教!!! 代码只写到 获取到链接了,至于排名 后边数组的键不就是排名喽... <?php /** * B ...