一、理论
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,这样的话,系统就会在必要的时候进入低功耗状态了。