CC2541广播模式,广播数据更新后,抓包工具抓到的数据没有变化
硬件平台:CC2541
软件环境:IAR for 8051 v8.20.2
协议栈版本:1.4.0
最近一个项目中,用了CC2541的广播模式(单一模式,不带从机或主机)。我是按照SimpleBLEBroadcaster的示例工程做的。
对广播数据的操作如下:
/* 关闭广播 */
initial_advertising_enable = FALSE;
GAPRole_SetParameter( GAPROLE_ADVERT_ENABLED, sizeof( uint8 ), &initial_advertising_enable );
/* 更新广播数据 */
GAPRole_SetParameter( GAPROLE_ADVERT_DATA, sizeof( advertData ), advertData );
/* 打开广播 */
initial_advertising_enable = TRUE;
GAPRole_SetParameter( GAPROLE_ADVERT_ENABLED, sizeof( uint8 ), &initial_advertising_enable );
虽然advertData[ ]的数据改变了,但是实际广播出来的数据没有任何变化,后来更改为更新数据之后,10ms再打开广播,还是不起作用。请帮我查看一下问题所在。
下面贴出初始化部分的代码:
/* Setup the GAP Broadcaster Role Profile */
{
/* Device starts advertising upon initialization */
uint8 initial_advertising_enable = TRUE;
/* 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 advType = GAP_ADTYPE_ADV_SCAN_IND; // use scannable unidirected advertisements
/* 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_ADV_EVENT_TYPE, sizeof( uint8 ), &advType );
}
/* Set advertising interval */
{
uint16 advInt = DEFAULT_ADVERTISING_INTERVAL;
GAP_SetParamValue( TGAP_LIM_DISC_ADV_INT_MIN, advInt );
GAP_SetParamValue( TGAP_LIM_DISC_ADV_INT_MAX, advInt );
GAP_SetParamValue( TGAP_GEN_DISC_ADV_INT_MIN, advInt );
GAP_SetParamValue( TGAP_GEN_DISC_ADV_INT_MAX, advInt );
}
/* Setup a delayed profile startup */
osal_set_event( smartTag_TaskID, ST_START_DEVICE_EVT );
dongle,
建议你在
/* 关闭广播 */
initial_advertising_enable = FALSE;
GAPRole_SetParameter( GAPROLE_ADVERT_ENABLED, sizeof( uint8 ), &initial_advertising_enable );
之后,不要立即更新内容,因为你发了这条命令,广播不是立马停止。
正确的做法是在状态改变之后,比如变成GAPROLE_WAITING 之后,再修改广播内容,然后再使能广播。
或者,加个timer,过一阵子再修改内容。
我今天试了一下,在中间加了100ms延时,再更新内容,还是不行。我之前用从机+广播模式,那时候是正常的,最近项目想把从机取消掉,我就参照着SimpleBLEBroadcaster示例程序修改。
广播事件类型改为GAP_ADTYPE_ADV_NONCONN_IND,这个是以前有从机模式的时候默认的,也还是不行。
还有一部分初始化的代码,请看一下,有没有缺什么东西:
void osalInitTasks( void )
{
uint8 taskID = 0;
tasksEvents = (uint16 *)osal_mem_alloc( sizeof( uint16 ) * tasksCnt );
osal_memset( tasksEvents, 0, ( sizeof( uint16 ) * tasksCnt ) );
/* LL Task */
LL_Init( taskID++ );
/* Hal Task */
Hal_Init( taskID++ );
/* HCI Task */
HCI_Init( taskID++ );
#if defined ( OSAL_CBTIMER_NUM_TASKS )
osal_CbTimerInit( taskID );
taskID += OSAL_CBTIMER_NUM_TASKS;
#endif /* OSAL_CBTIMER_NUM_TASKS */
/* GAP Task */
GAP_Init( taskID++ );
/* Profiles */
GAPRole_Init( taskID++ );
/* Application */
SmartTag_Init( taskID );
}
这个是抓包工具抓到的广播数据
我还是自己给自己回答吧!在官方例程SimpleBLEBroadcaster的基础上修改的话,不能再通过关闭广播加载广播数据,再开广播这种方式了。
正确方法:
GAPRole_SetParameter( GAPROLE_ADVERT_DATA, sizeof( advertData ), advertData );
GAP_UpdateAdvertisingData( smartTag_TaskID, TRUE, sizeof( advertData ), advertData );
为了造福大家,我还是自己回答自己吧!有用到的也可以来看看。
官方例程SimpleBLEBroadcaster,只用到了广播模式。以上的方法不正确。
正确做法:
GAPRole_SetParameter( GAPROLE_ADVERT_DATA, sizeof( advertData ), advertData );
GAP_UpdateAdvertisingData( smartTag_TaskID, TRUE, sizeof( advertData ), advertData );
dongle,
这个必须赞你一个,精神可嘉!而且有真本事!