本章介绍蓝牙协议(重点介绍:BLE)的基本特点、版本演进、协议的构成、等基础知识,本章重在了解,目的是对BLE协议有个大概的认知,即了解BLE协议栈的全貌。后续的章节会对每一部分单独进行详细的讲解。
00-蓝牙的历史
蓝牙(英语:Bluetooth),一种无线通讯技术标准,用来让固定与移动设备,在短距离间交换资料,以形成个人局域网(PAN)。其使用短波特高频(UHF)无线电波,经由2.4至2.485 GHz的ISM频段来进行通信。1994年由电信商爱立信(Ericsson)发展出这个技术。它最初的设计,是希望创建一个RS-232数据线的无线通信替代版本。它能够链接多个设备,克服同步的问题。
蓝牙技术目前由蓝牙技术联盟(SIG)来负责维护其技术标准,其成员已超过三万,分布在电信、电脑、网络与消费性电子产品等领域。IEEE曾经将蓝牙技术标准化为IEEE 802.15.1,但是这个标准已经不再继续使用。
蓝牙技术联盟 (英语:Bluetooth Special Interest Group,缩写为SIG)拥有蓝牙的商标,负责制定蓝牙规范、认证制造厂商,授权他们使用蓝牙技术与蓝牙标志,但本身不负责蓝牙设备的设计、生产及贩售。
从上表演进史可以得出,4.0之前的版本演进主要在追求通信速度,3.0高速蓝牙达到了24Mbps;4.0及其之后的版本演进主要在追求低功耗/低成本等物联网IoT特性。
我们常说的蓝牙4.0不等同于BLE,BLE只是蓝牙4.0的子集;蓝牙4.0是一个综合性协议规范。
蓝牙4.0版本以后技术模式上分为低功耗蓝牙(BLE)和经典蓝牙(BR/EDR)两种、市场芯片多数为仅支持BLE的,也有两者都支持的(双模蓝牙芯片)。
蓝牙芯片的三种功能配置:
01-蓝牙协议栈
蓝牙协议栈由主机 + HCI(可选) + 控制器三大块组成,其中对于单芯片方案是没用HCI的。
- 主机(Host) :主机部分由核心协议层(L2CAP、SDP、SMP、ATT)和核心规范(GAP、GATT)构成;
- 控制器(Controller):此部分拆分为低功耗蓝牙(Vol 6: Low Energy Controller)和经典蓝牙(Vol 2: BR/EDR Controller)两个章节说明
- HCI:此部分定义了主机和控制器之间通信的接口标准(Vol 4: Host Controller Interface),可以是UART、USB等通信方式。
- 上图中红色部分是BR/EDR经典蓝牙的必选项,绿色部分是LE低功耗蓝牙必选项,蓝色部分是公共部分;当然经典蓝牙也可以具备绿色部分特性。HCI接口根据芯片架构有关,是可选项。
- BLE协议栈的实现方式采用分层的思想:
- 控制器部分包括:物理层(PHY)、链路层(LL)、控制接口层(HCI)
- 主机部分包括:裸机链路控制及自适应协议层(L2CAP)、安全管理层(SMP)、属性协议层(ATT)、通用访问配置文件层(GAP),通用属性配置文件层(GATT)
- 下图为一个经典BLE系统框架图,尔其中的
Host
、Controller
就是BLE协议栈。
02-物理层
- BLE的物理层定义了如何使用无线电发射器/接收器来编码和解码用于传输和接收的数字数据,以及应用的其他无线电相关参数和属性。现阶段可以略过
- 主要了解下Frequency Band
- BLE在2400Mhz至2483.5 MHz的2.4GHz免授权频段内工作。BLE采用40个信道,每个信道间隔为2MHz,分为数据信道和广播信道;广播信道占用3个,用于发现设备、建立连接、广播数据;数据信道占用37个,用于已建立连接设备间的数据通信。建立连接的两个设备,必须同一时间处于同一信道上才能通信。
- 其中37/38/39固定为广播信道,其余为数据信道。
03-链路层(LL)
低功耗蓝牙参考
《Core_v5.3.pdf》
中 Part B: Link Layer Specification 章节部分,LL层是整个BLE协议栈的核心,也是BLE协议栈的难点和重点。LL层要做的事情非常多,比如具体选择哪个射频通道进行通信,怎么识别空中数据包,具体在哪个时间点把数据包发送出去,怎么保证数据的完整性,ACK如何接收,如何进行重传,以及如何对链路进行管理和控制等等。LL层只负责把数据发出去或者收回来,对数据进行怎样的解析则交给上面的GAP或者GATT。报文是链路层的基石,是BLE通信的基础设施,它包含四个字段:前导码、访问地址、协议数据单元(PDU)和循环冗余校验(CRC)。在广播、扫描或建立连接的过程中使用广播通道PDU 传输广播包。而用于与连接器件交换数据的数据包是通过数据通道PDU 传输的。链路层数据包的格式如图:
广播包的报头与数据包的报头内容不同
广播包
的报头,包含了:PDU Type(4bit) 广播报文类型、RFU(1bit) 未使用、ChSel(1bit) 未使用、TxAdd(1bit) 发送地址类型、RxAdd(1bit) 接收地址类型、length(8bit) payload长度。数据包
的包头,包含了:LLID(2bit)逻辑链路标识符、NESN(1bit)下一个预期序列号、SN(1bit)序列号、MD(1bit)更多数据、RFU(3bit)保留、length(8bit)长度。
04-HCI层
- HCI (Host Controller interface), 为Host访问Controller提供一组标准的接口
- 主要完成3个任务:
- Host通过HCI发送命令给Controller
- Controller通过HCI将事件发送给Host
- 传递ACL Data(面向连接,在连接通道上进行数据传输)
- 这里所说的接口既包括两个设备之间的物理接口,也包括逻辑接口。逻辑接口定义了命令、事件和数据的封包格式。而物理接口定义了主机和控制器之前如何传输这些数据。蓝牙规范定义了4种物理接口,3线 串口 、4线串口、HID、SDIO。这里不做过多介绍。
05-L2CAP层
- L2CAP是个复用层,可以让低功耗蓝牙复用三条不同的信道。它也支持数据的分割和重组功能,使得较大的报文可以在底层无线电中传输。
- 主要功能:屏蔽了控制器传输协议中的许多特性,方便高层协议的开发;报文分片和重组(SAR);流控、重传、报文完整性校验等。
06-SMP层
- SMP(Secure manager protocol)。定义了蓝牙设备配对、认证、解密等行为的安全操作,SMP用来管理BLE连接的加密和安全的,如何保证连接的安全性,同时不影响用户的体验,这些都是SMP要考虑的工作。
- 这一部分在后续“高阶”BLE安全研究过程中很重要。
07-ATT层
- ATT(属性协议):定义了访问对端设备上数据的一组规则,是GATT规范的基础,也是低功耗蓝牙的基石。定义了Host端属性报文格式和报文类型。这一层的关键词是Attribute(属性)。一个属性其实就是一条数据,属性是BLE数据提供单元,也是蓝牙空中传播数据的最上层,BLE开发过程中接触最多的就是这一层。
- ATT数据格式(本章简单了解即可)
08-GATT层
- GATT(Generic Attribute Profile, 通用属性规范),自己本身不提供数据,而是将ATT层提供的属性组合起来构成的服务。通过ATT层可以读写对端设备的属性值,各个属性之间有什么联系各个属性之间怎么组合起来的,是由GATT层负责。服务是GATT层的关键字,服务由属性组成。
- 一个BLE设备可以由多个服务组成,一个服务可以包含多个特征(characteristic),一个特征可以包含多个属性。GATT用来规范attribute中的数据内容,并运用group(分组)的概念对attribute进行分类管理。没有GATT,BLE协议栈也能跑,但互联互通就会出问题。
09-GAP层
- GAP(Generic Access Profile, 通用访问规范):定义了所有蓝牙设备的基础功能,设备间发现、连接、配对绑定的流程;蓝牙设备中四种角色;广播和扫描响应报文的格式;还有一些通用蓝牙参数定义,比如设备地址、名称、配对秘钥和设备的外观特征值,用于区分是什么设备,手机还是电脑;明确了作为一个低功耗蓝牙设备的基本需求,包含哪些层级以及如何协同工作的。 规范了一些通用的蓝牙参数:蓝牙设备地址、设备名称、配对秘钥、外观特征值(用于区分设备是手机还是电脑)。 其他详情可参考
《Core_v5.3.pdf》
中Part C: Generic Access Profile
章节部分。
参考:
蓝牙技术联盟核心规范: http://www.bluetooth.com
九筒网络安全研究社,专注于汽车安全、车联网安全、IoT安全、工控安全领域的研究!
团队博客: 九筒网络安全研究社 - 团队博客
GitHub: https://github.com/9-tong
微信公众号:九筒网络安全研究社
CSDN: 九筒网络安全研究社 - CSDN
看雪论坛: 九筒网络安全研究社 - 看雪论坛
FreeBuf: 九筒网络安全研究社 - FreeBuf
腾讯开发者社区: 九筒网络安全研究社 - 腾讯云开发者社区
知乎: 九筒网络安全研究社 - 知乎
作者