打开主菜单

谷雨文档中心 β

BLE技术揭秘

Ghostyu讨论 | 贡献2019年8月16日 (五) 14:46的版本 协议栈框图
BLE技术 蓝牙5.jpg

BLE是低功耗蓝牙的英文缩写(Bluetooth Low Energy),是蓝牙4.0版本起开始支持的新的、低功耗版本的蓝牙技术规范。

蓝牙技术联盟(Bluetooth SIG)在2010年发布了跨时代的蓝牙4.0,它并不是蓝牙3.0的简单升级版本,而是全新的技术架构,蓝牙4.0版本分两种模式:单模蓝牙和双模蓝牙。

常见的蓝牙音箱,是典型的双模蓝牙,它需要传输大量的音频数据。而小米手环,蓝牙温度计则属于单模蓝牙。行业里一般不讲单模蓝牙,而是统一称为低功耗蓝牙。

如今,蓝牙5.0已经发布和应用,4倍通信速度、2倍的通信距离以及Mesh组网特性,将使蓝牙成为物联网领域的重要的技术之一。

本文我们将由表及里,由浅入深,全方位的揭秘低功耗蓝牙技术。

目录

1 蓝牙简介

蓝牙是一种近距离无线通信技术,运行在2.4GHz免费频段,目前已大量应用于各种移动终端,物联网,健康医疗,智能家居等行业。蓝牙4.0以后的版本分为两种模式,单模蓝牙和双模蓝牙。

  • 单模蓝牙,即低功耗蓝牙模式,是蓝牙4.0中的重点技术,低功耗,快连接,长距离。
  • 双模蓝牙,支持低功耗蓝牙的同时还兼容经典蓝牙,经典蓝牙的特点是大数据高速率,例如音频、视频等数据传输。

如下图所示,双模蓝牙具有下图所有的特点,而单模蓝牙仅如图右侧所示。

经典蓝牙支持音频(HFP/HSP, A2DP)和数据(SPP, HID等)两大类协议,在音箱,耳机,汽车电子及传统数传行业,由于苹果对经典蓝牙数据传输接口有限制(需要过MFI认证),加上功耗偏大,因此在目前移动互联应用中慢慢地被边缘化。因此低功耗蓝牙顺势而出,由于可支持苹果4S以上及安卓4.3系统以上的数据传输,且功耗极低,目前正在被越来越多的移动互联设备所采用,但低功耗蓝牙不支持音频协议,并且受数据传输速度限制,其应用也被限制在小数据传输行业。而蓝牙双模则是综合了两者的优缺点,既可以支持音频传输,同样可支持数据传输,并且兼容性也是两者之和,在对功耗要求不苛刻的情况下,是比较理想的选择。

2 BLE特点

低功耗蓝牙瞄准多个市场,特别是移动智能终端,智能家居,互联设备等领域,主要特点包括:

  • 低功耗,使用纽扣电池就可以运行数月至数年。
  • 快连接,毫秒级的连接速度,传统蓝牙甚至长达数分钟。
  • 远距离,长达数百米的通信距离,而传统蓝牙通常10米左右。

蓝牙联盟沿用经典蓝牙的规范内容,为低功耗蓝牙定义了一些标准Profile,Profile理解为数据规范,只要遵守该规范,任意厂家的蓝牙设备,均可以相互连接与通信,例如无线蓝牙键盘鼠标,无论是安卓或是iOS还是Windows,均是即插即用,这便是“标准”的力量。低功耗蓝牙支持的标准Profile有:

  • HID,用于无线鼠标,键盘或其他遥控设备。
  • BatteryServices,电池状态服务,用于告知电池电量状态。
  • HRP,心率计Profile,用于心率采集。等等。

另外,低功耗蓝牙还可以自定义Profile,伴随着智能手机的发展和普及,低功耗蓝牙的这个特性得到了发扬光大,同时也拓宽了低功耗蓝牙的应用领域。例如,可以自定义一个开关量的Profile,数据01表示开灯,数据00表示关灯,然后手机发送数据01和00就可以控制灯的亮和灭。类似的应用案例有很多,下面总结应用特点

  • 支持自定义Profile,可以收发任意格式的数据,如01和00
  • 支持自定义设备,支持任意设备的连接和通信,例如智能蓝牙插座等。
提示:低功耗蓝牙的Profile均基于GATT(通用属性规范,后面会详解)之上,如HID over GATT。也就是说,经典蓝牙中的HID规范与低功耗蓝牙中的HID规范用的是两个不同的通道。

3 BLE工作流程

本节我们介绍低功耗蓝牙的基本行为状态和主从机交互过程,为后面的低功耗蓝牙协议的学习准备基础。

3.1 角色

