一.動態廣播
1.動態修改廣播包內容和掃描應答包內容
GAP_UpdateAdvertisingData( Peripheral_TaskID,TRUE ,sizeof( advertData ),advertData ); //更新廣播包內容
GAP_UpdateAdvertisingData( Peripheral_TaskID,FALSE ,sizeof( scanRspData ),scanRspData ); //更新掃描應答包內容
2.更新廣播內容注意點
我們是不可以快速連續的調用更新廣播包內容和掃描應答包內容函數的,需要等待底層處理完產生消息之后才可以再次調用,若兩次更新之間間隔較大是沒有問題的,
下面講述下如何最快的進行一組更新,即更新廣播包后"立即更新掃描應答包"。
//添加事件宏定義
#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 ); //更新廣播包內容
}
}
3.動態修改廣播間隔
更新廣播間隔是需要關閉廣播,進入等待廣播狀態后,更新新的廣播間隔再開啟廣播。
static void PeripheralUpdateAdvertisingInterval(){
static uint16_t advInt = 80;
uint8_t initial_advertising_enable = TRUE;
advInt=advInt+80;
GAP_SetParamValue(TGAP_DISC_ADV_INT_MIN, advInt);
GAP_SetParamValue(TGAP_DISC_ADV_INT_MAX, advInt);
GAPRole_SetParameter(GAPROLE_ADVERT_ENABLED, sizeof(uint8_t), &initial_advertising_enable);
}
//添加事件宏定義
#define ADV_INTERVAL_UPDATE_EVT 0x0040
//在Peripheral_Init初始化的最后調用該函數啟動事件
tmos_start_task(Peripheral_TaskID, ADV_INTERVAL_UPDATE_EVT, 1600); //1秒后執行
//Peripheral_ProcessEvent中添加事件處理
if(events & ADV_INTERVAL_UPDATE_EVT)
{
PRINT("close adv###########################\n");
uint8_t initial_advertising_enable = FALSE;
GAPRole_SetParameter(GAPROLE_ADVERT_ENABLED, sizeof(uint8_t), &initial_advertising_enable);
tmos_start_task(Peripheral_TaskID, ADV_INTERVAL_UPDATE_EVT, 1600*5); //5秒更新一次
return (events ^ ADV_INTERVAL_UPDATE_EVT);
}
//在狀態回調中打開廣播
case GAPROLE_WAITING:
if(pEvent->gap.opcode == GAP_END_DISCOVERABLE_DONE_EVENT)
{
PRINT("Waiting for advertising1..\n");
PeripheralUpdateAdvertisingInterval(); //調整廣播間隔再打開廣播
}
浙公網安備 33010602011771號