浅谈BLE协议栈

BLE 技术是 Bluetooth SIG 规定的一套通信协议,在协议变成具体的代码之前,都只存在文档中,TI、Nordic、CSR 等厂商,根据 SIG 发布的 BLE 技术协议,配合自身的芯片开发了一整套源码,并且这套源码经过了 SIG 的测试,服务 BLE 协议。这套源码就叫做协议栈,协议栈是协议的实现
浅谈BLE协议栈_第1张图片

浅谈BLE协议栈_第2张图片

浅谈BLE协议栈_第3张图片
浅谈BLE协议栈_第4张图片
浅谈BLE协议栈_第5张图片

BLE协议层

PHY层(Physical layer物理层)

PHY层用来指定BLE所用的无线频段,调制解调方式和方法等。PHY层做得好不好,直接决定整个BLE芯片的功耗,灵敏度以及selectivity等射频指标。

LL层(Link Layer 链路层)。

链路层定义了协议栈中最为基础的状态机、数据包格式、广播和连接流程等问题

LL层是整个BLE协议栈的核心,也是BLE协议栈的难点和重点。像Nordic的BLE协议栈能同时支持20个link(连接),就是LL层的功劳。LL层要做的事情非常多,比如具体选择哪个射频通道进行通信,怎么识别空中数据包,具体在哪个时间点把数据包发送出去,怎么保证数据的完整性,ACK如何接收,如何进行重传,以及如何对链路进行管理和控制等等。LL层只负责把数据发出去或者收回来,对数据进行怎样的解析则交给上面的GAP或者GATT。

HCI(Host controller interface 主机控制器接口)。

HCI 层通信层,向 host 和 controller 提供一个标准化的接口。该层可以由软件api 实现或者使用硬件接口 uart、spi、usb 来控制。
HCI是可选的(具体请参考文章: 三种蓝牙架构实现方案(蓝牙协议栈方 案)),HCI主要用于2颗芯片实现BLE协议栈的场合,用来规范两者之间的通信协议和通信命令等。

GAP层(Generic access profile 通用接入规范)。

GAP是对LL层payload(有效数据包)如何进行解析的两种方式中的一种,而且是最简单的那一种。GAP简单的对LL payload进行一些规范和定义,因此GAP能实现的功能极其有限。GAP目前主要用来进行广播,扫描和发起连接等。

L2CAP层(Logic link control and adaptation protocol 逻辑链路控制和适应协议) 。

L2CAP 层相当于快递,将数据打包,可以让客户点对点的通信。

L2CAP对LL进行了一次简单封装,LL只关心传输的数据本身,L2CAP就要区分是加密通道还是普通通道,同时还要对连接间隔进行管理。

SMP(Secure manager protocol 安全管理协议)。

SM 层安全服务层,提供配对和密钥的分发,实现安全连接和数据交换。

SMP用来管理BLE连接的加密和安全的,如何保证连接的安全性,同时不影响用户的体验,这些都是SMP要考虑的工作。

ATT(Attribute protocol 属性的协议)。

简单来说,ATT层用来定义用户命令及命令操作的数据,比如读取某个数据或者写某个数据。BLE协议栈中,开发者接触最多的就是ATT。
ATT 层 ATT 环境中,允许设备向另外一个设备展示一块特定的数据,称之为“属性” ,展示“属性”的设备称为服务器,与之配对的设备称为客户端。链路层状态(主机和从机)与设备的 ATT 角色是相互独立的,也就是说,主机设备可以是 ATT 服务器,也可以是 ATT 客户端。从机也一样

BLE引入了attribute概念,用来描述一条一条的数据。Attribute除了定义数据,同时定义该数据可以使用的ATT命令,因此这一层被称为ATT层。

GATT(Generic attribute profile )通用属性配置文件。

GATT 层 从名字就能看出,GATT 是在 ATT 上面的一层结构,定义了使用 ATT的服务框架,

GATT用来规范attribute中的数据内容,并运用group(分组)的概念对attribute进行分类管理。没有GATT,BLE协议栈也能跑,但互联互通就会出问题,也正是因为有了GATT和各种各样的应用profile,BLE摆脱了ZigBee等无线协议的兼容性困境,成了出货量最大的2.4G无线通信产品。
浅谈BLE协议栈_第6张图片

在BLE协议栈的层模型中,位于下部的物理层、链路层、DTM属于控制器,位于上部的L2Cap、ATT、GATT、GAP、SM层则属于主机,在主机之上用户自己的程序称为用户程序。因此BLE协议栈进一步可以抽象为三层:控制器、主机和用户程序。

在BLE协议中,广播通信相关的协议层次主要包括:
GAP——HCI——LL

