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 设备的行为,从而实现更复杂的蓝牙通信功能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/71597.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机毕业设计Python+DeepSeek-R1大模型医疗问答系统 知识图谱健康膳食推荐系统 食谱推荐系统 医疗大数据(源码+LW文档+PPT+讲解)

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

数字体验推荐TOP8提升用户参与

数字内容体验推荐核心优势 在数字化竞争日益激烈的市场环境中&#xff0c;数字内容体验的差异化优势已成为企业突围的关键。通过智能算法驱动的个性化推荐系统&#xff0c;能够精准捕捉用户行为轨迹与兴趣偏好&#xff0c;实现内容与受众的动态匹配。这种技术不仅显著提升页面…

【每日学点HarmonyOS Next知识】动图循环播放、监听tab切换、富文本上下滚动、tab默认居中、a标签唤起拨号

1、image加载网络动图播放一遍后不再播放,有什么方法可以 设置循环播放 目前ArkUI不支持gif图片设置轮播次数&#xff0c;可通过三方库ohos-gif-drawable设置轮播次数&#xff0c;在播放一次结束后的回调方法getLoopFinish()中更新播放次数&#xff0c;达到指定次数后设置播放…

redis数据迁移教程(使用RedisShake实现不停机迁移十分便捷)

1.我的场景 需要把本地的redis数据上传到阿里云服务器上面,服务器上redis并没有开aof持久化,但是将rdb文件上传至服务器后每次重启redis,rdb文件会被覆盖导致无法同同步数据,最终决定使用RedisShake 2.RedisShake介绍 什么是 RedisShake​ RedisShake 是一个用于处理和迁移…

C语言_数据结构总结4:不带头结点的单链表

纯C语言代码&#xff0c;不涉及C 0. 结点结构 typedef int ElemType; typedef struct LNode { ElemType data; //数据域 struct LNode* next; //指针域 }LNode, * LinkList; 1. 初始化 不带头结点的初始化&#xff0c;即只需将头指针初始化为NULL即可 void Init…

78.StringBuilder简单示例 C#例子 WPF例子

利用 StringBuilder 提升字符串操作性能 在 C# 中&#xff0c;字符串是不可变的&#xff0c;这意味着每次修改字符串时都会创建一个新的对象。这种特性虽然保证了安全性&#xff0c;但在频繁修改字符串的场景中会导致性能问题。StringBuilder 正是为解决这一问题而设计的。 什…

【数据集】社区天气资讯网络CoWIN-香港小时尺度气象数据(含MATLAB处理代码)

社区天气资讯网络CoWIN-香港小时尺度气象数据 数据概述气象变量说明数据提取(MATLAB全代码)输出WRF所需站点气温数据参考数据概述 官网-Community Weather Information Network (CoWIN) data policy CoWIN 提供 2010 - 2024 年 的数据下载,每年数据均可单独下载。下载数据…

【JAVA架构师成长之路】【Redis】第14集:Redis缓存穿透原理、规避、解决方案

30分钟自学教程&#xff1a;Redis缓存穿透原理与解决方案 目标 理解缓存穿透的成因及危害。掌握布隆过滤器、空值缓存等核心防御技术。能够通过代码实现请求拦截与缓存保护。学会限流降级、异步加载等应急方案。 教程内容 0~2分钟&#xff1a;缓存穿透的定义与核心原因 定义…

尚硅谷爬虫note15

一、当当网 1. 保存数据 数据交给pipelines保存 items中的类名&#xff1a; DemoNddwItem class DemoNddwItem(scrapy.Item): 变量名 类名&#xff08;&#xff09; book DemoNddwItem(src src, name name, price price)导入&#xff1a; from 项目名.items import 类…

LVGL直接解码png图片的方法

通过把png文件解码为.C文件&#xff0c;再放到工程中的供使用&#xff0c;这种方式随时速度快&#xff08;应为已经解码&#xff0c;代码中只要直接加载图片数据显示出来即可&#xff09;&#xff0c;但是不够灵活&#xff0c;适用于哪些简单又不经常需要更换UI的场景下使用。如…

