# GATT profile简述

一、引言

GATT Profile(General attribute profile)主要用于现在的低功耗蓝牙,主要用于传输数据量小的环境中,比如蓝牙交友,手机丢失器等小型数据场景。
讲解gatt之前我们也需要讲解一下gap与att与gatt之间的关系,att是bt中的最小数据单元,而gap是gatt执行的前提,只有gatt连接上设备之后,gatt的相关server服务才有被执行,而gatt是将一个或者众多的att聚合在一起组成的service。

二、GAP

在蓝牙的协议层中,gap是贯穿整个host层的存在,主要提供蓝牙设备的连接,广播等。
如下图所示为整个bluedroid的框架协议图、

在这里插入图片描述

2.1 设备角色

GAP 给设备定义了若干角色,其中主要的两个是:外围设备(Peripheral)和中心设备(Central)。

**外围设备:**这一般就是非常小或者简单的低功耗设备,用来提供数据,并连接到一个更加相对强大的中心设备。例如小米手环。
**中心设备:**中心设备相对比较强大,用来连接其他外围设备。例如手机等。

2.2. 广播数据

在 GAP 中外围设备通过两种方式向外广播数据:

广播数据被动扫描
数据长度最大31byte数据长度最大31byte
设备初始化必选用户功能自选

三、ATT属性协议

ble中的数据都是也属性的方式存在,每条属性由四个元素构成
1、属性句柄(handler),句柄的取值范围为0x0001 ~ 0xffff,它主要标识该属性在att的database中的位置,我们可以通过handler来获取到响应的att参数。
2、属性类型(UUID),没一个数据都有自己的一个代表,这个代表叫做UUID,比如温度,发射功率,电池等,蓝牙的协议官方对一些常用的数据类型进行了强制性归类,比如0x2a09表示电池的信息,0x2a6e表示温度信息,uuid可以是16bit,也可以为128bit,在低功耗蓝牙,主要是16bit。
3、属性值、属性值表示属性类型承载的有效信息。
4、属性许可,每个属性都有各自的访问权限,比如可读,科协,即可读又可写等。

四、GATT

gatt主要是提供信息的具体实现,它定义两个 BLE 设备通过叫做 Service 和 Characteristic 的东西进行通信。GATT 就是使用了 ATT(Attribute Protocol)协议,ATT 协议把 Service, Characteristic对应的数据保存在一个查找表(database)中,查找表使用 16 bit ID 作为每一项的索引。当

比喻:医院的血液检测科的人只能检测出血液中各种成分的含量,但是他们并不知道这些含量的多少所表达出的 病人的身体状况,所以就需要“主治医师”(GATT)华丽登场。
注意:gatt是具有独占性质的,当ble外设被host连接之后,gatt的广播将会被停止,知道ble外设断开之后才会继续发起广播。

4.1 cs通讯架构

gatt是使用att来作为bt设备与主机之间通讯的基础,使用cs架构方式,bt设备维护则att创建的查找表以及server和character,所以在cs中bt设置作为server端,主机设备作为client端,所有的请求,和通讯时间等都是由client端发起。

总结:一、gatt的运行必须在gap以及连接上具体的bt设备之后
二、gatt的基础为att
三、主机端作为整个流程的client,bt设备端作为server,bt设备端负责维护att创建的查找表以及与client通讯的server。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
#define DEVICE_NAME "BL618_GATT" // 设备名称 #define PROFILE_NUM 1 // 设备支持的服务数量 #define PROFILE_A_APP_ID 0 // 第一个服务的ID static void gap_event_handler(ble_event_t *event); static void gatt_event_handler(ble_event_t *event); int main(void) { // 初始化蓝牙协议栈 bluetooth_init(gap_event_handler, gatt_event_handler); // 设置设备名称 bluetooth_set_device_name(DEVICE_NAME); // 创建一个服务 bluetooth_gatt_create_service(PROFILE_NUM); // 添加服务的特征值 bluetooth_gatt_add_char(PROFILE_A_APP_ID, "CHAR_A", 0xFF01, 0x20, NULL); // 开始广播 bluetooth_start_advertising(); while (1) { // 等待事件 bluetooth_wait_for_event(); } return 0; } static void gap_event_handler(ble_event_t *event) { switch (event->type) { case BLE_GAP_EVENT_ADV_IND: { // 收到广播包,可以连接该设备 ble_gap_connect(&event->gap_event.adv_ind.address); break; } case BLE_GAP_EVENT_CONNECTED: { // 连接成功,可以开始 GATT 操作 break; } case BLE_GAP_EVENT_DISCONNECTED: { // 断开连接,重新开始广播 bluetooth_start_advertising(); break; } default: break; } } static void gatt_event_handler(ble_event_t *event) { switch (event->type) { case BLE_GATT_EVENT_READ: { // 处理读操作 break; } case BLE_GATT_EVENT_WRITE: { // 处理写操作 ble_err_t err = ble_gatt_server_send_indication(event->conn_handle, 0x1234, raw_data, sizeof(raw_data)); // 发送通知给主机 if (err != BLE_ERR_NONE) { // 发送失败,需要处理错误 break; } break; } default: break; } }给出无注释代码
05-25

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值