zoukankan      html  css  js  c++  java
  • 【转】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的操作。

  • 相关阅读:
    python-观察者模式
    python-迭代器模式
    python-策略模式
    python-组合模式
    python-享元模式
    python-代理模式
    虚基类与虚继承
    指针与地址的关系
    大数相加和大数相乘以及打印从1到最大的n位数
    各种排序实现以及稳定性分析
  • 原文地址:https://www.cnblogs.com/wi100sh/p/4334949.html
Copyright © 2011-2022 走看看