前言
蓝牙低功耗(Bluetooth Low Energy,或称Bluetooth LE、BLE,旧商标Bluetooth Smart),用于医疗保健、运动健身、安防、工业控制、家庭娱乐等领域。在如今的物联网时代下大放异彩,扮演者重要一环,是无线通信的主流技术之一(常见的无线通信技术有NFC、GPRS、Zigbee、WiFi等),2021 年 7 月蓝牙技术联盟(Bluetooth SIG) 发布了蓝牙 5.3 版本,也是截止目前的最新版本。
1. BLE的前世今生
蓝牙(BT)最早诞生于1999年,第一代蓝牙是单工传输的、通信易受干扰,难以区分主从设备、传输速率才几百kbps;
一路发展,直到蓝牙4.0版本,才有了低功耗蓝牙BLE的诞生,它包括经典蓝牙(泛指支持蓝牙协议在4.0以下的模块,一般用于数据量比较大的传输)和低功耗蓝牙协议,达到了低成本、低时延,低功耗,设备可多连、传输距离有个质的飞跃,还增强了安全性,就是这个版本开始才让它真正的在物联网等领域大放异彩;
蓝牙5.0加强了数据处理、音频的传输能力,进一步推动了蓝牙耳机的发展,广播通信容量从31Byte升级成为255Byte;蓝牙5.1增加测向功能和厘米级的定位服务(AOA和AOD),可以实现室内精准定位(误差1m内);蓝牙5.2支持主从一体角色下可同时连接7个从设备,并且可以作为从角色被另一个主角色设备连接(多主多从),增加了增强型ATT协议,LE功耗控制和LE同步信道等功能,被广泛应用于电子设备、智能手机、可穿戴产品、智能家居等领域;蓝牙5.3在传输速率、稳定性、安全性等方面都有明显的提升,功能更强,应用也越多。
2. 蓝牙分类
2.1 按协议类型区分
2.1.1 经典蓝牙
经典蓝牙泛指支持蓝牙协议4.0以下的蓝牙,它又可以按速率细分为:传统蓝牙模块(3.0以下的)和高速蓝牙模块(3.x);经典蓝牙一般用于连续流式传输音频和数据量比较大的传输,例如音乐、语音、打印机等。
2.1.2 低功耗蓝牙
低功耗蓝牙ble指支持蓝牙协议4.0或更高的版本,它不向后兼容4.0之前的经典蓝牙协议,主打低功耗(使用一个纽扣电池最起码都能工作好几个月),低延迟(几毫秒级别的响应);应用于实时性要求比较高,但是低速率,低功耗的场景,如鼠标键盘、智能家居、智能穿戴这类不需要大数据量交互的场景中,非常适合物联网应用。
2.2 按对协议的支持区分
2.2.1 单模蓝牙
具有Bluetooth Smart标识的设备仅支持低功耗蓝牙,可以与“Bluetooth Smart Ready”或“Bluetooth Smart”设备通信,单双模的区分是从BLE出来后才有的。
2.2.2 双模蓝牙
有Bluetooth Smart Ready标识的设备兼容经典蓝牙与低功耗蓝牙,可以运行两套协议堆栈,低功耗蓝牙与经典蓝牙使用相同2.4GHz无线电频率,因此双模设备可以共享同一个天线;一般应用于具有稳定电源供电的设备,如手机,PC 等基本是双模的蓝牙芯片。
2.3 按应用功能区分
2.3.1 蓝牙数据
通常指BLE蓝牙,应用于那些距离近、数据量不大、功耗要求较严格的场景。
2.3.2 蓝牙音频
通常指经典蓝牙,应用于较大码流的数据传输、对功耗要求没这么严格,例如娱乐设备等。
3. BLE特性、协议标准
3.1 BLE基本特性
- 低功耗:设备大部分时间处于休眠状态,当事件发生需要工作时,才由休眠态唤醒进入工作态,工作完成后又进入休眠态,因此它功耗低;
- 低延迟:连接速度很快,毫秒级的连接速度;
- 远距离:长达数百米的通信距离;
- 低成本:由于其工作在2.4GHz的ISM频段,使用该频段无需向各国的无线电资源管理部门申请许可证,省下了一笔费用;
- 抗干扰能力强:工作在2.4GHz的ISM频段的设备有很多,当周围处在该频段的设备多了,就会互相造成干扰,因此蓝牙采用了跳频方式来扩展频谱。
3.2 协议标准
蓝牙技术联盟(SIG)沿用经典蓝牙的规范内容,为蓝牙低功耗定义了一些profile,一台设备可以使用多个profile,这些profile定义了一个设备在特定应用情景下如何工作,制造商应通过在实现中遵循特定的profile以确保兼容性。对于协议规范要有个大概了解。
3.2.1 健康护理规范
-
BLP(Blood Pressure Profile)———用于血压测量。
-
HTP(Health Thermometer Profile)————用于医疗温度测量设备。
-
GLP(Glucose Profile)————用于血糖监测。
-
CGMP(Continuous Glucose Monitor Profile)。
3.2.2 运动和健身规范
-
BCS(Body Composition Service)————身体监测服务
-
CSCP(Cycling Speed and Cadence Profile)———— 用于连接到自行车或健身单车传感器,测量节奏和轮速
-
CPP(Cycling Power Profile)
-
HRP(心率规范)
-
LNP(位置和导航规范)
-
RSCP(Running Speed and Cadence Profile)
-
WSP(Weight Scale Profile)
3.2.3 其它
-
IPSP(互联网协议支持规范)
-
ESP(环境感应规范)
-
UDS(用户数据服务)
-
HFP(Hands-Free)蓝牙免提协议
-
A2DP(Advanced Audio Distribution)蓝牙音乐协议
-
IAP:苹果的特有协议,用于carplay等
-
HID(HUMAN INTERFACE DEVICE):人机接口协议,用于蓝牙鼠标、键盘、手柄等
-
Battery Service(电池服务)报告“电池状态”和设备中单个电池或电池组的电量级别。
蓝牙协议标准有很多,只要遵守协议规范,就可以实现不同厂商的设备进行互联,低功耗蓝牙还可以自定义Profile。
4. BLE协议栈
4.1 BLE协议栈层次框图
BLE的协议可分为Bluetooth Application和Bluetooth Core两大部分,Bluetooth Core又包含BLE Controller和BLE Host两部分。Bluetooth Application主要调用API实现上层功能,本质上来说不属于协议层,另外软件开发工程师需要重点了解GAP、ATT、Link Layer,其它有个简单认识即可。
4.2 PHY Layer
physical layer物理层:物理通信介质,负责调制方案、频带、信道的使用、发射器和接收器特性,PHY层设计的不好直接影响到BLE的功耗和灵敏度等,射频工程师的主要工作就是调试好PHY层。
频率范围是2.400-2.4835 GHz,将整个频带分为40份(各通道分布如下图,并非顺序分布),每通道的带宽为2MHz,称作RF Channel(射频信道)。
广播通道37:2.402Ghz;广播通道38:2.426Ghz;广播通道39:2.480Ghz;其它的都是数据通道。
4.3 Link Layer
Link layer链路层:链路管理,是整个协议栈的核心,定义了空中接口数据包格式、比特流处理程序(例如错误检查)、状态机以及用于无线通信和链路控制的协议;主要负责信道管理、广播和扫描、创建和保持连接、收发空中包和加密链路。
4.3.1 数据包格式
有两种数据包格式(一个为LE未编码的PHY数据格式,一种为LE编码的PHY数据格式),通常为第一种;
格式:前导序列 + 访问地址 + PDU报头 + PDU长度 + PDU数据 + CRC
(PDU:Protocol Data Unit; octets:8位byte)
前导序列:是一个01010101(0x55)或者10101010(0xAA)的8bit交替序列。如果接入地址的最高位是0,前导序列则是01010101,否则是10101010,这样的设计是为了保证报文的前9位都是交替的。
访问地址:一个32位的地址,官方文档描述如下图所示,访问地址用来排除噪音和其它链路数据包的干扰。它可以分为
① 广播访问地址:是一个固定值(0x8E89BED6),扫描到数据包后验证确认是广播访问地址后才把它认定为广播包,否则认为是噪音或者无效包;
② 数据访问地址:是一个随机值,不同的连接对应不同的值;当主机扫描到广播后,发送连接请求,这个请求会包含一个连接访问地址(断开重连后此地址不同,随机生成),连接上后数据包都是用这个地址。
PDU报头:
① 广播包报头
类型有:
ADV_IND :可连接的非定向广播,表示当前设备可以接受任何设备的连接请求;
ADV_DIRECT_IND:可连接的定向广播,设备不能被主动扫描;
ADV_NONCONN_IND:不可连接的非定向广播,仅发送广播数据,而不被连接;
ADV_SCAN_IND:可扫描的非定向广播,设备可以被发现,既可以发送广播数据,也可以响应扫描发送扫描回应数据,但不能建立连接;
SCAN_REQ:主动扫描请求;
SCAN_RSP :主动扫描回复;
CONNECT_REQ :连接请求;
② 数据包报头
PDU长度:表示PDU数据的长度;
PDU数据:需要发送的数据;
CRC:3字节的校验码。
4.3.2 链路层状态机
Standby:待机状态;
Advertising: 发送广播包;
Scaning:主动或被动扫描;
Initiating:初始化连接设备;
Connection:连接上,可通信状态。
4.4 HCI
HCI(Host controller Interface)主机接口规范:主机和控制器之间的接口,允许主机和控制器间互相传送数据,该层可以由软件API实现或者使用硬件接口 UART、SPI、USB、SDIO来控制。
4.5 L2CAP
L2CAP(Logical Link Control and Adaption Protocol)链路控制和适配协议:对LL进行了一次简单封装,LL只关心传输的数据本身,L2CAP就要区分是加密通道还是普通通道,同时还要对连接间隔进行管理。
4.6 SMP
SMP(Security Manager Protocol)安全管理协议:它支持执行安全相关程序,例如配对、绑定和密钥分发。安全管理器组件为其他层的安全功能提供了⼀个加密处理,并定义了配对算法。
4.7 ATT
ATT(Attribute Protocol)配置属性协议:用于发现、读取和写入对端设备上的属性的规范;ATT也是软件开发中接触最多的。
它分为两个角色:Server和Client,通常从机为服务端,主机为客户端;服务端提供拥有关联值的属性集 ,客户端发现、读、写这些属性,服务端也可以主动通知客户端。
- 属性类型:用UUID(16bit or 128 bit)的形式来表现;
- 属性句柄:用于标识一个属性,服务器上的所有属性都会分配一个唯一非零的属性句柄;
- 属性权限:使用许可、认证许可、授权许可;
- 属性值 :0-512 byte。
方法类型:
– 请求(客户端到服务端)
– 应答(服务端到客户端,是对请求的回应)
– 命令(客户端到服务端,不需要应答)
– 通知(服务端到客户端,不要确认)
– 指示(服务端到客户端)
– 确认(客户端到服务端,是对指示的回应)。
4.8 GATT
GATT(Generic Attribute profile)通用属性协议:定义了服务的流程、格式及其所包含的特征,包含特征的发现、读取、写入、通知、指示;主要用来规范attribute中的数据内容,并将不同attribute进行分组分类。
从机中可以有多个服务(service),一个服务中可以有多个特征值(Characteristic),每个特征值又有自己的属(property),属性的取值有读、写、通知(Notify)。每个服务和特征值都有唯一的UUID标识(标准UUID为128位,协议栈中一般为16位)。
为应用提供属性支持:
– 发现所有服务、特征及特征描述符
– 客户端发起过程(writing values)
– 服务端发起过程(notifications, indications)
4.9 GAP
GAP(Generic Access Profile)通用访问协议:GAP 是所有的蓝牙设备均需实现的Profile,主要用于描述device discovery(设备发现)、connection(连接)、security requirement(安全要求)和authentication(认证) 的行为和方法。
4.9.1 GAP的四种设备角色
① Master/Central:主机;扫描广播,发起对从机的连接;
② Peripheral:从机;发送广播包,允许被主机连接;
③ Observer:观察者;不能发起连接,只能持续扫描广播包;
④ Broadcaster:广播者;不能被主机连接,只能广播数据。
5. BLE工作流程
5.1 Advertising(广播)
从机在37、38、39信道上依次发送同一个广播包,信道顺序不定,三个信道都发送完成后,就称为一个广播事件;
相邻两个广播事件的时间间隔就为广播间隔,必须是“0.625ms”的整数倍,时间范围是从20ms到10.24s,广播间隔越大,连接的时间越长。
BLE链路层会在两个广播事件之间添加一个0~10ms的随机延时,保证多个设备广播时,不会一直发生广播碰撞;例如,软件设置广播间隔为62.5ms,则实际的时间间隔为62.5~72.5ms之间。
5.2 Scanning(扫描)
扫描是主机监听从机广播包和发送扫描请求的过程,主机通过扫描,可以获取到从机的广播包以及扫描回应数据包,主机可以对已扫描到的从机设备发起连接请求,从而连接从机设备并通信。
扫描可以分为被动扫描(Passive Scanning):主机监听广播信道的数据,当接收到广播包时,直接上报到Host端;
主动扫描(Active Scanning):当接收到广播包时,向从机发送一个扫描请求,以获取更多从机信息,从机收到该请求时,会再次发送一个扫描回应包。
扫描的基本流程为:设置扫描参数 -> 扫描使能 -> controller向host上报扫描结果 -> 停止扫描。
两个比较重要的扫描参数:扫描窗口和扫描间隔;如果扫描窗口等于扫描间隔,那么主机将一直处于扫描状态之中,持续监听从机广播包,导致ble无法执行其它操作,所以,通常设置扫描窗口小于扫描时间。
5.3 Connecting(连接)
5.3.1 连接参数
BLE连接涉及到三个重要的连接参数,通过修改这三个连接参数直接影响ble连接中的功耗和连接速度。
① Connection Interval(连接间隔):BLE设备间的连接是采用了调频方案的,在特定的频道中相互收发数据,两个信道切换的间隔就称为连接间隔,连接间隔以1.25ms为一个单元,范围是6 ~ 3200既7.5ms ~ 4s之间,就算两设备间没有数据被发送和接收,仍然会交换链路层数据(空包 )来维持连接。
② Slave Latency(从设备延迟):从机可以在没有数据要发的情况下,跳过一定数目的连接事件,不需要回复主机的数据包,依次达到省电。该参数设置范围为0 ~ 499。
如下图所示,OFF表示值为0,ON表示值大于0。
Slave Latency = 0 时,对于每次连接事件从机必须要回复,不回复则认为是从机通讯故障;
Slave Latency = 3 时,如果从机没有要回复的数据包,则可以忽略3个事件,第四个事件到来再回复;如果从机有要回复的数据包,不管Slave Latency配置为多少都应立即回复。
③ Supervision Timeout(监控超时):如果BLE在Timeout时间内没有发生通信,就会自动断开。配置范围是10 ~ 3200(一个单位为 10ms),即时间范围是100ms ~ 32s。
概述:增大Connection Interval值,会降低数据包吞吐量,降低功耗;降低Slave Latency值,则功耗增高。
5.3.2 更新连接参数
连接参数由主机发起连接的时候提供给从机,如果从机对连接参数有自己的要求,可以在连接后发起连接参数更新请求,更改连接参数值。
5.4 通信
BLE连接上后,主机(客户端)就会去获取从机(服务端)的服务(service)和特征值(Characteristic),通过它们相应的UUID值就可以进行设备间通信了。
例如,有个UUID为0x180a的service,service下有个UUID为0x2a24的Characteristic(属性为可读可写),那么客户端就可以通过特征值UUID对设备进行读写操作了。
参考博文连接
其它……
总结
从第一代蓝牙的诞生到现在已经20余年了,它的功能也在不断的完善和扩充,对协议栈的了解不是一朝一夕能搞懂的,也不是短短一篇文章就能诠释的。时代在进步、科技在发展,有些理论概念今天适用,明天可能它就发生了变化,因此,在学习的过程中我们要学会如何去获取资料,学会对鱼目混珠的文章保持自己的见解。
此篇文章仅已我自己的见解记录ble的协议栈理论知识,有错误的地方烦请评论区指正(能附上链接最好不过);如果阅读了这篇文章后对你有所帮助,那就点个小小的赞吧,这将是我持续更新的动力,谢谢~
//一个苟且在技术区的博主.