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.

[参考译文] CC2651R3:以前绑定的器件无法在白名单模式下连接

Guru**** 2386460 points
Other Parts Discussed in Thread: SYSCONFIG, CC2651R3
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/1373648/cc2651r3-previously-bonded-devices-can-not-connect-in-whitelist-mode

器件型号:CC2651R3
主题中讨论的其他器件:SysConfig

工具与软件:

您好!

我们的解决方案基于来自 BLE 堆栈的简单外设示例。 以下是我们使用的软件/工具的详细信息:

TI SimpleLink SDK:v7.41.00.17
TI Code Composer Studio:CCS-12.5.0
TI ARM Clang 编译器工具:3.2.0.LTS
XDCTools:3.62.01.15

我们的应用程序正在使用"Just Works"配对模式 以及启用绑定和 过滤器策略配置为"处理来自所有设备的扫描请求和仅来自 AL 中设备的 conn 请求(在 SDK v6.20中为 WL)"。 此外、我们依靠 GAPBondMgr 来处理配对、绑定和白名单连接工作流、并且不在应用程序中执行任何这些操作。  

我们最近已将项目从 SDK v6.20迁移到最新的 v7.41.00.17、并且观察到一个与白名单策略相关的问题。 测试步骤如下所示:

  • 外设在可配对广播模式下进行广播
  • 未绑定的中央设备扫描外设、并尝试连接、配对和绑定。 此外、成功绑定到中央器件、键合正确存储在 NVS 中(使用 GAP API 进行验证以返回绑定器件的数量)
  • 外设禁用可配对广播模式并在白名单广播模式下进行广播。
  • 已绑定的中央设备尝试连接。

预期结果:已绑定的器件应建立加密的 BLE 连接  

结果:已绑定的设备在 Android 上被拒绝连接"GATT ERROR (0x85)"、在 iOS 上则被拒绝连接  

以下是突出显示连接尝试失败的监听器屏幕截图:

  • 可配对高级模式下的连接

  • 白名单广播模式下的连接

