一、概念说明
BLE(Bluetooth Low Energy): 即蓝牙低功耗,它是一种技术,从蓝牙4.0开始支持。蓝牙低功耗芯片有两种模式:单模和双模。
- 单模:只能执行低功耗协议栈,也就是只支持ble。
- 双模:支持传统蓝牙以及ble的使用。
优点:传输速度更快,覆盖范围更广,安全性更高,延迟更短,耗电低等优点。
缺点:传输数据量小,BLE蓝牙一包数据最多20个字节,因此在Android系统下最好不要使用BLE蓝牙传输大量的数据。
二、功能演进
蓝牙在Android发展过程如下:
Android4.3开始,开始支持BLE功能,但只支持Central Mode(中心模式)。
Android5.0开始,开始支持Peripheral Mode(外围模式)。
- Central Mode:Android端作为中心设备,连接其他外围设备,例如:手机为中心设备,小米手环就是外围设备。
一个中心设备可以连接多个外设,一个外设只能被一个中心设备连接。中心设备和外设之间的通信是双向的。可以看到这是一个典型的星型结构。其实一个中心设备能够同时连接的设备数量也是有限,一般最多连接 7 个外设。
- Peripheral Mode:Android端作为外围设备,被其他中心设备连接。在Android5.0支持外围模式之后,才实现了两台Android手机通过BLE进行相互通信。
三、相关概念
1、概念说明
ATT(Attribute Protocol):ATT把数据封装,向外暴露为"属性",提供"属性"的为服务端,获取"属性"的为客户端。ATT是专门为低功耗蓝牙设计的,结构非常简单,数据长度很短,是BLE通信的基础。
GATT(Generic Attribute Profile):它是在ATT的基础上,对ATT进行的进一步逻辑封装,定义数据的交互方式和含义,是发送和接收简短数据片段的规范。当前所有低功耗应用程序的profile都基于GATT。
-
GATT层级:GATT按照层级定义了4个概念:配置文件(profile)、服务(Service)、特征(Characteristic)和描述(Descriptor)。他们的关系是这样的,profile定义了一个实际的应用场景,一个profile包含若干个service,一个service包含若干个characteristic,一个characteristic可以包含若干个descriptor。
Profile:蓝牙功能中一个使用场景,例如心率Profile,包含Heart Rate Service和Device Information Service。
Service:个人理解是Profile拆分到的更细的功能块,包含一个或者多个 Characteristic。每个 Service 有一个 UUID 唯一标识。 UUID 有16 bit 的,或者128 bit 的。16 bit 的 UUID 是官方通过认证的,需要花钱购买,128 bit 是自定义的,这个就可以自己随便设置。Heart Rate Service包含 3 个 Characteristic:Heart Rate Measurement,Body Sensor Location 和 Heart Rate Control Point,并且定义了只有第一个是必须的,它是可选实现的。
Descriptor:用于描述一个characteristic值。例如,一个descriptor可以为一个characteristic的值指定一个在可接受范围内的可读性描述,或者为一个characteristic的值指定一个计量单位。
Characteristic:数据读写的载体,定义了数值和操作,包含一个Characteristic声明、Characteristic属性、值、值的描述(Optional)。通常我们讲的 BLE 通信,其实就是对 Characteristic 的读写或者订阅通知。比如在实际操作过程中,我对某一个Characteristic进行读,就是获取这个Characteristic的value。
UUID:UUID 是全局唯一标识,Service、Characteristic还有 Descriptor都是使用UUID唯一标识的。
蓝牙技术联盟定义基础的UUID:0x0000xxxx-0000-1000-8000-00805F9B34FB
2、代码示例
如下代码可以加深对GATT层级的理解:
@Override
public void onServicesDiscovered(BluetoothGatt gatt, int status) {
if (status == BluetoothGatt.GATT_SUCCESS) {
List<BluetoothGattService> services = mBluetoothGatt.getServices();
for (int i = 0; i < services.size(); i++) {
BluetoothGattService bluetoothGattService = services.get(i);
List<BluetoothGattCharacteristic> characteristics = bluetoothGattService.getCharacteristics();
for (int j = 0; j < characteristics.size(); j++) {
//获取需要的characteristics
}
}
}
}
参考文章
Android BLE开发
Android BLE 蓝牙开发指南(一)入门基础
Android蓝牙BLE的详细讲解