BLE中的GATT协议中的服务和特征

GATT协议及在RW协议栈上的实现

本文用于进一步分析GATT协议的细节,不对基本概念做解释,需要阅读者有一定的BLE协议知识基础。

GATT协议

ATT协议基本概念

ATT协议是GATT协议的基本子协议,如果说GAP层是面向通信机制的协议,那么ATT协议就是面向通信时的数据的协议。在我看来所谓的ATT协议本质只是一套数据格式,在ATT协议中,属性attribute是数据传输协议中的基本数据单位,结构如下:

handle:句柄,即属性的标号,说明这个是第几个属性。

type: 类型,用于属性数据的意义,例如温度,时间,需要和value一起看。标准协议通过使用16bit(简化过)的UUID来区分

Value:属性的值

上述三个参数表征了一个数据单元的基本特征,是后续的GATT协议的基石。

GATT协议基本概念

在ATT协议上,蓝牙协议引申出了GATT协议,通过多个属性组成特征(Characteristic),再通过特征和属性,再组成服务(Service),通过多个服务组成档案(profile)。就像是用砖石搭起一件件房屋,在用一间间房屋和砖石搭建起高楼大厦。使得数据的交互变得可视化,有条理,更高效。

上图就是用多条属性,搭起来的一张属性表。这张属性表,表征了三个特征,一个心率服务。

需要特别说明的是,表格中的UUID Description 和Properties两列在实际的数据传输格式是没有的,而是根据属性的handle、type、value的内容而解释生成的

UUID Description 根据 UUID而来,而UUID表征的属性的类型。

现在对表中的各列进行说明:

  1. Handle:如前面ATT协议说明一样,是属性的标号,存在多个属性时用于区别。

  2. UUID:即前面ATT协议中的Type,蓝牙协议规定使用UUID来指定某一条属性的类型(type),属性是在整个gatt协议中从来都是不是单独存在的,永远是作为特征或者服务的一部分而存在,属性的类型则表明了他是特征或者服务的哪一部分(例如声明declaration、值value、或者是特性描述符description)。当然,如果是作为值,还会更具体到是什么类型的值(如时间、温度)。

  3. UUID Description:即根据前面UUID的进一步解释,蓝牙协议专门规定了很多UUID具有特殊意义,例如0x2800代表服务的声明,0x2803代表特征的声明。大家公认这些规定,作为共识。

  4. value:值,是实际的载荷,传递最有意义的信息。根据属性的类型,一般value的用途有两种,一是用来给特征或服务进行声明或者解释,二是用来给用户传递实际有意义的信息。

    第二种用途不多解释,这里重点解释第一种:

    例如,当某一条属性类型为服务声明(declaration)时,他的属性value就表示他是什么的服务,例如上面的180d就代表了这是个心率的服务。

    再例如,当某一条属性表征特征声明时,他的属性value就代表了这个特征的属性(properties,不是前面的attribute属性),例如上面第一个特征的声明

    五个字节长的数据:10:2D:00:37:2A。

    第一个字节10,代表了特征的权限是可以notify的

    • 0x01 ---- 允许对该特征值进行广播。
    • 0x02 ---- 允许读取特征值。-Read
    • 0x04 ---- 允许写入特征值(没有响应)。-Write Without Response
    • 0x08 ---- 允许写入特征值(有响应)。-Write
    • 0x10 ---- 允许向GATT 客户端进行特征值通知(无需确认)。-Notifications
    • 0x20 ---- 允许向GATT 客户端进行特征值指示(需要确认)。-Indications
    • 0x40 ---- 允许对特征值进行签名写操作。
    • 0x80 ---- 存在扩展性质位,该扩展性质位在特征扩展性质描述符中定义。

    第二、三个字节2D:00,代表了这个特征的值(value)是handle=2d的那一条属性的值,也就是上图第三条属性

    最后两个字节代表该特征的值的属性的类型,也是用UUID表示,不过是16位的,也就是上图第四条属性的UUID,0x2a37

  5. properties :根据前面特征声明属性的值的第一个字节的内容,而对特征的值的操作权限的说明。

上面这样分析看下来,GATT协议的目标并不是单纯的为了传数据,而是做过某种抽象化封装。我个人猜想是类似传感器之类应用的的封装,毕竟低功耗蓝牙设计的初衷就是做传感器节点。例如温湿度服务对应某个温湿度传感器节点,特征包含温度和湿度两个特征。多个传感器服务就组成了这一节点的profile档案表

posted on   不回本不改名  阅读(645)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示