蓝牙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 );

 

posted @ 2023-01-17 17:09  SweetTea_lllpc  阅读(1319)  评论(0)    收藏  举报