GATT 服務的核心函數bt_gatt_discover的介紹

目錄

概述

1 GATT 基本概念

1.1?GATT 的介紹

1.2?GATT 的角色

?1.3?核心組件

1.4?客戶端操作

2 ?bt_gatt_discover函數的功能和應用

2.1?函數介紹

?2.1 發現類型(Discover Type)

3?典型使用流程

3.1 服務發現示例

3.2 級聯發現模式

?3.3 按UUID過濾發現

?3.4 發現描述符

4 錯誤處理?

4.1 常見錯誤碼

4.2?錯誤處理示例

5 性能優化建議

6 資源管理注意事項

6.1?參數生命周期

6.2?取消發現


概述

本文介紹了藍牙低功耗(BLE)中的GATT協議及其核心功能。GATT定義了BLE設備通過服務和特征交換數據的標準框架,包含服務器和客戶端兩種角色。文章詳細解析了GATT的核心組件(服務、特性、描述符)及其層級結構,并以Zephyr協議棧中的bt_gatt_discover函數為例,說明其參數配置、發現類型和使用流程,包括服務發現、級聯發現、UUID過濾等典型應用場景。最后還列舉了常見錯誤碼及處理方法,為BLE應用的開發提供了實用指導。

1 GATT 基本概念

1.1?GATT 的介紹

GATT (Generic Attribute Profile) 是?Bluetooth Low Energy (BLE)?的核心協議,定義了?數據通信的標準框架,使BLE設備能夠通過?服務(Services)?和?特征(Characteristics)?交換數據。

1.2?GATT 的角色

角色說明典型設備
GATT 服務器(Server)存儲并提供數據(如傳感器數據)心率帶、溫度計
GATT 客戶端(Client)讀取或寫入服務器數據手機、中央設備

?1.3?核心組件

?1)層級結構

GATT Profile
├── Services (服務)
│   ├── Characteristics (特性)
│   │   ├── Value (值)
│   │   ├── Descriptors (描述符)
│   │   │   └── Client Characteristic Configuration (CCC)
│   │   └── Properties (屬性)
│   └── Includes (包含服務)
└── Attributes (屬性)

2)?關鍵組件說明

組件說明示例UUID
服務(Service)功能邏輯集合0x180A (設備信息服務)
特性(Characteristic)服務中的數據項0x2A29 (廠商名稱)
描述符(Descriptor)特性的元數據0x2902 (CCC描述符)
屬性(Attribute)數據庫基本單元由協議棧管理

1.4?客戶端操作

操作函數(Zephyr示例)說明
發現服務bt_gatt_discover()掃描遠程設備的GATT表
讀取特征值bt_gatt_read()讀取數據(如電池電量)
寫入特征值bt_gatt_write()發送命令或配置
啟用通知bt_gatt_subscribe()訂閱實時數據(如心率)

2 ?bt_gatt_discover函數的功能和應用

2.1?函數介紹

bt_gatt_discover?是 Zephyr BLE 協議棧中用于發現遠程設備 GATT 服務的核心函數,下面我將從多個維度進行詳細說明:

1)?函數原型與參數

int bt_gatt_discover(struct bt_conn *conn,struct bt_gatt_discover_params *params
);

2)參數說明:

  • conn:已建立的BLE連接句柄

  • params:發現參數結構體,包含以下關鍵字段:

struct bt_gatt_discover_params {const struct bt_uuid *uuid;      // 目標UUID(可選過濾條件)uint16_t start_handle;           // 起始屬性句柄(通常0x0001)uint16_t end_handle;             // 結束屬性句柄(通常0xFFFF)enum bt_gatt_discover_type type; // 發現類型void (*func)(struct bt_conn *conn,const struct bt_gatt_attr *attr,struct bt_gatt_discover_params *params);
};

?2.1 發現類型(Discover Type)

