Android 低功率蓝牙之BluetoothGattCharacteristic详解

embedded/2025/3/11 1:03:57/

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 应用的基础。


http://www.ppmy.cn/embedded/171624.html

相关文章

我的第一个CVE漏洞挖掘之旅

目录: 为什么选择 Moodle? 我该从哪里开始? 寻找漏洞 源点(Sources)和同步点(Syncs) 更大的影响 本文介绍我是如何在一个开源项目中找到我的第一个 CVE 漏洞(CVE-2025–26529&#…

【动手实验】TCP orphan socket 的产生与消亡

之前在实验中提到了 tcp_max_orphans 和 tcp_orphan_retries 两个参数,我们使用 ss -s 命令查看当前系统中的 socket 状态也有 orphan 状态的 socket,本篇文章我们就来分析下到底什么情况下的 socket 才会被视为 orphan socket。 # ubuntu node1 in ~ …

Calico-BGP FullMesh模式与RR模式 Day04

1. BGP协议简单介绍 BGP是什么?BGP是如何工作的? - 华为 Configure BGP peering | Calico Documentation 1.1 什么是BGP 边界网关协议(BGP)是一种用于在网络中的路由器之间交换路由信息的标准协议。每台运行 BGP 的路由器都有一…

彻底解决 k8s xxx 命名空间卡在 ​Terminating 的问题

前言 在 Kubernetes 集群管理中,命名空间(Namespace)卡在 Terminating 状态是一个常见但棘手的问题。这种状态通常由资源残留、Finalizers 未完成清理或控制器异常导致。本文将结合实践案例和底层原理,提供一套完整的解决方案&am…

从技术角度看大语言模型进化技术路线与落地应用详解:未来的最佳实践方向是什么?

文章大纲 **一、模型架构创新:从Transformer到下一代架构****二、训练与优化技术:从暴力Scaling到精细调控****三、数据与知识工程:从粗放喂养到智能增强****四、应用层进化:从通用能力到垂直场景突破****五、伦理与可持续性技术**未来技术路线图参考文献**一、大模型架构创…

Android paging初识

嗯,用户之前已经问过关于Android Paging库的问题,现在又提到了同样的困惑,可能说明他们在实际学习中遇到了困难,或者在项目应用过程中遇到了障碍。用户可能已经尝试过学习Paging库,但感觉复杂,导致犹豫是否…

软件测试的基础入门(二)

文章目录 一、软件(开发)的生命周期什么是生命周期软件(开发)的生命周期需求分析计划设计编码测试运行维护 二、常见的开发模型瀑布模型流程优点缺点适应的场景 螺旋模型流程优点缺点适应的场景 增量模型和迭代模型流程适应的场景…

clickhouse的优缺点

《ClickHouse的优缺点及成功案例分析》 当我们谈论数据库技术时,ClickHouse无疑是一个引人注目的名字。它是一种专为在线分析处理(OLAP)设计的列式数据库管理系统(DBMS),由俄罗斯的Yandex公司开发。随着大…