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)
  • UUID:?00002902-0000-1000-8000-00805f9b34fb

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

  • :

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

    • 0x0001: 啟用通知。

    • 0x0002: 啟用指示。

(2)?Characteristic User Description Descriptor
  • UUID:?00002901-0000-1000-8000-00805f9b34fb

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

(3)?Characteristic Presentation Format Descriptor
  • UUID:?00002904-0000-1000-8000-00805f9b34fb

  • 作用: 描述特征值的格式(例如數據類型、單位、精度等)。

(4)?Characteristic Aggregate Format Descriptor
  • UUID:?00002905-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.pswp.cn/web/71597.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/71597.shtml
英文地址,請注明出處:http://en.pswp.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;提取上下文特征…