1. GATT特性值声明基础概念解析
在蓝牙低功耗(BLE)协议栈中,GATT(Generic Attribute Profile)是构建服务与特性的核心框架。Characteristic value declaration(特性值声明)作为GATT规范中的基础数据结构,承载着设备间通信的关键信息单元。这个看似简单的数据结构,在实际工程实现中却隐藏着许多值得深入探讨的技术细节。
特性值声明本质上是一个属性(Attribute),由三个核心部分组成:特性值(Value)、特性UUID和一组权限标志(Permissions)。其中UUID采用16位或128位格式,用于唯一标识特性类型。例如心率测量特性固定使用0x2A37作为16位UUID。权限标志则定义了该特性的可读性、可写性等访问控制规则。
在Core_v6.2规范中,特性值声明的存储布局有着严格定义。一个完整的声明包含以下字段:
- 特性属性(1字节):指明通知/指示/读写等权限
- 特性值句柄(2字节):指向实际特性值的引用
- 特性UUID(2/16字节):标识特性类型
实际工程中常见的实现误区包括:
- 错误计算属性长度:当使用128位UUID时,声明总长度应为19字节(1+2+16),但开发者常误用5字节格式
- 权限位设置冲突:同时设置NOTIFY和WRITE_WITHOUT_RESPONSE可能导致某些协议栈异常
- 句柄顺序错误:声明句柄必须小于特性值句柄,否则会导致客户端解析失败
2. Core_v6.2规范的关键演进
相比v5.0版本,Core_v6.2在GATT部分进行了多项重要改进,这些变化直接影响特性值声明的实现方式:
2.1 扩展属性(Extended Properties)的增强支持
v6.2明确规定了当特性支持扩展属性时,必须在声明中包含额外的属性字段。具体实现时:
- 设置特性声明中的属性字节第7位为1
- 在特性描述符列表中添加扩展属性描述符
- 扩展属性描述符的值字段包含2字节位掩码
典型应用场景:
c复制// 支持多通知的扩展属性设置示例
const uint8_t ext_prop_desc[] = {
0x02, // 描述符类型
0x01, // 支持可靠写入
0x02 // 支持异步通知
