Android中的BLE

BLE是Bluetooth Low Energy的简写,是蓝牙连接传输数据技术的一种,顾名思义,和普通的蓝牙技术相比它的最大优点就是省电,这是如何做到的呢,这就是我们下面会介绍的BLE使用的GATT和ATT协议,既然它的特点是省电,这也就决定了这种技术不适用于传输数据量大、对传输速率和实时性要求高的应用,不过针对像心率监测、设备防丢这样的场景就很适合了。

  • GATT/ATT协议
    Generic Attribute Profile (GATT):这就是BLE使用的协议,它是在ATT的基础上增加了一份清单(Profile),这上面写了很多Service来表示设备支持什么功能
    Attribute Protocol (ATT):,说白了就是属性的读写,也可以理解为有固定的键值的map,那么这个协议都有哪些对我们暴露出的组成部分呢?
    Characteristic: 相当于一个扩展的键值对,包含了128位UUID的键值、属性值和一系列描述,描述又是什么呢
    Descriptor:描述就是对某个属性值的我们可读的解释,通过它我们就能知道当某个属性被设置成对应的值的时候会如何如何,再简单点说就是告诉我们某个属性的特定值代表什么意思,从这里就能知道如何操作属性来实现开发者的功能
    Service:Characteristic集合,可以说它就可以对应一个独立的功能,比如心率监测
    一张图理解这个协议的组成:
    Android中的BLE_第1张图片

  • Android中如何操作
    先看一张流程图:
    Android中的BLE_第2张图片

我们所要做的一般也就是这几种操作:扫描设备,连接/断开设备,向设备发送数据,从设备接收数据,容错处理

首先声明权限:

<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>

获得BluetoothAdapter用于扫描连接设备:

// Initializes Bluetooth adapter.
final BluetoothManager bluetoothManager =
        (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);
mBluetoothAdapter = bluetoothManager.getAdapter();

扫描设备:

mBluetoothAdapter.startLeScan(mLeScanCallback);

停止扫描:

mBluetoothAdapter.stopLeScan(mLeScanCallback);

这里要注意扫描设备对于应用所在的设备来说也是一件极耗性能和电量的操作,所以扫描到设备最好立即停止扫描,即使一段时间扫描不到设备也要停止扫描(设置超时时间),具体代码可以参考提供的demo

连接设备:

mBluetoothGatt = device.connectGatt(this, false, mGattCallback);//这种耗时操作肯定是异步进行的,所以连接成功或失败后会有相应的回调,mGattCallback就是一个回调对象,在其中的回调方法中进行对连接结果的自定义操作

读数据:

mBluetoothGatt.readCharacteristic(characteristic);//mBluetoothGatt为BluetoothGatt对象,提供了读写数据的封装接口
//读数据也是异步进行的操作,最终会在BluetoothGattCallback#onCharacteristicRead中回调

写数据:

characteristic.setValue(pData); 
mBluetoothGatt.writeCharacteristic(characteristic);
//写操作自然也是异步的,成功写入后会回调BluetoothGattCallback#onCharacteristicWrite

鉴于上述操作多数是耗时操作,需要异步进行,所以推荐做法是将设备连接及之后的读写操作和后续的连接状态管理放到Service中,当操作完成拿到回调结果以后就发送广播,将注册者感兴趣的结果发送出去,然后在注册者(一般是Activity)中进行ui等简单逻辑的处理.

另外一点就是新手在读写数据时可能遇到的疑惑,我怎么才能判断要对哪个属性值操作呢。当我们接到BLE相关任务的时候,我们应该还会拿到一份文档,每一条记录代表了属性的UUID,相对应的属性值和说明,这样当我们拿到Charactic对象时就要比较它的uuid是否和你期望操作的属性的uuid相同,这样就可以针对性地完成操作了

参考文档:
http://developer.android.com/intl/es/guide/topics/connectivity/bluetooth-le.html
http://developer.android.com/intl/es/samples/BluetoothLeGatt/index.html

你可能感兴趣的:(android)