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表征的属性的类型。
现在对表中的各列进行说明:
-
Handle:如前面ATT协议说明一样,是属性的标号,存在多个属性时用于区别。
-
UUID:即前面ATT协议中的Type,蓝牙协议规定使用UUID来指定某一条属性的类型(type),属性是在整个gatt协议中从来都是不是单独存在的,永远是作为特征或者服务的一部分而存在,属性的类型则表明了他是特征或者服务的哪一部分(例如声明declaration、值value、或者是特性描述符description)。当然,如果是作为值,还会更具体到是什么类型的值(如时间、温度)。
-
UUID Description:即根据前面UUID的进一步解释,蓝牙协议专门规定了很多UUID具有特殊意义,例如0x2800代表服务的声明,0x2803代表特征的声明。大家公认这些规定,作为共识。
-
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
-
properties :根据前面特征声明属性的值的第一个字节的内容,而对特征的值的操作权限的说明。
上面这样分析看下来,GATT协议的目标并不是单纯的为了传数据,而是做过某种抽象化封装。我个人猜想是类似传感器之类应用的的封装,毕竟低功耗蓝牙设计的初衷就是做传感器节点。例如温湿度服务对应某个温湿度传感器节点,特征包含温度和湿度两个特征。多个传感器服务就组成了这一节点的profile档案表
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现