当前位置: 首页 > news >正文

Android 低功率蓝牙之BluetoothGattDescriptor详解

BluetoothGattDescriptor 详解

BluetoothGattDescriptor 是 Android 中用于表示蓝牙低功耗(BLE)设备中 GATT(Generic Attribute Profile)描述符 的类。描述符是 GATT 架构中的一种属性,用于提供关于 特征值(Characteristic) 的附加信息或配置选项。它是 BLE 通信中非常重要的一部分。


1. GATT 架构中的描述符

在 BLE 的 GATT 架构中,数据是以分层结构组织的:

  • 服务(Service):代表设备提供的功能(例如电池服务、心率服务等)。

  • 特征(Characteristic):服务中的具体数据点(例如电池电量、心率值等)。

  • 描述符(Descriptor):为特征提供额外的信息或配置选项。

描述符通常用于:

  • 配置特征的行为(例如启用通知或指示)。

  • 提供特征的元数据(例如描述、格式等)。


2. 常见的描述符

以下是 BLE 中一些常见的标准描述符:

(1) Client Characteristic Configuration Descriptor (CCCD)
  • UUID00002902-0000-1000-8000-00805f9b34fb

  • 作用: 用于启用或禁用特征的通知(Notification)或指示(Indication)。

  • :

    • 0x0000: 禁用通知和指示。

    • 0x0001: 启用通知。

    • 0x0002: 启用指示。

(2) Characteristic User Description Descriptor
  • UUID00002901-0000-1000-8000-00805f9b34fb

  • 作用: 提供人类可读的特征描述(例如字符串 "Battery Level")。

(3) Characteristic Presentation Format Descriptor
  • UUID00002904-0000-1000-8000-00805f9b34fb

  • 作用: 描述特征值的格式(例如数据类型、单位、精度等)。

(4) Characteristic Aggregate Format Descriptor
  • UUID00002905-0000-1000-8000-00805f9b34fb

  • 作用: 用于描述多个特征值的组合格式。


3. BluetoothGattDescriptor 类详解

BluetoothGattDescriptor 是 Android 中用于操作描述符的类,以下是其核心方法和属性:

(1) 属性
  • UUID: 描述符的唯一标识符。

    java

    复制

    UUID descriptorUuid = descriptor.getUuid();
  • Permissions: 描述符的权限(例如读、写权限)。

    java

    复制

    int permissions = descriptor.getPermissions();
  • Value: 描述符的值(字节数组)。

    java

    复制

    byte[] value = descriptor.getValue();
(2) 常用方法
  • 读取描述符的值:
    使用 BluetoothGatt.readDescriptor(descriptor) 方法读取描述符的值。

    java

    复制

    boolean success = gatt.readDescriptor(descriptor);

    读取结果会通过 BluetoothGattCallback.onDescriptorRead() 回调返回。

  • 写入描述符的值:
    使用 BluetoothGatt.writeDescriptor(descriptor) 方法写入描述符的值。

    java

    复制

    descriptor.setValue(newValue); // 设置值
    boolean success = gatt.writeDescriptor(descriptor);

    写入结果会通过 BluetoothGattCallback.onDescriptorWrite() 回调返回。

  • 启用通知或指示:
    通过写入 CCCD 描述符的值来启用通知或指示。

    java

    复制

    BluetoothGattDescriptor cccd = characteristic.getDescriptor(UUID.fromString("00002902-0000-1000-8000-00805f9b34fb"));
    cccd.setValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE); // 启用通知
    gatt.writeDescriptor(cccd);

4. 使用示例

以下是一个典型的 BLE 通信流程,涉及描述符的操作:

(1) 启用通知

java

复制

// 获取特征
BluetoothGattCharacteristic characteristic = gatt.getService(serviceUuid).getCharacteristic(characteristicUuid);

// 获取 CCCD 描述符
BluetoothGattDescriptor cccd = characteristic.getDescriptor(UUID.fromString("00002902-0000-1000-8000-00805f9b34fb"));

// 启用通知
cccd.setValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE);
gatt.writeDescriptor(cccd);

// 设置特征的通知监听
gatt.setCharacteristicNotification(characteristic, true);
(2) 读取描述符的值

java

复制

// 读取描述符
BluetoothGattDescriptor descriptor = characteristic.getDescriptor(descriptorUuid);
gatt.readDescriptor(descriptor);

// 在回调中处理读取结果
@Override
public void onDescriptorRead(BluetoothGatt gatt, BluetoothGattDescriptor descriptor, int status) {
    if (status == BluetoothGatt.GATT_SUCCESS) {
        byte[] value = descriptor.getValue();
        // 处理描述符的值
    }
}
(3) 写入描述符的值

java

复制

// 写入描述符
BluetoothGattDescriptor descriptor = characteristic.getDescriptor(descriptorUuid);
descriptor.setValue(newValue); // 设置新值
gatt.writeDescriptor(descriptor);

// 在回调中处理写入结果
@Override
public void onDescriptorWrite(BluetoothGatt gatt, BluetoothGattDescriptor descriptor, int status) {
    if (status == BluetoothGatt.GATT_SUCCESS) {
        // 写入成功
    }
}

5. 注意事项

  • 权限: 确保在 AndroidManifest.xml 中声明了蓝牙权限:

    xml

    复制

    <uses-permission android:name="android.permission.BLUETOOTH"/>
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> <!-- Android 12 及以上需要 -->

    运行 HTML

  • 异步操作: BLE 操作是异步的,所有操作结果通过 BluetoothGattCallback 回调返回。

  • 线程安全: 确保 BLE 操作在主线程中执行。


通过 BluetoothGattDescriptor,开发者可以灵活地配置和控制 BLE 设备的行为,从而实现更复杂的蓝牙通信功能。

相关文章:

  • 装饰器模式--RequestWrapper、请求流request无法被重复读取
  • 基于GeoTools的GIS专题图自适应边界及高宽等比例生成实践
  • 【JavaSE-8】面向对象
  • 运动控制卡--固高实用
  • 软件信息安全性测试流程有哪些?专业软件测评服务机构分享
  • MySQL自定义序列数的实现
  • 【AIGC系列】6:HunyuanVideo视频生成模型部署和代码分析
  • 【Framework系列之Client】UIManager和UIPanel模块介绍
  • Go加spy++隐藏窗口
  • 梦三国2游戏下载
  • io学习------>进程
  • LeetCode 解题思路 11(Hot 100)
  • windows部署spleeter 版本2.4.0:分离音频的人声和背景音乐
  • Reverse DevTools | 逆向调试工具 使用手册
  • 机器学习深度学习基本概念:logistic regression和softmax
  • VScode 中文符号出现黄色方框的解决方法
  • 通用外设驱动模型(四步法)及配置GPIO步骤
  • 云原生系列之本地k8s环境搭建
  • 【pyqt】(十二)文本框
  • 神经网络中梯度计算求和公式求导问题
  • 上海重大工程一季度开局良好,城乡融合类年内计划新开工一项
  • 韩国第二大轮胎制造商因火灾停产,或影响700万条轮胎销售
  • 上海国际电影电视节 | 奔赴电影之城,开启光影新程
  • 上海乐高乐园客流预测来了:工作日0.8万人次/日,周末节假日2万人次/日
  • 家国万里·时光故事会|从徐光启到徐家汇,一颗甘薯里的家国
  • 住建部:我国超9.4亿人生活在城镇