服务(Service)是一系列特征(Characteristic)。例如,您可能拥有名为“心率监测器”的服务,其中包括“心率测量”等特征。
特征(Characteristic 包含一个值(value) 和 0 至多个描述特征值的描述符(descriptor)
描述符(descriptor)可指定人类可读的描述、特征值的可接受范围或特定于特征值的度量单位。
服务和特征的都由UUID标识。
https://github.com/android/connectivity-samples/blob/main/BluetoothLeGatt/Application/src/main/java/com/example/android/bluetoothlegatt/BluetoothLeService.java
要连接到远程外围设备(提供蓝牙服务的设备),请创建 BluetoothGattCallback 并调用 BluetoothDevice#connectGatt 以获取此类的实例。 可以使用蓝牙设备发现或 BLE 扫描过程发现支持 GATT 的设备。
bluetoothGatt = device.connectGatt(this, false, gattCallback);
connectGatt 将连接到由 BLE 设备托管的 GATT 服务器,并返回 BluetoothGatt 实例,然后您可使用该实例执行 GATT 客户端操作。调用方(Android 应用)是 GATT 客户端。BluetoothGattCallback 用于向客户端传递结果(例如连接状态),以及任何进一步的 GATT 客户端操作。
BluetoothGattCallback可以override几个方法:
1)onConnectionStateChange 连接接状态改变 (连接还是断开了)
2) onServicesDiscovered 在远程设备上发现了Gatt服务
3) onCharacteristicRead 特征值已经读取 (报告 一个 特征读操作的结果)
4) onCharacteristicChanged 特征值 改变了
5) onCharacteristicWrite 特征已写 (指出 特征写操作的结果), 是对 writeCharacteristic(BluetoothGattCharacteristic, byte[], int)操作 的回应。 这时候,可以 characteristic.getValue()来获取远程设备报告 他写入的值,是否与你 调用 writeCharacteristic时写入的值,是否一致
6) onMtuChanged MTU改变了
7) onDescriptorRead 报告 描述符 读操作的结果
8) onDescriptorWrite 指出 描述符 写操作的结果, 是对 writeDescriptor的响应. 写描述符,主要是对特征的功能进行配置,比如特征值改变后,要不要主动通知 客户端(中心设备)
9) onReadRemoteRssi 报告远程设备的信号强度, 是对 readRemoteRssi 的响应
10)onServiceChanged 需要重新同步远程设备
顺序:
onConnectionStateChange 已连接 请求修改MTU
onMtuChanged MTU已修改 请求发现远程设备上的服务
onServicesDiscovered 服务已经发现 (1)枚举服务和其中的特征。 或者 直接获取特定UUID的特征
(2)对特征进行相关设置,比如是否需要通知,写类型(WRITE_TYPE_NO_RESPONSE是否需要写响应)
(3) 读写特征
onCharacteristicRead 读数据已经获得 如果上一步,发出 读操作,当特征值读到时,会出发此回调。
操作:
读—-
如果客户端(中心设备) 要读服务端(外围设备)的 特征的值,直接调用
readCharacteristic, 然后在 onCharacteristicRead 获取读的的值
写—–
如果客户端(中心设备) 要往 服务端的某个特征写,并且想知道回应值,
先打开通知 setCharacteristicNotification, 设置写类型 setWriteType, 设置值 setValue, 最后 writeCharacteristic
写完之后,在 onCharacteristicChanged 获取响应数据
服务端,外围设备开启 GattServer
openGattServer(Context context, BluetoothGattServerCallback callback)
onConnectionStateChange
onCharacteristicReadRequest
onCharacteristicWriteRequest
onDescriptorReadRequest
onDescriptorWriteRequest
onMtuChanged
onNotificationSent
onServiceAdded