热门标签 | 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客户端。两者的区别在于指示有应用层的确认,而通知没有。


推荐阅读
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社区 版权所有