目录
概述
本文主要介绍Bluetooth Low Energy (BLE) 的GATT服务的相关概念。GATT(通用属性配置文件)是蓝牙低功耗(BLE)的核心协议,定义了数据通信标准框架。它通过服务(Services)和特征(Characteristics)实现设备间数据交换,服务为数据功能逻辑集合,特征是具体数据项。GATT包含服务器(存储数据)和客户端(读写数据)两种角色,支持读取、写入、通知等操作。标准服务如电池服务(0x180F)、设备信息服务(0x180A)等提供通用功能,特征如电池电量(0x2A19)、心率数据(0x2A37)等实现具体数据交互。协议通过属性句柄、权限控制和MTU协商等机制确保数据传输安全高效。
1 GATT 基本概念
1.1 GATT 的介绍
GATT (Generic Attribute Profile) 是 Bluetooth Low Energy (BLE) 的核心协议,定义了 数据通信的标准框架,使BLE设备能够通过 服务(Services) 和 特征(Characteristics) 交换数据。
1.2 GATT 的角色
角色 | 说明 | 典型设备 |
---|---|---|
GATT 服务器(Server) | 存储并提供数据(如传感器数据) | 心率带、温度计 |
GATT 客户端(Client) | 读取或写入服务器数据 | 手机、中央设备 |
1.3 核心组件
组件 | 说明 |
---|---|
服务(Service) | 数据功能的逻辑集合(如电池服务、设备信息服务) |
特征(Characteristic) | 服务中的具体数据项(如电池电量、设备名称) |
描述符(Descriptor) | 特征的附加信息(如通知使能、数据格式) |
2 GATT 服务(Services)
2.1 服务类型
类型 | 说明 |
---|---|
主服务(Primary Service) | 设备的核心功能(如 0x180F 电池服务) |
次要服务(Secondary Service) | 被其他服务引用的辅助功能 |
包含服务(Include Service) | 服务间的引用关系 |
2.2 常见标准服务
UUID (16-bit) | 服务名称 | 说明 |
---|---|---|
0x1800 | Generic Access | 设备名称、外观等通用信息 |
0x1801 | Generic Attribute | 服务变更通知 |
0x180A | Device Information | 厂商、固件版本等 |
0x180F | Battery Service | 电池电量 |
0x1810 | Blood Pressure | 血压数据 |
0x1816 | Cycling Speed and Cadence | 骑行速度和踏频 |
3 GATT 特征(Characteristics)
3.1 特征结构
每个特征包含:
-
值(Value):实际数据(如温度值
25.5°C
)。 -
属性(Properties):定义操作权限(读/写/通知等)。
-
描述符(Descriptors):如
Client Characteristic Configuration Descriptor (CCCD)
用于启用通知。
3.2 常见标准特征
UUID (16-bit) | 特征名称 | 说明 |
---|---|---|
0x2A00 | Device Name | 设备名称(可读) |
0x2A19 | Battery Level | 电池电量(0-100%) |
0x2A37 | Heart Rate Measurement | 心率数据(通知) |
0x2A29 | Manufacturer Name String | 厂商名称(只读) |
4 GATT 数据交互方式
4.1 客户端操作
操作 | 函数(Zephyr示例) | 说明 |
---|---|---|
发现服务 | bt_gatt_discover() | 扫描远程设备的GATT表 |
读取特征值 | bt_gatt_read() | 读取数据(如电池电量) |
写入特征值 | bt_gatt_write() | 发送命令或配置 |
启用通知 | bt_gatt_subscribe() | 订阅实时数据(如心率) |
4.2 服务器实现(Zephyr示例)
// 定义电池服务特征
BT_GATT_SERVICE_DEFINE(battery_svc,
BT_GATT_PRIMARY_SERVICE(BT_UUID_BAS),
BT_GATT_CHARACTERISTIC(BT_UUID_BAS_BATTERY_LEVEL,
BT_GATT_CHRC_READ | BT_GATT_CHRC_NOTIFY,
BT_GATT_PERM_READ, read_battery_level, NULL, NULL),
BT_GATT_CCC(battery_level_ccc_changed, BT_GATT_PERM_READ | BT_GATT_PERM_WRITE),
);
// 读取回调函数
static ssize_t read_battery_level(struct bt_conn *conn,
const struct bt_gatt_attr *attr,
void *buf, uint16_t len, uint16_t offset) {
uint8_t level = get_battery_level(); // 获取电量(0-100%)
return bt_gatt_attr_read(conn, attr, buf, len, offset, &level, sizeof(level));
}
5 GATT 协议细节
1) 属性句柄(Handle)
-
每个属性(服务/特征/描述符)有唯一的 16位句柄(如
0x0001
)。 -
客户端通过句柄访问数据。
2) 权限(Permissions)
权限 | 说明 |
---|---|
BT_GATT_PERM_READ | 允许读取 |
BT_GATT_PERM_WRITE | 允许写入 |
BT_GATT_PERM_NOTIFY | 允许通知 |
3) 数据长度(MTU)
默认 23字节,可通过 bt_gatt_exchange_mtu()
协商更大的MTU(如247字节)