BLE协议—协议栈基础
BLE协议栈基础
蓝牙BLE协议栈包含三部分:主机、主机接口层和控制器。
主机:逻辑链路控制及自适应协议层(L2CAP),安全管理层(SM),属性协议层(ATT),通用访问配置文件(GAP),通用属性配置文件层(GATT)
主机接口层:主机控制接口(HCI)
控制器:物理层(PHY)、链路层(LL)
控制器(Controller)
-
物理层(Physical Layer,PHY):BLE在2400Mhz至2483.5 MHz的2.4GHz免授权频段(ISM)内工作。采用自适应跳频的高斯频移键控(GFSK)。BLE采用40个信道,每个信道间隔为2MHz,分为数据信道和广播信道;广播信道占用3个,用于发现设备、建立连接、广播数据;数据信道占用37个,用于已建立连接设备间的数据通信。建立连接的两个设备,必须同一时间处于同一信道上才能通信。
其中37/38/39为固定广播信道,其余为数据信道。 -
链路层(Link Layer,LL),控制设备的射频状态,让设备处于七种状态:
-
Standby:默认状态,不进行收发。
-
Advertising:广播状态,在3个广播信道广播数据包,同时监听和回复扫描者发送的扫描数据包。
-
Scanning:扫描状态,在3个广播信息监听广播数据包,同时发送扫描数据包。
-
Initiating:发起状态,在广播信道监听广播数据包,从而发起连接。
-
Connection:连接状态。发起连接的设备通过发送连接请求来回应广播设备,如果广播设备接受连接请求,那么广播设备与发起连接的设备将会进入连接状态。发起连接的设备称为主机(Client),接受连接请求的设备称为从机(Server)。
-
Synchronization:同步状态,可以通过广播通道接收BIS同步数据流,由Standby状态进入。Synchronization状态可用于侦听一定区域内的BIS广播同步数据流(比如音频数据流),处于Synchronization状态并且正在接收同步数据包的设备称为Synchronized Receiver,只能单向接收BIG,如果在主机指定时间内未侦听到任何有效BIG,处于该状态的设备将回到Standby状态并通知主机。(BLE 5.1)
-
Isochronous Broadcasting:等时广播状态可以通过广播通道发送BIS(Broadcast Isochronous Stream) 数据报文,由Standby状态进入。想向一定区域内其它设备广播同步数据流(比如音频数据流)的设备需要处于Isochronous Broadcasting状态,处于该状态的设备称为Isochronous Broadcaster。处于Isochronous Broadcasting状态的链路层状态机应发送由一个或多个BIS 组成的BIG(Broadcast Isochronous Group),每个BIG最多包含31个BIS,每个BIS承载一个单独的同步数据流。传输第一个BIS 数据报文后链路层应通知主机,若停止同步广播则回到Standby状态。(BLE 5.2)
主机控制接口(Host Controller Interface)
主机控制接口(Host-Controller Interface,HCI):为Host访问Controller提供一组标准的接口。
HCI主要完成3个任务:
- Host通过HCI发送命令给Controller
- Controller通过HCI将事件发送给Host
- 传递ACL Data(面向连接,在连接通道上进行数据传输)
该接口层的实现可以是软件接口,也可以是标准硬件接口,比如UART、SPI、USB。
主机(Host)
-
逻辑链路控制和适配器协议(Logical Link Control and Adaption Protocol,L2CAP):为上层提供了多路复用、数据分段与重组服务,并且支持逻辑端对端的数据通信。
-
安全管理层(Security Manager,SM):定义了配对和密钥分发的方法,并为其他层提供了与对端设备进行安全连接和数据交换的功能。
-
属性协议层(Attribute Protocol,ATT):定义了访问对端设备上数据的一组规则,是GATT规范的基础,也是低功耗蓝牙的基石。定义了Host端属性报文格式和报文类型。这一层的关键词是Attribute(属性)。一个属性其实就是一条数据,属性是BLE数据提供单元,也是蓝牙空中传播数据的最上层,BLE开发过程中接触最多的就是这一层。
Attribute协议下文详解 -
通用属性配置文件层(Generic Attribute Profile,GATT):自己本身不提供数据,而是将ATT层提供的属性组合起来构成的服务。通过ATT层可以读写对端设备的属性值,各个属性之间有什么联系各个属性之间怎么组合起来的,是由GATT层负责。服务是GATT层的关键字,服务由属性组成。
一个BLE设备可以由多个服务组成(使用UUID进行区分),一个服务可以包含多个特征(characteristic),一个特征可以包含多个属性。GATT用来规范attribute中的数据内容,并运用group(分组)的概念对attribute进行分类管理。 -
通用访问配置文件层(Generic Access Profile,GAP):定义了所有蓝牙设备的基础功能,设备间发现、连接、配对绑定的流程;蓝牙设备中四种角色;广播和扫描响应报文的格式;还有一些通用蓝牙参数定义,比如设备地址、名称、配对秘钥和设备的外观特征值,用于区分是什么设备,手机还是电脑;明确了作为一个低功耗蓝牙设备的基本需求,包含哪些层级以及如何协同工作的。 规范了一些通用的蓝牙参数:蓝牙设备地址、设备名称、配对秘钥、外观特征值。
通用访问配置文件层(Generic Access Profile,GAP)
GAP管理蓝牙设备的基本行为,例如设备的发现、连接和配对。GAP规范定义了设备的广告(Advertisement)格式、设备的可见性、设备的连接参数等。GAP的主要作用是使蓝牙设备能够进行发现和连接,并定义了设备在不同状态下的行为。
GAP角色
GAP层定义了4种BLE角色:
- 外围设备(Peripheral):可以发送广播并接受连接的设备(在链路层中作为从机)。
- 中央设备(Central):可以扫描广播并发起连接的设备(在链路层中作为主机)。
- 播报设备(Broadcaster):可以发送广播,但不可接受连接的设备。
- 观察设备(Observer):可以扫描广播,但不可发起连接的设备。
链路层可以同时支持多个状态机, GAP层也支持一个设备同时作为多个GAP角色,所以一个BLE设备通常可以同时充当主机和从机(多主多从)。
设备配置
GAP定义了4个设备配置参数:
- 设备地址:设备地址在协议栈内部指BD_ADDR,小端数据格式。设备地址可以随机,也可以固定。
- 设备名称:设备名称一般用于区分BLE设备,最长可达248个字节,支持UTF-8编码。
- 设备外观:设备外观是用于用户识别设备功能,长度为两个字节。
- 连接PIN码:PIN码用于两个设备之间配对时使用,为6位十进制整形数,因此它的有效范围为000000-999999(0x00000000 – 0x000F423F)。使用时必须显示全部6位数字,包括前导0。
模式和规程
GAP定义5套模式和规程,设备通常运行在这5套模式和规程中:
- Broadcast mode and Observation procedure, 广播模式和观察规程
- Discovery modes and procedures,发现模式和规程
- Connection modes and procedures,连接模式和规程
- Bonding modes and procedures, 绑定模式和规程
- Periodic advertising modes and procedure,周期性的广播模式和规程
安全模式
GAP定义了2种安全模式以及4种安全规程:
- 安全模式1(LE Security mode 1):使用认证信息保证安全。
- 安全模式2(LE Security mode 2):使用数字签名保证安全。
规程 | 描述 | 安全模式 |
---|---|---|
认证规程(Authentication procedure) | 执行认证和加密操作 | 安全模式1 |
授权规程(Authorization procedure) | 确认是否为某个操作提供授权 | 安全模式1 |
连接数据签名规程 (Connection data signing procedure) | 连接数据签名规程,在未加密的连接中传输认证的数据。 | 安全模式2 |
认证已签名的数据规程 (Authenticate signed data procedure) | 认证已签名的数据规程,校验带有前面的数据是否有效 | 安全模式2 |
广播和扫描
广播和扫描在无线通信中是非常重要的一个技术点。在BLE中,扫描和广播是通信的基础,用户可以直接用扫描和广播进行数据的传输,也可以在广播和扫描的基础上进行连接后点对点通信。
由于广播和扫描内容篇幅较长,具体可以移步👇链接
BLE协议—广播和扫描
属性协议层(Attribute Protocol,ATT)
ATT其实相当于设备的数据库。用于在蓝牙设备之间传输和管理数据。它定义了一种基于属性的数据交换模型,其中数据被组织为属性(Attributes)的集合。每个属性都有一个唯一的标识符(Attribute Handle),用于在设备之间进行唯一标识。ATT协议定义了一组操作,例如读取、写入、通知和确认等,用于设备之间对属性的访问和操作。
属性
属性(Attribute)是ATT最基础的单位,用于传输和管理数据。ATT协议定义了一个Attribute数据结构去格式化数据。
- Attribute handle:Attribute句柄,2字节长度的唯一性标识。Client要访问Server的Attribute,都是通过这个句柄来访问,也就是说ATT PUD一般都包含handle的值。属性句柄值的范围:0x0001~0xFFFF, 在应用层添加service和characteristic时系统会自动按照顺序的为相关attribute生成句柄;
- Attribute Type:2字节或者16字节长。作用是用以区分当前属性是服务项或是特征值等,它用UUID来表示。
- 完整UUID为16字节,蓝牙联盟为了减少数据传输,定义了一个特殊的UUID:
0000xxxx-0000-1000-8000-00805F9B34FB
,当使用2字节UUID时,BLE协议会自动把UUID补全成16字节,比如UUID0xAABB
补全后为0000AABB-0000-1000-8000-00805F9B34FB
- UUID取值范围:
- 完整UUID为16字节,蓝牙联盟为了减少数据传输,定义了一个特殊的UUID:
UUID | 说明 |
---|---|
0x1800 – 0x26FF | 服务项类型 |
0x2700 – 0x27FF | 单位 |
0x2800 – 0x28FF | 属性类型 |
0x2900 – 0x29FF | 特征描述符类型 |
0x2A00 – 0x7FFF | 特征值类型 |
- Attribute Value:属性值,长度为0-512字节。
- Attribute Permissions:权限属性
通用属性配置文件层(Generic Attribute Profile,GATT)
GATT是专用的L2CAP通道。可以进行设备服务和特征值的读写操作。GATT定义了两个角色,GATTS(从机或服务端)和GATTC(主机或客户端),一个设备可以同时作为主机和从机。
GATT建立在ATT协议之上,为设备之间的数据交换提供了更高层次的抽象和定义。GATT使用ATT协议来管理服务(Services)和特征(Characteristics),这些服务和特征定义了设备提供的功能和数据类型。通过GATT,设备可以通过属性的方式对外公开自己的功能和数据,使得其他设备可以访问和操作这些属性。
特征
特征Characteristic是GATT中最基础的单位。每个特征都由三个属性组成,各自都有对应的UUID。
-
Characteristic declaration:特征声明,UUID固定为0x2803,用于标识特征。
-
Characteristic value:特征值,为特征所携带的实际数据。它可以是各种数据类型,例如整数、浮点数、字符串等,用于传输和存储特征相关的信息 (特征值UUID为用户自定义)。特征值又三部分组成。
-
Characteristic properties :特征特性,一般用于标识特征权限。
-
Characteristic Value Attribute Handle:特征值属性句柄,用于存储属性值的句柄。
-
Characteristic UUID:特征值UUID,用于标识特征值的UUID。
-
-
Characteristic descriptor:特征描述符,为可选字段,用于声明更多的特征信息,比如特征值范围、特征值单位等。
服务
-
Service:
Services主要用来传输和管理数据,它分为主服务(primary service),次服务(secondary service)。一个Service可以包含多个Characteristics。
-
Primary service:主服务,用于公开此设备主要可用功能的服务,UUID为0x2800。
-
secondary service:次服务,为设备提供额外辅助信息,但跟设备公开的功能无关的服务,一般被包含在主要服务或另一个辅助服务中,UUID为0x2801。
-
include service:
-
include Service attribute handle:被服务所包含Service的attribute的句柄。
-
End group handle:被服务所包含Service中最后一个attribute的句柄。
-
Service UUID:被包含服务UUID。
具体UUID可以参考蓝牙联盟UUID列表
蓝牙联盟UUID列表
学习笔记,有问题欢迎指出
参考链接:
https://cloud.tencent.com/developer/article/1874730