前言:在日常使用中我们可能有需要动态修改广播包的情况。从机设备不走连接将一些传感器数据通过广播包显示出来
程序中提供了接口函数进行动态修改不用再先关闭广播再重新开启。
/******************************************************************************** @fn GAP_UpdateAdvertisingData** @brief Setup or change advertising and scan response data.** NOTE: if the return status from this function is SUCCESS,* the task isn't complete until the GAP_ADV_DATA_UPDATE_DONE_EVENT* is sent to the calling application task.** input parameters** @param taskID - task ID of the app requesting the change* @param adType - TRUE - advertisement data, FALSE - scan response data* @param dataLen - Octet length of advertData* @param pAdvertData - advertising or scan response data** output parameters** @param None.** @return SUCCESS: data accepted,<BR>* bleIncorrectMode: invalid profile role,<BR>*/ extern bStatus_t GAP_UpdateAdvertisingData( u8 taskID,u8 adType,u8 dataLen,u8 *pAdvertData );
GAP_UpdateAdvertisingData( 0,TRUE ,sizeof( advertData ),advertData ); // 广播包
GAP_UpdateAdvertisingData( 0,FALSE ,sizeof( scanRspData ),scanRspData ); // 扫描应答包
使用示例:
static uint8_t advertData[] = {// Flags; this sets the device to use limited discoverable// mode (advertises for 30 seconds at a time) instead of general// discoverable mode (advertises indefinitely)0x02, // length of this data GAP_ADTYPE_FLAGS,DEFAULT_DISCOVERABLE_MODE | GAP_ADTYPE_FLAGS_BREDR_NOT_SUPPORTED,// service UUID, to notify central devices what services are included// in this peripheral0x03, // length of this dataGAP_ADTYPE_16BIT_MORE, // some of the UUID's, but not all LO_UINT16(SIMPLEPROFILE_SERV_UUID),HI_UINT16(SIMPLEPROFILE_SERV_UUID),0x05,0xff,0x01,0x02,0x03,0x04};
上述为广播包内容,下面给出实际更新示例
if(events & Change_advdata_evt){advertData[12] = 0xaa;GAP_UpdateAdvertisingData( 0,TRUE ,sizeof( advertData ),advertData );tmos_start_task(Peripheral_TaskID, Change_advdata_evt, 16000);return (events ^ Change_advdata_evt);}
实际效果:
修改前: 修改后: