Android BLE 基础概念解析
核心角色:Central 与 Peripheral
BLE 通信采用不对称的客户端-服务器模型:
-
Central(中心设备)
- 角色:主动扫描并连接其他设备(通常是手机、平板等)
- Android 实现:应用程序即 Central
- 类比:商场中主动寻找店铺的顾客
-
Peripheral(外围设备)
- 角色:被动广播自身存在(如传感器、智能设备等)
- Android 实现:自 API 21 起可充当 Peripheral(实现较复杂)
- 类比:播放广告吸引顾客的商场店铺
关键点:大多数场景中,Android 手机是 Central,连接的智能设备是 Peripheral。
客户端-服务器模型
在 BLE 的 GATT 协议中:
手机 (Central) = 客户端 (Client)
智能设备 (Peripheral) = 服务器 (Server)
核心架构:GATT 协议
连接建立后,所有通信通过 GATT 协议进行,其分层结构如下:
- Profile:标准应用规范(如心率监测),定义必须包含的服务
- Service:独立功能单元(如电池服务),包含相关数据
- Characteristic :
- 基础通信实体
- 包含 Value(实际数据)和 Properties(操作权限)
- 支持 READ/WRITE/NOTIFY/INDICATE 等操作
- Descriptor :
- 特征元数据
- 关键 CCCD 用于启用/禁用 NOTIFY/INDICATE
结构关系:Profile → Service → Characteristic → Value & Descriptor
Android BLE 关键类
| 类名 | 功能 | 关键操作 |
|---|---|---|
| BluetoothAdapter | 代表蓝牙硬件 | 蓝牙开关、设备扫描 |
| BluetoothDevice | 远端设备 | connectGatt() 建立连接 |
| BluetoothGatt | 通信核心 | 服务发现、读写操作 |
| BluetoothGattService | GATT 服务 | getCharacteristic() |
| BluetoothGattCharacteristic | GATT 特征 | 读写 Value |
| BluetoothGattDescriptor | 特征描述符 | 配置通知 |
| BluetoothLeScanner | 设备扫描 | ScanCallback 处理结果 |
典型交互流程
-
权限检查
- 声明 BLUETOOTH 相关权限
- 注意 Android 各版本的权限变化
-
设备扫描
- 获取 BluetoothLeScanner
- 配置 ScanSettings/ScanFilter
- 在 ScanCallback 中处理结果
-
设备连接
- 调用 connectGatt()
- 通过 BluetoothGattCallback 监听状态
-
服务发现
- connected 状态调用 discoverServices()
- 在 onServicesDiscovered 中处理
-
数据通信
- 读/写 Characteristic
- 开启通知: a) 启用本地通知 b) 配置 CCCD 描述符 c) 接收 onCharacteristicChanged
-
断开连接
- 调用 disconnect()
- 执行 close() 释放资源
重要注意事项
- 所有操作均为异步执行
- BluetoothGatt 非线程安全,建议使用操作队列
- 注意标准 UUID 与自定义 UUID 的区别
- 不同 Android 版本对 BLE 的支持存在差异