对于GATT的理解
GATT(通用属性配置文件)属性表是BLE(低功耗蓝牙)服务器端数据组织的核心。它本质上是一个数据库,以表格的形式存储了设备对外提供的所有数据以及相关的元数据、访问规则。
属性的四个核心元素
GATT属性表中的每一行代表一个“属性”,每个属性由以下4个基本元素构成:
- 句柄(Handle):一个16位无符号整数,充当属性在表中的唯一索引或地址。句柄由协议栈自上而下按顺序分配,客户端后续的所有操作都通过这个句柄来定位属性。由于是16位,理论上一个GATT服务器最多可拥有65535这个属性。
- 类型(Type):使用UUID(唯一通用识别码)来标识属性的“种类”或“语义”,即告诉客户端这个属性代表什么。UUID主要有两种形式:
- SIG定义的标准UUID:16位,由蓝牙技术联盟官方分配,用于标准化的服务和特征(如设备名称、电池电量)。
- 厂商自定义UUID:128位,用于实现厂商私有的、非标准的功能。
- 值(Value):属性实际承载的数据。它可能是用户数据(如温度数据),也可能是另一个属性的元数据(如一个“特征声明”属性大的值就包含了该特征值的UUID和权限信息)。指的长度可变,最大512字节。
- 权限(Permissions):一个位字段,定义了GATT客户端对该属性“值”的访问控制策略。它规定了“谁”在“什么条件下”可以执行“何种操作”。权限由服务器设定,无法被客户端发现,客户端中能在访问被拒绝时才能感知到权限的存在。
深入解析:属性权限(Permissions)
权限是保障BLE通信安全的关键,它通常是以下几种访问控制的组合:
基本访问权限:
- READ:允许客户端读取属性值。
- WRITE:允许客户端写入属性值。
安全增强权限:
- 需要加密(Encryption):例如
Encrypt_READ或ENCRYPT_WRITE,要求链路必须加密后才能访问。这是保护敏感数据(如心身份信息)的基础。 - 需要认证(Authentication):例如
AUTHEN_READ或AUTHEN_WRITE,要求链路必须经过配对(Pairing)并完成认证,确保通信对端是可信设备。 - 需要授权(Authorization):例如
AUTHOR_READ,要求客户端在应用层获取信任或授权后才能访问。这是一种更高级别的、由应用逻辑控制的信任机制。
需要区分的是,权限(Permission)定义的是对“值”的访问规则,而特征属性(Properties)(如Read、Write、Notify)描述的是该特征“支持哪些操作”“,并不涉及安全策略。
- 需要加密(Encryption):例如
属性表的层级组织:从服务到属性
属性表并非平铺直叙,而是通过特定类型的属性,形成了“Profile(规范)> Service(服务)> Characteristic(特征) > Attribute(属性)”的清晰层级结构。
- 服务(Service):由一个或多个“特征”组成的集合,代表 设备的一项功能(如“电池服务”)。它在属性表中通过服务声明(类型UUID通常为
0x2800)来标识。 - 特征(Characteristic):数据交互基本单元,包含一个值和相关属性/描述符。它由多个属性共同构成,是属性表中最核心的复合结构。
一个特征通常包含以下三个属性:
- 特征声明(Characteristic Declaration):必备。其类型UUID固定为
0x2803。他的值包含了该特支持的操作() - 特征值(Characteristic Value):必备。持有实际用户数据的属性。器类型UUID由特征定义决定(如心率测量值的UUID是
0x2A37)。 - 特征描述符(Characteristic Descriptor):可选。提供关于特征值的额外元数据。常见描述符包括:
- 客户端特征值配置(CCCD,UUID
0x2904):用于客户端使能或禁用该特征值的通知(notify)或指示功能。 - 特征表示格式(UUID
0x2904):描述特征值的单位、格式等。 - 特征用户描述(UUID
0x2901):一个人类可读的字符串描述。
- 客户端特征值配置(CCCD,UUID
GATT属性表是一个以句柄为索引、UUID为类型标识、值为数据载体、权限为安全边界的结构化数据库,并通过服务和特征的层级关系,将离散的属性组织成有意义的、可供客户端发现和交互的功能单元。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 CCの日记!
评论