類型枚舉值說明對應ATT操作
BT_GATT_DISCOVER_PRIMARY發現主服務ATT Read By Group Type Req
BT_GATT_DISCOVER_SECONDARY發現次要服務ATT Read By Group Type Req
BT_GATT_DISCOVER_INCLUDE發現包含的服務ATT Read By Type Req
BT_GATT_DISCOVER_CHARACTERISTIC發現特性ATT Read By Type Req
BT_GATT_DISCOVER_DESCRIPTOR發現描述符ATT Find Information Req
BT_GATT_DISCOVER_STD_CHAR_DESC發現標準特性描述符ATT Read By Type Req

3?典型使用流程

3.1 服務發現示例

static struct bt_gatt_discover_params discover_params;static void discover_cb(struct bt_conn *conn,const struct bt_gatt_attr *attr,struct bt_gatt_discover_params *params)
{if (!attr) {printk("Discovery complete\n");return;}switch (params->type) {case BT_GATT_DISCOVER_PRIMARY: {struct bt_gatt_service_val *svc = attr->user_data;printk("Service found: start_handle=0x%04X, end_handle=0x%04X\n",attr->handle, svc->end_handle);break;}case BT_GATT_DISCOVER_CHARACTERISTIC: {struct bt_gatt_chrc *chrc = attr->user_data;printk("Characteristic: handle=0x%04X, properties=0x%02X\n",chrc->value_handle, chrc->properties);break;}}
}void start_discovery(struct bt_conn *conn)
{discover_params.uuid = NULL;  // 發現所有主服務discover_params.start_handle = 0x0001;discover_params.end_handle = 0xFFFF;discover_params.type = BT_GATT_DISCOVER_PRIMARY;discover_params.func = discover_cb;int err = bt_gatt_discover(conn, &discover_params);if (err) {printk("Discovery failed to start (err %d)\n", err);}
}

3.2 級聯發現模式

