BLE简述
- BLE(低能耗蓝牙)首次出现在蓝牙规范4.0版本中。BLE是作为其前身经典蓝牙BR/EDR的替代。下图是传统蓝牙(BT)与BLE的区别,从图可知相比BT,BLE的功耗小,支持距离大。
BLE除了点对点通信,还支持广播模式:允许一个设备同时向无限数量的接收者传输数据。每个设备都能与网络中的任何其他设备进行通信。其中,点对点通信包括面向连接通信以及无连接通信,广播模式只有无连接通信(废话QAQ)。
BLE的频段和WIFI一样都是2.402 – 2.480 GHz,每个信道之间间隔为2hz,因此有40个信道。其中37,38,39为广播信道,这里需要说明37,38,39只是逻辑顺序(即Channel Index),从物理信道上看是隔着好几条信道的,这是因为要防止收到数据传输信道的干扰导致三条广播信道全部无法正常工作。其它37个为数据传输信道。下表为蓝牙官方给出BLE与经典蓝牙的区别。
Attribution | Bluetooth Low Energy (LE) | Bluetooth Classic |
---|---|---|
频段范围 | 2.4GHz ISM Band (2.402 – 2.480 GHz Utilized) | 2.4GHz ISM Band (2.402 – 2.480 GHz Utilized) |
信道 | 40 channels with 2 MHz spacing (3 advertising channels/37 data channels) | 79 channels with 1 MHz spacing |
通道使用信息 | FHSS(跳频) | FHSS(跳频) |
调制技术 | GFSK | GFSK, π/4 DQPSK, 8DPSK |
传输速率 | LE 2M PHY: 2 Mb/s LE 1M PHY: 1 Mb/s LE Coded PHY (S=2): 500 Kb/s LE Coded PHY (S=8): 125 Kb/s | EDR PHY (8DPSK): 3 Mb/s EDR PHY (π/4 DQPSK): 2 Mb/s BR PHY (GFSK): 1 Mb/s |
发射速率 | ≤ 100 mW (+20 dBm) | ≤ 100 mW (+20 dBm) |
Rx Sensitivity | LE 2M PHY: ≤-70 dBm LE 1M PHY: ≤-70 dBm LE Coded PHY (S=2): ≤-75 dBm LE Coded PHY (S=8): ≤-82 dBm | ≤-70 dBm |
数据传输 | Asynchronous Connection-oriented Isochronous Connection-oriented Asynchronous Connectionless Synchronous Connectionless Isochronous Connectionless | Asynchronous Connection-oriented Synchronous Connection-oriented |
通信手段 | Point-to-Point (including piconet) Broadcast Mesh | Point-to-Point (including piconet) |
Positioning Features | Presence: Advertising Direction: Direction Finding (AoA/AoD) Distance: RSSI, HADM (Coming) | None |
- 想想蓝牙的应用,如手机与蓝牙耳机、电脑与无线鼠标,显然他们是C/S架构。一般而言设备提供服务,因此设备是server,手机使用设备提供的服务,因此手机是client。我们称client为主机,server为从机。
- 对于蓝牙服务端设备而言(注意我们只关注BLE通信),它们收集信息存储起来,客户端发送一条命令实际上就是获取服务端存储起来的数据。因此可以说服务其实就是各种有价值的数据。
BLE规格
官方文档截的图,目前还不太能理解,等理解深刻之后才回来看看。
物理信道
在总结中已经提到,BLE 工作在 2.4GHz 的频段上,分为 40 个 RF 信道,每个信道间隔2MHZ。同一时刻,只能用一个信道进行数据的传输/接收。
这 40 个 RF Channel 上,并不是平等的, 可以看到SIG 把物理信道转换成为一个叫做 Channel Index 。物理信道从 0 - 39 进行编号。而Channel Index为PHY Ch0 对应 37,PHY Ch12 对应 38,PHY 39 对应 39:
问:为什么这三个广播信道之间隔好几个信道?
答:因为如WIFI也用的2.4GHZ,很有可能蓝牙信号被干扰,而广播信道隔开设计就是为了避免数据信道被干扰导致广播信道不可用。偷个图说明:
除了 37、38、39 这些频段,在 Connection 状态下使用了 其他的 37 个 Channel,通过跳频技术(Hopping),来减少数据干扰,增强系统的可靠性。
BLE协议栈
协议栈层次结构
下图说明了BLE的协议栈构成。可以看到本身蓝牙官方定义协议栈是由Profiles,HOST主机和Controller控制器组成。 其中在HOST和Controller之中由主机控制器接口(HCI)连接,HCI是它们之间的逻辑接口,注意不是物理组件。在底层物理传输方面,HCI可以用许多不同的方式实现,但逻辑或功能接口总是相同的。
为了更好理解我们把协议栈分为应用层,协议栈以及radio。协议栈之上就是application应用层,也叫Profiles,一个Profile就是一个功能。比如电池,睡眠,心率这些常见蓝牙设备提供的功能。
可以看到BLE协议栈自成体系。
协议栈各层/协议职能
知识还是比较多的,先总结一下各层职能,之后再详细去看。
Physical Layer 物理层
物理层定义了无线电发射器/接收器如何用于编码和解码数字数据的传输和接收,以及其他适用的无线电相关参数和属性。
Link Layer 链路层
LL层是整个BLE协议栈的核心。这一层定义了空中接口数据包的格式,具体在哪一个时间点把数据包发送出去,怎么保证数据的完整性,ACK如何接收,如何进行重传,以及如何对链路进行管理和控制等等。LL层不负责解析,只规定格式,对数据进行怎样的解析则交给上面的GAP或者ATT。
HCI 主机-控制-接口
HOST和Controller之间的桥梁。为HOST和Controller之间的命令和数据的双向通信提供一个明确的功能接口。
L2CAP层
对上层进行多路复用,支持对上层PDU的分割和重组,支持流量控制。LL只关心传输的数据自己,L2CAP就要区分是加密通道仍是普通通道,同时还要对链接间隔进行管理。
ATT 数据交互协议
ATT层用来定义用户命令及命令操作的数据,它的关键就是命令。
ATT命令可以大致分为4类:read读,write写,notify(通知)和indicate(指示)。这些命令又可以分成两种:如果它需要response,那么会在相应命令后面加上request;相反,如果它只需要ACK而不需要response,那么它的后面就不会带request。ATT的每个命令发出去之后,会立马等ACK信息,如果收到了ACK包,发送方认为命令完成;否则发送方会一直重传该命令直到超时导致BLE连接断开。
BLE协议栈中,开发者接触最多的就是ATT。BLE引入了attribute概念,用来描述一条一条的数据。Attribute除了定义数据,同时定义该数据可使用的ATT命令,所以这一层被称为ATT层。注意:ATT也是蓝牙空口包中的最上层
SMP 安全管理层
SMP用来管理BLE链接的加密和安全,如何保证链接的安全性,同时不影响用户的体验。
GATT
GATT用来规范attribute中的数据内容,并运用group(分组)的概念对attribute进行分类管理。没有GATT,BLE协议栈也能跑,但互联互通就会出问题,也正是由于有了GATT和各类各样的应用profile,BLE摆脱了ZigBee等无线协议的兼容性困境,成了出货量最大的2.4G无线通讯产品。
GAP
定义了在非连接状态下可使用的操作模式和程序,比如发起广播,扫描和发起连接。定义了安全级别和模式。
BLE连接状态及过程
BLE设备有七种状态:
就绪态 Standby
可以理解为摆烂状态。
处于就绪态的链路层什么也不干,一旦链路层接收到应用层指令那么设备就会进入到相应的状态,一旦设备空闲下来,则又会进入就绪态。
广播态 Advertising
广播态的功能,就是让周围设备能够发现自己。
处于广播态的链路层会发送广播报文,该报文会被周围设备搜索并解析出来,广播报文的内容包括了设备是否可被连接,设备的名字,设备的地址,设备提供的服务及其他相关信息。收到广播报文的设备可以发送回应报文,广播态的链路层还可以监听这种回应报文,并作出响应。
扫描态 Scanning
扫描态的主要功能,就是接受广播报文以发现周围的设备。扫描过程可以分为主动扫描和被动扫描。
被动扫描,就是监听(广播)信道,并且不会向周围发送任何报文,周围设备发送的非定向广播报文都可以被接收到。非定向报文是指,没有指定报文接收地址的报文。
主动扫描,就是主动发出扫描请求的报文,处于广播状态的链路层会监听这种报文,收到广播报文后还可以发送报文询问详细信息,接收方收到报文后会发出回应报文,这种回应报文是定向报文,只能被发出扫描请求的设备接收并解析出来。
连接态 Connecting
连接态,顾名思义就是设备连接建立完成之后的状态,从应用层的角度来看,两个设备已经成功建立了物理连接,并且可以交互用户数据了。
发起态 Initiating
发起态,是准备发起连接到连接完成前的一段状态,它的功能是完成连接所需要的所有过程。
等时广播状态 Isochronous Broadcasting
等时广播状态可以通过广播通道发送BIS(Broadcast Isochronous Stream) 数据报文,由Standby状态进入。想向一定区域内其它设备广播同步数据流(比如音频数据流)的设备需要处于Isochronous Broadcasting状态,处于该状态的设备称为Isochronous Broadcaster。处于Isochronous Broadcasting状态的链路层状态机应发送由一个或多个BIS 组成的BIG(Broadcast Isochronous Group),每个BIG最多包含31个BIS,每个BIS承载一个单独的同步数据流。传输第一个BIS 数据报文后链路层应通知主机,若停止同步广播则回到Standby状态。
总而言之,这玩意儿有点像并发,貌似QOS的拥塞控制的定制队列也是这个思想(把数据包分成不同的队列,轮询的向队列取数据,每次只取一个)
同步接收状态 Synchronization
可以通过广播通道接收BIS同步数据流,由Standby状态进入。Synchronization状态可用于侦听一定区域内的BIS广播同步数据流(比如音频数据流),处于Synchronization状态并且正在接收同步数据包的设备称为Synchronized Receiver,只能单向接收BIG,如果在主机指定时间内未侦听到任何有效BIG,处于该状态的设备将回到Standby状态并通知主机。
Isochronous Broadcaster — Synchronized Receiver
给出一篇博客的例子。
等时广播者与同步接收者之间通过广播信道传输同步数据流BIS(比如音频数据流),等时同步广播通信也是一种一对多的通信方式,是在Bluetooth 5.2 中新增的,同样只能进行单方向通信,比如可以让听讲座的众多观众借助支持该通信模式的蓝牙耳机同步听到一个演讲者等时广播的音频数据流;
常见连接示例
比如手机A要连接华为手环B,首先华为手环B进入广播态向周围设备发起广播报文,A进入扫描态通过scanner模块接受B发的广播报文,发现该设备信息后,A进入发起态,向B发起连接请求,B接收到连接请求后,确认是与本身通讯向广播者发响应信息,这样当广播者和接受者都有了对方的身份信息时,即表示双方连接成功,A、B进入连接态。
手机A: Standby—->Scanning—->Initiating—->Connection
华为手环B:Standby—->Advertising—->Connection
此时我们把手机A称为主机,华为手环B称为从机。
参考文献
1.https://www.cnblogs.com/iini/p/12334646.html
2.http://www.javashuo.com/article/p-ajgbndml-nv.html
3.https://blog.csdn.net/linan101/article/details/110478851
4.https://blog.csdn.net/m0_37621078/article/details/107697019