蓝牙BLE从机Peripheral讲解六(动态广播与连接)
一、动态广播内容
动态修改广播包需要对广播包里面的数据进行重新赋值即可。通过TMOS任务处理。
if(events & DYNAMIC_advertData) //动态广播包内容
{
tmos_memset(advertData, 0, 31);
advertData[0] = 0x03;
advertData[1] = 0xFF;
advertData[2] = addnum;
advertData[3] = 'a';
addnum++;
printf("Start Dynamic advertData......%d\r\n", addnum);
GAP_UpdateAdvertisingData(Peripheral_TaskID, TRUE, sizeof(advertData), advertData);
tmos_start_task(Peripheral_TaskID, DYNAMIC_advertData, 1600);
return (events ^ DYNAMIC_advertData);
}
二、动态广播间隔
动态修改广播间隔需要先关闭广播,然后修改广播间隔,等到协议栈重新进入等待广播时再重新打开广播。
if(events & DYNAMIC_AdvInterval_Close) //动态广播包内容(关闭广播)
{
uint8 initial_advertising_enable = FALSE;
GAPRole_SetParameter( GAPROLE_ADVERT_ENABLED, sizeof( uint8 ), &initial_advertising_enable );
printf("Close Dynamic Advertise Interval...\r\n");
add_time += 40;
if(add_time > 1600){
add_time = 40;
}
PRINT("add_time = %d\n", add_time);
GAP_SetParamValue( TGAP_DISC_ADV_INT_MIN, add_time );
GAP_SetParamValue( TGAP_DISC_ADV_INT_MAX, add_time );
return (events ^ DYNAMIC_AdvInterval_Close);
}
if(pEvent->gap.opcode == GAP_END_DISCOVERABLE_DONE_EVENT)
{
PRINT("Waiting for advertising..\n");
tmos_set_event(Peripheral_TaskID, DYNAMIC_AdvInterval_Open);
}
if(events & DYNAMIC_AdvInterval_Open) //动态广播包内容(开启广播)
{
printf("Open Dynamic Advertise Interval...\r\n");
uint8 initial_advertising_enable = TRUE;
GAPRole_SetParameter( GAPROLE_ADVERT_ENABLED, sizeof( uint8 ), &initial_advertising_enable );
tmos_start_task(Peripheral_TaskID, DYNAMIC_AdvInterval_Close, 1600);
return (events ^ DYNAMIC_AdvInterval_Open);
}
三、配置广播应答
uint16_t adv_event_continue = 1<<1;
GAP_SetParamValue( TGAP_ADV_SCAN_REQ_NOTIFY, adv_event_continue );