static void discover_chars(struct bt_conn *conn, uint16_t start, uint16_t end)
{static struct bt_gatt_discover_params params;params.start_handle = start;params.end_handle = end;params.type = BT_GATT_DISCOVER_CHARACTERISTIC;params.func = discover_cb;bt_gatt_discover(conn, &params);
}static void discover_cb(...)
{if (params->type == BT_GATT_DISCOVER_PRIMARY) {// 發現主服務后繼續發現特性struct bt_gatt_service_val *svc = attr->user_data;discover_chars(conn, attr->handle + 1, svc->end_handle);}
}

?3.3 按UUID過濾發現

static struct bt_uuid_16 find_uuid = BT_UUID_INIT_16(0x180F); // 電池服務void find_battery_service(struct bt_conn *conn)
{discover_params.uuid = &find_uuid.uuid;discover_params.type = BT_GATT_DISCOVER_PRIMARY;bt_gatt_discover(conn, &discover_params);
}

?3.4 發現描述符

void discover_descriptors(struct bt_conn *conn, uint16_t start, uint16_t end)
{discover_params.start_handle = start;discover_params.end_handle = end;discover_params.type = BT_GATT_DISCOVER_DESCRIPTOR;bt_gatt_discover(conn, &discover_params);
}

4 錯誤處理?

4.1 常見錯誤碼

錯誤碼說明
0成功
-ENOTCONN未建立連接
-EINVAL無效參數
-ENOMEM內存不足
-EOPNOTSUPP操作不支持

4.2?錯誤處理示例

int err = bt_gatt_discover(conn, &params);
if (err) {printk("Error %d during discovery\n", err);switch (err) {case -ENOTCONN:// 處理連接問題break;case -EINVAL:// 檢查參數有效性break;}
}

5 性能優化建議

  1. 分階段發現:先發現服務,再根據需要發現特性和描述符

  2. 緩存發現結果:避免重復發現

  3. 合理設置句柄范圍:縮小start_handle/end_handle范圍

  4. 使用UUID過濾:減少不必要的發現操作

6 資源管理注意事項

6.1?參數生命周期

// 錯誤:使用棧變量(函數返回后失效)
void start_temp_discovery(struct bt_conn *conn) {struct bt_gatt_discover_params temp_params = {...};bt_gatt_discover(conn, &temp_params); // 危險!
}// 正確:使用靜態或動態分配
static struct bt_gatt_discover_params persistent_params;

6.2?取消發現

void cancel_discovery(struct bt_conn *conn) {bt_gatt_discover_cancel(conn, &discover_params);
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/82338.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/82338.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/82338.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【更新至2023年】1985-2023年全國及各省就業人數數據(無缺失)

1985-2023年全國及各省就業人數數據(無缺失) 1、時間:1985-2023年 2、來源:Z國統計年鑒、各省年鑒、新中國60年 3、指標:就業人數 4、范圍:全國及31省 5、缺失情況:無缺失 6、指標解釋&am…

0基礎學習Linux之揭開朦朧一面:環境基礎開發工具

目錄 Linux下安裝軟件的方案: 對于操作系統的理解: 操作系統的生態問題: 什么是好的操作系統(os): 重新理解centos VS ubnutu VS kail: 關于yum: 用 yum 安裝軟件(安裝和卸載軟件一定要有r…

YOLO 算法詳解:實時目標檢測的里程碑

在計算機視覺領域,目標檢測一直是一個關鍵且熱門的研究方向,而 YOLO(You Only Look Once)算法憑借其出色的實時性和較高的檢測精度,成為了目標檢測算法中的明星選手。本文將深入探討 YOLO 算法的原理、發展歷程、技術優…

leetcode98.驗證二叉搜索樹:遞歸法中序遍歷的遞增性驗證之道

一、題目深度解析與BST核心性質 題目描述 驗證二叉搜索樹(BST)是算法中的經典問題,要求判斷給定的二叉樹是否滿足BST的定義: 左子樹中所有節點的值嚴格小于根節點的值右子樹中所有節點的值嚴格大于根節點的值左右子樹本身也必須…

MathQ-Verify:數學問題驗證的五步流水線,為大模型推理筑牢數據基石

MathQ-Verify:數學問題驗證的五步流水線,為大模型推理筑牢數據基石 大語言模型在數學推理領域進展顯著,但現有研究多聚焦于生成正確推理路徑和答案,卻忽視了數學問題本身的有效性。MathQ-Verify,通過五階段流水線嚴格…

八股戰神-JVM知識速查

1.JVM組成 JVM由那些部分組成,運行流程是什么? JVM是Java程序的運行環境 組成部分: 類加載器:加載字節碼文件到內存 運行時數據區:包括方法區,堆,棧,程序計數器,本地…

Maven:在原了解基礎上對pom.xml文件進行詳細解讀

一、pom.xml文件 就像項目管理軟件 Make 的 MakeFile、Ant 的 build.xml 一樣,Maven 項目的核心是 pom.xml。POM( Project Object Model,項目對象模型 ) 定義了項目的基本信息,用于描述項目如何構建,聲明項目依賴,等等…

Spring Cloud項目登錄認證從JWT切換到Redis + UUID Token方案

背景介紹 在傳統的Spring Boot項目中,用戶登錄認證常見的方案是使用JWT(JSON Web Token)來實現無狀態的身份驗證。JWT憑借自包含用戶信息、方便前后端分離、性能較好等優勢被廣泛采用。 然而,在實際項目中,JWT也有一…

MongoDB 快速整合 SpringBoot 示例

1.添加依賴<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spr…

Flyweight(享元)設計模式 軟考 享元 和 代理屬于結構型設計模式

1.目的&#xff1a;運用共享技術有效地支持大量細粒度的對象 Flyweight&#xff08;享元&#xff09;設計模式 是一種結構型設計模式&#xff0c;它的核心目的是通過共享對象來減少內存消耗&#xff0c;特別是在需要大量相似對象的場景中。Flyweight 模式通過將對象的共享細節與…

002大模型-提示詞工程,少樣本提示,角色扮演,思維鏈

一、提示詞工程 二、少樣本提示 三、角色扮演 四、思維鏈

華為OD機試真題——傳遞悄悄話(二叉樹最長路徑問題)(2025A卷:200分)Java/python/JavaScript/C/C++/GO最佳實現

2025 A卷 200分 題型 本專欄內全部題目均提供Java、python、JavaScript、C、C++、GO六種語言的最佳實現方式; 并且每種語言均涵蓋詳細的問題分析、解題思路、代碼實現、代碼詳解、3個測試用例以及綜合分析; 本文收錄于專欄:《2025華為OD真題目錄+全流程解析+備考攻略+經驗分…

「讀書報告」Spark實時大數據分析

這本書是清華大學出版社2018年出版的&#xff0c;我是2020年讀的&#xff0c;說真的的&#xff0c;不怎么喜歡這本書&#xff0c;所以作者我都不想提。有的人可能會奇怪&#xff0c;ailx10&#xff0c;你一個搞網絡安全的&#xff0c;怎么會去讀大數據相關的書&#xff0c;哎&a…

2025 河北ICPC( D. 金泰園(二分)-- C.年少的誓約(公式轉化))

文章目錄 2025 河北ICPCD. 金泰園&#xff08;二分&#xff09;C.年少的誓約(公式轉化)總結 2025 河北ICPC 題目鏈接&#xff1a; Attachments - The 9th Hebei Collegiate Programming Contest - Codeforces sdccpc20250522 - Virtual Judge 賽時&#xff1a;5道 D. 金泰…

QT學習一

對于選擇qmake還是cmake&#xff0c;現在寫的暫時先用qmake 1.命名規范和快捷鍵 2.按鈕控件常用API //創建第一個按鈕QPushButton * btn new QPushButton;//讓btn對象 依賴在mywidget窗口中btn->setParent(this);//顯示文本btn->setText("第一個按鈕");//創建…

【Elasticsearch】給所索引創建多個別名

Elasticsearch 是可以給索引創建多個別名的。 為什么可以創建多個別名 1. 靈活性 - 別名可以為索引提供一個更易于理解的名稱&#xff0c;方便用戶根據不同的業務場景或用途來引用同一個索引。例如&#xff0c;一個索引可能同時服務于多個不同的應用程序或服務&#xff0c;通…

使用 OpenCV 實現哈哈鏡效果

在計算機視覺和圖像處理領域&#xff0c;OpenCV 提供了非常強大的圖像幾何變換能力&#xff0c;不僅可以用于糾正圖像&#xff0c;還能制造各種“有趣”的視覺效果。今天&#xff0c;我們就來實現一個經典的“哈哈鏡”效果&#xff0c;讓圖像像在游樂園里一樣被拉伸、壓縮、扭曲…

AI|Java開發 IntelliJ IDEA中接入本地部署的deepseek方法

目錄 連接本地部署的deepseek&#xff1a; IntelliJ IDEA中使用deepseek等AI&#xff1a; 用法一&#xff1a;讓AI寫代碼 用法二&#xff1a;選中這段代碼&#xff0c;右鍵&#xff0c;可以讓其解釋這段代碼的含義。這時顯示的解釋是英文的。 連接本地部署的deepseek&#…

如何使用兩塊硬盤作為 Ubuntu24 的系統盤,實現壞掉一塊不影響系統運行。

最近我想使用Ubuntu組一個NAS系統&#xff0c;想實現系統盤冗余&#xff0c;各位大佬可以給點建議嗎。 Deep Seek 為了實現兩塊硬盤作為 Ubuntu 24 系統盤的冗余配置&#xff08;RAID 1&#xff09;&#xff0c;確保一塊硬盤損壞時系統仍可運行&#xff0c;以下是詳細步驟&am…

【2025最新】虛擬機安裝macos,VMware在Windows11上安裝macOS 15完整圖文教程 - 新手也能輕松上手

引言 想體驗蘋果系統但不想買Mac電腦&#xff1f;別擔心&#xff01;本教程將手把手教你如何在Windows11環境下&#xff0c;通過VMware虛擬機安裝macOS Sequoia15系統。即使你是零基礎小白&#xff0c;按照這個步驟操作&#xff0c;也能輕松搞定&#xff01; 準備工作 在開始…