GAP负责从应用程序的角度,抽象并封装LL提供的功能,以便让应用以比较傻瓜的方式进行广播通信。当然,这不是必须的,也就是说,我们可以在没有GAP参与的情况下,进行广播通信。

HCI负责将LL提供的所有功能,以Command/Event的形式抽象出来,供Host使用。

LL(Link Layer)位于最底层,负责广播通信有关功能的定义和实现,包括物理通道的选择、相关的链路状态的定义、PDU的定义、设备过滤(Device Filtering)机制的实现等。

低功耗蓝牙里面,焦点几乎都在 GAP 和 GATT 上,因此,必须学好这个

通用访问配置文件(GAP)

Ble 协议栈中的 GAP 层负责处理设备访问模式,包括设备发现、建立连接、终止连接、初始化安全管理和设备配置,所以在 ble 协议栈中有不少函数均是以 GAP 为前缀,这些函数会负责以上的内容。GAP 层总是作为下面四个钟角
色之一:
☆Broadcaster 广播者——不可以连接的一直在广播的设备;
☆Observer 观测者——可扫描广播设备,但不能发起建立连接的设备;
☆Peripheral 从机——可被连接的广播设备,可以在单个链路层连接中作从机。
☆Central 主机——可以扫描广播设备并发起连接,在单个链路层或多链路层中作为主机,在 TI 的 ble 协议栈中,一个主机可以连接三个从机。
在典型的蓝牙低功耗系统中,从机设备广播特定的数据, 以便让主机知道他是一个可以连接的设备,广播内容包括设备地址以及一些额外的数据,如设备名、服务等。主机收到广播数据后,会向从机发送扫描请求 Scan Request,然后从机将特定的数据回应给主机,称为扫描回应 Scan Response。主机收到扫描回应后,便知道这是一个可以建立连接的外部设备,这就是设备发现的全过程。此时,主机可以向从机发起建立连接的请求,连接请求包括下面一些参数。
△连接间隔——在两个 BLE 设备的连接中使用调频机制,两个设备使用特定的信道收发数据,然后过一段时间后再使用新的信道。(链路层处理信道切换) ,两设备在信道切换后收发数据称之为连接事件,即使没有应用数据的收发,两个设备任然会通过交换链路层数据来维持连接,连接间隔就是两个连接时间之间的时间间隔,连接间隔以 1.25ms 为单位,连接间隔的值为 6(7.5ms)~3200(4s)。
不同的应用可以要求不同的时间间隔,长的时间间隔的优势是显著的节省功耗,因为设备可以在连接事件之间有较长时间的休眠,坏处是当设备有应用数据需要发送时,必须要等到下一个连接事件。短的时间间隔优势是两设备连接频发,可以更快的收发数据,不利之处是设备因连接时间的到来而频繁的唤醒,会有较多的功耗。
△从机延时——这个参数的设置可以使从机跳过若干连接时间,这给了从机更多的灵活度,如果它没有数据发送时,可以选择跳过连接时间继续休眠,以节省功耗。
△管理超时——这是两个成功连接事件之间的最大允许的间隔,如果超过了这个时间而这个值的单位是 10ms,没有成功的连接时间,设备被认为丢失连接,返回到未连接状态,管理超时的范围是 100(100ms)~ 3200(32s) 另外,超时值必须大于有效的连接间隔[有效的连接间隔=连接间隔*(1+从机延时)]。
从机可以通过向主机发送“连接参数更新请求”来改变连接设置,主机接收到请求后,可以选择接受或者拒绝这些新的参数。连接可以被主机或者从机以任何原因主动终止。当一方发起终止链接时,另一方必须响应。然后两个设备才能退出
连接状态。
△安全管理——只有已认证的连接中,特定的数据数据才能被读写,一旦连接建立,两个设备进行配对,当配对完成后,形成加密连接的密钥,在典型的应用中,外设请求集中器提供密钥来完成配对工作。密钥是一个固定的值,如 000000,
也可以随机生成一个数据提供给使用者,当主机设备发送正确的密钥后,两设备交换安全密钥并加密认证链接。在许多情况下,同一对外设和主机会不时的连接和断开,ble 的安全机制中有一项特性,允许两个设备之间建立长久的安全密钥信息,这种特性称为绑定,他允许两设备连接时快速的完成加密认证,而不需要每次连接时执行配对的完整过程。

通用属性配置文件(GATT)