BLE设备角色主要分为两种角色,主机(Master或Central)从机(Peripheral),当主机和从机建立连接之后才能相互收发数据

  • 主机,主机可以发起对从机的扫描连接。例如手机,通常作为BLE的主机设备
  • 从机,从机只能广播并等待主机的连接。例如智能手环,是作为BLE的从机设备

另外还有观察者(Observer)广播者(Broadcaster),这两种角色不常使用,但也十分有用,例如iBeacon,就可以使用广播者角色来做,只需要广播特定内容即可。

  • 观察者,观察者角色监听空中的广播事件,和主机唯一的区别是不能发起连接,只能持续扫描从机。
  • 广播者,广播者可以持续广播信息,和从机的唯一区别是不能被主机连接,只能广播数据

蓝牙协议栈没有限制设备的角色范围,同一个BLE设备,可以作为主机,也可以作为从机,我们称之为主从一体,主从一体的好处是,每个BLE设备都是对等的,可以发起连接,也可以被别人连接,更加实用。

3.2 广播

广播是指从机每经过一个时间间隔发送一次广播数据包,这个时间间隔称为广播间隔,只有当从机处于广播状态时,主机才能发现该从机。

广播时间间隔的范围是从20ms到10.24s,广播间隔影响建立连接的时间。

广播数据包最多能携带31个字节的数据,一般包含可读的设备名称,设备是否可连接等信息。

当主机收到从机广播的数据包后,它可以再发送获取更多数据包的请求,这个时候从机将广播扫描回应数据包,扫描回应数据包和广播包一样,可以携带31个字节的数据。

提示:蓝牙4.x,广播有效载荷最多是31个字节。而在蓝牙5.0中,通过添加额外的广播信道和新的广播PDU,将有效载荷增加到了255个字节

3.3 扫描

扫描是主机监听从机广播数据包和发送扫描请求的过程,主机通过扫描,可以获取到从机的广播包以及扫描回应数据包,主机可以对已扫描到的从机设备发起连接请求,从而连接从机设备并通信。

扫描动作有两个比较重要的时间参数:扫描窗口扫描间隔,如果扫描窗口等于扫描间隔,那么主机将一直处于扫描状态之中,持续监听从机广播包。

3.4 连接

在BLE连接中,使用跳频方案,两个设备在特定时间、特定频道上彼此发送和接收数据。这些设备稍后在新的通道(协议栈的链路层处理通道切换)上通过这个约定的时间相遇。这次用于收发数据的相遇称为连接事件。如果没有要发送或接收的应用数据,则交换链路层数据来维护连接。两个连接事件之间的时间跨度称为连接间隔,是以1.25 ms为单位,范围从最小值7.5 ms到最大值4.0 s

3.5 通信

低功耗蓝牙协议里,引用了服务 Service特征值 Characteristic 的概念。每个服务和特征值都有自己的唯一标识 UUID,芯片中采用两个字节的UUID。

一个从机设备包括一个或者多个服务;一个服务中又可以包括一条或者多条特征值,每个特征值都有自己的属性 Property,属性的取值有:可读 Read可写 Write 以及 通知 Notify

可读可写的字面意思容易理解,表示该特征值可以被主机读取和写入数据,而通知则表示从机可以主动向主机发送通知数据。这便是主从机之间两个典型的通信方式。

下图是一个典型的从机设备,该从机包含有一个Profile,两个个Service和五个Characteristic。我们先来介绍这些特征值的作用,然后介绍如何通过特征值通信。

服务0x180A

180A是蓝牙协议里标准的服务UUID,用来描述设备信息 Device Information,可以通过该服务,来提供从机设备的相关说明,例如硬件版本,软件版本,序列号等信息。这样,主机就可以获取从机的设备信息。上图中我们添加了三个提供具体设备信息的特征值,他们分别是:

  • 特征值0x2A24,描述产品型号 Model Number String,例如某智能锁的产品型号为:“DSL-C07”。
  • 特征值0x2A25,描述产品序列号 Serial Number String,例如某智能锁的产品序列号为:“lkjl0016190502552269”
  • 特征值0x2A26,描述产品固件版本号 Firmaware Revision String,例如某智能锁的固件号为:“2.7.2.0”

上述特征值仅有Read属性,因此主机只能读,不能执行写操作。

服务0xFFF0

FFF0是我们自定义的服务UUID,它包含两个特征值,用来发送和接收数据。

  • 特征值0xFFF1,自定义的数据发送通道,具有Read和Write属性,主机可以通过该特征值,向从机发送数据,至于发送的数据最大长度,可以在Profile中配置。
  • 特征值0xFFF2,自定义的数据接收通道,具有Notify属性,从机可以通过该特征值,主动向主机发送数据。

