内部转载:BLE中的连接参数更新

发布时间 2023-09-11 14:02:03作者: 不回本不改名

一、连接参数说明

1、连接事件(Connection Event)和连接间隔(Connection Interval)

连接事件是指主设备和从设备之间相互发送数据包的过程。每个连接事件都是由Master发起包,再由Slave回复。主设备和从设备可以在一个连接事件中发送多个包。主设备和从设备都有一个16位的连接事件计数器(connEventCounter),它在第一个连接事件时设置为零,产生新的连接事件时就加一,该计数器用于同步链路层控制程序(LLCP)。

连接间隔决定了主设备和从设备两个连续的连接事件之间的时间长度。参数interval_min(最小连接间隔)和interval_max(最大连接间隔)描述了连接间隔的取值范围,这两个参数用于从设备向主设备提供一个范围时使用,连接间隔的最终取值由主设备决定。

 

2、从设备延迟(Slave latency)

从设备延迟是指从设备可以跳过的连接事件的次数。在没有数据要发送的情况下,允许从设备跳过一定数目的连接事件,在这些连接事件中不必回复主设备的包,达到省电的目的。上图表示从设备延迟为3的交互情况。

 

3、监控超时(Supervision Timeout)

监控超时设定了一个超时时间,如果主设备和从设备在这个时间内没有发生通信的话,就会自动断开。

参数应满足:监控超时 > (从设备延迟 + 1) * 连接间隔 * n , n >= 2

注:关于n的取值,《低功耗蓝牙开发指南》中建议取值为6,原文如下:

如果将从设备延迟设为可行的最大值,在监控超时发生前从设备只能获取唯一一次的侦听主设备的机会,这并不是一个好的处理方法。因此,建议至少给从设备留出6次侦听的机会,如果连接间隔为100ms,从设备延迟为9,那么监控超时应该至少为6S,这样一来,链路在最终断开前从设备至少会有6次侦听的机会。

n的取值过小会降低链路的容错能力,过大时也会导致当对端设备断电时,需要等待较长的时间才会上报设备断开信息,n的取值可以根据实际应用情况调整。

 

连接参数在不同的配置情况下,将对通信速率和功耗产生影响:

  • 连接间隔缩短,主设备和从设备通信更加频繁,缩短数据发送周期,提高数据发送速度,增加功耗。
  • 连接间隔增长,主设备和从设备通信频率降低,增长数据发送周期,降低数据发送速度,降低功耗。
  • 从设备延迟加大,将减少从设备回复主设备的次数,降低从设备的功耗。

 

4、连接间隔和从设备延迟的应用

增大连接间隔可以有效降低设备的功耗,但同时也会降低数据交互的实时性。在部分应用场景中,我们希望既能降低功耗,又能保证数据的实时性。在这种情况下,可以通过连接间隔和从设备延迟的配合使用,来达到需求。我们通过下面ble鼠标的应用来说明该场景的具体实现。

(以下举例中的参数是为了方便说明,不代表实际应用的参数。)

在ble鼠标应用中,需要保证用户的点击动作能够及时的发送给电脑,这样用户才能有很好的体验感。那么要确保点击动作的数据能及时发送给电脑,就需要有较短的连接间隔。如下图连接间隔为100ms:

这样用户的点击动作(下图红色块标识的位置)可以在下一个连接事件中发送给电脑(最多延时100ms),有较好的体验感:

但这时鼠标不得不每100ms响应一次,这样就导致鼠标需要频繁的从低功耗状态唤醒去响应空包,增加鼠标的功耗。而鼠标大部分时间是没有数据需要发送的。

 

A.当我们想要降低鼠标的功耗时,我们可以怎么做?

这时增大连接间隔是一个很好的选择。

如图,将连接间隔设置为1S,那么鼠标只需要1S响应一次,相比上面连接间隔为100ms的情况,能够有效降低功耗。但这时,如果用户在红色块位置点击鼠标按键,那么电脑就只能在接近1S后才会收到这个事件,用户体验感极差,这是不允许的。

 

B.那么有没有方法,既能降低鼠标的功耗,又能保证鼠标可以及时将用户的点击事件发送给电脑呢?

这时可以使用从设备延迟参数。

如下图,连接间隔为100ms,从设备延迟为9的情况:

这样鼠标在没有数据要发送时,只需要在每10次连接事件中响应一次,在其它连接事件发生时保持静默。这时鼠标的功耗就和上面连接间隔为1S时的功耗一样了。

如果这时,也发生点击事件,那么鼠标会在什么时候将这个数据发送给电脑?会不会是在1S后的第十次连接事件中发送?看下图:

 