两个设备应用数据的通信是通过协议栈的 GATT 层实现, GATT 角度来看,当两个从设备建立连接后,他们处于下面两种角色之一;
△GATT 服务器——他是为 GATT 客户端提供数据服务的设备。
△GATT 客户端——他是从 GATT 服务器读写应用数据的设备。
需要特别注意的是,GATT 角色中的客户端和服务器的概念与链接中的主机和从机完全独立,主机可以是 GATT 客户端也可以是 GATT 服务器。
一个 GATT 服务器中可包含一个或者多个 GATT 服务,GATT 服务是完成特定功能的一些列数据的集合,△强制的 GAP 服务——这一服务包含了设备的访问信息,例如设备名、设备供应商和产品标识,他是协议栈的一部分,是 ble 规范对每一个 BLE 设备的要求,这部分源代码并没有提供,而是编译到协议栈库文件中了。
△强制的 GATT 服务——该服务包含了 GATT 服务器的信息,是协议栈的一部分,是ble 规范对每一个 ble 设备的要求,这部分也是在 ble 协议栈库文件中。
△SimpleBLEProfile 服务——这个服务包含应用数据的信息,与应用程序数据的传递密切相关,读者也可以按照特定的格式编写自己的 GATT 服务。
Characteristic 特征值是服务用到的值,以及其内容和配置信息,GATT 定义了在BLE 连接中发现、读取和写入属性的子过程。GATT 服务器上的特征值机器内容
和配置信息(称为描述符)存储于属性表中,属性表是一个数据库,包含了称为属性的小块数据,除了值本身,每个属性都包含下列属性。
△Handle 句柄——属性在表中的地址,每个属性有唯一的句柄。
△type 类型——表示数据代表的事务,通常是蓝牙技术联盟规定的或由用户自定义 UUID。
△权限——对顶了 GATT 客户端设备对属性的访问权限,包括是否能访问和怎样访问。GATT 定义了若干在 GATT 服务器和客户端之间的通信的子过程。下面是一些子过程:
△读特征值——客户端设备请求读取局并处的特征值,服务器将此值回应给客户端。
△使用特性的 UUID 读——客户端请求读基于一个特定类型的所有特性值,服务器将所有与制定类型匹配的特性的句柄和值回应给客户端设备。
△读多个特性值——客户端一次请求中读取几个句柄的特征值,服务器将这些特征值回应给客户端。
△读特性描述符——客户端请求读特定句柄处的特征描述符。服务器将特征描述符的值回应给客户设备。
使用 UUID 发现特征值——客户端通过发送特征的类型 UUID 来请求发现这个特征的句柄,服务器将这个特征的声明回应给客户端设备。
△写特征值——客户端设备请求向服务器特定的局并处写入特征描述符,服务器特性描述符是否写入成功的信息反馈给客户端。
△特性值通知——服务器将一个特性值通知给客户端,客户端设备不需要向服务器请求这个数据,当客户端收到这个数据时,也不需要回应服务器,但需要注意的是,想要使能服务通知,首先要配置好特征,profile 中定义了什么时候服务器应该发送这个数据。
每个 Profile 初始化其相应的服务并内在的通过设备的 GATT 服务器来注册服务,GATT 服务器将整个服务加到属性表中,并为每个属性分配唯一句柄。GATT属性表中有一些特殊的属性类型,其值是由蓝牙技术联盟(SIG)定义:
△GATT_PRIMARY_SERVICE_UUID——表示新服务的起始和提供的服务类型;
△GATT_CHARACTER_UUID——称为“特征声明”紧随其后的是 GATT 特征值;
△GATT_CLIENT_CHAR_CFG_UUID——这一属性代表特征描述符,它与属性表中它前面最近的特征值有关,他允许 GATT 客户端设备使能特征值通知。
△GATT_CHAR_USER_DESC_UUID——这一属性代表特征值描述符,他与属性表中他前面最近的句柄处的特征值相关,包含一个 ASCCI 字符串,是对相关的特征的描述。

报文是链路层的基石,是BLE通信的基础设施,它包含四个字段:序言、访问地址、协议数据单元(PDU)和循环冗余校验(CRC)。在广播、扫描或建立连接的过程中使用广播通道PDU 传输数据包。而用于与连接器件交换数据的数据包是通过数据通道PDU 传输的。链路层数据包的格式如图:
在这里插入图片描述
报文 = 前导字 + 访问地址 + PDU + CRC
前导字(Preamble)
只有两种选择:0x55(0b01010101)和0xAA(0b10101010)。假如访问地址的首位是1,则选择0xAA,反之则选择0x55,即让前9个bit是0、1交叉的序列。由于BLE信号功率强度可以从-90dBm ~ 10dBm,物理层的放大器需要去处理不同功率强度的信号,这样一串0、1序列可以帮助ADC调整增益参数,以适配不同功率的射频信号。

你可能感兴趣的:(BLE,蓝牙)