1. BLE GATT数据模型全景解析
在蓝牙低功耗(BLE)开发中,GATT(Generic Attribute Profile)数据模型是设备间通信的核心框架。作为BLE协议栈的应用层规范,GATT定义了数据交互的标准格式和通信规则。实际开发中,约75%的BLE功能实现问题都源于对GATT模型理解不透彻。我曾在一个医疗设备项目中,因为误用Characteristic Properties导致数据吞吐量只有理论值的30%,后来通过深入理解GATT模型才彻底解决问题。
GATT模型采用分层数据结构,其核心组件包括:
- Service(服务):完成特定功能的逻辑集合
- Characteristic(特征值):服务中的具体数据点
- Descriptor(描述符):特征的附加信息
- Attribute(属性):所有数据单元的基础存储结构
这种层级关系构成了BLE设备的数据骨架,理解它们之间的交互机制是开发稳定BLE应用的前提。下面通过一个智能手环的典型实例来说明:手环的电池服务(Battery Service)包含电池电量特征(Battery Level Characteristic),该特征又包含客户端特征配置描述符(CCCD)用于启用通知功能。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. GATT属性协议深度剖析
2.1 Attribute核心结构解析
每个GATT属性都遵循标准数据结构:
cpp复制struct attribute {
uint16_t handle; // 唯一标识符
uuid_t uuid; // 类型标识
uint8_t permissions; // 访问权限
uint8_t* value; // 数据值
size_t value_len; // 数据长度
};
Handle是16位唯一标识,相当于内存地址。在设备连接期间保持不变,但不同会话可能变化。我曾遇到一个坑:某厂商设备每次重启会重新分配Handle,导致客户端缓存失效,解决方案是在代码中实现UUID动态发现机制。
UUID决定属性类型,分为16位(蓝牙标准定义)和128位(自定义)两种格式。16位UUID如0x180D表示心率服务,0x2A37表示心率测量特征。自定义UUID需要完