问题:

  • 筛选器策略设置是否与之前的 SDK 一致、或者是否有我遗漏的其他配置?  
  • 我们是否需要在应用程序中处理 gapbondmgr.h/.c 更改?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    在应用程序中必须考虑到 SDK 版本之间可能有一些细微更改。 我建议查看下一页中列出的迁移指南: https://dev.ti.com/tirex/content/simplelink_cc13xx_cc26xx_sdk_7_41_00_17/docs/ble5stack/ble_user_guide/html/ble-stack-5.x-guide/migration-cc13xx_cc26xx.html

    这些指南将提及应考虑的 SDK 版本之间的任何主要更改。

    此致、

    1月

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

    您好、Jan:

    我已经通过这些更改修补了项目、但是我所描述的行为保持不变/错误

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

    您好!

    明白了。 感谢您的观看。 我要确保我们不会遗漏有关7.41中预期的程序的任何内容。 您能否从7.41获取 SDK 示例工程、添加白名单代码、看看工程是否正确执行白名单?

    此致、

    1月

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

    大家好、Jan、我已经在 SDK v7.41中的简单外设示例中添加了必要的源代码来启用两个广播集:可配对和白名单。

    但是、在此处可以观察到相同的问题、请参阅 NRF Connect 应用程序中的屏幕截图:

    -在可配对的 Adv 模式中连接:配对和绑定是成功的。

    -处于白名单广告模式时的连接:已配对和绑定的设备的连接被拒绝

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

    您好!

    感谢您的测试。 您是否可以共享用于启用白名单的代码片段? 它是否遵循 高级安全功能 SLA 任务3中概述的格式

    此致、

    1月

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

    您好、Jan:

    以下是请求的详细信息:

    白名单的 ADV 参数 ADV 模式:

    可配对 ADV 模式的 ADV 参数:

    绑定管理器设置:

    -配置和启用白名单广播模式的代码片段

            //Advertisement for whitelisted devices
            BLE_LOG_INT_INT(0, BLE_LOG_MODULE_APP, "APP : ---- call GapAdv_create set=%d,%d\n", 0, 0);
            // Create Advertisement set #1 and assign handle
            status = GapAdv_create(&SimplePeripheral_advCallback, &advParams1,
                                   &advHandleLegacy_ForWhitelistedDev);
            SIMPLEPERIPHERAL_ASSERT(status == SUCCESS);
    
            // Load advertising data for set #1 that is statically allocated by the app
            status = GapAdv_loadByHandle(advHandleLegacy_ForWhitelistedDev, GAP_ADV_DATA_TYPE_ADV,
                                         sizeof(advData1), advData1);
            SIMPLEPERIPHERAL_ASSERT(status == SUCCESS);
    
            // Load scan response data for set #1 that is statically allocated by the app
            status = GapAdv_loadByHandle(advHandleLegacy_ForWhitelistedDev, GAP_ADV_DATA_TYPE_SCAN_RSP,
                                         sizeof(scanResData1), scanResData1);
            SIMPLEPERIPHERAL_ASSERT(status == SUCCESS);
    
            // Set event mask for set #1
            status = GapAdv_setEventMask(advHandleLegacy_ForWhitelistedDev,
                                         GAP_ADV_EVT_MASK_START_AFTER_ENABLE |
                                         GAP_ADV_EVT_MASK_END_AFTER_DISABLE |
                                         GAP_ADV_EVT_MASK_SET_TERMINATED);
    
            // Enable legacy advertising for set #1
    //        status = GapAdv_enable(advHandleLegacy_ForWhitelistedDev, GAP_ADV_ENABLE_OPTIONS_USE_MAX , 0);

    -用于配置可配对广播的代码片段

    static void SimplePeripheral_ConfigurePairableAdv()
    {
      bStatus_t status = FAILURE;
    
      //Advertisement for New Devices
      BLE_LOG_INT_INT(0, BLE_LOG_MODULE_APP, "APP : ---- call GapAdv_create set=%d,%d\n", 1, 0);
      // Create Advertisement set #2 and assign handle
      status = GapAdv_create(&SimplePeripheral_advCallback, &advParams2,
                             &advHandleLegacy_ForNewDev);
      SIMPLEPERIPHERAL_ASSERT(status == SUCCESS);
    
      // Load advertising data for set #2 that is statically allocated by the app
      status = GapAdv_loadByHandle(advHandleLegacy_ForNewDev, GAP_ADV_DATA_TYPE_ADV,
                                   sizeof(advData2), advData2);
      SIMPLEPERIPHERAL_ASSERT(status == SUCCESS);
    
      // Load scan response data for set #1 that is statically allocated by the app
      status = GapAdv_loadByHandle(advHandleLegacy_ForNewDev, GAP_ADV_DATA_TYPE_SCAN_RSP,
                                   sizeof(scanResData2), scanResData2);
      SIMPLEPERIPHERAL_ASSERT(status == SUCCESS);
    
      // Set event mask for set #2
      status = GapAdv_setEventMask(advHandleLegacy_ForNewDev,
                                   GAP_ADV_EVT_MASK_START_AFTER_ENABLE |
                                       GAP_ADV_EVT_MASK_END_AFTER_DISABLE |
                                       GAP_ADV_EVT_MASK_SET_TERMINATED);
    }
    

    -用于启用可配对广播的代码片段

    static void SimplePeripheral_EnablePairableAdv()
    {
       // Disable Bonded Devices Advertisement
      GapAdv_disable(advHandleLegacy_ForBonDev);
    
      // Enable pairing for new devices
      // Display_printf(dispHandle, 16, 0, "Pair Mode: Pairing Enabled");
      // uart_log
      // SimplePeripheral_serialPrint("Pair Mode: Pairing Enabled");
      GAPBondMgr_SetParameter(GAPBOND_PAIRING_MODE, sizeof(uint8_t), &pairModeWaitForRequest);
      // GAPBondMgr_SetParameter(GAPBOND_PAIRING_MODE, sizeof(uint8_t), &pairModeInitiatePairing);
    
      // Enable Advertisement for New Devices
      GapAdv_enable(advHandleLegacy_ForNewDev, GAP_ADV_ENABLE_OPTIONS_USE_MAX, 0);
    
      // Timer for Advertisement A
      Util_startClock(&timeoutClkForPairableAdv);
    
      // Timer for change pairing mode to pairing not allowed
      Util_startClock(&timeoutClkForPairingModeChange);
    }

    请注意、超时后、配对模式被禁用、器件在白名单广播模式下进行广播。 此外、预计已配对和绑定的器件将连接到简单外设应用。

    static void SimplePeripheral_PairingNotAllowed()
    {
      // Disable Pairing for new devices
      // Display_printf(dispHandle, 16, 0, "Pair Mode: Pairing Disabled");
      // uart_log
    //  SimplePeripheral_serialPrint("Pair Mode: Pairing Disabled");
      GAPBondMgr_SetParameter(GAPBOND_PAIRING_MODE, sizeof(uint8_t), &pairModePairingNotAllowed);
    }

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

    您好、Jan:

    我在 SDK v7.10.2.23的简单外设示例基础上准备了另一个具有相同代码的示例。 这导致白名单按预期工作、已绑定的器件可以在白名单广播模式下连接。 有关详细信息、请参阅屏幕截图:

    可配对广播中的连接(对和绑定):

    白名单中的连接 Adv (已绑定的设备):

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

    您好!

    明白了。 感谢您在较旧的 SDK 上运行该测试。 奇怪的是、同样的行为会导致较新的 SDK 出现问题。 我猜一些缺陷修复或附加功能会影响白名单广告功能以前的工作方式。 我将更仔细地研究 SDK 之间修复的问题、看看是否有什么东西跳出我的思维。 要确认、simple_peripheral 示例的唯一更改是您共享的四个代码段和发布的 SysConfig 选项、对吗?

    此致、

    1月

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

    您好、Jan:

    没有进一步的变化。 您能否准备一个带有白名单功能的原型?

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

    您好!

    明白了。 感谢您的确认。 我将努力在我这边重现这种情况、并在明天之前提供更新。

    此致、

    1月

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

    您好!

    我很抱歉,我今天没能解决这个问题。 我将在明天确定优先级、并在一天中的某个时间提供更新。 对于这可能给您带来的不便、我深表歉意。

    此致、

    1月

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

    您好!

    我对拖延时间表示最诚挚的歉意。 我能够在我这边实施允许列表筛选。 我向 simple_peripheral 工程添加了一些修改来启用此功能。 首先、我删除了远距离广播集、只使用一个。 这意味着我删除了对 advHandleLongRange 的所有引用。 之后、我将连接数量限制为1个连接(以使器件在1个连接后停止广播)。

    建立连接后、我会将设备添加到允许列表

    建立连接后、我将读取特征5以启动配对。 在配对回调中、我添加了用于更改允许列表策略的代码。 我在这个地方做了这件事,因为广告应该在这一点上关闭:

    使用此项目、我能够使用 Android 设备连接至 CC26X2R1器件、反复配对、断开和重新连接、而且当尝试连接另一个设备时、绝不会形成连接。

    我已将项目上传至: e2e.ti.com/.../1512.simple_5F00_peripheral_5F00_CC26X2R1_5F00_LAUNCHXL_5F00_tirtos7_5F00_ticlang.zip

    您能在自己这边试一下吗? 对于提供这些代码片段而出现的延迟、深表歉意。

    此致、

    1月

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

    您好、Jan:

    非常感谢您准备的项目。 不过、我还有几个问题:

    我们的用例(在我准备的示例项目中演示):

    -两个广播集,  

    advSet1:过滤器策略设置为"处理来自所有器件的扫描请求、仅处理来自 AL 中器件的连接请求"[主要用于连接之前已配对和绑定的器件、默认广播集]

    advSet2:过滤器策略设置为"处理来自所有设备的请求"。 该 Adv Set 支持配对、新器件可以配对和绑定

    发生的情况是:

    -当外设在 advSet1中广播时,如果未绑定的中央设备尝试连接,则应拒绝连接。 (GATT 错误)

    -当外设在 advSet2中进行广播时,它可以连接,也可以配对和绑定。 对于所有后续连接、同一中央设备必须能够在通过 advSet1进行连接时建立连接(因为中央设备现在已列入白名单)。 这在 SDK v7.41中失败、但在 v7.10中成功

    [这两种方案都作为 gapbondmgr.c]工作流程的一部分进行处理。

    现在、比较您已编译的工程:

    1.过滤器策略的 SysConfig 设置配置为"处理来自所有设备的请求"、这意味着任何设备都可以连接、并在需要时绑定和配对。  

    因此、在这里、我们的用例不一致、因为筛选器策略设置不同。 因此、我们无法使用一个 Adv Set 再现相同的行为。

    2.使用 HCI 自定义 API 将设备添加到白名单

    我假设 gapbondmgr 组件应负责该问题、并且根据 TI 指南、不建议在应用程序中处理该问题。 此外,如果这是在应用程序中处理,那么还必须处理我认为的 LRU 债券清单处理。 我们是否有意在新 SDK 中明确地实现该目的?

    您能否使用两个 Adv 集修改您的示例应用程序、并尝试重现我所述的情形。 此处介绍了 ADV 集的设置: https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/1373648/cc2651r3-previously-bonded-devices-can-not-connect-in-whitelist-mode/5253981#5253981

    在我的应用中、我添加了一个计时器、在应用启动30秒后禁用可配对高级。 在这段时间内、必须对 Adv 进行配对并绑定、然后 Adv 切换到白名单 Adv。 所以预计绑定的器件可以连接。

    谢谢、Kaiwalya

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

    嗨、Kaiwalya、

    为了澄清、我将滤波器设置更改为仅允许在接收到配对事件后从白名单中的器件进行连接。 基本上是将我的广播集从 advSet2转换为 advSet1。

    作为快速测试、您能否尝试使用您自己的 HCI 命令来查看它是否起作用?

    此致、

    1月

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

    您好、Jan:

    我尝试使用 HCI API 将器件(已配对)手动添加到白名单。

    然而,我不能连接白名单 Adv 为后续连接(在 iOS 和 Android 测试)

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

    您好!

    我懂了。 明白了。 我将尝试使用2个广告集、如您所述、以查看我是否可以重现该行为。 同时、您能否确认是否使用我的解决方案、然后只有之前连接的器件才能连接?

    此致、

    1月

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

    您好、Jan:  

    我已将您的应用移植到 CC2651R3、结果如下:

    - OnePlus Nord (Android 13) NRF Connect 应用程序

    可以进行首次连接、进行配对和键合。 之后、通过白名单进行连接不起作用(GATT 错误0x85)

    ...

    - iPhone 12迷你(iOS 17.5.1) Lightblue 应用程序

    可以进行首次连接、进行配对和键合。 之后、通过白名单进行连接的工作正常。

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

    您好!

    使用两个广播集、我能够重现您看到的行为(Android 上的 GATT 错误)。 我将为此提交一个 TT、以尽快由研发部门解决。 与此同时、我认为我们应该探讨潜在的权变措施。 它似乎使用一个单一的广告集至少在 iOS 上工作. 我想知道是否有一些额外的逻辑,我们可以添加,以使它在 Android 端的一致工作。 下面是我使用两个广告集重现行为的项目:

     e2e.ti.com/.../6253.simple_5F00_peripheral_5F00_CC26X2R1_5F00_LAUNCHXL_5F00_tirtos7_5F00_ticlang.zip

    您之前提到过它在6.20版本上有效。 您是否测试了介于两者之间的任何 SDK? 如果我们可以缩小修改此行为的 SDK 范围、可能会有所帮助。

    此致、

    1月

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

    您好 Jan、感谢您确认两个广告集的行为。  

    您提到这在以前的6.20版本上是有效的。 您是否测试了介于两者之间的任何 SDK? 如果我们能够缩小修改此行为的 SDK 范围、可能会有所帮助。[/QUOT]

    我可以先使用 SDK v7.40.00.77和更高版本在 SDKv7.41.00.17中重现此内容。 而我们当前恢复到 SDK v7.10.2.23、未观察到此行为。

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

    您好!

    我懂了。 感谢您分享这些结果。 我已更新 TT 并将信息转发给研发部门 他们将在未来的 SDK 版本中解决该问题。 对于由此给您带来的不便、我深表歉意。 您有兴趣在7.10 SDK 中使用的未来 SDK 是否存在任何功能或错误修复?

    此致、

    1月