从上面两种情况中可以看到,鼠标并不会等到第十次连接事件才发送数据,而是在点击事件发生的下一次连接事件中发送,发送完毕后鼠标再次进入低功耗状态。也就是说在这种情况下,点击事件会在一次连接间隔(100ms)内发送给电脑,满足数据及时性的要求。

在这里我们要明确一点,从设备延迟为9,并不是表示从设备在这9次连接事件中不能发送数据,而是表示允许从设备最多连续9次不响应主设备的包。当从设备有数据需要发送时,在这9次连接事件中是可以去响应的。

从该例程中我们发现,当连接间隔为100ms,从设备延迟为9时,鼠标既可以保证低功耗要求(1S响应一次),又可以保证数据能及时发送给电脑(最多延迟100ms)。

 

二、连接参数更新流程

1、连接参数更新 - LLCP

当主设备和从设备都支持连接参数请求链路层控制程序(LLCP)。主设备需要更新连接参数时,可向从设备发送连接参数更新请求(LL_CONNECTION_PARAM_REQ),也可直接通知从设备更新参数(LL_CONNECTION_UPDATE_IND)而不需要进行协商;从设备需要更新连接参数时,需要向主设备发送连接参数更新请求(LL_CONNECTION_PARAM_REQ)。

无论是由主设备发起的连接参数更新请求还是从设备发起的连接参数更新请求,都只能由主设备发起连接参数更新通知来应用新的连接参数。

1.1 LLCP连接参数更新流程

说明:

1、若接收方不能正确解析LL_CONNECTION_PARAM_REQ PDU(不支持该控制报文),则回复LL_UNKNOWN_RSP PDU,表示接收方无法解析这个请求。连接双方继续使用之前的连接参数进行交互。

2、接收方为从设备。

  • 若从设备不接受LL_CONNECTION_PARAM_REQ PDU中的参数要求,则回复LL_REJECT_EXT_IND PDU,表示从设备拒绝该请求。连接双方继续使用之前的连接参数进行交互。
  • 若从设备接受连接参数更新请求,则回复LL_CONNECTION_PARAM_RSP PDU,然后主设备发送LL_CONNECTION_UPDATE_IND 指令,进入连接参数更新流程。

3、接收方为主设备。

  • 若主设备拒绝LL_CONNECTION_PARAM_REQ PDU中的参数要求,则回复LL_REJECT_EXT_IND PDU。连接双方继续使用之前的连接参数进行交互。
  • 若主设备接受连接参数更新请求,则直接发送LL_CONNECTION_UPDATE_IND 指令,进入连接参数更新流程。

4、当主设备没有发出LL_CONNECTION_PARAM_REQ,而是直接发送LL_CONNECTION_UPDATE_IND 指令时。若从设备支持LL_CONNECTION_UPDATE_IND PDU中的连接参数,则进入连接更新流程;若从设备不支持该连接参数,则断开连接。

 

 

1.2 LLCP连接参数更新请求 0x0F

连接过程中,设备根据自身应用需求,需要修改连接参数,可以发送连接参数更新请求(LL_CONNECTION_PARAM_REQ),控制包操作码:0x0F。

  • Interval_Min:指示连接间隔的最小值,单位1.25ms。
  • Interval_Max:指示连接间隔的最大值,单位1.25ms。
  • Latency:指示期望的从设备延迟。
  • Timeout:指示期望的监控超时,单位10ms。
  • PreferredPeriodicity:指 示 期 望 的 连接间隔 集 合 ,单位1.25ms。连接间隔 = PreferredPeriodicity * k,例如,当“PreferredPeriodicity”取值为100时,表示期望连接间隔为125 ms的整数倍。注意PreferredPeriodicity 不能大于Interval_Max。
  • ReferenceConnEventCount:与 Offset0~5 一起指示新参数生效的时间点,取值范围 0~65535。
  • Offset0~5:与 ReferenceConnEventCount 起指示新参数生效的时间点即可,单位为 1.25ms,从 Offset0 到 Offset5 优先级依次降低,取值范围 0~65535,取值 65535表示无效值。

抓包数据展示:

 

1.3 LLCP连接参数更新响应 0x10

从设备收到主设备发送的连接参数更新请求(LL_CONNECTION_PARAM_REQ)后,如果接受该请求中的连接参数,需要返回连接参数更新响应(LL_CONNECTION_PARAM_RSP)。而主设备收到从设备发送的连接参数更新请求(LL_CONNECTION_PARAM_REQ)后,如果接受该请求中的连接参数,直接发送连接参数更新指令(LL_CONNECTION_UPDATE_IND)。

