BLE协议栈入门学习
蓝牙LE栈
物理层
频带
蓝牙LE在2400MHz到2483.5MHz范围内的2.4GHz免授权频段工作,该频段分为40个信道,每个信道间隔为2MHz。
时分
蓝牙LE是半双工的,可以发送和接收,但不能同时发送和接收,然而,所有的设备都是在时分复用(TDD)方案中使用,因此像是全双工
链路层
链路层概述
它定义了空中传输的几种类型的数据包和一个相关的空中接口协议,它使用一个状态机来运行,根据状态的不同,链路层可能以许多完全不同的方式运作,由许多类型的事件驱动。定义了许多影响链路状态或者链路使用参数的控制程序。也定义了无线信道的选择和分类。
链路层既支持有连接和无连接通信,也支持确定性和(稍微)随机的事件时机,它支持点对点通信,也支持一对多通信
状态机
状态 | 描述 |
---|---|
standby | 设备既不发送也不接收数据包 |
Initiating | 响应来自特定设备的广播数据包以请求连接 |
Advertising | 发送广播数据包,并可能发送用于响应其他设备的广播数据包的数据包 |
Connection | 与另一个设备建立了连接 |
Scanning | 监听来自其他设备的广播数据包 |
Isochronous Broadcast | 广播同步数据包 |
Synchronization | 监听由特定设备发送的属于特定广播序列的周期性广播 |
在连接状态下,定义了两个重要的设备角色,Central和Peripheral,启动连接,并从Initiating状态转换到Connection状态的设备承担Central角色;接收连接请求,从Advertising状态转换到Connection状态的设备承担Peripheral角色
逻辑传输
LE ACL——LE异步面向连接的逻辑传输
基础知识
当两个蓝牙LE设备连接时,它们使用面向异步连接的逻辑传输(LE-ACL或简称ACL)LE-ACL是最常用的蓝牙LE逻辑传输类型之一,提供面向连接的数据通信。
主机控制器接口
基础知识
主机控制器接口是根据命令和事件定义的。这些本质上是可以在主机和控制器之间交换的消息。命令由主机发送给控制器,事件由控制器发送给主机。事件可以是对命令的响应,也可以是不请自来的消息。
逻辑链路控制与适配协议(L2CAP)
基础知识
L2CAP使用通道的概念来分离在栈层之间传递的数据包序列。固定通道不需要设置,是立即可用的,并与特定的更高层协议相关联。信道也可以通过指定的协议服务多路复用器(PSM)值动态创建并与协议相关联。
L2CAP和协议复用
在协议栈中位于L2CAP之上的层使用不用的协议,如属性协议(ATT)和安全管理协议(SMP)。
当L2CAP信道处理属性协议时,它要么使用为ATT保留的固定信道,在这种情况下被称为充当未增强的ATT承载者,要么使用一系列一个或者多个动态信道,每个信道都充当增强的ATT承载者。未增强的ATT承载者支持按顺序执行ATT事务,每次执行一个。增强型ATT承载支持并行ATT事务,这些事务在并行L2CAP通道中按顺序执行。
L2CAP和流量控制
基于信用的流程控制是众多可能的流程控制方法之一,它的大体工作原理如下:
- 发送设备知道接收设备的容量,根据它可以处理的PDU数量而不会丢失数据。它通过配置或在数据传输开始前通过两个设备之间的交换来获取该容量信息
- 发送设备设置一个计数器,初始值为接收器的容量限制。每次发送一个PDU,计数器就递减。当计数器值到达0时,发送方就暂停发送PDU
- 接收端从其缓冲区读取并处理一个或多个PDU之后,将相应数量的值发送回发送设备,发送端使用其来增加其计数器,当计数器处于非0值时,发送器可以继续发送更多的PDU
L2CAP定义了几种操作模式,主要与流量控制有关
L2CAP分段和重组
L2CAP以上和以下的层都受到MTU大小的限制,它规定了该层创建的PDU类型允许的最大大小。例如,ATT_MTU参数定义了ATT PDU的最大大小
L2CAP本身和它上面或下面的层在堆栈中可能有不同的MTU大小。因此有必要将一些PDU/SDU分成一系列相邻层可以处理的较小部分,或者相反,将一系列相关的较小的部分重组成完整的PDU/SDU。L2CAP应用于上层的这些过程称为分割(segmentation)和重组(reassembly),而与L2CAP以及下层的等效过程称为分裂(fragmentation)和复合(recombination)
属性协议
基础知识
属性协议(ATT)由两个设备使用,一个是客户端,一个是服务器。服务器公开一系列称为属性的复合数据项。属性由服务器组织在一个称为属性表的索引列表中。
每个属性包含一个句柄,一个通用唯一标识符(UUID),一个值和一组权限
通用属性配置文件(GATT)定义了属性如何表示称为服务,特征和描述符的高级构造。通常,连续句柄值范围内的一组属性需要表示诸如此类的更复杂的类型,因此属性协议支持处理由句柄值范围表示的属性组。
ATT客户端使用ATT来发现ATT服务器中属性表的详细信息,包括感兴趣的属性或属性类型的句柄值。当句柄值已知时,他们可以与某些PDU类型一起使用,以识别表中的特定属性,然后对其进行操作。例如,ATT_READ_BY_GROUP_TYPE_REQ PDU可用于查找属性表定义的所有GATT主服务 。
ATT PDU
属性协议定义了31个不同的PDU,每个PDU都基于六种方法中的一种
命令
客户端到服务器:
命令
请求和响应
服务器到客户端:
通知
指示和确认
PDU格式
所有ATT PDU具有相同的结构,由标识PDU类型的操作码,一组参数和可选的认证签名组成。签名字段很少使用,并且当属性协议在加密链路上运行时是冗余的,因为链路层的所有加密数据包都包含认证数据。
事务
客户端到服务器,一组请求和响应,被视为一个事务;服务器到客户端,一组指示和确认,被视为一个事务;事务的超时时间是30秒。ATT是顺序事务模型,一个事务已经开始之后,在它完成之前,同一个承载实例不能再处理其他ATT PDU。
承载
L2CAP对于ATT有两种承载,未增强ATT承载和增强ATT承载
未增强ATT承载
- 使用固定的L2CAP通道,因此可能只有一个承载实例
- 事务是严格顺序的,不管应用层有多少客户端在使用ATT,这意味着一个应用程序发起的事务可能会延迟另一个应用程序希望发起的事务
- 客户端收到任何犹豫缓冲区溢出等问题而无法处理的通知将被丢弃。
- ATT MTU可以通过ATT_EXCHANGE_MTU_REQ与ATT_EXCHANGE_MTU_RSP配置
- 当使用非增强ATT承载时,可选支持某些PDU类型,如ATT_MULTIPLE_HANDLE_VALUE_NTF, ATT_READ_MULTIPLE_VARIABLE_REQ 和 ATT_READ_MULTIPLE_VARIABLE_RSP。
- 支持非增强ATT承载的L2CAP信道可以是未加密的,也可以是加密的。
增强ATT承载
- 使用动态L2CAP通道,支持多通道,因此允许多个承载实例
- 事务还是按顺序处理的,但是是基于每个承载实例的,因此从应用层来看,并行事务是可能的
- ATT MTU设置为L2CAP层自动使用的MTU值,并且ATT_EXCHANGE_MTU_REQ与ATT_EXCHANGE_MTU_RSP是不允许通过增强ATT承载的
- 增强ATT承载包含L2CAP的流量控制方法——增强型基于信用的流量控制模式,因此不会丢失任何PDU
- 使用增强ATT承载时,必须支持某些PDU,如ATT_MULTIPLE_HANDLE_VALUE_NTF, ATT_READ_MULTIPLE_VARIABLE_REQ 和 ATT_READ_MULTIPLE_VARIABLE_RSP。
- 支持非增强ATT承载的L2CAP信道必须是加密的。
发现EATT支持
GATT允许客户端确定连接的服务器是否支持EATT,也允许客户端通知服务器它是否支持EATT
通用属性概要(GATT)
基础知识
GATT基于属性表中的属性定义了更高级的数据类型,这些数据类型被称为服务,特征和描述符。它还定义了一系列通过ATT使用这些数据类型的过程,应用程序通常使用映射到这些过程的平台API
服务是一种分组机制,它提供了一个上下文,在这个上下文中可以使用它们包含的特征。服务通常对应于设备的主要特性或者能力
特征是状态数据的单个项目,具有类型,关联值和一组属性,这些属性表明数据如果在相关的GATT程序集中使用。例如,可以定义一个连接的对等设备可以读取某个特定特征的值,但不能写入它
特征属于一个服务,相同的特征类型可以是多个服务的成员,并且根据这些服务提供的不同上下文,使用特征的规则可能会有所不同
描述符属于某些特征,可以包含元数据,如特征的文本描述,或者可能提供控制特征行为的一些方法。特征有0或多个附加的描述符。
所有GATT服务器都必须提供两项特殊服务,通用访问服务和通用属性服务
蓝 牙 SIG vs自 定 义
一些服务,特征和描述符是SIG定义的,并具有表示其类型的16位UUID
自定义服务,特征和描述符可以由实现者分配128位UUID标志。16位UUID具有等价的128位值,格式为0000XXXX-0000-1000-8000-00805F9B34FB, 其中XXXX是 16位 UUID值 。 实 现 者 不 能 在 这 个 范 围 内 使 用 UUID, 除 非 从 蓝 牙 SIG购 买了UUID。
通用访问配置文件(GAP)
基础知识
蓝牙核心规范的通用访问配置文件(GAP)部分定义了与设备发现和在两个设备之间建立连接有关的过程。如何执行数据的无连接通信,如何使用周期性广播以及如何设置同步通信也是GAP包含的主题
广播包的传输和通过扫描的接收是GAP工作的核心,有许多不同的广告和扫描包类型,这些是由链路层定义的。载荷字段称为AdvData,并不是在所有PDU类型中都存在该字段。当它存在时,它所包含的数据被编码为一系列一个或多个长度/标签/值结构,称为AD类型。AD类型在核心规范补充(CSS)文档中定义
GAP与BLE和BR/EDR都有相关性。另外,虽然广告和扫描等活动与GAP具有核心相关性,但这些过程实际上是由链路层执行的,所涉及的PDU类型也是如此。
角色
GAP定义了4个设备角色:
角色 | 描述 |
---|---|
Broadcaster | 一种使用某种形式的广播以无连接的方式传输数据的设备,广播设备有一个发射机,但接收机是可选的,单纯的广播设备不接受来自中央设备的连接 |
Observer | 观察设备接收广播数据包,它不连接到其他设备,包含一个接收机,发射机是可选的,它能以无连接的方式接收广播数据包 |
Peripheral | 外设可以与中心设备连接,它包含发射机和接收机 |
Central | 中央设备能主动与外围设备建立连接,它包含一个发射机和接收机 |
注意,链路层也会使用角色名称Central和Peripheral,这两种不同语境中的术语含义有些差别
发现
Broadcaster或者Peripheral要么处于不可发现模式,要么处于GAP定义的两种可发现模式之一。当以不可发现模式广播时,广播的数据包在空中是可见的,但是执行一般可发现过程或者有限可发现过程的扫描设备将忽略这些数据包。
可发现模式包括一般可发现模式与有限可发现模式。在一般可发现模式下,设备的可发现时间是无限的,而在有限可发现模式下,最多只能发现3分钟
发现设备能通过检查广播包中的AdvData字段中称为Flags的AD类型,来识别广播设备所处的可发现模式。有限发现模式通常用于优先考虑用户最近接触过的设备。
当一个Observer或者Central试图发现其他设备时,它可能会使用被动扫描或者主动扫描。被动扫描是指接收广播PDU而不发送任何扫描PDU。主动扫描包括接收广播PDU,并通过发送扫描PDU请求更多信息。各种PDU类型由链路层定义
连接模式
广播设备可以通过所使用的PDU(遗留广播)或者AdvMode字段的值(扩展广播)来指示自己是否可以被连接
定向与非定向
定向的广播PDU只有特定设备应该处理此PDU,PDU中有TargetA字段,包含预期接收设备的蓝牙地址。
非定向的广播PDU适用于接收它们的任何Observer或者Central,不包含TargetA字段
可扫描与不可扫描
某些广播PDU类型被称为可扫描的,这意味着允许接收到这样的PDU的设备以适当类型的扫描请求PDU响应,以请求更多的广播数据。广播PDU由链路层定义
安全管理器协议(SMP)
基础知识
安全管理器协议(SMP)是协议栈安全管理器组件的一部分。它支持执行与安全相关的程序,如配对、绑定和密钥分发。
安全管理器组件为其他层可以使用的安全功能提供了一个加密工具箱,并定义了配对算法