低功耗蓝牙技术基础
本文最后更新于:7 天前
低功耗蓝牙技术基础
BLE全称bluetooth low energy一般翻译为低功耗蓝牙或者蓝牙低功耗。特点是低成本、低延时、低功耗,因为目前的智能手机基本上对BLE100%的支持率,所以BLE在消费电子、物联网市场具有非常大的应用市场。
蓝牙的协议规范都由sig制定,sig是蓝牙技术联盟协会,由一众行业技术领先的厂商组成,官方网站bluetooth, 网站的specifications专栏中包含蓝牙技术的所有profile,这也是蓝牙开发人员务必要阅读了解的。
本文针对BLE的常用应用配置进行简述说明,具体的细节部分需要阅读蓝牙官方的spec。
BLE协议栈的架构分层如下:
一、角色配置
蓝牙具有主机/从机,客户端/服务端,观察者/广播者的角色概念。
- 主机/从机是根据连接时的行为进行区分的角色。
- 客户端/服务端与主机/从机是两个独立的概念,客户端和服务端是根据att服务访问时的数据提供和数据访问区分的角色。
- 观察者/广播者是根据非连接场景下数据通信双方的行为区分的概念。
- 主机:在连接这个行为中负责发现从机和发起连接从机的业务。
- 从机:在连接行为中负责广播自己被主机发现和被主机连接的业务。
- 客户端:对服务端的服务进行访问,可以对服务端进行读写行为。
- 服务端:给客户端提供服务,对客户端进行指示/通知行为。
- 观察者(扫描者):扫描广播者的广播信息。
- 广播者:将带有设备标识的特定信息通过广播包的信息广播出去。
二、广播
蓝牙的频率范围是2.400-2.4835 GHz,按照每个信道2MHz可以分为40个射频信道。信号频率分布如下:
设备在广播时会在3个广播信道发送相同的报文。广播需要配置广播包的内容和广播包的广播间隔。
2.1 广播包
广播包由包头和内容组成,包头的格式固定由以下内容组成:
- PDU Type:标识广播包类型
- 可连接的非定向广播(Connectable Undirected Event Type):是一种非常常用的广播类型,标识当前广播设备可以接受任何设备的扫描连接请求
- 可连接的定向广播(Connectable Directed Event Type):一种为了尽快建立连接的广播方式,广播包的内容包含广播者的地址和发起者的地址,当发起者收到发给自己的广播包时,应该立即发送连接请求作为广播的回应。
- 不可连接的非定向广播(Non-connectable Undirected Event Type):广播者仅仅是为了广播自己的数据,不响应扫描请求和连接请求。
- 可扫描的非定向广播(Scannable Undirected Event Type):不能用于发起连接,但是允许其他设备扫描广播设备并且做出扫描响应,适用于广播者对数据的发送,但是广播者不响应连接请求。
- RFU:预留
- ChSel:如果本机支持跳频(Hopping)算法 #2,这设置为 1
- TxAdd:代表设备的地址类型,包含
- 公有地址(需要找IEEE购买),查询购买链接
- 随机地址
- 静态地址:上电后生成不可以修改,最高两位为0b11,其余46位是随机数
- 私有地址:
- 不可以解析的私有地址:随机部分比较长,不可以被解析最高两位是10,高24位是随机数部分,低24位是随机数和一个key生成的hash值
- 可以解析的私有地址:动态修改,建议15min变化一次,最高两位是00
- RxAdd:代表期望对端的地址是随机地址还是公有地址
- Length:代表了后面的 Payload 的长度,最大支持31个字节
- PDU Type:标识广播包类型
广播包中的数据包采用ltv格式:length、type、value的形式。type是广播的数据类型:规范文档 Assigned Numbers Document,包含:
蓝牙core5.0新增新特性:
- 扩展广播(LE Advertising Extensions):原来的37、38、39为主广播信道,剩余的0-36信道为第二广播信道,当扫描设备在主广播信道接收到ADV_EXT_IND指令时,可以在指定的第二广播信道监听辅助广播数据,数据长度最大可达255字节,如果数据想要更长可以根据主广播包中的AuxPtr指向新的辅助包,通过这种方式理论上可以不断扩展长度。
- long range:提高发射功率、提升接收灵敏度、 新增前向纠错编码,实际通信距离可达500-1000m
- 使用新的调频算法:新的跳频同时支持广播和数据通信调频,相比之前的提升性能、更加安全。
- 更高频率的广播:5.0以前最小支持的interval为100ms,最高速率为2.48kbps。5.0将最小值限制为20ms,提升速度为原来的5倍12.4kbps。
- 扩展广播(LE Advertising Extensions):原来的37、38、39为主广播信道,剩余的0-36信道为第二广播信道,当扫描设备在主广播信道接收到ADV_EXT_IND指令时,可以在指定的第二广播信道监听辅助广播数据,数据长度最大可达255字节,如果数据想要更长可以根据主广播包中的AuxPtr指向新的辅助包,通过这种方式理论上可以不断扩展长度。
2.2 广播配置
蓝牙广播时会在37、38、39三个信道进行广播,在同一个环境中如果有多个设备一起广播可能会出现周期性的同时广播而互相干扰,所以蓝牙除了定向广播之外的其他广播类型广播的发送时间均会实现动态调整,实现该动态调整的方式是在每次广播事件后随机加入0-10ms的随机延时。这样当出现两个设备单词广播时间相同,那它们在下一次广播的时间大概率不会相同而互相影响。两个相邻广播事件之间的时间间隔为 advInterval + advDelay ,advInterval必须是0.625ms的整数倍,范围是20ms-10.24s。advDelay是一个链路层分配的一个伪随机数。范围是0-10ms。
一般广播的间隔配置都是设置最小广播间隔和最大广播间隔,如果需要固定广播间隔只需要将两个值设置为一个值即可。
三、扫描
蓝牙的扫描是指蓝牙设备的扫描者角色通过扫描环境中广播者的广播数据进行发现、广播数据传递、为连接做准备。需要注意的是扫描状态无法直接进入连接状态,只能在扫描停止后通过就绪状态进入连接状态。
3.1 扫描类型:BLE的扫描方式分为两种主动扫描和被动扫描
- 主动扫描(active scanning):扫描者在发现广播包后主动发起扫描请求,通过广播者的扫描响应作为一次连接前准备的交互。
2. 被动扫描(passive scanning):扫描者只是发现广播者设备,但是不会发起扫描请求。
两种扫描方式对比,主动扫描的方式会让广播者发现扫描者来暴露扫描者的信息(addr),但是被动扫描不会被扫描者发现具有一定的隐蔽性。
3.2 扫描参数配置
- 扫描类型:上面的两种扫描类型被动扫描(0)、主动扫描(1)
- 扫描窗口(windows):一次扫描进行的时间宽度
- 扫描间隔(interval):两个连续的扫描窗口之间的时间差,包括扫描休息的时间和扫描窗口的时间
- 窗口和间隔可设置的时间范围是2.5ms-10.24s
- 扫描窗口的时间不能大于扫描间隔的时间
- 如果扫描窗口时间和扫描间隔时间相等,则扫描设备一直扫描,没有休息时间,带来的功耗会比较高
- 扫描请求中的地址类型:包含随机地址和公有地址(设备mac地址),随机地址不会暴露自己的地址信息,相对来说更加安全。
- 扫描的过滤策略
- 除了定向广播中包含不指向当前扫描设备的广播包,其他一律扫描
- 广播包地址在扫描设备白名单中或者发给扫描设备的定向广播包
- 所有的非定向广播包或者指向扫描设备的定向广播包或者广播地址为可解析私有地址的定向广播包
- 广播地址在扫描白名单或者广播地址为可解析私有地址的定向广播包或者指向扫描者地址的定向广播包
3.3 扫描者设备HOST收到的扫描事件内容:
- 扫描设备数量
- 事件类型
- 广播设备地址类型
- 广播者地址值
- 广播数据长度
- 广播数据内容
- 广播者信号强度(扫描设备计算扫描到的RSSI,不能单纯的反映广播者的广播功率)
四、连接
从上面的‘ble状态机图’可以看出,想要进入连接状态要么是从广播状态进入,要么是从‘initiating’状态进入。
initiating(发起)状态也是一个扫描状态,只不过这个扫描状态是在scanning发现有待连接的设备后进入到这个状态准备发起连接请求,所以这个是状态是master角色进入连接的前一个状态。
advertising(广播)状态就是slave在广播的过程中被master可发现、可扫描、可连接的状态。
BLE建立完整连接的过程分为两个环节:连接、配对
4.1 连接
连接的过程简单的说就是发现observer扫描发现advertiser的广播包后进入发起状态,然后发起连接请求,advertiser响应发起请求,然后两者的角色分别切换为主机和从机开始发送同步数据,这个时候就认为连接已经完成。
4.2 配对
与传统蓝牙不同的是,ble的配对过程发生在连接过程之后。
配对分为三个阶段,蓝牙spec规定前面两个阶段是必须的,第三阶段为可选的。
- 交换配对信息(能力)
设备交换包含的能力,用于在后面的阶段决定使用什么方法进行配对,
- 方法包含:
- justWorks:直连,直接连接的方式,安全级别低。
- passkeyEntry:输入密钥,使用6位数字进行加密验证,范围是000000-999999。
- outOfBand:带外密钥交换,通过非ble传输的方式交换密钥,比如nfc、红外等。
- 设备能力包含:
- DisplayOnly 只能是显示000000 - 999999的数字
- DisplayYesNo 显示Yes/No 的按钮
- KeyboardOnly 只能是输入000000 - 999999的数字
- NoinputNoOutput 没有输入也没有显示,只能用Just work工作方式
- KeyboardDisplay 能输入000000 - 999999的数字和输出
- 生成短期/长期密钥
设备通过生成随机数和一些算法生成LTK和STK - 传输密钥
如果是justWork方式会直接跳过这一步配对成功,其他方式会在这个阶段传输密钥为后续的通信进行加密。经典蓝牙的shared link key也是在这个阶段进行传输。
4.3 连接保持
- 连接间隔
设备之间连接事件的时间间隔,单位是1.25ms,设置范围是7.5ms到4s。一版都会设置最大连接间隔和最小连接间隔,最大连接间隔指的是在没有数据通信空闲时通过最大连接间隔发空包来保持连接,最小连接间隔是在数据连续发送时的时间间隔。 - 从机延迟(slave latency)
属于从设备的一个属性,如果设置为打开,则允许在设置的范围内跳过主机的连接事件不响应。如果设置为关闭,则必须响应主机所有的连接事件。可设置的范围是0-499 - 连接超时时间(supervision timeout)
主从机连续两次连接事件交互的最大事件间隔,如果超过时间则认为连接已经断开。可设置的范围大小是100ms-32s - IOS设备对连接参数的要求
IOS设备对连接参数有一定的要求,如果设置的参数不在要求范围内,则会产生连接不稳定或者连接断开的现象。
- Interval Max * (Slave Latency + 1) <=2s
- Interval Min >=20ms
- Interval Min + 20 ms <= Interval Max
- Slave Latency <= 4
- SupervisionTimeout <= 6 s
- Interval Max * ( Slave Latency + 1) * 3 < SupervisionTimeout
五、GAP、ATT和GATT
GAP、ATT、GATT都属于蓝牙规范的内容,为应用层提供支持。
5.1 ATT
Attribute Protocol; a protocol for discovering, reading, and writing attributes on a peer device
The attribute protocol allows a device referred to as the server to expose a set of attributes and their associated values to a peer device referred to as the client. These attributes exposed by the server can be discovered, read, and written by a client, and can be indicated and notified by the server.
ATT提供了一种client和server之间对属性访问的规范,访问方式包含6种:
- Commands—PDUs sent to a server by a client that do not invoke a response.
- Requests—PDUs sent to a server by a client that invoke a response.
- Responses—PDUs sent to a client by a server in response to a request.
- Notifications—Unsolicited PDUs sent to a client by a server that do not invoke a confirmation.
- Indications—Unsolicited PDUs sent to a client by a server that invoke a confirmation.
- Confirmations—PDUs sent to a server by a client to confirm receipt of an indication.
ATT中定义的属性的类型使用16位的UUID表示,UUID一般位128位,只是在传输的过程中只传输特殊的16位的类型识别码。除了属性的类型ATT中还定义了属性的权限、属性的访问方法、MTU的交换、长属性等。
5.2 GAP
Generic Access Profile
This profile defines the generic procedures related to discovery of Bluetooth devices (idle mode procedures) and link management aspects of connecting to Bluetooth devices (connecting mode procedures). It also defines procedures related to use of different security levels. In addition, this profile includes common format requirements for parameters accessible on the user interface level.
The purpose of the Generic Access Profile is:To introduce definitions, recommendations and common requirements related to modes and access procedures that are to be used by transport and application profiles.
To describe how devices are to behave in standby and connecting states in order to guarantee that links and channels always can be established between Bluetooth devices, and that multi-profile operation is possible. Special focus is put on discovery, link establishment and security procedures.
To state requirements on user interface aspects, mainly coding schemes and names of procedures and parameters, that are needed to guarantee a satisfactory user experience.
从上面的图可以看出gap是包含了所有的蓝牙HOST协议。如发现、建立连接、断开连接、数据传输、安全管理、设备的角色配置等。GAP中定义的四种角色包含:
- Broadcaster Role:广播者,广播数据
- Observer Role:观察者,扫描发现广播者的广播数据
- Peripheral Role:从机角色,可以被连接的角色
- Central Role:主机角色,可以发起连接从机的角色
5.3 GATT
The Generic Attribute Profile (GATT) defines a service framework using the Attribute Protocol. This framework defines procedures and formats of services and their characteristics. The procedures defined include discovering, reading, writing, notifying and indicating characteristics, as well as configuring the broadcast of characteristics.
- 一个GATT的profile由一个或者多个services组成
- 一个服务定义可能包含引用服务(Reference Service)、强制Characteristic和可选Characteristic
- 每个特征值必须包含Characteristic声明、Characteristic属性、值、值的描述(可选)
属性包含:
- write:client可以写sever角色Characteristic的值
- read:client可以读sever角色Characteristic的值
- notify:sever可以向client发起通知而不需要回复
- indicate:sever可以向client发起通知而必须要回复
六、数据传输
- ble的数据传输采用快速跳频算法来选择需要使用的信道,最新的蓝牙协议包含两种跳频算法。
- ble采用停等重传的机制进行数据传输:指的是每一次的数据通信必须要接收到ack才能认为当前数据传输完成,否则则会一直重复传输当前数据知道超时。
- 每个 BLE 终端都维护两个 1 bit 参数: transmitSeqNum 和 nextExpectedSeqNum,分别指示当前传输的数据包序号和下一个期待接收的数据包序号,它们与 Packet 中的 SN 和 NESN字段一起维护 Master 和 Slave 之间的重传机制。transmitSeqNum 和nextExpectedSeqNum 在 connect 建立时都初始化为 0。
- 发送数据包时,对于 SN 字段,若数据包为新传,则设置为自身 transmitSeqNum 取值,否者与上一次传输一致;对于 NESN 字段,始终设置为自身 nextExpectedSeqNum 取值。
- 接收数据包时, transmitSeqNum 和 nextExpectedSeqNum 按照如下原则进行更新,若 SN 字 段 与 自 身 nextExpectedSeqNum 一 致 , 则 表 明 该 数 据 包 为 重 传 ,nextExpectedSeqNum 不变;否者为新传,并且需要将自身 nextExpectedSeqNum 取反。若 NESN 字段与自身 transmitSeqNum 一致,则表明接收到 NACK,即上一次自己发送的数据包失败,需要重发;否者表明收到 ACK,需要发送新的数据包,并且将将自身 transmitSeqNum 取反。若接收到的数据包 CRC 错误,则不更新 transmitSeqNum 和 nextExpectedSeqNum,并重发上一次自己发送的数据包(判定收到了 NACK)
- Master(或 Slave)发送 LL_TERMINATE_IND PDU 到 Slave(或 Master),同时启动定 时器(Tterminate);
- Slave(或 Master)收到后回复 ACK,同时关闭 connect;
- 收到 ACK 的 Master (或 Slave)则判定 connect 关闭。
- 若 Master(或 Slave)没有收到 ACK,其在 Tterminate 超时后仍然判定 connect 关闭,不在 发送数据包。
- 若 Slave(或 Master)一直没有收到 LL_TERMINATE_IND PDU,则可由于SUPERVISION TIMER 超时而断开 connect。