1. 项目概述
在蓝牙技术规范中,GATT(Generic Attribute Profile)作为核心协议之一,定义了设备间数据交换的基本框架。Characteristic definition(特性定义)则是GATT协议中最关键的数据结构单元,它承载了蓝牙设备对外暴露的实际功能与数据。最新发布的Core_v6.2规范对这部分内容进行了重要更新,特别是在支持BR/EDR传统传输模式方面做出了显著改进。
作为一名蓝牙协议栈开发工程师,我参与过多个基于GATT协议的设备开发项目。本文将结合Core_v6.2规范最新要求,深入解析Characteristic的定义方法、属性配置技巧以及实际应用中的典型问题解决方案。无论您是在开发健康监测设备、智能家居产品还是工业传感器,这些内容都将帮助您避免常见的协议实现陷阱。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 核心概念解析
2.1 GATT基础架构
GATT采用客户端-服务器架构,其中服务器端存储着被称为Attribute(属性)的数据结构。这些属性按照特定规则组织为:
- 服务(Service):表示设备提供的完整功能单元
- 特性(Characteristic):服务中的具体数据点
- 描述符(Descriptor):特性的元数据
在Core_v6.2中,每个Characteristic必须包含以下基本属性:
- 特性声明(Characteristic Declaration)
- 特性值(Characteristic Value)
- 特性描述符(可选)
2.2 Characteristic组成要素
一个完整的Characteristic定义包含五个关键部分:
| 组成部分 | 作用 | 存储位置 | UUID |
|---|---|---|---|
| 声明 | 标识特性类型和位置 | 服务器 | 0x2803 |
| 值 | 存储实际数据 | 服务器 | 自定义 |
| 属性 | 定义访问权限 | 值属性 | - |
| 描述符 | 提供额外配置 | 服务器 | 多种 |
| 配置 | 客户端特定设置 | 客户端 | - |
注意:在BR/EDR模式下,特性值的最大长度限制为512字节,而BLE模式下默认是20字节(可通过MTU交换扩展)
3. 特性定义实操指南
3.1 标准特性定义流程
根据Core_v6.2规范,定义一个新特性需要遵循以下步骤:
- 声明特性结构
c复制// 典型特性声明结构体
typedef struct {
uint16_t handle; // 特性句柄
bt_uuid_t uuid; // 特性UUID
uint8_t properties; // 属性位掩码
uint16_t value_handle; // 值句柄
uint16_t ext_prop_handle; // 扩展属性句柄(可选)
} bt_gatt_characteristic_t;
- 设置属性权限
属性字段采用位掩码组合,常见配置包括:
- 0x01: 广播
- 0x02: 读
- 0x04: 无认证写
- 0x08: 有认证写
- 0x10: 通知
- 0x20: 指示
- 0x40: 带确认写
- 0x80: 扩展属性
- 实现回调函数
c复制// 读操作回调示例
static ssize_t read_temp_callback(struct bt_conn *conn,
const struct bt_gatt_attr *attr,
void *buf, uint16_t len, uint16_t offset)
{
int32_t temp = get_current_temperature();
return bt_gatt_attr_read(conn, attr, buf, len, offset, &temp, sizeof(temp));
}
3.2 高级配置技巧
多协议支持配置
在Core_v6.2中实现GATT over BR/EDR需要特别注意:
c复制// 注册服务时指定传输模式
BT_GATT_SERVICE_DEFINE(
temp_sv
