TI中文支持网
TI专业的中文技术问题搜集分享网站

更新广播数据

各位好,

今年TI推出来BLE5的协议栈,现在我在使用simplelink_cc2640r2_sdk_2_30_00_28。芯片是CC2640R2f。

基于ble5_simple_peripheral开发蓝牙项目。

我的问题是需要更新广播数据,但是新的协议栈更新广播数据不同了。

我尝试过用这种方式更新扫描响应的数据,

status = GapAdv_prepareLoadByBuffer(scanRspData,TRUE );
SIMPLEPERIPHERAL_ASSERT(status == SUCCESS);
status = GapAdv_loadByBuffer(sizeof(update_ScanRapData),update_ScanRapData);
SIMPLEPERIPHERAL_ASSERT(status == SUCCESS);

但是结果是不是预期的那样,这样的更新覆盖了广播数据和扫描响应的数据。

也尝试过以下这种方式:

status = GapAdv_prepareLoadByHandle(advHandleLegacy,GAP_ADV_FREE_OPTION_SCAN_RESP_DATA);
SIMPLEPERIPHERAL_ASSERT(status == SUCCESS);
status = GapAdv_loadByHandle(advHandleLegacy,GAP_ADV_DATA_TYPE_SCAN_RSP,sizeof(update_Advertising),update_Advertising);
SIMPLEPERIPHERAL_ASSERT(status == SUCCESS);

结果是没有任何作用,这个广播handle可以确定是有效的。

 

Viki Shi:

论坛有类似问题,请参考:
e2echina.ti.com/…/482606
e2e.ti.com/…/745613

z z46:

这位兄弟,你解决这个问题了吗,我遇到了相同的。。。。求指导,求联系

shimin zhang:

回复 z z46:

我看了TI的document,按照他们的说法,有两种更新方式,一种是更新单个广播的数据,另一种是更新所有广播的数据,结果我发现都失败了。后来我想到一种办法,simplelink_cc2640r2_sdk_2_30_00_28这个SDK支持多个广播(实际就是可以分时交替广播,这样只要mac地址不一样,就相当于多个BLE设备在广播),也可以停止广播,然后删除/析构这个广播。接着创建/构造一个广播,载入你要更新的数据,再开启广播,这样也实现更新广播数据,但是删除/析构广播、创建/构造这个过程需要间隔一定的时间,否则会出现同一个mac的BLE交替广播两种数据。

//删除以前的广播。status = GapAdv_destroy(advHandleLegacy);
//创建新的广播。
status = GapAdv_create(&SimplePeripheral_advCallback, &advParamLegacy,&advHandleLegacy);
以上两个函数,先删除广播,然后1秒钟(非阻塞延迟)后,再调用创建新的广播函数。

z z46:

回复 shimin zhang:

就相当于每次都销毁原来的广播集重新再建一个是吧

NA NM以上两个函数,先删除广播,然后1秒钟(非阻塞延迟)后,再调用创建新的广播函数。

这个非阻塞延时是虾米意思啊,不能调用for(i=0;i<65535;i++)这样的延时函数是吗,得用定时器?

期待您的答复 搓手.jpg

shimin zhang:

回复 z z46:

对,不能调用这样for延时。可以用一个软件定时器,执行完删除广播,然后启动软件定时器,软件定时器触发一个创建广播的事件。

z z46:

回复 shimin zhang:

OK,我试下,谢谢大神

z z46:

回复 shimin zhang:

大神, 我今天试了,还是不行喂,有时能成功,有时不行,和以前一样的说,请问你有源码能给我参考吗?

同时附上我的程序:

//在这里将数组中的数据更新掉并销毁以前的广播集
static bool SetLongRangeAdvData(uint8_t *pdata, uint8_t Len)
{bStatus_t status = FAILURE;if(Len > 80){return false;}status = GapAdv_destroy(advHandleLongRange);if(status != SUCCESS){SC_Log_info1("prepare Load By Handle error code: 0x%02x.",status);}if(Len < 80){for(uint8_t i = Len;i < 80;i++){advertData[i] = 0;}}for(uint8_t i = 0;i < Len;i++){advertData[i] = pdata[i];}advertDataLength = Len;Util_startClock(&clkLRadvUpdate);return true;
}//util_dequeue 后处理事件case SP_UPDATE_LONG_RANGE_ADV:
//SetLongRangeAdvData(((spNpiReceiveData_t *)pMsg->pData)->data, ((spNpiReceiveData_t *)pMsg->pData)->length);bStatus_t status = FAILURE;// Use long range params to create long range set #2GapAdv_params_t advParamLongRange = GAPADV_PARAMS_AE_LONG_RANGE_CONN;advParamLongRange.primPhy = GAP_ADV_PRIM_PHY_CODED_S8;//GAP_ADV_PRIM_PHY_1_MBPS;advParamLongRange.secPhy = GAP_ADV_SEC_PHY_CODED_S8;//GAP_ADV_SEC_PHY_1_MBPS;// Create Advertisement set #2 and assign handlestatus = GapAdv_create(&SimplePeripheral_advCallback, &advParamLongRange,&advHandleLongRange);//SIMPLEPERIPHERAL_ASSERT(status == SUCCESS);if(status != SUCCESS){SC_Log_info1("create handle error code: 0x%02x.",status);}// Load advertising data for set #2 that is statically allocated by the appstatus = GapAdv_loadByHandle(advHandleLongRange, GAP_ADV_DATA_TYPE_ADV,advertDataLength, advertData);//sizeof(advertData), advertData);chg by zch0725//SIMPLEPERIPHERAL_ASSERT(status == SUCCESS);// Load scan response data for set #2 that is statically allocated by the app//status = GapAdv_loadByHandle(advHandleLongRange, GAP_ADV_DATA_TYPE_SCAN_RSP,//sizeof(scanRspData), scanRspData);//SIMPLEPERIPHERAL_ASSERT(status == SUCCESS);/// Set event mask for set #2status = GapAdv_setEventMask(advHandleLongRange,GAP_ADV_EVT_MASK_START_AFTER_ENABLE |GAP_ADV_EVT_MASK_END_AFTER_DISABLE |GAP_ADV_EVT_MASK_SET_TERMINATED);// Enable long range advertising for set #2status = GapAdv_enable(advHandleLongRange, GAP_ADV_ENABLE_OPTIONS_USE_MAX , 0);//SIMPLEPERIPHERAL_ASSERT(status == SUCCESS);if(status != SUCCESS){SC_Log_info1("enable error code: 0x%02x.",status);}break;
z z46:

回复 shimin zhang:

大神,你是回家过年了吗。。。年前我还有望得到你的回复吗T_T

z z46:

回复 shimin zhang:

大神 回来上班了吗 仍然搓手等答复中

赞(0)
未经允许不得转载:TI中文支持网 » 更新广播数据
分享到: 更多 (0)