热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

GATT及其服务、特性和属性详解

本文介绍了蓝牙低功耗(BLE)中的通用属性配置文件(GATT),包括其角色、层次结构、属性、特性和服务等内容。

声明:本文参考自 原文章

1. 角色

除了GAP(通用访问配置文件)定义的角色外,BLE还定义了两个与GAP角色独立的角色:GATT服务器和GATT客户端。提供数据的设备被称为GATT服务器,而访问GATT服务器并获取数据的设备则被称为GATT客户端。值得注意的是,一个设备可以同时担任服务器和客户端的角色。

2. GATT层

GATT层负责传输实际数据。GATT服务器通过一个称为属性表的表格来组织数据,这些数据用于实际传输。

2.1 属性

属性包含句柄、UUID(类型)和值。句柄是属性在GATT表中的唯一标识符,每个属性的句柄在设备中都是唯一的。UUID提供了属性表中数据类型的信息,是理解属性表中每个字节意义的关键。一个GATT表中可能包含多个属性,这些属性可能具有相同的UUID。

2.2 特性

特性至少包含两个属性:一个用于声明,一个用于存储特性的值。所有通过GATT服务传输的数据都必须映射为一系列特性。可以将特性中的数据视为一个个捆绑的数据点,每个特性都是一个独立且自包含的数据单元。例如,如果多块数据总是同时变化,可以将它们组合在一个特性中。

2.3 描述符

特性中的属性要么是属性值,要么是描述符。描述符是一个额外的属性,用于提供关于特性的更多信息,通常提供人类可读的特性描述。特别值得一提的是客户端特性配置描述符(Client Characteristic Configuration Descriptor,CCCD),它用于支持通知或指示功能的特性。在CCCD中写入“1”启用通知功能,写入“2”启用指示功能,写入“0”则同时禁用通知和指示功能。

2.4 服务

服务包含一个或多个相关联的特性。GATT服务通常包含具有相关功能的多个特性,如特定传感器的读取和设置、人机接口的输入输出等。将相关特性组织到服务中不仅实用而且高效,有助于明确逻辑和用户数据的边界,并促进不同应用程序间的代码重用。GATT的设计遵循蓝牙技术联盟(SIG)的规范,SIG建议根据其规范设计自定义的profile。

2.5 Profile(数据配置文件)

一个profile文件可以包含一个或多个服务,其中包含所需服务的信息或对等设备交互的配置信息。设备的GAP和GATT角色可能在数据交换过程中发生变化,因此,profile文件应包含广播类型、连接间隔、安全等级等信息。需要注意的是,一个profile中的属性表不能包含另一个属性表。

2.6 标准和自定义服务及特性

蓝牙技术联盟(SIG)已定义了一些profile、服务、特性和GATT层的属性。然而,协议栈中只实现了一部分BLE服务,这意味着只要协议栈支持GATT,就可以为特定应用创建所需的profile和服务。因此,在一个应用中可以支持profile和服务,从而可以创建自定义服务。

2.7 UUID

GATT层中定义的所有属性都有一个UUID值,UUID是一个全球唯一的128位号码,用于识别不同的特性。

2.7.1 蓝牙技术联盟 UUID

蓝牙核心规范定义了两种UUID:基本UUID和16位UUID。所有蓝牙技术联盟定义的UUID共用一个基本UUID:0x0000xxxx-0000-1000-8000-00805F9B34FB。每个蓝牙技术联盟定义的属性都有一个唯一的16位UUID,用于替代基本UUID的‘x’部分。例如,心率测量特性使用0x2A37作为16位UUID,其完整的128位UUID为:0x00002A37-0000-1000-8000-00805F9B34FB。虽然蓝牙技术联盟使用相同的基本UUID,但16位UUID足以唯一识别各种属性。蓝牙技术联盟定义的UUID不能用于任何自定义属性、服务和特性,自定义属性必须使用完整的128位UUID。

2.7.2 供应商特定的UUID

SoftDevice 以类似蓝牙技术联盟定义UUID的方式定义UUID:首先增加一个特定的基本UUID,然后定义一个16位的UUID(类似于别名),再加载在基本UUID之上。这种方式使得应用更加简单,尤其是在同一服务中。使用nRFgo Studio可以轻松生成一个新的基本UUID。例如,在LED BUTTON示例中,采用0x0000xxxx-1212-EFDE-1523-785FEABCD123作为基本UUID。蓝牙核心规范没有规定如何分配16位UUID,因此可以根据需要自由分配。例如,在LED BUTTON示例中,0x1523作为服务的UUID,0x1524作为LED特性的UUID,0x1525作为按键状态特性的UUID。

