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)下,可以设置每次开始广播后的广播持续时间,理所当然,广播持续的时间越短则越省电。广播持续时间如下设置:
VOID 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)中,蓝牙主机必须先发包,然后蓝牙设备必须回复,一直这样重复下去,不然蓝牙主机会认为蓝牙设备那边不正常。而通过设置从机延时的次数,允许蓝牙设备一定次数内不对蓝牙主机数据进行回复,蓝牙主机即使乜有收到蓝牙设备的回复也不会认为蓝牙设备不正常,这样的话,蓝牙设备也就降低了功耗。
影响蓝牙BLE设备功耗的几个因素 - ziye334 - ziye334的博客
影响蓝牙BLE设备功耗的几个因素 - ziye334 - ziye334的博客
在代码中,从机延时如下设置:
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,这样的话,系统就会在必要的时候进入低功耗状态了。