通用属性配置文件(GATT)
GATT 层管理服务数据库,提供服务注册和属性声明所需的 API。
GATT 客户端向 GATT 服务器发起命令和请求,并可以接收服务器发送的响应、指示(indication)和通知(notification)。它通过配置选项 CONFIG_BT_GATT_CLIENT 启用。
GATT 服务器接受来自 GATT 客户端的命令和请求,并向客户端发送响应、指示和通知。
可使用 bt_gatt_service_register() API 注册服务,该 API 接受 bt_gatt_service 结构体,其中提供服务包含的属性列表。辅助宏 BT_GATT_SERVICE() 可用于声明服务。
可以使用 bt_gatt_attr 结构体或以下辅助宏之一来声明属性:
BT_GATT_PRIMARY_SERVICE声明主要服务。
BT_GATT_SECONDARY_SERVICE声明次要服务。
BT_GATT_INCLUDE_SERVICE声明包含服务。
BT_GATT_CHARACTERISTIC声明特征。
BT_GATT_DESCRIPTOR声明描述符。
BT_GATT_ATTRIBUTE声明属性。
BT_GATT_CCC声明客户端特征配置(CCC)。
BT_GATT_CEP声明特征扩展属性(CEP)。
BT_GATT_CUD声明特征用户格式(CUD)。
每个属性都包含一个描述其类型的 uuid、一个 read 回调、一个 write 回调以及一组权限。如果属性权限不允许相应操作,则 read 和 write 回调都可以设置为 NULL。
备注
GATT 不支持 32 位 UUID。当 UUID 包含在 ATT PDU 中时,所有 32 位 UUID 都应转换为 128 位 UUID。
备注
属性 read 和 write 回调直接从 RX 线程调用,因此不建议在其中长时间阻塞。
可以使用 bt_gatt_notify() API 通知属性值变化;另一种选择是 bt_gatt_notify_cb(),通过它可以传入一个回调,以便在需要知道数据通过空口发送的确切时刻时调用。指示(indication)由 bt_gatt_indicate() API 支持。
可以使用 bt_gatt_discover() API 发起发现流程,该 API 接受描述发现类型的 bt_gatt_discover_params 结构体。这些参数还可用作过滤器:设置 uuid 字段后只会发现与之匹配的属性,而将其设置为 NULL 则允许发现所有属性。
备注
不支持缓存已发现的属性。
读流程由 bt_gatt_read() API 支持,该 API 接受 bt_gatt_read_params 结构体作为参数。在参数中可以设置一个或多个属性,不过设置多个句柄需要启用选项 CONFIG_BT_GATT_READ_MULTIPLE
写流程由 bt_gatt_write() API 支持,它接受 bt_gatt_write_params 结构体作为参数。如果写操作不需要响应,可以使用 bt_gatt_write_without_response() 或 bt_gatt_write_without_response_cb() API,其中后者与 bt_gatt_notify_cb() 的工作方式类似。
可以使用 bt_gatt_subscribe() API 发起对通知和指示的订阅,该 API 接受 bt_gatt_subscribe_params 作为参数。支持对同一属性进行多次订阅,因此同一属性可能会触发多个 notify 回调。可以使用 bt_gatt_unsubscribe() API 移除订阅。
备注
移除订阅时,会调用 notify 回调并将数据设置为 NULL。