GATT协议及蓝牙核心系统结构

GATT协议

GATT generic Attributes的缩写,中文是通用属性,是低功耗蓝牙设备之间进行通信的协议。

GATT定义了一种多层的数据结构,已连接的低功耗蓝牙设备用它来进行通信。

GATT基于ATT。see Bluetooth Core System Architecture for block diagram and explanations)

GATT定义的多层数据结构简要概括起来就是服务(service)可以包含多个特征(characteristic),每个特征包含属性(properties)和值(value),还可以包含多个描述(descriptor)。它形象的结构如下图:

GATT协议及蓝牙核心系统结构_第1张图片

服务,是由有关该服务的多个特质,以及该服务和其他服务的关系组成。特征,由特征的名字(这是通俗说法,实际上使用UUID来唯一标识每个特征的),特征的值,特征的属性(用来表明该特征可接受的操作,和用来声明与安全相关的权限),以及可选的一个或多个的描述器(与特征相关的metadata或configuration flags)组成。

而图中的profile是什么呢。profile不属于实际用于通信的数据结构的组成部分,在这里它是一组服务的集合,这些服务被人为地组合起来并定义成一个特定的使用场景,用来声明一个低功耗蓝牙设备可以做的事情。两个设备要达到兼容要求两者支持同一种使用场景(profile)。

ps:很多地方都会出现GATT Profile这个词,或者Bluetooth profiles,有人翻译成通用属性描述文件(后者是蓝牙描述文件),不管怎么样指的就是蓝牙设备的使用场景,它除了包含多个服务以外,也许还会给出一些针对该场景下的用户交互设计的建议等等。对于其他协议和设备,看到profile这个词,通常表明接下来要讲的是关于该设备的用途和数据格式。

GATT除了定义了这种服务-特征型的数据结构,还定义了蓝牙设备使用这种数据结构进行通信的流程,包括服务流程和形式,特征的发现,特征值的读写、订阅,特征的广播等等

GATT把蓝牙通信流程分为三部分:发现流程,客户端初始化流程,和服务端初始化流程。GATT服务端存储来自GATT客户端传来数据,接受GATT客户端的请求,命令,以及批准(数据、请求、命令等的传播都是基于ATT协议的)。GATT服务端会对GATT客户端的请求进行响应,并且当GATT服务端上某些事件发生的时候会异步地通知GATT客户端。GATT还定义了数据存储在GATT服务端上的格式。

由于BR/EDR和LE是两种不同的标准,它们支持的profile是不同的,就算是非常类似的profile,具体实现也不同。BR/EDR和LE之间要实现兼容要求至少一个设备是可以实现标准切换的。

关于蓝牙核心技术

对于蓝牙核心技术的具体实现就形成了当下的各种蓝牙标准,其中比较流行的是BR/EDR标准和LE标准。BR/EDR用于建立相对短距离的连续的连接,适合连接音视频设备等使用场景。LE提供的是长距离的一瞬间的数据传输,不建立长连接,功耗低,适合对连续性没有要求且有低功耗需求的情景,如物联网。

蓝牙核心系统结构

蓝牙核心系统包括射频收发器,基带和协议栈。核心系统协议包括射频(RF)协议、链路控制(LC)协议、链路管理(LM)协议、逻辑链路的控制和适配(L2CAP)协议。
蓝牙核心系统最底三层是射频,链路控制,链路管理协议,通常会把这三者归为一个子系统——蓝牙控制器。把往上的其他层一起称为为蓝牙主机。在蓝牙控制器和蓝牙主机之间实现通信通常需要有主机-控制器接口,Host to Controller Interface(HCI)。蓝牙系统的具体应用apps,就是建立在蓝牙主机之上。
如下图:
GATT协议及蓝牙核心系统结构_第2张图片

针对不同的蓝牙标准,蓝牙控制器会有差别:
对于BR/EDR 控制器会包括射频、基带和链路管理,以及可选的主机-控制器接口。
对于LE 控制器包括LE物理层(PHY),链路层和可选的主机-控制器接口。
对于双模式控制器,就是将以上两种控制器结合起来的控制器,两种模式使用同一个蓝牙设备地址。

