BLE 连接参数(原文)
有几个参数影响中央和外围设备之间的连接。 这反过来影响设备的功耗:设备上的无线电活动越多,消耗就越大。
setAdvertisingInterval()
当外围设备处于广告模式时,它以固定的间隔发送短达20毫秒或长达10.28秒的广告包。 短时间间隔允许中央设备快速找到外设,但由于需要频繁的无线电工作,因此功耗较高。 因此,它是速度和电池使用时间之间的平衡。
广告间隔完全在外围设备的控制之下。 这与其他连接参数不同,如下所示,哪些参数是中央设备可以忽略的建议。
间隔使用BLE_API的这个BLEDevice类中的setAdvertisingInterval()函数设置。 该函数接受以毫秒为单位的值。
ble.setAdvertisingInterval(1000); // one second
注意:
1. 如果设置为0,广告将被禁用。
2. 当连接模式为ADV_CONNECTABLE_DIRECTED(意味着只接受来自预先定义的中央设备的连接)时,应将其设置为0(即禁用)。
3. 如果设置的值低于最小值(20),则会自动使用最小值。
连接间隔和从设备延迟(Connection interval and slave latency)
当外围设备和中央设备之间的连接建立(连接模式)时,中心决定与外设同步的频率(how often)。 这个决定是单方面的:外围设备不能对中央强制任何东西。 但是,它可以提出中央可能选择尊重的建议。
外设的建议是使用三个参数: MIN_CONN_INTERVAL (最短间隔)和MAX_CONN_INTERVAL (最长间隔),它们一起描述了间隔范围; 以及SLAVE_LATENCY,它定义了外设可以忽略连接事件的次数。
连接间隔(Connection interval)
间隔(interval)参数以毫秒为单位接收值。 例如,以下代码表示最短间隔时间为250毫秒,最长时间为350毫秒:
#define MIN_CONN_INTERVAL 250 //250 milliseconds
#define MAX_CONN_INTERVAL 350 //350 milliseconds
连接间隔不能小于7.5毫秒或长于4秒。 中央将选择由外设建议的最小值和最大值之间的值,或强制实现其自身的值。 重要的是要明白,虽然外设可以建议一个范围(两个值),但最终只能使用一个值。 这是因为同步本身必须始终以固定的间隔发生,而不是范围上的随机点。 这两个参数仅在外围设备向中心提供一个范围时使用。 当中央选择一个值时,它存储在一个新变量中,连接仅指该变量。
连接间隔(Connection interval)是一个误导性的名称; 在每个连接事件中并不会重新尝试新的连接。 相反,在正在进行的连接的上下文中,连接事件允许双方发送和接收数据。具体来说,如果有任何状态更改要报告,BLE设备有机会向客户端发送通知。
从设备延迟 (Slave latency)
理想情况下,当BLE设备(特别是外围设备)处于非活动状态时,需要睡眠才能保持电池。 这意味着它不想处理信息或响应连接事件。 但是,客户端(通常是可充电电话或平板电脑)通常较少受限制,可能会想频繁地与外设同步以保持最新状态。 因此,它将不断地启动连接事件(connection events),唤醒外设。 当外设回答客户端时,尽管没有新的信息,它也浪费了大量的精力。
减轻这种情况的一种方法是使用SLAVE_LATENCY参数。 此参数由中央设备设置,但外设可以根据自己的操作知道提出建议。SLAVE_LATENCY允许外设根据新数据的存在来处理连接事件:
如果没有要发送的新数据,外设可以忽略参数中指定数量的连续连接事件。 这意味着外设可以继续睡眠,尽管客户端尝试同步。
即使没有新数据,外设仍然必须定期响应客户端,以证明连接仍然存在。
如果有新的数据要发送,外设将响应一个连接事件,无论自从上一次响应事件以来已经有多长时间了。
SLAVE_LATENCY参数接受一个整数,指定可以忽略的连接事件数。 例如,以下代码意味着设备可以忽略四个连续的连接事件,但必须响应第五个连接事件:
#define SLAVE_LATENCY 4 // four events can be ignored, the fifth must be met
SLAVE_LATENCY和MIN_CONN_INTERVAL之间的区别是状态依赖。 MIN_CONN_INTERVAL是独立于状态的:即使有新的数据要发送也是如此。 SLAVE_LATENCY与状态相关 :仅当外围设备没有数据时才使用。 这些参数的组合使我们可以有条件地控制我们的无线电使用情况:当有新的信息时,我们会经常进行通信,但是当没有信息时很少。 一个很好的例子是BLE鼠标。 为了节省能源,当用户没有移动鼠标时,我们不想经常使用射频。 但是为了方便使用,当用户使用鼠标时,我们不希望缓慢的通信(慢速通信会使鼠标落后于用户的操作)。 因此,我们将设置一个高延迟,但是最小连接间隔很小。
注意: SLAVE_LATENCY的最大值取决于您使用的堆栈。检查您的供应商的规格。
把它们放在一起
这是一个描述外设和中央之间的交互的图。 请注意,在本例中,我们命名了连接间隔connectionInterval
的变量:
连接监控超时
有时设备会丢失它们之间的连接,例如当它们移出彼此的传输范围时。 这些设备不知道连接是否丢失,但是如果没有从另一方接收到任何信息,他们可以假设已经有足够的时间了。 我们定义为“足够”以确定连接丢失的时间称为超时 。 连接监控超时(Connection Supervision Timeout)参数定义为在假设连接丢失之前等待数据传输的时间。
在我们的示例中,此参数称为CONN_SUP_TIMEOUT,并以毫秒为单位接收值。 例如,以下代码表示超时为6秒:
#define CONN_SUP_TIMEOUT 6000 // six seconds
连接监视超时是中央设备自由忽略的建议。 这限制了我们使用其他参数创建数据传输之间长距离的能力,因为长间隔需要将其他参数与长监控超时相结合。 如果中央拒绝我们的监督超时,同时接受其他参数,它可能设置很长的差距,但短暂的超时。 然后假设我们断开连接。
注意: CONN_SUP_TIMEOUT的最大值取决于您使用的堆栈。检查您的供应商的规格。
最大限度地延长电池寿命
由于连接参数对能源消耗有影响,我们应该考虑一下,即使知道中央可能会选择不遵守我们的建议。 一个考虑因素是我们的连接间隔应该与我们期望生成新数据的速率相匹配。 例如,如果我们每秒读取一个传感器,则连接间隔不应该小于此。 如果它更小,那么当没有数据生成时,我们将处理很多请求。 作为相反的示例,对于数据更新非定期(例如鼠标移动)的应用,连接间隔可以确定用户在应用等待更新时经历的延迟。 由于我们重视用户体验超过能量,我们将使用一个短的连接间隔。 我们可以补充短连接间隔,具有高从机延迟,让鼠标在运动之间睡眠更长。
对于电池寿命,我们使用射频越少越好。 所有的参数总体意味着我们可以很少使用射频:在广告模式下,我们可以每10.28秒使用一次射频。
在连接模式下,我们可以设置四秒的最大连接间隔,但是当我们没有生成新数据时,没有无线电活动的最长持续时间可能只要[(max interval) * (slave latency)]。 但是,请记住,我们受到监督超时(supervision timeout)的限制; 如果我们的间隔太大,中央设备可能会断开连接(请记住,我们不能强制中央设备接受我们的监控超时设置,因此可能会出现不匹配)。