假设主机写特征值的协议栈函数原型为 int GATT_WriteCharValue(uuid_t UUID, uint8 *pValue, uint8 len)

假设从机发送通知的协议栈函数原型为 int GATT_Notification(uuid_t UUID, uint8 *pValue, uint8 len)

那么主机向从机发送Hello,可以这样调用协议栈的函数:GATT_WriteCharValue(0xFFF1,"Hello",5)

那么从机向主机发送1234,可以这样调用协议栈的函数:GATT_Notification(0xFFF2,"1234",4)

3.6 断开

主机或从机都可以发起断开连接请求,对方会收到该请求,然后断开连接恢复连接前的状态。

3.7 过程演示

现在我们总结一下BLE的工作流程,使用两个虚拟的BLE硬件来模拟主从机的交互过程。

假设有两个BLE设备,使用的是BLE261低功耗蓝牙模块(假设已经下载了用于交互演示的功能固件),一个是主机,名称为:BleCentral,另一个是从机,名称为:BlePeripheral,如下图所示。

3.7.1 步骤1:上电初始化

主机、从机上电后(不分先后顺序),首先进行协议栈初始化和相关功能调用,如下图所示。

  • 主机设备,主机初始化时,需要设置设备类型,设置用于扫描的相关参数,初始化GATT等协议相关的参数。(下一章节详细介绍何为GATT)
  • 从机设备,从机初始化时,需要设置设备名称,广播相关参数,从机Profile等。从机一般会立即开启广播,也可以等待一个事件来触发广播,例如按键触发。

3.7.2 步骤2:主机扫描从机

按键按下,触发主机扫描从机,此时,主机显示屏打印Scanning正在扫描。此刻的从机仍然处于广播状态。

3.7.3 步骤3:发现从机设备

当主机扫描到从机时,可以返回已扫描到的从机相关信息,例如可以提取到下图中的从机设备名称,从机MAC地址,从机的RSSI信号值等数据。

因此,有些应用在从机的广播包或者扫描回应包中添加自定义字段,这样就可以被主机通过扫描的方式拿到数据。

3.7.4 步骤4:发送连接请求

当主机扫描到从机后,通过MAC地址向从机发送连接请求。低功耗蓝牙的连接速度非常快,100ms左右即可成功连接上。如果从机的广播比较大,则会影响连接的速度。

从机在未收到连接请求之前仍然处于自由的广播状态。

3.7.5 步骤5:成功连接从机

当从机收到连接请求后,双方成功建立连接,此时双方的状态均变为已连接状态。

然后主机可以调用协议栈提供的接口函数来获取从机的服务。

3.7.6 步骤6:获取从机服务

获取从机服务通常是在连接成功后就立即执行的,因为只有获取从机的服务后,才能与其通信。下图是主机向从机发送获取服务的请求。

此刻,从机处于已连接状态。响应服务获取请求是在底层自动完成,上层无需理会。

3.7.7 步骤7:成功获取服务

如下图所示,主机成功获取到从机的服务,例如获取到UUID为0xFFF0的Services,该Service有两个特征值,分别是具有读写属性的0xFFF1,以及具有通知属性的0xFFF2。

读写属性是指主机可以读写该特征值的内容。而通知属性是指从机可以通过该特征值向主机发送数据。

3.7.8 步骤8:主机向从机发送数据

主机通过特征值0xFFF1,主动向从机发送自定义数据Hello,当数据成功发送后,主机状态变为:数据已发送。从机将收到主机发来的数据,从机状态变为收到数据。

3.7.9 步骤9:从机向主机发送数据

从机可以通过Norify的方式主动向主机发送数据,例如下图,从机通过特征值0xFFF2发送了一条Notify通知,数据内容为:1234

3.7.10 步骤10:发送断开请求

主机和从机任何一方均可以发起断开连接的请求,对方收到后,状态将变为已断开。

3.7.11 步骤11:成功断开连接

从机收到主机发来的断开请求,此刻状态变为已断开。

4 BLE协议栈

BLE协议栈一般是指芯片厂家,依据 Bluetooth SIG 发布的 Bluetooth Core Specification 核心协议的实现的代码固件,并提供函数接口,由芯片内部程序调用,可实现上节BLE工作流程等相关功能。

常见的协议栈有德州仪器 TI 的 ble-stack 和 Nordic 的 SoftDevice

4.1 协议栈框图

在本节中,我们列举两家典型的蓝牙芯片厂家:TI和Noridc,来深入了解低功耗蓝牙协议栈。

下图分别是TI的CC26系列芯片协议栈功能框图,

下图是Nordic的nRF52系列芯片的协议栈功能框图。

4.2 协议栈结构

结构