This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] LAUNCHXL-CC2640R2:观测器未捕获所有广播包

Guru**** 2595800 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/608642/launchxl-cc2640r2-simple-observer-not-capturing-all-advertising-packets

器件型号:LAUNCHXL-CC2640R2

我的 1_35_00_33 simplelink SDK 中的 simple_ob观测 器_cc2640r2lp_app 存在一些可靠性问题。  我正在尝试从 每100mSec 发送一次的外设设备捕获所有广播数据包(另一个运行 Project_Zero 应用程序的 CC2640R2 LaunchXL)。  外设 器件在其广播数据中包含一个计数器、该计数器在发送每个 ADV 数据包时递增。  我正在检查观测器代码中的数据、大约缺少10%的数据。  当我使用 TI 数据包监听器检查 BLE 流量时、我可以看到从外设发送的所有 ADV 数据包、其中没有缺失、因此问题似乎不出在外设器件中。  我已修改 GAP_DEVICE_INFO_EVENT、以将事件过滤为仅与我感兴趣的地址匹配的事件、并检查 mfr 中的计数器。 ADV 数据包的区域是连续的、这表示我没有错过一个数据包。  代码和典型输出如下所示。  我将 DEFAULT_SCAN_DURATION 设置为0以无限期扫描、 将 DEFAULT_MAX_SCAN_RES 设置为8。  我还设置了一些其他 GAP 参数、如下所示...

//EC -根据 e2e.ti.com/.../345382将扫描占空比设置为100%
GAP_SetParamValue (TGAP_GEN_DISC_SCAN_INT、16);
GAP_SetParamValue (TGAP_GEN_DISC_SCAN_WING、16);

//EC -请勿按设备地址过滤... 允许应用程序接收所有 ADV 数据包
GAP_SetParamValue (TGAP_FILTER_ADV_REPORTS、false);

我认为这可能是扫描窗口/间隔或时间问题,但我不确定如何解决问题,而不是尝试和错误...任何帮助解决这一问题都是非常感激的。

