低功耗蓝牙BLE之修改广播间隔等参数
转载:http://blog.csdn.net/zzfenglin/article/details/51166830
发现模式 (Discoverable Mode)
低功耗蓝牙的发现模式主要分为有限可发现模式和普通可发现模式,TI的CC2540和CC2541的工程中发现模式具体定义在“components/ble/include”目录下的“Gap.h”文件中,如下所示:
/** @defgroup GAP_ADTYPE_FLAGS_MODES GAP ADTYPE Flags Discovery Modes
* @{
*/
#define GAP_ADTYPE_FLAGS_LIMITED 0x01 //!< Discovery Mode: LE Limited Discoverable Mode
#define GAP_ADTYPE_FLAGS_GENERAL 0x02 //!< Discovery Mode: LE General Discoverable Mode
#define GAP_ADTYPE_FLAGS_BREDR_NOT_SUPPORTED 0x04 //!< Discovery Mode: BR/EDR Not Supported
/** @} End GAP_ADTYPE_FLAGS_MODES */
注意发现模式的定义必须在广播数据的开头处,不能在扫描回应数据中定义,实例代码如下:
// GAP - Advertisement data (max size = 31 bytes, though this is
// best kept short to conserve power while advertisting)
static uint8 advertData[] =
{
// Flags; this sets the device to use limited discoverable
// mode (advertises for 30 seconds at a time) instead of general
// discoverable mode (advertises indefinitely)
0x02, // length of this data
GAP_ADTYPE_FLAGS,
DEFAULT_DISCOVERABLE_MODE | GAP_ADTYPE_FLAGS_BREDR_NOT_SUPPORTED,
// service UUID, to notify central devices what services are included
// in this peripheral
0x03, // length of this data
GAP_ADTYPE_16BIT_MORE, // some of the UUID's, but not all
LO_UINT16( SIMPLEPROFILE_SERV_UUID ),
HI_UINT16( SIMPLEPROFILE_SERV_UUID ),
};
有限可发现模式 (GAP_ADTYPE_FLAGS_LIMITED)
如果将上述实例代码段中的“DEFAULT_DISCOVERABLE_MODE”设置为“GAP_ADTYPE_FLAGS_LIMITED”,设置的代码如下:
#define DEFAULT_DISCOVERABLE_MODE GAP_ADTYPE_FLAGS_LIMITED
则设备就处于有限可发现模式,当设备处于有限可发现模式时,很多人以及网上的一些资料提到广播会在使能打开之后的 30.72s 之后停止广播。但是实际测试并不是这样,而是180s,通过查阅发现在“Gap.h”文件中有如下说明:
#define TGAP_LIM_ADV_TIMEOUT 1 //!< Maximum time to remain advertising, when in Limited Discoverable mode. In seconds (default 180 seconds)
注释中说明在有限可发现模式下,默认是180s之后停止广播,如果想设置这个值,可以用下面的方式:
GAP_SetParamValue( TGAP_LIM_ADV_TIMEOUT, ADV_TIMEOUT );
注意:通过上述方法设置“ TGAP_LIM_ADV_TIMEOUT”时,设置的时间单位是s(秒)。
还有些人会碰到另一种情况,就是在设置的时间或者是默认的时间之后,广播停止了,但是过了一段时间,默认应该是 30s 之后,广播又重新开启了,出现这种情况的时候确认下“GAPROLE_ADVERT_OFF_TIME”的设置,如果不设置该值,就会出现停止广播 30s(默认值)之后重新广播的情况,该值的默认值在“projects/ble/profiles/roles”目录下的“peripheral.c”文件中设置,如下:
#define DEFAULT_ADVERT_OFF_TIME 30000 // 30 seconds
所以如果要实现有限可发现模式,就要在应用的初始化地方设置该值为 0,设置方式如下:
uint16 gapRole_AdvertOffTime = 0;
GAPRole_SetParameter( GAPROLE_ADVERT_OFF_TIME, sizeof( uint16 ), &gapRole_AdvertOffTime );
介于上面的说明,我们来实现两个具体的情景便于理解:
1.广播使能开启之后,限制广播在 30s 之后停止,并且在应用部分没有使能打开的情况下不再广播,相关代码实现如下:
#define DEFAULT_DISCOVERABLE_MODE GAP_ADTYPE_FLAGS_LIMITED
uint16 gapRole_AdvertOffTime = 0;
GAPRole_SetParameter( GAPROLE_ADVERT_OFF_TIME, sizeof( uint16 ), &gapRole_AdvertOffTime );//GAPROLE_ADVERT_OFF_TIME设置的时间单位是ms,默认是30s
uint16 ADV_TIMEOUT = 30;
GAP_SetParamValue( TGAP_LIM_ADV_TIMEOUT, ADV_TIMEOUT );//设置的单位是s,不设置的话,默认是180s
2.广播使能开启之后,限制广播在 20s 之后停止,然后过 15s 之后自动重新广播,如此反复。
#define DEFAULT_DISCOVERABLE_MODE GAP_ADTYPE_FLAGS_LIMITED
uint16 gapRole_AdvertOffTime = 15000;
GAPRole_SetParameter( GAPROLE_ADVERT_OFF_TIME, sizeof( uint16 ), &gapRole_AdvertOffTime );//GAPROLE_ADVERT_OFF_TIME设置的时间单位是ms,默认是30s
uint16 ADV_TIMEOUT = 20;
GAP_SetParamValue( TGAP_LIM_ADV_TIMEOUT, ADV_TIMEOUT );//设置的单位是s,不设置的话,默认是180s
GAP_SetParamValue( TGAP_LIM_DISC_ADV_INT_MIN, advInt );//单位是0.625ms
GAP_SetParamValue( TGAP_LIM_DISC_ADV_INT_MAX, advInt );//单位是0.625ms
普通可发现模式 (GAP_ADTYPE_FLAGS_GENERAL)
若将实例代码段中的“DEFAULT_DISCOVERABLE_MODE”设置为“GAP_ADTYPE_FLAGS_GENERAL”,设置的代码如下:
#define DEFAULT_DISCOVERABLE_MODE GAP_ADTYPE_FLAGS_GENERAL
普通可发现模式是用的最多的模式,在该模式下,我们可以设置广播持续时间,设置方法如下:
GAP_SetParamValue( TGAP_GEN_DISC_ADV_MIN, DEFAULT_ADV_DURATION );
我们看一下“TGAP_GEN_DISC_ADV_MIN”的介绍,仍然在“Gap.h”中,如下:
#define TGAP_GEN_DISC_ADV_MIN 0 //!< Minimum time to remain advertising, when in Discoverable mode (mSec). Setting this parameter to 0 turns off the timeout (default).
从注释可以看到如果设置“DEFAULT_ADV_DURATION”为0,那就关闭了超时,也就是会一直持续的广播(当然前提是应用部分没有去主动使能关闭广播)。这个时候“GAPROLE_ADVERT_OFF_TIME”就无效了,因为持续广播时不会触发“GAP_END_DISCOVERABLE_DONE_EVENT”这个事件(该事件只有在广播关闭的时候才会发送给应用层,并在“peripheral.c”中进行接收处理,这是唯一处理“GAPROLE_ADVERT_OFF_TIME”的地方)。
接下来直接介绍几种使用场景:
1.最常用的场景,一直持续广播
#define DEFAULT_DISCOVERABLE_MODE GAP_ADTYPE_FLAGS_GENERAL
// Duration of slow advertising duration in ms (set to 0 for continuous advertising)
#define DEFAULT_SLOW_ADV_DURATION 0
GAP_SetParamValue( TGAP_GEN_DISC_ADV_MIN, DEFAULT_SLOW_ADV_DURATION );
2.普通可发现模式下的限时广播,使能打开广播后限制20s后停止广播,而且不再自动重新广播。
#define DEFAULT_DISCOVERABLE_MODE GAP_ADTYPE_FLAGS_GENERAL
// Duration of advertising duration in ms (set to 0 for continuous advertising)
#define DEFAULT_ADV_DURATION 20000
GAP_SetParamValue( TGAP_GEN_DISC_ADV_MIN, DEFAULT_ADV_DURATION );
uint16 gapRole_AdvertOffTime = 0;
GAPRole_SetParameter( GAPROLE_ADVERT_OFF_TIME, sizeof( uint16 ), &gapRole_AdvertOffTime );
3.循环间断限时广播,使能打开广播之后,广播20s,然后停止广播,过10s之后自动重新开始广播,如此反复。
#define DEFAULT_DISCOVERABLE_MODE GAP_ADTYPE_FLAGS_GENERAL
// Duration of slow advertising duration in ms (set to 0 for continuous advertising)
#define DEFAULT_ADV_DURATION 20000
GAP_SetParamValue( TGAP_GEN_DISC_ADV_MIN, DEFAULT_ADV_DURATION );
uint16 gapRole_AdvertOffTime = 10000;
GAPRole_SetParameter( GAPROLE_ADVERT_OFF_TIME, sizeof( uint16 ), &gapRole_AdvertOffTime );
普通可发现模式修改广播间隔的方法如下:
GAP_SetParamValue(TGAP_GEN_DISC_ADV_INT_MIN, advInt );//单位是0.625ms
GAP_SetParamValue(TGAP_GEN_DISC_ADV_INT_MAX, advInt ); //单位是0.625ms
参考博文:http://blog.csdn.net/zhuangjitongxue/article/details/49805595
推荐阅读