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)的代码:

  1. 主机扫描 → 连接外设
  2. 连接成功后
    • 主机:GATT 客户端,去发现服务、读数据
    • 外设:GATT 服务端,提供服务、存数据

超级精简总结

BLE角色 GATT角色 功能
外设(Peripheral) GATT 服务端(Server) 提供服务、存数据、被连接
主机(Central) GATT 客户端(Client) 使用服务、读数据、主动连接

如果你愿意,我可以再给你讲:
GATT 服务、特征值、描述符到底是什么,用生活例子讲得特别好懂。

posted @ 2026-04-08 23:00  wzm888  阅读(0)  评论(0)    收藏  举报