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

Android 低功率蓝牙之BluetoothGattCharacteristic详解

BluetoothGattCharacteristic 是 Android 蓝牙低功耗(BLE)开发中的一个核心类,用于表示 GATT(Generic Attribute Profile)服务中的特征值(Characteristic)。特征值是 BLE 设备之间通信的基本数据单元,通常用于读取、写入或通知数据。

1. 基本概念

  • GATT: Generic Attribute Profile,定义了 BLE 设备之间通信的数据结构和协议。

  • Characteristic: 特征值,是 GATT 服务中的一个数据点,包含一个值和一组描述符(Descriptors)。

  • Descriptor: 描述符,用于描述特征值的元数据,例如特征值的格式、权限等。

2. BluetoothGattCharacteristic 的主要属性

  • UUID: 唯一标识符,用于区分不同的特征值。

  • Properties: 特征值的属性,定义了可以对特征值执行的操作(如读、写、通知等)。

  • Value: 特征值的实际数据,通常是一个字节数组。

  • Permissions: 特征值的权限,定义了客户端可以执行的操作(如读、写等)。

3. Properties

特征值的属性决定了客户端可以对该特征值执行的操作。常见的属性包括:

  • PROPERTY_READ: 可读。

  • PROPERTY_WRITE: 可写。

  • PROPERTY_NOTIFY: 可通知(服务器可以在值改变时通知客户端)。

  • PROPERTY_INDICATE: 可指示(类似于通知,但需要客户端确认)。

  • PROPERTY_WRITE_NO_RESPONSE: 可写且不需要响应。

4. Permissions

特征值的权限决定了客户端可以执行的操作。常见的权限包括:

  • PERMISSION_READ: 允许读取。

  • PERMISSION_WRITE: 允许写入。

  • PERMISSION_READ_ENCRYPTED: 允许加密读取。

  • PERMISSION_WRITE_ENCRYPTED: 允许加密写入。

5. 常用方法

  • getValue(): 获取特征值的当前值,返回一个字节数组。

  • setValue(byte[] value): 设置特征值的值。

  • setValue(String value): 设置特征值的值为字符串。

  • getProperties(): 获取特征值的属性。

  • getPermissions(): 获取特征值的权限。

  • getUuid(): 获取特征值的 UUID。

  • getDescriptor(UUID uuid): 获取指定 UUID 的描述符。

  • getDescriptors(): 获取所有描述符。

6. 使用示例

以下是一个简单的示例,展示了如何读取和写入一个特征值:

java

复制

BluetoothGattCharacteristic characteristic = ...; // 获取特征值

// 读取特征值
if ((characteristic.getProperties() & BluetoothGattCharacteristic.PROPERTY_READ) > 0) {
    boolean success = mBluetoothGatt.readCharacteristic(characteristic);
    if (success) {
        // 读取成功,可以在 onCharacteristicRead 回调中获取值
    }
}

// 写入特征值
if ((characteristic.getProperties() & BluetoothGattCharacteristic.PROPERTY_WRITE) > 0) {
    characteristic.setValue("Hello, BLE!");
    boolean success = mBluetoothGatt.writeCharacteristic(characteristic);
    if (success) {
        // 写入成功
    }
}

// 启用通知
if ((characteristic.getProperties() & BluetoothGattCharacteristic.PROPERTY_NOTIFY) > 0) {
    mBluetoothGatt.setCharacteristicNotification(characteristic, true);
    BluetoothGattDescriptor descriptor = characteristic.getDescriptor(UUID.fromString("00002902-0000-1000-8000-00805f9b34fb"));
    descriptor.setValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE);
    mBluetoothGatt.writeDescriptor(descriptor);
}

7. 回调处理

在 BluetoothGattCallback 中,你可以处理特征值的读取、写入和通知事件:

java

复制

@Override
public void onCharacteristicRead(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) {
    if (status == BluetoothGatt.GATT_SUCCESS) {
        byte[] value = characteristic.getValue();
        // 处理读取到的值
    }
}

@Override
public void onCharacteristicWrite(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) {
    if (status == BluetoothGatt.GATT_SUCCESS) {
        // 写入成功
    }
}

@Override
public void onCharacteristicChanged(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic) {
    byte[] value = characteristic.getValue();
    // 处理通知的值
}

8. 总结

BluetoothGattCharacteristic 是 Android BLE 开发中的关键类,用于表示和操作 GATT 服务中的特征值。通过它,你可以读取、写入和监听特征值的变化,从而实现与 BLE 设备的通信。理解其特征值属性、权限以及如何使用它们是开发 BLE 应用的基础。

相关文章:

  • 极狐GitLab 17.9 正式发布,40+ DevSecOps 重点功能解读【一】
  • “深入浅出”系列之Linux篇:(12)C++网络编程
  • nvm 让 Node.js 版本切换更灵活
  • 记录一些面试遇到的问题
  • Linux系统之配置HAProxy负载均衡服务器
  • powermock,mock使用笔记
  • 重生之我在 CSDN 学习 KMP 算法
  • Linux——Docker容器内MySQL密码忘记了如何查看
  • 信息管理之信息的萃取方法--使用渐进归纳法逐步提取高可见性笔记
  • os-copilot安装和使用体验测评
  • PHP 矩形面积和周长的程序(Program for Area And Perimeter Of Rectangle)
  • 前端网络安全面试题及答案
  • MATLAB实现遗传算法优化风电_光伏_光热_储热优化
  • Mysql创建库、表练习
  • RoboDexVLM:基于视觉-语言模型的任务规划和运动控制,实现灵巧机器人操作
  • 中原银行:从“小机+传统数据库”升级为“OceanBase+通用服务器”,30 +系统成功上线|OceanBase DB大咖说(十五)
  • pypi 配置国内镜像
  • IDEA Generate POJOs.groovy 踩坑小计 | 生成实体 |groovy报错
  • 数据库安装
  • 测试理论快速入门
  • 广州医药集团有限公司原党委书记、董事长李楚源被“双开”
  • 本周看啥|《歌手》今晚全开麦直播,谁能斩获第一名?
  • 侵害孩子者,必严惩不贷!3名性侵害未成年人罪犯被执行死刑
  • 租车订单时隔7年从花呗免密扣费?“GoFun出行”引质疑
  • 坚持吃素,是不是就不会得高血脂了?
  • 盛和资源海外找稀土矿提速:拟超7亿元收购匹克,加快推动坦桑尼亚项目