物理层

收发2.4Ghz的无线信号。BR/EDR使用窄带多信道和LE使用的信道较少但带宽较宽。LE将2402-2480分成了40个信道,其中有3个信道专门用于广播(2402MHz、2426MHz、2480MHz),成为广播信道,其余37个为数据信道。

链路层

定义包的结构和传输信道,完成设备的发现、连接流程,以及数据的收发流程。链路层的有5个工作状态:等待状态、广播状态、扫描状态、初始化状态和连接状态。

从等待状态可以进入广播状态、初始化状态或扫描状态。广播状态下的链路层会用广播信道进行包的广播并监听其他设备对包的响应。扫描状态下的链路层会监听广播信道,从广播信道中接收广播的包。初始化状态下的链路层会监听指定设备在广播信道中发送的包,用来初始化和该设备的连接。

从广播状态或者初始化状态可以进入连接状态。连接状态的的进入,一个连接请求包是个标志。对于初始化状态下的链路层,当发送连接请求包后就进入连接状态。对于广播状态下的链路层,当接收到连接请求包就进入连接状态。从广播状态进入连接状态的设备作为从设备,从初始化状态进入连接状态的设备作为主设备。

主设备和从设备进行通信时,由主设备把握通信时机。一个从设备同一时间只和一个主设备进行通信。在连接状态下的链路层只会使用数据信道进行包的传输。每一个连接事件都需要确定一个信道编号,该编号的信道用于传输这个连接事件中发生的所有包。每个连接事件至少包含一个来自主设备的包。在一个连接事件当中,主从设备交替收发数据包。当数据包进行传输时,连接事件被视为开启。从设备每接收到一个来自主设备的包后都需要回复一个包。
连接请求包中包括几个重要参数:connInterval、connSupervisionTimeOut、connSlaveLatency、whiteList。connInterval参数是整数,表示连接事件的发生间隔,由于连接事件的发生间隔要求是1.25ms的倍数,因此实际表示的时间间隔为connInterval*1.25ms。由于事件发生的间隔允许值为7.5ms到4.0s,因此connInterval参数的取值范围是5-80。间隔越小,数据收发的机会越多;间隔越大,越省电。connSupervisionTimeOut表示接收两个包的时间间隔的最大允许值,超过这个时间就认为数据丢失,传输中断。connSlaveLatency表示当从设备监听的主设备连续发生连接事件时,从设备可忽略的事件数。在没有数据传输的情况下,忽略连接事件可以节约电能。有效范围是0到(connSupervisionTimeout/connInterval)-1,也就说可忽略的连接事件数要小于 超时时间内可以发生的连接事件数。whiteList顾名思义白名单,链路层用来进行设备过滤。主机对白名单进行设置,链路层对于被过滤调的设备进行的广播、扫描或者初始化都不会引起主机唤醒,可以节省电源。

Direct Test Mode

是个测试模块可以通过HCI或者串口直接控制蓝牙的物理层来让它收发数据包。

逻辑链路控制和适配协议(L2CAP)层

基于包的协议,将包传输到HCI,对于无主机系统,就将包传给链路管理器LM。支持多路复用,包的分割和重组,以及向上层协议提交服务质量信息。

属性协议(ATT)

定义了连接建立后,用于进行数据交换的客户端/服务器协议。ATT中的属性被GATT进一步封装成了服务。ATT主要在LE中使用。

安全管理器(Security Manager)

定义了有关配对,授权以及加密的协议。提供了一套工具供其他组建使用它来获得安全支持。

GATT

前面讲过,是只用在LE标准中的。

Generic Access Profile (GAP)

和GATT联合起来定义了与蓝牙设备的发现、蓝牙设备的信息共享相关的角色和流程,定义了设备连接中的链接管理流程。


本文内容是阅读自以下链接后整理的笔记,理解还不深:

https://www.bluetooth.com/specifications/bluetooth-core-specification

https://www.bluetooth.com/specifications/generic-attributes-overview

你可能感兴趣的:(ios开发学习笔记)