Fast Advertising & Slow Advertising
CC2540的Timeapp例子中区分了2种不同的advertising:
Fast
广播间隔:30ms
广播持续时间:30s
Slow
广播间隔:1s
广播持续时间:永久
我在使用这两种广播模式时发现有2个问题:
1、采用Slow advertising,iphone能够搜索到蓝牙开发板,但是配对时总是超时,导致只能使用Fast模式进行;
2、Fast模式修改广播持续时间为永久,无法生效,实际广播时间只有几秒,之后手机就搜不到开发板了;
大家有没有遇到这样的问题呢,一起讨论下吧!
大家有没有遇到这样问题呢?
cai,
把你的代码贴出来给大家看看?
另外,iPhone用的啥app?
没用app,直接手机搜到然后进行连接的;
// Fast advertising interval in 625us units
#define DEFAULT_FAST_ADV_INTERVAL 32
// Duration of fast advertising duration in ms
#define DEFAULT_FAST_ADV_DURATION 30000
// Slow advertising interval in 625us units
#define DEFAULT_SLOW_ADV_INTERVAL 1600
// Duration of slow advertising duration in ms (set to 0 for continuous advertising)
#define DEFAULT_SLOW_ADV_DURATION 0
static void startAdvertising(uint8 mode)
{
uint8 advState = TRUE;
if ( mode == ADV_FAST )
{
//快速广播
GAP_SetParamValue( TGAP_GEN_DISC_ADV_INT_MIN, DEFAULT_FAST_ADV_INTERVAL );
GAP_SetParamValue( TGAP_GEN_DISC_ADV_INT_MAX, DEFAULT_FAST_ADV_INTERVAL );
GAP_SetParamValue( TGAP_GEN_DISC_ADV_MIN, DEFAULT_FAST_ADV_DURATION );
}
else
{
//慢速广播
GAP_SetParamValue( TGAP_GEN_DISC_ADV_INT_MIN, DEFAULT_SLOW_ADV_INTERVAL );
GAP_SetParamValue( TGAP_GEN_DISC_ADV_INT_MAX, DEFAULT_SLOW_ADV_INTERVAL );
GAP_SetParamValue( TGAP_GEN_DISC_ADV_MIN, DEFAULT_SLOW_ADV_DURATION );
}
// Enable advertising
GAPRole_SetParameter( GAPROLE_ADVERT_ENABLED, sizeof( uint8 ), &advState );
}
cai,
huh,很奇怪。代码看不出什么问题。
你能用packet sniffer抓包看一下吗?广播的时候和发起连接的时候到底发生了什么。
空中抓包往往能看出很多东西。
另外,你怎么调用你的 startAdvertising()的?
调用的时机有以下几个:
1、初始化时调用startAdvertising(ADV_FAST);进入快速广播状态;
2、在gapStateCallback()的以下case进行调用:
if ( timeAppGapState == GAPROLE_CONNECTED && newState != GAPROLE_CONNECTED ) { DEBUG_PRINT("Disconnected , newState : %d \r\n", newState); disconnected(); if ( newState == GAPROLE_WAITING_AFTER_TIMEOUT ) { //这个应该是连接超时(距离太远,蓝牙关闭)造成的,采用慢速广播 startAdvertising(ADV_SLOW); } else { //这个应该是手机端主动断开造成的,采用快速广播 startAdvertising(ADV_FAST); } } // if advertising stopped else if ( timeAppGapState == GAPROLE_ADVERTISING && newState == GAPROLE_WAITING ) { DEBUG_PRINT("Advertising stopped\r\n"); // if fast advertising switch to slow if ( GAP_GetParamValue( TGAP_GEN_DISC_ADV_INT_MIN ) == DEFAULT_FAST_ADV_INTERVAL ) { startAdvertising(ADV_SLOW); } }
抓包的话我回头试试,现在手头边暂时没有设备。
另外我调整了一下2种广播模式的设置值,现在上面的代码能在各种情况下自动广播和进行配对,但是有时候要多试几次才能配对成功:
#define DEFAULT_FAST_ADV_INTERVAL 320 //def: 32
#define DEFAULT_FAST_ADV_DURATION 0 //def: 30000
#define DEFAULT_SLOW_ADV_INTERVAL 800 //def: 1600
#define DEFAULT_SLOW_ADV_DURATION 0 //def: 0