在蓝牙低功耗(BLE)开发中,服务(Service)、特征(Characteristic) 和 描述符(Descriptor) 是蓝牙设备数据交互的核心元素,它们通过 GATT 协议(Generic Attribute Profile)组织数据。以下是通俗易懂的解释:
1. 服务(Service)
- 是什么:服务是蓝牙设备功能的逻辑分组,类似于一个"功能模块"。
- 例如:心率监测服务、电池电量服务等。
- 核心作用:
- 定义设备能做什么(如测量心率、监控电量)。
- 通过 UUID 唯一标识。
- 示例:
设备 → 服务1(心率监测) 服务2(电池电量) 服务3(自定义控制)
2. 特征(Characteristic)
- 是什么:特征是服务中的具体数据点,用于实际的数据读写操作。
- 例如:心率值、电池电量百分比。
- 核心作用:
- 存储具体数据(如
71 bpm
)。 - 通过 UUID 和 属性(Properties) 定义操作权限(读/写/通知等)。
- 存储具体数据(如
- 属性(Properties)示例:
READ
:允许读取数据WRITE
:允许写入数据NOTIFY
:主动推送数据(如实时心率)
- 示例:
服务(心率监测) → 特征1(心率测量值) 特征2(传感器位置)
3. 描述符(Descriptor)
- 是什么:描述符是特征的附加信息,用于细化特征的行为或配置。
- 例如:启用数据通知、设置数据格式。
- 核心作用:
- 配置特征的行为(如开启实时通知)。
- 补充描述特征(如单位、数据范围)。
- 最常见描述符:
- Client Characteristic Configuration Descriptor (CCCD)
用于启用/禁用特征的NOTIFY
或INDICATE
功能。
- Client Characteristic Configuration Descriptor (CCCD)
- 示例:
特征(心率测量值) → 描述符1(启用通知) 描述符2(数据格式说明)
三者的关系
用层级结构表示:
蓝牙设备(Device)
│
└── 服务(Service) → 功能模块(如心率服务)
│
└── 特征(Characteristic) → 具体的数据点(如心率值)
│
└── 描述符(Descriptor) → 配置或描述特征(如启用通知)
实际开发场景
-
读取电池电量
- 找到电池服务(UUID
0x180F
)
→ 读取特征0x2A19
(电池电量值)。
- 找到电池服务(UUID
-
接收实时心率数据
- 找到心率服务(UUID
0x180D
)
→ 写入 CCCD 描述符(开启NOTIFY
)
→ 监听特征0x2A37
(心率值)。
- 找到心率服务(UUID
-
控制智能灯泡
- 创建自定义服务(128-bit UUID)
→ 添加特征(如开关
、颜色
)
→ 设置特征属性为WRITE
。
- 创建自定义服务(128-bit UUID)
关键总结
概念 | 类比 | 作用 | 典型 UUID 类型 |
---|---|---|---|
服务 | 手机的"相机"模块 | 功能分组 | 16-bit(标准服务) |
特征 | 相机中的"拍照按钮" | 数据读写/操作入口 | 16-bit 或 128-bit |
描述符 | 按钮的"长按提示说明" | 配置特征的附加信息 | 通常 16-bit |
通过理解这三层结构,你就能设计蓝牙设备的数据交互逻辑了!如果需要具体代码示例或调试工具(如 nRF Connect
),可以进一步交流。