• Android 蓝牙(Bluetooth)(二)


    Android4.3 规范了BLE的API,但是直到目前的4.4,还有些功能不完善。

    在BLE协议中,有两个角色,周边(Periphery)和中央(Central);周边是数据提供者,中央是数据使用/处理者;在iOS SDK里面,可以把一个iOS设备作为一个周边,也可以作为一个中央;但是在Android SDK里面,直到目前最新的Android4.4.2,Android手机只能作为中央来使用和处理数据;那数据从哪儿来?从BLE设备来,现在的很多可穿戴设备都是用BLE来提供数据的。

    一个中央可以同时连接多个周边,但是一个周边某一时刻只能连接一个中央。

    大概了解了概念后,看看Android BLE SDK的四个关键类(class):

    a) BluetoothGattServer作为周边来提供数据;BluetoothGattServerCallback返回周边的状态。

    b) BluetoothGatt作为中央来使用和处理数据;BluetoothGattCallback返回中央的状态和周边提供的数据。

    BluetoothGatt

                              /*
                             * 通过使用if(gatt==null)来判断gatt是否被创建过,如果创建过就使用gatt.connect();重新建立连接。
                             * 但是在这种情况下测试的结果是重新连接需要花费很长的时间。
                             * 解决办法是通过gatt = device.connectGatt(this, false, gattCallback);建立一个新的连接对象,很明显这样的速度要比上一种方法快很多
                             * 然而,多次创建gatt连接对象的直接结果是创建过6个以上gatt后就会再也连接不上任何设备,原因应该是android中对BLE限制了同时连接的数量为6个
                             * 解决办法是在每一次重新连接时都执行一次gatt.close();关闭上一个连接。
                             * 有人说为什么不在gatt.disconnect();后加一条gatt.close();呢,原因是如果立即执行gatt.close();会导致gattCallback无法收到STATE_DISCONNECTED的状态。
                             * 当然,最好的办法是在gattCallback收到STATE_DISCONNECTED后再执行gatt.close();,这样逻辑上会更清析一些。
                             */

    readCharacteristic writeCharacteristic

    一个服务多个特征

    ===========================================================================================

    连接GATT Server:(此处转载)

    两个设备通过BLE通信,首先需要建立GATT连接。这里我们讲的是Android设备作为client端,连接GATT Server。
    连接GATT Server,你需要调用BluetoothDevice的connectGatt()方法。此函数带三个参数:Context、autoConnect(boolean)和BluetoothGattCallback对象。调用示例:
     
    mBluetoothGatt = device.connectGatt(this, false, mGattCallback);
     
    函数成功,返回BluetoothGatt对象,它是GATT profile的封装。通过这个对象,我们就能进行GATT Client端的相关操作。BluetoothGattCallback用于传递一些连接状态及结果。
     
    BluetoothGatt常规用到的几个操作示例:
     
    connect() :连接远程设备。
    discoverServices() : 搜索连接设备所支持的service。
    disconnect():断开与远程设备的GATT连接。
    close():关闭GATT Client端。
    readCharacteristic(characteristic) :读取指定的characteristic。
    setCharacteristicNotification(characteristic, enabled) :设置当指定characteristic值变化时,发出通知。
    getServices() :获取远程设备所支持的services。
     
    等等。
     
    注:
    1、某些函数调用之间存在先后关系。例如首先需要connect上才能discoverServices。
    2、 一些函数调用是异步的,需要得到的值不会立即返回,而会在BluetoothGattCallback的回调函数中返回。例如 discoverServices与onServicesDiscovered回调,readCharacteristic与onCharacteristicRead回调,setCharacteristicNotification与 onCharacteristicChanged回调等。
                              作者:xubuhang                出处:http://www.cnblogs.com/xubuhang/ 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。 

     
  • 相关阅读:
    20170416
    汇总02
    总结
    在编程的世界中,如何高效地学习理论知识,应用理论知识来解决实际生产中的问题
    周末待整理
    web 性能提升
    es6
    http、https、 json、 ajax
    微信小程序 问题收集
    eslint
  • 原文地址:https://www.cnblogs.com/xubuhang/p/4259014.html
  • Copyright © 2020-2023  润新知