蓝牙BLE从机Peripheral讲解六(动态广播与连接)
一、动态广播内容
动态修改广播包需要对广播包里面的数据进行重新赋值即可。通过TMOS任务处理。
注意:是不可以快速连续的调用更新广播包内容和扫描应答包内容函数的,需要等待底层处理完产生消息之后才可以再次调用
//添加事件宏定义
#define ADV_DATA_UPDATE_EVT 0x0020
//Peripheral_Init初始化的最后调用该函数启动任务
tmos_start_task(Peripheral_TaskID, ADV_DATA_UPDATE_EVT, 1600); //1秒后执行
//Peripheral_ProcessEvent添加此事件处理
if(events & ADV_DATA_UPDATE_EVT)
{
PeripheralUpdateAdvertisingData(UpdataAdvData_flag); //更新广播包内容
tmos_start_task(Peripheral_TaskID, ADV_DATA_UPDATE_EVT, 1600); //1秒更新一次
return (events ^ ADV_DATA_UPDATE_EVT);
}
//在Peripheral_ProcessGAPMsg新增case处理
case GAP_ADV_DATA_UPDATE_DONE_EVENT:
{
UpdataAdvData_flag=pEvent->dataUpdate.adType;
PRINT("last updata=%x\n", UpdataAdvData_flag);
if(UpdataAdvData_flag){ //若上次更新的广播包则再次调用更新
tmos_set_event(Peripheral_TaskID, ADV_DATA_UPDATE_EVT);
}
break;
}
//添加该处理函数
static void PeripheralUpdateAdvertisingData(uint8_t adType){
if(adType==1){
PRINT("now updata rsp=%x\n",adType);
GAP_UpdateAdvertisingData( Peripheral_TaskID,FALSE,sizeof( scanRspData ),scanRspData ); //更新应答包内容
}
if(adType==0){
PRINT("now updata adv=%x\n",adType);
GAP_UpdateAdvertisingData( Peripheral_TaskID,TRUE ,sizeof( advertData ),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 );
浙公网安备 33010602011771号