低功耗蓝牙 BLE 之连接事件、连接参数和更新方法
连接事件
在一个连接当中,主设备会在每个连接事件里向从设备发送数据包。一个连接事件是指主
设备和从设备之间相互发送数据包的过程。连接事件的进行始终位于一个频率,每个数据
包会在上个数据包发完之后等待 150μs 再发送。
连接间隔决定了主设备与从设备的交互间隔;它是指两个连续的连接事件开始处的时间距
离,可以是 7.5ms ~ 4s 内的任意值,但必须为 1.25ms 的整数倍。要确定从设备与主设备
的实际交互间隔,需要用到从设备延迟这一参数,代表从设备在必须侦听之前可以忽略多
少个连接事件。
如下图所示,连接事件被一个个的连接间隔分开。从主设备发送数据包开始,每个连接事
件可以持续进行,直至主设备或从设备停止响应。在连接事件之外,主从设备之间不发送
任何数据包。
举个例子,如果连接间隔为 100ms,从设备延迟是 9,那么从设备可以忽略 9 个链接事
件,但不得不侦听第 10 个连接事件。换言之,从设备必须每秒侦听一次,而此时监控超
时的最小值应为 1010ms。反过来,另一个极端的例子是,如果监控超时使用了 32s 的最
大值,对于间隔为 100ms 的链路,从设备延时必须小于等于 319。
虽然如此,如果将从设备延迟设为可行的最大值,在监控超时发生前从设备只能获得唯一
一次侦听主设备的机会,这可不是一个好主意。因此,建议至少给从设备留出 6 次侦听的
机会。在前面的例子中,如果连接间隔为 100ms ,从设备延迟为 9,那么监控超时应该至
少为 6s,这样一来,链路在最终断开前从设备至少会有 6 次侦听的机会。
连接参数介绍
主设备和从设备建立连接之后,所有的数据通信都是在连接事件(Connection Events)中
进行的。
尖刺的波就是连接事件(Connection events),剩下的 Sleeping 是睡眠时间,设备在建立
连接之后的大多数时间都是处于 Sleeping,这种情况下耗电量比较低,而在连接事件
(Connection events)中,耗电量就相对高很多,这也是 BLE 为什么省电的原因之一。
每个连接事件(Connection events)中,都需要由 Master 发起包,再由 Slave 回复。
Master 即主机,简称 M;Slave 即从机,简称 S。抓包过程中看到的 M->S 或者 S->M 即
主机到从机或者从机到主机。
连接参数 (Connection Parameters):
通过修改下面三个参数,就可以设置 BLE 连接过程中的传输速度和功耗。
1.Connection Interval(连接间隔)
Connection Interval
(GAPROLE_MIN_CONN_INTERVAL && GAPROLE_MAX_CONN_INTERVAL)连接间隔,在
BLE 的两个设备的连接中使用跳频机制。两个设备使用特定的信道发送和接收数据,然后
过一段时间后再使用新的信道(BLE 协议栈的链路层处理信道的切换)。两个设备在切换信
道后发送和接收数据称为一个连接事件。尽管没有应用数据被发送和接收,两个设备仍旧
会交换链路层数据(空包 Empty PDU)来维持连接。
这个连接间隔就是指在一个连接事件(Connection events)的开始到下一个连接事件
(Connection events)的开始的时间间隔。连接间隔以 1.25ms 为单元,连接间隔的范围是
6 ~ 3200 既 7.5ms ~ 4s 之间。
2.Slave Latency(从设备延迟或者从设备时延)
允许 Slave(从设备)在没有数据要发的情况下,跳过一定数目的连接事件
(Connection events),在这些连接事件(Connection events)中不必回复 Master(主设
备)的包,这样就能更加省电。
范围可以是 0 ~ 499
更详细的使用解析如下:
Slave Latency = OFF 也就是 Slave Latency 为 0 时,Master 发包,Slave 必须回复,如果不
回复,Master 就会认为 Slave 那边接收不正常。
Slave Latency = ON 也就是 Slave Latency 不为 0 的时候,图中 Slave Latency 为 3。Master
发包,Slave 没有数据要回复的时候,就会忽略 3 个连接事件,在第 4 个连接事件接收到
Master 发送的数据之后,回复 Master。如果 Slave 有数据要发送就会唤醒,也就是说即使
Slave Latency 为 3,但是在 Master 发第二包的时候 Slave 有数据要回复,这个时候就会立
即回复 Master 而不是等到 3 个连接事件之后的第 4 个连接事件去回复。
3.Supervision Timeout(超时时间或者监控超时)
这个参数设定了一个超时时间,如果 BLE 在这个时间内没有发生通信的话,就会自动断
开。
单位是 10ms,该变量的范围是 10 ~ 3200,折算成时间范围是 100ms ~ 32s 。
连接间隔、从机时延以及超时时间这三者必须满足如下公式:
Supervision Timeout > (1 +slaveLatency)* (connectionInterval)
上述公式必须满足,否则连接就会不正常断开。
这三个连接参数不同情况下对通信速率和功耗的影响:
1.Connection Interval 缩短,Master 和 Slave 通信更加频繁,提高数据吞吐速度,缩短了数
据发送的时间,当然也增加了功耗。
2.Connection Interval 增长,通信频率降低,数据吞吐速度降低,增加了数据发送的时间,
当然,这种设置降低了功耗。
3.Slave Latency 减少或者设置为 0,每次 Connection Events 中都需要回复 Master 的包,功
耗会上升,数据发送速度会提高。
4.Slave Latency 加长,功耗下降,数据发送速度降低。
连接参数更新规程
连接建立时,主设备通过链接请求数据包发送连接参数。当连接活跃了一段时间,连接参
数也许不再适用于当前使用的服务。出于提高效率的目的,连接参数需要进行更新。较之
首先断开连接、接着更换新参数重新连接,还有一种在链路中更新参数更为简单的途径,
如下图所示:
为此,主设备向从设备发送连接更新请求,即 LL_CONNECTION_UPDATE_REQ,当中携带
了新的参数。这些参数不必进行协商,从设备或者接受和使用它们,或者断开链路。连接
更新请求中包含了早先创建连接时用过的一部分参数,还有一个称为瞬时(instant)的新
参数:
1.传输窗口大小
2.传输窗口偏移量
3.连接间隔
4.从设备延迟
5.监控超时
6.瞬时
瞬时参数决定了连接更新的开始时刻。发送消息时,主设备为连接更新选定一个未来的时
间点,并且放在消息中。接到消息后,从设备会记住这个未来的时刻,届时再切换至新的
连接参数。这有助于解决无线系统里的一个最大问题----报文重传。只要数据包的重传次
数足够,并最终在瞬时之前传输成功,上述过程执行起来就不会有问题。但是,如果该数
据包届时没能完成传输,链路就有可能丢失。
由于低功耗蓝牙没有时钟,要决定瞬时时刻只有依靠计算连接事件的个数。因此,每一个
连接事件都会被计数,链路上的第一个连接事件,也就是在连接请求之后的位于首个传输
窗口里的连接事件记为 0。因此,瞬时实际上是一个连接事件的计数器,相应的连接事件
到来时就使用新的参数。为了让从设备收到数据包,主设备必须为其提供足够的机会。不
过从设备延迟是多少,都应该至少保证 6 次数据发送机会。也就是说,如果从设备延迟
为 500ms,那么瞬时通常被设定在 3s 之后的某个未来时刻。
瞬时到来时,从设备开始侦听发送窗口,就好像连接建立的过程那样。主设备能够调整从
设备的计时,总体而言不超过 1.25ms。不过,由于主设备可能还是一个经典蓝牙设备,上
述调整使其得以协调低功耗蓝牙从设备,从而更好地完成调度。一旦该过程结束,新的连
接间隔、监控超时、从设备延迟值将投入使用。
连接参数的修改
“连接参数更新请求”命令可以让从设备更新链路层的连接参数,如下图所示。这些参数包
括连接间隔(从设备希望主设备允许从设备发送数据包的频率)、从设备延迟(从设备能够
忽略主设备的连接事件的最大值)以及监控超时。
在连接中,如果从设备希望修改当前的连接参数则可以使用该命令。比方说,如果连接事
件的间隔有可能太快了,导致过多的电量浪费。这在从设备时延很大时没有问题,但如果
不是这样,从设备将会频繁的侦听链路。这在一些情况下是必要的,例如设备间首次绑
定、互发多个数据包、探索服务和设备特性等。但在很多其他情况下,尽可能地减少从设
备必须侦听连接事件的数量对提高电池寿命至关重要。
连接参数更新请求命令仅用于从设备向主设备发送,这是由于主设备随时都能启动链路层
连接参数更新控制(Connection Parameter Update Control)规程。如果该命令由主设备发
送,从设备会将其视为一个错误,并返回带有“命令不理解”原因代码的“命令拒绝”命令。
从设备可以在任何时候发送该命令;收到该信息的主设备如果可以修改连接参数,则将返
回“连接参数更新响应”(Connection Parameter Update Response),其中的结果代码设为
“接受(accepted)”。随后,主设备将会启动链路层连接参数更新控制规程。
当然,如果主设备不同意从设备的请求参数,它可以发送结果代码为“拒绝(rejected)”的
连接参数更新响应命令以拒绝请求。此时从设备有两个选择:要么接受主设备希望的正在
使用的连接参数,要么终止连接。终止连接的做法咋看起来可能让人觉得很激进,但是,
假如使用当前的参数从设备将会在一周内耗尽电量,而使用请求的参数则可以持续数年,
很明显,合理的选择只有一个。
修改连接参数时,如果要减少主设备拒绝从设备请求的可能性,可以在请求里设置一个可
接受的参数范围。经过精心设计的从设备会乐意接受很宽的参数范围。由于主设备可能正
忙于实时会话音频连接或者高质量语音连接等任务,它可以接受一定范围内的连接间隔参
数。设备可接受的间隔参数会根据当前任务的不同而不同,可能有别于上一次设备连接时
的参数。
要提高主设备接受连接参数的机率,还有个方法是从设备提供一个合理的从设备延迟。主
设备可以选择最合适的连接事件间隔,从设备则使用最佳功耗的从设备延迟参数。
举个例子,如果从设备想每 600ms 同步一次,它可以请求范围 100ms ~ 750ms 的连接间
隔参数,并带上从设备延迟 5。如果主设备选择 100ms,则从设备每 6 个连接事件同步一
次;如果主设备选择 200ms,则从设备每 3 个连接事件同步一次,实现其所期望
的 600ms 间隔;如果主设备选择 300ms,则从设备忽略每隔一个连接事件同步一次;如果
主设备选择 400ms,则从设备每 400ms 同步一次。
下面介绍一下在 TI 的 CC2540 和 CC2541 中,连接参数修改的方法。
(一)连接成功建立之后从设备自动申请修改连接参数。