2.8 空中操作和性质

大部分的空中操作事件都是通过句柄进行的,因为句柄能够唯一识别各个属性。特性的性质决定了如何使用特性,包括:

1)写

2)无响应写

3)读

4)通知

5)指示

2.8.1 写和无响应写

写和无响应写允许GATT客户端向GATT服务器的特性中写入值。两者的区别在于无响应写事件没有应用层的确认或回应。

2.8.2 读

读性质表明GATT客户端可以读取GATT服务器中特性的值。

2.8.3 通知和指示

通知和指示性质允许GATT服务器在其特性发生变化时通知GATT客户端。两者的区别在于指示有应用层的确认,而通知没有。


推荐阅读
  • Google排名优化-面向Google(Search Engine Friendly)的URL设计 ... [详细]
  • 本文档汇总了Python编程的基础与高级面试题目,涵盖语言特性、数据结构、算法以及Web开发等多个方面,旨在帮助开发者全面掌握Python核心知识。 ... [详细]
  • 本文将详细介绍通过CAS(Central Authentication Service)实现单点登录的原理和步骤。CAS由耶鲁大学开发,旨在为多应用系统提供统一的身份认证服务。文中不仅涵盖了CAS的基本架构,还提供了具体的配置实例,帮助读者更好地理解和应用这一技术。 ... [详细]
  • MySQL Debug 模式的实现与应用
    本文详细介绍了如何启用和使用 MySQL 的调试模式,包括编译选项、环境变量配置以及调试信息的解析。通过实际案例展示了如何利用调试模式解决客户端无法连接服务器的问题。 ... [详细]
  • 本文详细介绍如何通过设置SSH密钥来获取连接GitHub远程仓库的权限,包括生成密钥、添加到GitHub账户以及验证连接等步骤。 ... [详细]
  • 深入解析Spring Boot自动配置机制
    本文旨在深入探讨Spring Boot的自动配置机制,特别是如何利用配置文件进行有效的设置。通过实例分析,如Http编码自动配置,我们将揭示配置项的具体作用及其背后的实现逻辑。 ... [详细]
  • 云屏系统基于嵌入式微系统msOS,旨在解决当前嵌入式彩屏GUI编程中硬件要求高、软件开发复杂、界面效果不佳等问题。该系统通过结合MCU和Android技术,利用Html5+JavaScript实现高效、易用的图形用户界面开发,使嵌入式开发人员能够专注于业务逻辑。 ... [详细]
  • 本文记录了作者在学习验证码识别过程中,针对粘连字符分割的探索与实践。通过对多种算法的研究和应用,总结出有效的解决方案,并分享了相关经验和技巧。 ... [详细]
  • 724. 寻找数组的中轴索引
    给定一个整数数组 `nums`,编写一个方法返回该数组的“中轴”索引。定义中轴索引为该索引左侧所有数字之和等于右侧所有数字之和的索引。如果不存在这样的索引,则返回 -1。如果有多个中轴索引,返回最左边的一个。 ... [详细]
  • iOS 开发技巧:TabBarController 自定义与本地通知设置
    本文介绍了如何在 iOS 中自定义 TabBarController 的背景颜色和选中项的颜色,以及如何使用本地通知设置应用程序图标上的提醒个数。通过这些技巧,可以提升应用的用户体验。 ... [详细]
  • 本文介绍了如何使用JFreeChart库创建一个美观且功能丰富的环形图。通过设置主题、字体和颜色等属性,可以生成符合特定需求的图表。 ... [详细]
  • 如何从python读取sql[mysql基础教程]
    从python读取sql的方法:1、利用python内置的open函数读入sql文件;2、利用第三方库pymysql中的connect函数连接mysql服务器;3、利用第三方库pa ... [详细]
  • 如何使用MD5进行文件验证
    本文详细介绍MD5(Message-Digest Algorithm 5)的用途及如何通过MD5码来验证文件的完整性。 ... [详细]
  • TortoiseSVN与VisualSVN Server的安装及基本操作指南
    本文详细介绍了如何安装VisualSVN Server以及TortoiseSVN客户端,并提供了基本的操作步骤,包括配置仓库、用户管理及权限设置等关键环节。 ... [详细]
  • 本文详细介绍了Java的安装、配置、运行流程以及有效的学习方法,旨在帮助初学者快速上手Java编程。 ... [详细]
author-avatar
EMBRACE-老王
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有