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.

CC2541 设置limited discory 模式失败

Other Parts Discussed in Thread: CC2541, CC2540

蓝牙协议栈版本 1.5.1

代码调整的地方:

在simpleBLEPeripheral 工程基础上,进行如下调整:

#define DEFAULT_DISCOVERABLE_MODE    GAP_ADTYPE_FLAGS_LIMITED

现象描述;

安卓手机可以一直扫描到该设备;查看广播消息,正常。

问题点:

在limited discory模式下,CC2541不是应该广播180s,之后关闭广播吗?为什么手机还可以检测到广播内容?

后续测试情况;

1、使用Brocaster 模式,limited discory 功能正常;

2、使用Peripheral 模式,limited discory 没有作用;手机可以一直接收广播内容;

  • 还修改了哪些代码,peripheral也是可以的
  • Peripheral 和Brocaser 修改的内容是一样的;

    1、修改#define DEFAULT_DISCOVERABLE_MODE    GAP_ADTYPE_FLAGS_LIMITED

    2、添加超时时间设置:

    // By setting this to zero, the device will go into the waiting state after
    // being discoverable for 30.72 second, and will not being advertising again
    // until the enabler is set back to TRUE
    uint16 gapRole_AdvertOffTime = 0;

    uint8 enable_update_request = DEFAULT_ENABLE_UPDATE_REQUEST;
    uint16 desired_min_interval = DEFAULT_DESIRED_MIN_CONN_INTERVAL;
    uint16 desired_max_interval = DEFAULT_DESIRED_MAX_CONN_INTERVAL;
    uint16 desired_slave_latency = DEFAULT_DESIRED_SLAVE_LATENCY;
    uint16 desired_conn_timeout = DEFAULT_DESIRED_CONN_TIMEOUT;

    // Set the GAP Role Parameters
    GAPRole_SetParameter( GAPROLE_ADVERT_ENABLED, sizeof( uint8 ), &initial_advertising_enable );
    GAPRole_SetParameter( GAPROLE_ADVERT_OFF_TIME, sizeof( uint16 ), &gapRole_AdvertOffTime );

    GAPRole_SetParameter( GAPROLE_SCAN_RSP_DATA, sizeof ( scanRspData ), scanRspData );
    GAPRole_SetParameter( GAPROLE_ADVERT_DATA, sizeof( advertData ), advertData );

    GAPRole_SetParameter( GAPROLE_PARAM_UPDATE_ENABLE, sizeof( uint8 ), &enable_update_request );
    GAPRole_SetParameter( GAPROLE_MIN_CONN_INTERVAL, sizeof( uint16 ), &desired_min_interval );
    GAPRole_SetParameter( GAPROLE_MAX_CONN_INTERVAL, sizeof( uint16 ), &desired_max_interval );
    GAPRole_SetParameter( GAPROLE_SLAVE_LATENCY, sizeof( uint16 ), &desired_slave_latency );
    GAPRole_SetParameter( GAPROLE_TIMEOUT_MULTIPLIER, sizeof( uint16 ), &desired_conn_timeout );
    }

    /********** User modify. **********/
    GAP_SetParamValue(TGAP_LIM_ADV_TIMEOUT, 30);

    // Set the GAP Characteristics
    GGS_SetParameter( GGS_DEVICE_NAME_ATT, GAP_DEVICE_NAME_LEN, attDeviceName );

    3、关闭 POWER_SAVING \ CC2540_MINIDK 宏定义

  • peripheral将advertOffTime设置为0应该是不会停止广播,用下面代码广播180s后会停止广播60s

    #define DEFAULT_DISCOVERABLE_MODE   GAP_ADTYPE_FLAGS_LIMITED

    uint16_t advertOffTime = 60000; // 60 seconds in milliseconds units.
    GAPRole_SetParameter(GAPROLE_ADVERT_OFF_TIME, sizeof(uint16_t),
    &advertOffTime);

    停止广播时间可以通过advertOffTime修改

  • 但是在 Brocaster 模式下,设置 GAP_ADTYPE_FLAGS_LIMITED 和 advertOffTime 设置为0的话,广播180s后会停止广播。
    我的理解是: GAP_ADTYPE_FLAGS_LIMITED 模式下,advertOffTime = 0,只广播一次;如果advertOffTime != 0,则单次广播完之后,间隔advertOffTime 时间进行下一次广播。

    请问,我这样理解有问题吗?
  • 你好,我按照你说的进行了测试,测试结果正常(设备广播180s后停止广播60s,然后再循环广播180s停止广播60s);请问应该如何设置,实现只广播一次。
  • 據我所知,TI BLE Stack沒有实现只广播一次的API
  • 可能是我描述的情况不太清楚,我的意思是广播一段时间之后,就停止广播。
  • 我測試蓝牙协议栈版本 1.5.1 simpleBLEPeripheral 工程去修改#define DEFAULT_DISCOVERABLE_MODE GAP_ADTYPE_FLAGS_LIMITED,等待一段時間之后確實不會关闭广播,感覺像是协议栈有bug,建議你initial_advertising_enable設置成FALSE,要啟動時才用GAPRole_SetParameter( GAPROLE_ADVERT_ENABLED, ...)去打開广播,然後設定一個定時事件在時間到的時候再次調用GAPRole_SetParameter( GAPROLE_ADVERT_ENABLED, ...)去关闭广播
  • 非常感谢,这个是一个不错的解决方法。请问 Peripheral 和 Scanner 切换,你了解如何处理吗?
  • 可以參考一下e2e.ti.com/.../963009 這個討論串裡面的 masterslaveswitch 例程
  • YiKai是对的,广播一段时间停止广播可以设置定时器然后将GAPROLE_ADVERT_ENABLED参数设置为false来禁用广播
    关于advertOffTime可以看下这里
    e2e.ti.com/.../2444126