BLE 实现低功耗的原理即代码优化

一、理论

BLE与传统蓝牙相比,最大的特点是超低功耗,主要是通过以下几方面实现的:

根据SIG官方发布会的资料,它和经典BT的技术相比,主要的改变集中体现在待机功耗的减少、高速连接的实现和峰值功耗的降低3个方面

     (1)广播频段和广播时射频开启时间的减少:

               传统蓝牙使用16~32个频段进行广播,而BLE仅使用3个广播频段;   

               每次广播时的射频开启时间由传统蓝牙的22ms减少为0.6~1.2ms;

     (2)BLE设计了深度睡眠状态(Duty-Cycle)来替代传统蓝牙的空闲时间,并且在Duty-Cycle时,发送数据间隔也被增大.

     (3)BLE 的连接采用先进的Sniffer-Subrating模式.减速呼吸模式,优化保持设备连接信息的频率,达到优化功耗的目的。

     (4)传统蓝牙规范规定,若某一设备正在进行广播,则它不会响应当前正在进行的设备扫描,而BLE允许正在进行广播的设备连接正在扫描的设备,这有效避免了重复连接。通过对连接机制的改进,BLE连接建立过程可控制在3ms内完成。

     (5)BLE在每个从设备和每个数据包上使用32位的存取地址,优化了传统蓝牙一对一的连接,实现一对多。

     (6)BLE增加了GFSK调制,降低峰值功耗。

二、代码优化

1、广播的方式

蓝牙BLE设备的广播分两种形式:永久广播(GAP_ADTYPE_FLAGS_GENERAL)和限制广播(GAP_ADTYPE_FLAGS_LIMITED)。如果将BLE设备的广播方式设置成永久广播,那么只要BLE设备上电就会开始广播直到BLE设备断电为止。如果将BLE设备的广播方式设置成限制广播,那么打开广播后,超过一定的时间就会自动广播广播以节省电源。所以为了节省BLE设备的功耗,最好设置默认的广播模式为限制广播。

define DEFAULT_DISCOVERABLE_MODE    GAP_ADTYPE_FLAGS_LIMITED

2、广播的间隔

在广播期间,每次发送广播数据的间隔也能影响BLE设备的功耗,对于广播模式为永久广播的BLE设备来说尤为明显。所以可以将广播的间隔修改大一点以降低功耗。

广播间隔在代码中,如下设置:

define DEFAULT_ADVERTISING_INTERVAL   160

uint16 advInt = DEFAULT_ADVERTISING_INTERVAL;

GAP_SetParamValue( TGAP_LIM_DISC_ADV_INT_MIN, advInt );

GAP_SetParamValue( TGAP_LIM_DISC_ADV_INT_MAX, advInt );

GAP_SetParamValue( TGAP_GEN_DISC_ADV_INT_MIN, advInt );

GAP_SetParamValue( TGAP_GEN_DISC_ADV_INT_MAX, advInt );

可以将原先的160(单位为625us,160 = 100ms)修改成更大的值,如320。但是需要注意的的是,如果将广播的间隔修改大之后,相应地会影响BLE设备的连接速度,所以这里也不宜修改过大,最好广播间隔不要超过1s。

3、广播持续的时间

在广播模式为限制广播模式(GAP_ADTYPE_FLAGS_LIMITED)下,可以设置每次开始广播后的广播持续时间,理所当然,广播持续的时间越短则越省电。广播持续时间如下设置:

 GAP_SetParamValue( TGAP_LIM_ADV_TIMEOUT, 30);

这里设置每次广播持续的时间为30s。具体的时间根据实际使用的场合而定。

4、连接间隔

当连接上蓝牙BLE设备时,蓝牙主机会定期向BLE设备发送连接事件(Connection Events),BLE设备接收到连接事件后,就必须进行恢复,以通知蓝牙主机连接通路正常。而这段时间真是BLE设别连接后最耗电的时候,所以增加连接间隔时间会降低BLE设备的功耗,但是需要注意的是,改变连接间隔时间就相应地会改变蓝牙的通讯速度,所以还需谨慎修改。

这里写图片描述

在代码中,提供连个参数:最小连接间隔和最大连接间隔。通过修改这两个参数,BLE协议栈就会根据不同的情况设置不同的连接间隔。连接间隔参数以1.25ms为单位,范围可从7.5ms~4s。连接间隔时间如下设置:

define DEFAULT_DESIRED_MIN_CONN_INTERVAL    80

define DEFAULT_DESIRED_MAX_CONN_INTERVAL   800

uint16 desired_min_interval = DEFAULT_DESIRED_MIN_CONN_INTERVAL;

uint16 desired_max_interval DEFAULT_DESIRED_MAX_CONN_INTERVAL;

GAPRole_SetParameter(GAPROLE_MIN_CONN_INTERVAL, sizeof( uint16 ), &desired_min_interval );

GAPRole_SetParameter(GAPROLE_MAX_CONN_INTERVAL, sizeof( uint16 ), &desired_max_interval );

5、从机延时次数

所谓的从机延时(Slave Latency)次数,就是在连接时忽略连接事件的次数。在每一个连接事件(Connection Event)中,蓝牙主机必须先发包,然后蓝牙设备必须回复,一直这样重复下去,不然蓝牙主机会认为蓝牙设备那边不正常。而通过设置从机延时的次数,允许蓝牙设备一定次数内不对蓝牙主机数据进行回复,蓝牙主机即使乜有收到蓝牙设备的回复也不会认为蓝牙设备不正常,这样的话,蓝牙设备也就降低了功耗。

在代码中,从机延时如下设置:

define DEFAULT_DESIRED_SLAVE_LATENCY 3

uint16 desired_slave_latency = DEFAULT_DESIRED_SLAVE_LATENCY;

GAPRole_SetParameter(GAPROLE_SLAVE_LATENCY, sizeof(uint16), &desired_slave_latency );

6、进入睡眠状态

在蓝牙工程Project->Options->C/C++ Complier->Defined Symbols下的编辑框中添加POWER_SAVING,这样的话,系统就会在必要的时候进入低功耗状态了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值