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.

[参考译文] CC2642R-Q1:当最大特性数量= 0 时、引脚或密钥缺失

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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/1627898/cc2642r-q1-pin-or-key-missing-when-maximum-number-of-characteristic-0

器件型号: CC2642R-Q1

SDK:simplelink_cc13xx_cc26xx_sdk_7_41_00_17

项目:simple_peripheral

我的客户在其应用程序中使用的配置为最大数量的特征= 0、但他们最近发现无法使用此配置完成加密。 绑定后、下一个连接将终止、因为 CC2642 向中央器件发送 LLCP 拒绝扩展指示。

image.png

image.png

我知道 CCC 在绑定器件的连接中应该是持久的、但对于这种特定情况、客户需要对协议栈中的逻辑进行一些详细说明。

  1. 如果最大特性数量设置为 0 且启用了绑定、则该栈如何处理 CCC 以及在收到加密请求时为什么发送引脚或密钥丢失?
  2. 如果特征参数的最大数量大于 0、我们观察到 SimplePeripheral_processCharValueChangeEvt 在连接后被调用、是由堆栈启动吗? 它是否会影响从中央器件发出的启用或禁用通知的后续写入请求?
  3. 是否有办法在不接收来自中央器件的写入请求的情况下手动处理来自外设的 CCC 值?

此致、

Shuyang Zhong

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

    您好:

    1. 当特性数量设置为 0 时、栈将向 NV 存储写入 0 字节、并从 NV 存储读取 0 字节。 这将导致不存储或恢复 CCCD 值。
      1. 它在接收到加密请求时发送引脚或密钥缺失错误的原因是 BLE 规范规定 CCCD 必须在绑定器件的连接之间保持不变。
      2. 当绑定管理器尝试恢复绑定上下文时、它将尝试恢复 CCCD、但将特征数量设置为 0 时、这是不可能的。 这将导致密码失败并拒绝 PIN 或密钥缺失的加密请求。
    2. 是的、这是由堆栈启动的。
      1. 否、这不应影响从中央器件发出的启用/禁用通知的后续写入请求
    3. 是的、有 GATT 服务器 API 可以手动操作外设上的 CCCD 值、而无需接收来自中央器件的写入请求、因为它们是在本地完成的。
      1. GATTServo CCCD/CharCfg 允许您写入 App_Write  
      2. GATTServo App_Send CCUpdatedEvent 将发送通知、指示系统更新绑定信息
      3. 在外设端进行手动写入时、需要注意一些风险
        1. 服务器手动更改 CCCD 值是非标准的、可能会导致客户端状态同步问题、客户端未请求的意外通知、或与某些中央设备的潜在互操作性问题。

    此致、
    Josh Alderson

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

    您好:

    我要咨询的第三个问题是:  

    将最大特征数修改为 4。 进行连接配对后、在发出下一个连接 GAP_LINK_INSTABLE_EVENT 通知之前、 cc2642 协议栈将首先通过 simpleAttrCB 通知 Profile_Write 如何删除此通知。  

    非常感谢!

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

    您好:

    如果您尝试根本不进行回调、则可能无法完全注册写入回调、但强烈不建议这样做。 这样做会破坏器件上的所有写入功能、即使尝试写入 CCCD 属性、也会导致返回错误。

    您不希望  调用 simpleAttrCB Profile_Write 函数的具体原因是否存在? 是否存在您不希望回调发生的特定情况(例如,在债券恢复期间)、或者是否有任何写入?

    此致、
    Josh Alderson

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

    您好:

    主要原因是不需要在 GAP_LINK_INSTABLE_EVENT 之前通知。  

    “ble connect idx:0 handle:0“日志是 SimplePeripheral_processGapMessage 函数的 GAP_LINK_RESISTed_event 输出。在此连接事件之前、协议栈已通知通知通知通知已激活 NOTIFICE。 此行为仅在配对后发生。 可以消除这种行为吗?  即使在成功连接后、仍需要响应 notify activation。  

    [i] f:simplel Profile_Write、AttrCB l:820 ble open notify
    [i]:SimplePeripheral_processAdvEvent l:1862 设置 ADV 禁用 2026年03月26日 02:20:13.705]
    [i]:SimplePeripheral_processAdvEvent l:1890 Set ADV Terminated 2026年03月26日 02:20:13.705]
    [i]:f:SimplePeripheral_processCharValueChangeEvt l:1434 ble open notify Success index 2026年03月26日:4 手柄:0[SimpleLink 02:20:13.705]
    [i]:SimplePeripheral_processGapMessage l:1217 双连接 idx:0 手柄:0[SimpleLink 2026年03月26日 02:20:13.705]
    [i] f:SimplePeripheral_processAdvEvent l:1850 Set ADV enable 2026年03月26日 02:20:13.835]

    非常感谢!

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

    您好:

    感谢您的澄清。

    是的、此行为可以修复。 问题是在绑定还原期间、堆栈会自动从绑定记录中恢复 CCCD 值 解决方案 正在发送。 GAP_LINK_ESTABLISHED_EVENT这将使用特殊method参数值触发写入回调。

    解决方法是检查method参数 SimpleGattProfile_writeAttrCB和防止本地写入通知应用程序。

    在中SimpleGattProfile_writeAttrCB、修改GATT_CLIENT_CHAR_CFG_UUID大小写  

    case GATT_CLIENT_CHAR_CFG_UUID:
        status = GATTServApp_ProcessCCCWriteReq( connHandle, pAttr, pValue, len,
                                                 offset, GATT_CLIENT_CFG_NOTIFY );
        
        /* Only notify app for real client writes, not bond restoration */
        if ( method != GATT_LOCAL_WRITE )
        {
            notifyApp = SIMPLEGATTPROFILE_CHAR4;
        }
        break;
    

    注意: 如果使用GATT_LOCAL_WRITE、则需要包括:

    #include <ti/ble/host/gatt/gattservapp.h>
    

    这将阻止绑定还原期间的应用程序通知、同时仍允许回调客户端对 CCCD 的实际写入。

    此致、
    Josh Alderson

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

    您好:

    非常感谢。 问题已经解决。