静态空 SimpleBLEObserver_processRoleEvent (gapObserverRoleEvent_t *pEvent)
{
uint8_t EVENT_addr[B_ADDR_LEN];//!<广播或 SCAN_RSP 的地址
uint16_t advDataDifference = 0;
uint32_t currentTicks = 0;

switch (pEvent->gap.opcode)
{
案例 GAP_DEVICE_INIT_DONE_EVENT:
{
//Display_print0 (dispHandle、1、0、Util_convertBdAddr2Str (pEvent->initDone.devAddr));)
//Display_print0 (dispHandle、2、0、"已初始化");

//提示用户开始扫描。
//Display_print0 (dispHandle、5、0、"Discover ->");
}
中断;

案例 GAP_DEVICE_INFO_EVENT:
{
//SimpleBLEObserver addDeviceInfo (pEvent->deviceInfo.addr、pEvent->deviceInfo.addType);
advTotEvntCnt++;
memcpy (event_addr、pEvent->deviceInfo.addr、B_ADDR_LEN);
currentTicks = Clock_getTicks ();

//检查地址是否与我们的 matchBuf 模式匹配,因此我们知道它是我们的 BLE 设备之一
if (memcmp (&event_addr[B_ADDR_LEN-ADV_ID_MATH_LEN]、&matchBuf[B_ADDR_LEN-ADV_ID_MATH_LEN]、ADV_ID_MATH_LEN)==0)
{
advFiltEvntCnt++;
//将节拍和 mfr ADV 数据存储到缓冲区中以进行离线检查/调试。 外等式提前计数器、单位为 mfr。
//每个 ADV 数据包的 ADV 数据、当它达到1000时、它回绕到0。
advFiltEvntTicks[advDataBufIndex]=电流 Ticks;
memcpy (&advFiltEvntData[advDataBufIndex]、pEvent->deviceInfo.pEvtData + 6、sizeof (uint32_t));

//检查广播数据是否是顺序的...如果没有错过日志#,则检查0会在缓冲区换行时忽略,因此不准确,但足够接近
if (advFiltEvntData[advDataBufIndex]>0)
{
advDataDifference = advFiltEvntData[advDataBufIndex]- advFiltLastData;
if ((advDataDifference > 1)&&(advFiltEvntCnt > 1))
{
advFiltMisedEvntCnt += advDataDifference - 1;
}
}
advFiltLastData = advFiltEvntData[advDataBufIndex];
advDataBufIndex =(advDataBufIndex < ADV_DATA_BUF_LEN)? advDataBufIndex++:0;
}

//每10秒输出性能数
if (currentTicks - startTicks > 1000000)
{
startTicks = currentTicks;
advFiltMisedEvntPct =((float) advFiltMisedEvntCnt /(float) advFiltEvntCnt)*100;
Display_Print1 (dispHandle、1、0、"时间戳记数:%d "、currentTicks);
Display_Print1 (dispHandle、2、0、"Total Event Count:%d"、advTotEvntCnt);
Display_Print1 (dispHandle、3、0、"过滤事件计数:%d"、advFiltEvntCnt);
Display_Print1 (dispHandle、4、0、"错过的事件计数:%d "、advFiltMisedEvntCnt);
Display_Print1 (dispHandle、5、0、"错过的事件百分比:%d"、advFiltMisedEvntPct);
advTotEvntCnt = 0;
advFiltEvntCnt = 0;
advFiltMisedEvntCnt = 0;
}
}
中断;

案例 GAP_DEVICE_DISCOVERING_EVENT:
{
//发现完成。
扫描=错误;

//复制结果。
scanRes = pEvent->disccmpl.numDevs;
memcpy (devList、pEvent->discCmpl.pDevList、
(sizeof (gapDevRec_t)* pEvent->discCmpl.numDevs));

Display_Print1 (dispHandle、2、0、"找到的设备%d"、scanRes);

如果(scanRes >0)
{
Display_print0 (dispHandle、3、0、"<- to Select");
}

//初始化扫描索引。
scanIdx =-1;

//提示用户可以在此状态下重新执行扫描。
Display_print0 (dispHandle、5、0、"Discover ->");
}
中断;

默认值:
中断;
}

   

谢谢、

ED

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Ed:

    您正在使用哪些扫描参数? 为了确保捕获所有广播、扫描窗口应大于通告间隔。 在此处阅读更多信息: dev.ti.com/.../
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    广播速度为100mSec、我尝试了100mSec 到5000mSec 之间的扫描窗口、但没有成功。  我可以可靠地接收发送的95%至99%的 ADV 数据包、但不能100%接收。  我还尝试通过增加3个外围设备(CC2640r2 LaunchXL 板)来增加整个无线 ADV 流量、每个广播间隔为100mSec、但这似乎不会影响可靠性、例如更糟...

    BLE 堆栈在所有3个广播通道上进行扫描、是否有可能由于它在 ch38上进行"侦听"而丢失某些数据包?例如、外设在 CH37或 CH39上进行传输?  是否可以将 BLE 堆栈设置为仅在3个广播通道中的一个通道上扫描、例如仅在 CH37上扫描?  您似乎可以将堆栈设置为在下面的单个通道上进行广播...

    谢谢你。

    ED

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Ed:

    为了符合蓝牙核心规范、器件必须在所有三个广播通道上进行扫描。 www.bluetooth.com/.../adopted-specifications

    但是、外围设备只能在一个通道上进行广播。

    扫描窗口表示设备在每个信道上扫描的时间。 因此、将扫描窗口设置为大于广播间隔应确保接收到所有广播包。

    您是否在嘈杂的环境中工作?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Marie、

    我尝试在"单一观测器"示例代码上设置大于广播间隔的扫描窗口、但是、当我这么做时、我从未收到 GAP_DEVICE_INFO_EVENT。  我尝试过各种值范围,最近的值低于...这里是否缺少某些值(请注意 DEFAULT_SCAN_DURATION = 0)?

    //设置 GAP
    GAP_SetParamValue (TGAP_GEN_DISC_SCAN、DEFAULT_SCAN_DURATION);
    GAP_SetParamValue (TGAP_LIM_DISC_SCAN、DEFAULT_SCAN_DURATION);
    
    // EC -根据 e2e.ti.com/.../345382
    GAP_SetParamValue (TGAP_GEN_SCAN_INT_REDURATION、DEFAULT_SCAN_REQ)将扫描占空比设置为100%;
    
    
    //根据 GAP_SCAN_INT_SCAN_INT_SCAN_INT_REQ 设置为8000;不是 TS_SCAN_INT_SCAN_RE_ 允许应用程序接收所有 ADV 数据包
    GAP_SetParamValue (TGAP_FILTER_ADV_REPORTS、false);
    
    

    在嘈杂的环境中、我使用 TI 数据包监听器来双重检查外设是否正常工作、并在外设设置进行500次广播后发现0%的数据包缺失、每秒进行一次广播、这样我就可以在数据包监听器显示屏上轻松地观察到数据包。  使用简单的观测器、我最多只能得到1%的丢包。  平均而言、我每秒收到的 ADV 消息约为6条、这些消息不是来自我的外设(该区域的其他内容、例如电话、电视等)、 但是、这种流量似乎不会给 TI 数据包监听器带来问题、因此我认为这也不会成为简单观测器的问题。  我将外设和观测器板放置在彼此几英寸的桌子上、因此信号强度不应成为问题。  我还删除了所有调试和控制台 printf、以确保这不会产生问题、但没有得到任何改进。  还有其他想法吗?

    Thx、

    ED

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Ed:

    您能否使用 SmartRF Studio 测试数据包错误率? www.ti.com/.../smartrftm-studio