GATT专题2
下面就是nuttx开源代码中的GATT属性表,在蓝牙连接成功后,使用下面属性表注册到全局变量中,
后续GATT客户端要发现服务,使用各种不同的服务,比如心率/血氧/电池/压力/久坐等不同的服务时,
就从这个全局变量中获取这些服务,使用这些服务。
点击查看代码
static const struct bt_gatt_attr_s g_attrs[] =
{
BT_GATT_PRIMARY_SERVICE(GASVC, &g_gap_uuid),
BT_GATT_CHARACTERISTIC(NAME_CHR, &g_name_chrc),
BT_GATT_DESCRIPTOR(NAME_DSC, &g_device_name_uuid, BT_GATT_PERM_READ,
read_name, NULL, (FAR void *)CONFIG_DEVICE_NAME),
BT_GATT_CHARACTERISTIC(APPEARANCE_CHR, &g_appearance_chrc),
BT_GATT_DESCRIPTOR(APPEARANCE_DSC, &g_appeareance_uuid,
BT_GATT_PERM_READ, read_appearance, NULL, NULL),
};
蓝牙中GATT的服务端和客户端和BLE外设/主机是怎么对应的
我用最简单、最清晰、不绕弯的方式给你讲明白:
GATT 服务端 / 客户端 ↔ BLE 外设 / 主机 是固定对应关系,没有例外。
一句话终极结论(必须背下来)
BLE 外设(Peripheral)= GATT 服务端(Server)
BLE 主机(Central)= GATT 客户端(Client)
详细对应关系(一看就懂)
1. BLE 外设(Peripheral)
广播、被连接、提供数据的一方
例子:手环、心率带、温度计、鼠标、键盘、传感器
→ 对应:GATT 服务端(GATT Server)
- 定义服务(Service)
- 定义特征值(Characteristic)
- 保存数据
- 等待客户端来读/写
- 主动发通知(Notify)
一句话:外设 = 提供服务的一方 = GATT 服务端
2. BLE 主机(Central)
主动扫描、发起连接、读取数据的一方
例子:手机、电脑、网关、主控MCU
→ 对应:GATT 客户端(GATT Client)
- 主动发现服务
- 读特征值
- 写特征值
- 订阅通知
- 接收外设发来的数据
一句话:主机 = 使用服务的一方 = GATT 客户端
最直观的比喻
- GATT 服务端(外设)= 商店
摆商品(服务/特征值),等顾客来买 - GATT 客户端(主机)= 顾客
进店挑选、买东西、查看价格
标准流程(对应你之前的代码)
你之前的 check_pending_conn 是主机(Central)的代码:
- 主机扫描 → 连接外设
- 连接成功后
- 主机:GATT 客户端,去发现服务、读数据
- 外设:GATT 服务端,提供服务、存数据
超级精简总结
| BLE角色 | GATT角色 | 功能 |
|---|---|---|
| 外设(Peripheral) | GATT 服务端(Server) | 提供服务、存数据、被连接 |
| 主机(Central) | GATT 客户端(Client) | 使用服务、读数据、主动连接 |
如果你愿意,我可以再给你讲:
GATT 服务、特征值、描述符到底是什么,用生活例子讲得特别好懂。
浙公网安备 33010602011771号