This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

Fast Advertising & Slow Advertising

Other Parts Discussed in Thread: CC2540

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