作者:EMBRACE-老王 | 来源:互联网 | 2024-11-18 16:36
声明:本文参考自 原文章。
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客户端。两者的区别在于指示有应用层的确认,而通知没有。