CC2540的Timeapp例子中区分了2种不同的advertising:
Fast
广播间隔:30ms
广播持续时间:30s
Slow
广播间隔:1s
广播持续时间:永久
我在使用这两种广播模式时发现有2个问题:
1、采用Slow advertising,iphone能够搜索到蓝牙开发板,但是配对时总是超时,导致只能使用Fast模式进行;
2、Fast模式修改广播持续时间为永久,无法生效,实际广播时间只有几秒,之后手机就搜不到开发板了;
大家有没有遇到这样的问题呢,一起讨论下吧!
Yan:
大家有没有遇到这样问题呢?
Yan:
cai,
把你的代码贴出来给大家看看?
另外,iPhone用的啥app?
cai alex:
回复 Yan:
没用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 );}
Yan:
回复 cai alex:
cai,
huh,很奇怪。代码看不出什么问题。
你能用packet sniffer抓包看一下吗?广播的时候和发起连接的时候到底发生了什么。
空中抓包往往能看出很多东西。
另外,你怎么调用你的 startAdvertising()的?
cai alex:
回复 Yan:
调用的时机有以下几个:
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 stoppedelse if ( timeAppGapState == GAPROLE_ADVERTISING &&newState == GAPROLE_WAITING ){DEBUG_PRINT("Advertising stopped\r\n");// if fast advertising switch to slowif ( 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