一.动态广播

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();                                                    //调整广播间隔再打开广播
            }

 

posted on 2022-09-15 15:22  WCH蓝牙应用分享  阅读(2443)  评论(0)    收藏  举报