1. 项目概述:GATT服务定义在蓝牙核心规范中的定位
这个标题指向的是蓝牙核心规范6.2版本中关于主机层(Vol 3 Host)GATT(通用属性协议)部分的第3.1节——服务定义(Service definition)内容。作为蓝牙协议栈的核心组件,GATT定义了设备间数据交换的标准方式,而服务定义则是构建蓝牙功能的基础模块。
在实际开发中,理解GATT服务定义相当于掌握了蓝牙设备功能设计的"乐高积木"搭建规则。每个服务(Service)就是一组相关功能的数据集合,比如电池服务包含电量百分比、充电状态等属性。规范中这部分内容详细规定了:
- 服务如何声明自身存在
- 服务包含哪些特征值(Characteristics)
- 各特征值的访问权限
- 服务之间的层级关系
以智能手环开发为例,当我们需要让手环向手机传输心率数据时,就必须按照这个章节的规范,在设备中实现符合标准的"心率服务",包含心率测量特征、传感器位置特征等。任何偏离规范的实现都会导致设备间互操作性问题。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 服务定义的核心要素解析
2.1 服务声明(Service Declaration)
每个GATT服务必须以服务声明作为起点,这是一个类型为0x2800的属性(Attribute),其值字段包含该服务的UUID。服务声明相当于功能的"门牌号",设备扫描时会首先读取这个信息来判断支持哪些功能。
在具体实现时需要注意:
- 主服务(Primary Service)使用UUID 0x2800
- 次要服务(Secondary Service)使用UUID 0x2801
- 自定义服务必须使用128位UUID
- 声明属性必须设置可读权限
示例代码片段(伪代码):
c复制// 心率服务声明
att_declare_attribute(
.uuid = 0x2800, // Primary Service
.permissions = ATT_READABLE,
.value = {0x0D, 0x18} // Heart Rate Service UUID(16-bit)
);
2.2 特征值定义(Characteristic Definition)
特征是服务中的具体数据点,每个特征需要完整的定义结构:
- 特征声明(Characteristic Declaration):属性类型0x2803,包含特征属性、句柄和UUID
- 特征值(Characteristic Value):实际存储数据的属性
- 特征描述符(Descriptor):如用户描述、客户端特征配置等
关键参数说明表:
| 参数 | 说明 | 典型值示例 |
|---|---|---|
| 属性(Properties) | 定义如何与特征交互 | 0x02(读), 0x08(通知) |
| 值句柄(Value Handle) | 特征值的位置指针 | 0x0023 |
| UUID | 特征类型标识 | 0x2A37(心率测量) |
| 权限(Permissions) | 访问控制规则 | 加密读、无认证写 |
2.3 服务层次结构
规范中明确定义了服务的包含关系:
- 一