【计算机网络】Socket

Socket 是网络通信的核心技术之一&#xff0c;充当应用程序与网络协议栈之间的接口。 1. Socket 定义 Socket&#xff08;套接字&#xff09;是操作系统提供的 网络通信抽象层&#xff0c;允许应用程序通过标准接口&#xff08;如 TCP/IP 或 UDP&#xff09;进行数据传输。它…

Apache XTable:在数据湖仓一体中推进数据互作性

Apache XTable 通过以多种开放表格式提供对数据的访问&#xff0c;在增强互作性方面迈出了一大步。移动数据很困难&#xff0c;在过去&#xff0c;这意味着在为数据湖仓一体选择开放表格式时&#xff0c;您被锁定在该选择中。一个令人兴奋的项目当在数据堆栈的这一层引入互作性…

anolis8.9-k8s1.32-node-二进制部署

一、系统 # cat /etc/anolis-release Anolis OS release 8.9 # uname -r 5.10.134-18.an8.x86_64 二、从master上拷贝dockers及cri-docker相关文件 # groupadd docker # mkdir /etc/docker# scp -P 4033 root192.168.7.201:/etc/systemd/system/containerd.service /etc/s…

《AJAX:前端异步交互的魔法指南》

什么是AJAX AJAX&#xff08;Asynchronous JavaScript and XML&#xff0c;异步 JavaScript 和 XML&#xff09; 是一种用于创建异步网页应用的技术&#xff0c;允许网页在不重新加载整个页面的情况下&#xff0c;与服务器交换数据并局部更新页面内容。尽管名称中包含 XML&…

Python 性能优化:从入门到精通的实用指南

Langchain系列文章目录 01-玩转LangChain&#xff1a;从模型调用到Prompt模板与输出解析的完整指南 02-玩转 LangChain Memory 模块&#xff1a;四种记忆类型详解及应用场景全覆盖 03-全面掌握 LangChain&#xff1a;从核心链条构建到动态任务分配的实战指南 04-玩转 LangChai…

利用 requestrepo 工具验证 XML外部实体注入漏洞

1. 前言 在数字化浪潮席卷的当下&#xff0c;网络安全的重要性愈发凸显。应用程序在便捷生活与工作的同时&#xff0c;也可能暗藏安全风险。XXE&#xff08;XML外部实体&#xff09;漏洞作为其中的典型代表&#xff0c;攻击者一旦利用它&#xff0c;便能窃取敏感信息、掌控服务…

FreeRTOS第17篇:FreeRTOS链表实现细节05_MiniListItem_t:FreeRTOS内存优化

文/指尖动听知识库-星愿 文章为付费内容,商业行为,禁止私自转载及抄袭,违者必究!!! 文章专栏:深入FreeRTOS内核:从原理到实战的嵌入式开发指南 1 为什么需要迷你列表项? 在嵌入式系统中,内存资源极其宝贵。FreeRTOS为满足不同场景需求,设计了标准列表项(ListItem_…

Spring 无法解决循环依赖的 5 种场景

一、构造器注入引发的循环依赖 1. 问题复现 Component public class ServiceA {private final ServiceB serviceB;Autowiredpublic ServiceA(ServiceB serviceB) { // 构造器注入this.serviceB serviceB;} }Component public class ServiceB {private final ServiceA servic…

Core Vision Kit(基础视觉服务)

文章目录 一、Core Vision Kit简介场景介绍约束与限制二、通用文字识别三、人脸检测一、Core Vision Kit简介 Core Vision Kit(基础视觉服务)是机器视觉相关的基础能力,例如通用文字识别(即OCR,Optical Character Recognition,也称为光学字符识别)、人脸检测、人脸比对…

第TR3周:Pytorch复现Transformer

&#x1f368; 本文为&#x1f517;365天深度学习训练营中的学习记录博客 &#x1f356; 原作者&#xff1a;K同学啊 Transformer通过自注意力机制&#xff0c;改变了序列建模的方式&#xff0c;成为AI领域的基础架构 编码器&#xff1a;理解输入&#xff0c;提取上下文特征…