蓝牙低功耗(Bluetooth Low Energy,或称Bluetooth LE、BLE,旧商标Bluetooth Smart),用于医疗保健、运动健身、安防、工业控制、家庭娱乐等领域。在如今的物联网时代下大放异彩,扮演者重要一环,是无线通信的主流技术之一(常见的无线通信技术有NFC、GPRS、Zigbee、WiFi等),2021 年 7 月 发布了蓝牙 5.3 版本,也是截止目前的最新版本。
蓝牙(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.1.1 经典蓝牙
经典蓝牙泛指支持蓝牙协议4.0以下的蓝牙,它又可以按速率细分为:传统蓝牙模块(3.0以下的)和高速蓝牙模块(3.x);经典蓝牙一般用于连续流式传输音频和数据量比较大的传输,例如音乐、语音、打印机等。
2.1.2 低功耗蓝牙
低功耗蓝牙ble指支持蓝牙协议4.0或更高的版本,它不向后兼容4.0之前的经典蓝牙协议,主打低功耗(使用一个纽扣电池最起码都能工作好几个月),低延迟(几毫秒级别的响应);应用于实时性要求比较高,但是低速率,低功耗的场景,如鼠标键盘、智能家居、智能穿戴这类不需要大数据量交互的场景中,非常适合物联网应用。
2.2.1 单模蓝牙
具有Bluetooth Smart标识的设备仅支持低功耗蓝牙,可以与“Bluetooth Smart Ready”或“Bluetooth Smart”设备通信,单双模的区分是从BLE出来后才有的。
2.2.2 双模蓝牙
有Bluetooth Smart Ready标识的设备兼容经典蓝牙与低功耗蓝牙,可以运行两套协议堆栈,低功耗蓝牙与经典蓝牙使用相同2.4GHz无线电频率,因此双模设备可以共享同一个天线;一般应用于具有稳定电源供电的设备,如手机,PC 等基本是双模的蓝牙芯片。
2.3.1 蓝牙数据
通常指BLE蓝牙,应用于那些距离近、数据量不大、功耗要求较严格的场景。
2.3.2 蓝牙音频
通常指经典蓝牙,应用于较大码流的数据传输、对功耗要求没这么严格,例如娱乐设备等。
低功耗:设备大部分时间处于休眠状态,当事件发生需要工作时,才由休眠态唤醒进入工作态,工作完成后又进入休眠态,因此它功耗低;低延迟:连接速度很快,毫秒级的连接速度;远距离:长达数百米的通信距离;低成本:由于其工作在2.4GHz的ISM频段,使用该频段无需向各国的无线电资源管理部门申请许可证,省下了一笔费用;抗干扰能力强:工作在2.4GHz的ISM频段的设备有很多,当周围处在该频段的设备多了,就会互相造成干扰,因此蓝牙采用了跳频方式来扩展频谱。
蓝牙技术联盟(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。
BLE的协议可分为Bluetooth Application和Bluetooth Core两大部分,Bluetooth Core又包含BLE Controller和BLE Host两部分。Bluetooth Application主要调用API实现上层功能,本质上来说不属于协议层,另外软件开发工程师需要重点了解GAP、ATT、link Layer,其它有个简单认识即可。
physical layer物理层:物理通信介质,负责调制方案、频带、信道的使用、发射器和接收器特性,PHY层设计的不好直接影响到BLE的功耗和灵敏度等,射频工程师的主要工作就是调试好PHY层。
频率范围是2.400-2.4835 GHz,将整个频带分为40份(各通道分布如下图,并非顺序分布),每通道的带宽为2MHz,称作RF Channel(射频信道)。
广播通道37:2.402Ghz;广播通道38:2.426Ghz;广播通道39:2.480Ghz;其它的都是数据通道。
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:连接上,可通信状态。
HCI(Host controller Interface)主机接口规范:主机和控制器之间的接口,允许主机和控制器间互相传送数据,该层可以由软件API实现或者使用硬件接口 UART、SPI、USB、SDIO来控制。
L2CAP(Logical link Control and Adaption Protocol)链路控制和适配协议:对LL进行了一次简单封装,LL只关心传输的数据本身,L2CAP就要区分是加密通道还是普通通道,同时还要对连接间隔进行管理。
SMP(Security Manager Protocol)安全管理协议:它支持执行安全相关程序,例如配对、绑定和密钥分发。安全管理器组件为其他层的安全功能提供了⼀个加密处理,并定义了配对算法。
ATT(Attribute Protocol)配置属性协议:用于发现、读取和写入对端设备上的属性的规范;ATT也是软件开发中接触最多的。
它分为两个角色:Server和Client,通常从机为服务端,主机为客户端;服务端提供拥有关联值的属性集 ,客户端发现、读、写这些属性,服务端也可以主动通知客户端。
属性类型:用UUID(16bit or 128 bit)的形式来表现;属性句柄:用于标识一个属性,服务器上的所有属性都会分配一个唯一非零的属性句柄;属性权限:使用许可、认证许可、授权许可;属性值 :0-512 byte。
方法类型:
– 请求(客户端到服务端)
– 应答(服务端到客户端,是对请求的回应)
– 命令(客户端到服务端,不需要应答)
– 通知(服务端到客户端,不要确认)
– 指示(服务端到客户端)
– 确认(客户端到服务端,是对指示的回应)。
GATT(Generic Attribute profile)通用属性协议:定义了服务的流程、格式及其所包含的特征,包含特征的发现、读取、写入、通知、指示;主要用来规范attribute中的数据内容,并将不同attribute进行分组分类。
从机中可以有多个服务(service),一个服务中可以有多个特征值(Characteristic),每个特征值又有自己的属(property),属性的取值有读、写、通知(Notify)。每个服务和特征值都有唯一的UUID标识(标准UUID为128位,协议栈中一般为16位)。
为应用提供属性支持:
– 发现所有服务、特征及特征描述符
– 客户端发起过程(writing values)
– 服务端发起过程(notifications, indications)
GAP(Generic Access Profile)通用访问协议:GAP 是所有的蓝牙设备均需实现的Profile,主要用于描述device discovery(设备发现)、connection(连接)、security requirement(安全要求)和authentication(认证) 的行为和方法。
4.9.1 GAP的四种设备角色
① Master/Central:主机;扫描广播,发起对从机的连接;
② Peripheral:从机;发送广播包,允许被主机连接;
③ Observer:观察者;不能发起连接,只能持续扫描广播包;
④ Broadcaster:广播者;不能被主机连接,只能广播数据。
从机在37、38、39信道上依次发送同一个广播包,信道顺序不定,三个信道都发送完成后,就称为一个广播事件;
相邻两个广播事件的时间间隔就为广播间隔,必须是“0.625ms”的整数倍,时间范围是从20ms到10.24s,广播间隔越大,连接的时间越长。
BLE链路层会在两个广播事件之间添加一个0~10ms的随机延时,保证多个设备广播时,不会一直发生广播碰撞;例如,软件设置广播间隔为62.5ms,则实际的时间间隔为62.5~72.5ms之间。
扫描是主机监听从机广播包和发送扫描请求的过程,主机通过扫描,可以获取到从机的广播包以及扫描回应数据包,主机可以对已扫描到的从机设备发起连接请求,从而连接从机设备并通信。
扫描可以分为被动扫描(Passive Scanning):主机监听广播信道的数据,当接收到广播包时,直接上报到Host端;
主动扫描(Active Scanning):当接收到广播包时,向从机发送一个扫描请求,以获取更多从机信息,从机收到该请求时,会再次发送一个扫描回应包。
扫描的基本流程为:设置扫描参数 -> 扫描使能 -> controller向host上报扫描结果 -> 停止扫描。
两个比较重要的扫描参数:扫描窗口和扫描间隔;如果扫描窗口等于扫描间隔,那么主机将一直处于扫描状态之中,持续监听从机广播包,导致ble无法执行其它操作,所以,通常设置扫描窗口小于扫描时间。
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 更新连接参数
连接参数由主机发起连接的时候提供给从机,如果从机对连接参数有自己的要求,可以在连接后发起连接参数更新请求,更改连接参数值。
BLE连接上后,主机(客户端)就会去获取从机(服务端)的服务(service)和特征值(Characteristic),通过它们相应的UUID值就可以进行设备间通信了。
例如,有个UUID为0x180a的service,service下有个UUID为0x2a24的Characteristic(属性为可读可写),那么客户端就可以通过特征值UUID对设备进行读写操作了。
其它......
从第一代蓝牙的诞生到现在已经20余年了,它的功能也在不断的完善和扩充,对协议栈的了解不是一朝一夕能搞懂的,也不是短短一篇文章就能诠释的。时代在进步、科技在发展,有些理论概念今天适用,明天可能它就发生了变化,因此,在学习的过程中我们要学会如何去获取资料,学会对鱼目混珠的文章保持自己的见解。
此篇文章仅已我自己的见解记录ble的协议栈理论知识,有错误的地方烦请评论区指正(能附上链接最好不过);如果阅读了这篇文章后对你有所帮助,那就点个小小的赞吧,这将是我持续更新的动力,谢谢~