连接参数更新响应(LL_CONNECTION_PARAM_RSP)控制包操作码:0x10。

连接参数更新响应(LL_CONNECTION_PARAM_RSP)数据包的内容,和连接参数更新请求(LL_CONNECTION_PARAM_REQ)数据包参数内容一样。

 

2、连接参数更新 - L2CAP

当主设备或从设备不支持连接参数请求链路层控制程序(LLCP)。主设备需要更新连接参数时,可直接通知从设备更新参数(LL_CONNECTION_UPDATE_IND);从设备需要更新连接参数时,需要向主设备发送L2CAP连接参数更新请求(Connection Parameter Update Request),主设备将回复L2CAP连接参数更新响应(Connection Parameter Update Response),并决定是否更新连接参数。

 

2.1 L2CAP连接参数更新流程

 

2.2 L2CAP连接参数更新请求 0x12

L2CAP连接参数更新请求(Connection Parameter Update Request),属于逻辑链路控制和适配协议(L2CAP)的信令命令,命令代码:0x12。该命令只能由从设备发送给主设备。包格式:

  • Interval Min:指示连接间隔的最小值,单位1.25ms。
  • Interval Max:指示连接间隔的最大值,单位1.25ms。
  • Slave Latency:指示期望的从设备延迟。
  • Timeout Multiplier:指示期望的监控超时,单位10ms。

抓包数据展示:

 

2.3 L2CAP连接参数更新响应 0x13

当主设备收到L2CAP连接参数更新请求(Connection Parameter Update Request),无论主设备是否接收该请求,都必须回复L2CAP连接参数更新响应(Connection Parameter Update Response)。

L2CAP连接参数更新响应(Connection Parameter Update Response),同样属于逻辑链路控制和适配协议(L2CAP)的信令命令,命令代码:0x13,包格式:

Result:表示主设备对连接参数更新请求的响应,值为0表示接收,值为1表示拒绝。

抓包数据展示:

 

3、连接参数更新指令

连接参数更新指令(LL_CONNECTION_UPDATE_IND),该指令只能由主设备发送给从设备。控制包操作码:0x00。

  • WinSize:更新连接参数时,从设备开窗接收的时间,单位1.25ms。
  • WinOffset:接收窗口偏移量,单位1.25ms。Interval:新的连接间隔参数。
  • Latency:新的从设备延迟参数。
  • Timeout:新的监控超时参数。
  • Instant:瞬时,表示主从设备更改连接参数的起始位置。连接过程中,主从设备都会维护一个连接事件计数器(connEventCounter),更新连接参数时,约定当计数值等于Instant时,主从设备使用新的连接参数进行交互。

抓包数据展示:

 

主设备发送LL_CONNECTION_UPDATE_IND 指令时。若从设备支持LL_CONNECTION_UPDATE_IND PDU中的连接参数,则进入连接更新流程;若从设备不支持该连接参数,则断开连接。

 

三、补充说明

1、为什么会返回LL_UNKNOWN_RSP?

在发送连接参数更新请求(LL_CONNECTION_PARAM_REQ)时,对端设备返回LL_UNKNOWN_RSP。

这种情况是对端设备不支持通过链路层控制程序(LLCP)来更新连接参数。这个是由协议栈实现的,在SDK应用层没有开放配置方法的情况下,该问题需要联系厂商处理。

出现这种情况,并不是一种错误状态。一般设备在不支持通过链路层控制程序(LLCP)来更新连接参数的情况下,会支持通过逻辑链路控制和适配协议(L2CAP)来更新连接参数。

可通过LL_FEATURE_REQ 或 LL_SLAVE_FEATURE_REQ指令获取设备支持的特征。ble特征列表如下:

其中bit1:Connection Parameters Request Procedure ,所指示的便是设备是否支持通过LLCP来更新连接参数。值为1表示支持,为0表示不支持。

如下图抓包数据即表示不支持:

 

2、Instant(瞬时)参数

在连接参数更新指令(LL_CONNECTION_UPDATE_IND)的参数中Instant(瞬时)是怎么确定的。

该参数是由主设备决定的,每个厂商都有自己的计算方式。一般为了降低信号干扰的影响,Instant指定的连接事件到来前,需要保证从设备至少能有6次侦听的机会。

《低功耗蓝牙开发指南》中关于Instant(瞬时)的建议,原文如下:

瞬时实际上是一个连接事件的计数器,相应的连接事件到来时就使用新的参数。为了让从设备收到数据包,主设备必须为其提供足够的机会。不管从设备延迟是多少,都应该至少保证六次数据发送机会。也就是说,如果从设备延迟为500ms,那么瞬时通常被设定在3s之后的某个未来时刻。