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.

[参考译文] CC2340R5:如何管理 Data PDU 长度?

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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/1425587/cc2340r5-how-to-manage-the-data-pdu-length

器件型号:CC2340R5

工具与软件:

尊敬的 TI:

我将使用两个 CC2340R5板并相互连接、并 在 syscfg 中将这两个器件的 PDU Max Size 设置为240、如下图所示。

稍后、我使用监听器检查从中央设备发送的 LL_LENGTH_REQ 的内容、发现 TX Max 仅为27字节(SIG 指定的最小 PDU 长度)。 是否有任何其他设置需要修改?

来自中央设备的 LL_LENGTH_REQ


来自外设的另一个 LL_LENGTH_REQ

SDK I 使用的是 simplelink_lowpower_f3_sdk_8_10_01_02

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

    您好!

    最大 PDU 长度只是 PDU 可以设置的最大长度。 这不是它将设置的值。 您还需要在应用程序代码中配置数据长度。

    此致、

    1月

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

    您好、Jan:

    感谢您的解释。 之后、我在两个器件之间使用了"ATT_EXCHANGE_MTU_REQ"来处理该问题。

    接下来、我尝试发送一个"ATT_WRITE_REQ"、代码如下所示:

    // Exchange and set Max MTU
    attExchangeMTUReq_t req;
    uint8_t MTUVals = 251;
    req.clientRxMTU = MTUVals - L2CAP_HDR_SIZE;
    GATT_ExchangeMTU(gapEstMsg->connectionHandle, &req, BLEAppUtil_getSelfEntity());
    
    // Use ATT_WRITE_REQ to send local OOB data
    Req.handle = 37;
    uint8_t charVals[16];
    for (int i = 0; i < KEYLEN; i++)
    {
        charVals[i] = localOobData.rand[i];
    }
    Req.pValue = GATT_bm_alloc(gapEstMsg->connectionHandle, ATT_WRITE_REQ, sizeof(charVals), NULL);
    Req.len = sizeof(charVals);
    for (int i = 0; i < sizeof(charVals); i++)
    {
        Req.pValue[i] = charVals[i];
    }
    Req.sig = 0;
    Req.cmd = 0;
    
    bStatus_t status = GATT_WriteCharValue(gapEstMsg->connectionHandle, &Req, BLEAppUtil_getSelfEntity());
    if ( status != SUCCESS )
    {
        GATT_bm_free((gattMsg_t *)&Req, ATT_WRITE_REQ);
    }
    // Print the status of the gatt_WriteCharValue call
    MenuModule_printf(APP_MENU_GENERAL_STATUS_LINE, 0, "Call Status: GATTWrite = "
                      MENU_MODULE_COLOR_BOLD MENU_MODULE_COLOR_RED "%d" MENU_MODULE_COLOR_RESET,
                      status);

    但是、无法发送请求、并且通过 UART 打印的错误消息如下图所示:


    在多次尝试后,问题似乎是第一个参数,句柄,在GATT_WriteCharValue(),但我不知道如何解决它。 对于如何解决此问题、您有什么建议吗?

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

    您好!

    感谢您分享最新调试结果。 这很有帮助! 您能解释一下为什么您怀疑函数的第一个参数是问题吗? 您能否尝试打印您要传递的值、以确认它确实是我们预期的连接句柄?

    此致、

    1月

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

    您好!

    由于错误代码22转换为十六进制值0x16、我在 TI 的库中查询发现它指示了参数错误。 我开始使用 handle 参数进行故障排除、发现输入0会导致0x16错误消息、输入1会返回0x02。 pReq 和 taskId 等其他参数是根据 TI 在 GitHub 上提供的示例代码编写的、因此我认为问题可能出在句柄上。

    我添加调试消息以打印 gapEstMsg->connectionHandle、代码更新如下:

    // Exchange and set Max MTU
    attExchangeMTUReq_t req;
    uint8_t MTUVals = 251;
    req.clientRxMTU = MTUVals - L2CAP_HDR_SIZE;
    GATT_ExchangeMTU(gapEstMsg->connectionHandle, &req, BLEAppUtil_getSelfEntity());
    
    MenuModule_printf(APP_MENU_PROFILE_STATUS_LINE2, 0, "my handle = "
                      MENU_MODULE_COLOR_BOLD MENU_MODULE_COLOR_RED "%d" MENU_MODULE_COLOR_RESET,
                      gapEstMsg->connectionHandle);
    
    // Use ATT_WRITE_REQ to send local OOB data
    Req.handle = 37;
    uint8_t charVals[16];
    for (int i = 0; i < KEYLEN; i++)
    {
        charVals[i] = localOobData.rand[i];
    }
    Req.pValue = GATT_bm_alloc(0, ATT_WRITE_REQ, sizeof(charVals), NULL);
    Req.len = sizeof(charVals);
    for (int i = 0; i < sizeof(charVals); i++)
    {
        Req.pValue[i] = charVals[i];
    }
    Req.sig = 0;
    Req.cmd = 0;
    
    bStatus_t status = GATT_WriteCharValue(0, &Req, BLEAppUtil_getSelfEntity());
    if ( status != SUCCESS )
    {
        GATT_bm_free((gattMsg_t *)&Req, ATT_WRITE_REQ);
    }
    // Print the status of the gatt_WriteCharValue call
    MenuModule_printf(APP_MENU_GENERAL_STATUS_LINE, 0, "Call Status: GATTWrite = "
                      MENU_MODULE_COLOR_BOLD MENU_MODULE_COLOR_RED "%d" MENU_MODULE_COLOR_RESET,
                      status);

    此时 UART 会显示以下消息:


    当前句柄为0、因此我也将0填入 GATT_WriteCharValue ()、但它仍打印 Error status =22。

    然而,当我删除了发送GATT_Exchange_MTU_REQ,和直接发送的代码ATT_WRITE_REQ,它是成功的传输。 结果如下图所示:


    因此,我怀疑在发送后GATT_Exchange_MTU_REQ,句柄可能已更改为与 GATT 或 ATT 相关的内容。 然而,当我发送时GATT_WriteCharValue(),我仍然传递的值connectionHandle 作为句柄,这可能是传输失败的原因。 当然、这只是我的假设。 如果我错了、请纠正我。 谢谢你。

    此致、

    Aki

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

    尊敬的 Aki:

    我相信你是对的。 我认为不能在 GATT Exchange API 发布其完成事件之前调用 GATT 写入 API。 我也不希望您每次都需要更改 MTU 大小、因此我建议在连接开始时将其设置为所需的值、而不是每次都需要执行写入操作。

    此致、

    1月

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

    您好!

    上述所有代码均以Connection_ConnEventHandler函数的开关大小写BLEAPPUTIL_LINK_ESTABLISHED_EVENTapp_connection.c形式编写、用于。 如果我想ATT_MTUExchange在连接开始时积极执行操作、您会建议我将其写在哪里?

    此致、

    Aki

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

    尊敬的 Aki:

    明白了。 感谢您的澄清。 是否可以删除 MTU Exchange 之后的 GATT 过程? 尝试仅在链接建立事件中执行 MTU 交换、并在一段时间后在单独的事件中执行写入。 我希望了解添加一些延时时间是否会对这种行为产生影响。

    此致、

    1月

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

    您好、Jan:

    在 app_connection.c 中、我为 MTU 交换和 ATT 写入添加一些新的事件定义、

    #define MTU_EXCHANGE_EVENT (uint32_t)BV(14)
    #define ATT_WRITE_OOB_DATA_CONFIRM_EVENT (uint32_t)BV(15)
    #define ATT_WRITE_OOB_DATA_RAND_EVENT (uint32_t)BV(16)
    #define OOB_PAIRING_EVENT (uint32_t)BV(17)
    #define SET_REMOTE_OOB_DATA_EVENT (uint32_t)BV(18)
    
    // Events handlers struct, contains the handlers and event masks
    // of the application central role module
    BLEAppUtil_EventHandler_t connectionConnHandler =
    {
        .handlerType    = BLEAPPUTIL_GAP_CONN_TYPE,
        .pEventHandler  = Connection_ConnEventHandler,
        .eventMask      = BLEAPPUTIL_LINK_ESTABLISHED_EVENT |
                          BLEAPPUTIL_LINK_TERMINATED_EVENT |
                          BLEAPPUTIL_LINK_PARAM_UPDATE_EVENT |
                          BLEAPPUTIL_LINK_PARAM_UPDATE_REQ_EVENT |
                          MTU_EXCHANGE_EVENT |
                          ATT_WRITE_OOB_DATA_CONFIRM_EVENT |
                          ATT_WRITE_OOB_DATA_RAND_EVENT |
                          OOB_PAIRING_EVENT |
                          SET_REMOTE_OOB_DATA_EVENT
    };

    然后、在 Connection_Conn 4510Handler()中、我添加新的案例以实现这些新事件、

    void Connection_ConnEventHandler(uint32 event, BLEAppUtil_msgHdr_t *pMsgData)
    {
        switch(event)
        {
            case BLEAPPUTIL_LINK_ESTABLISHED_EVENT:
            {
                gapEstLinkReqEvent_t *gapEstMsg = (gapEstLinkReqEvent_t *)pMsgData;
    
                // Add the connection to the connected device list
                Connection_addConnInfo(gapEstMsg->connectionHandle, gapEstMsg->devAddr);
    
                /*! Print the peer address and connection handle number */
                MenuModule_printf(APP_MENU_CONN_EVENT, 0, "Conn status: Established - "
                                  "Connected to " MENU_MODULE_COLOR_YELLOW "%s " MENU_MODULE_COLOR_RESET
                                  "connectionHandle = " MENU_MODULE_COLOR_YELLOW "%d" MENU_MODULE_COLOR_RESET,
                                  BLEAppUtil_convertBdAddr2Str(gapEstMsg->devAddr), gapEstMsg->connectionHandle);
    
                /*! Print the number of current connections */
                MenuModule_printf(APP_MENU_NUM_CONNS, 0, "Connections number: "
                                  MENU_MODULE_COLOR_YELLOW "%d " MENU_MODULE_COLOR_RESET,
                                  linkDB_NumActive());
    
                event = MTU_EXCHANGE_EVENT;
                Connection_ConnEventHandler(event, pMsgData);
    
                break;
            }
    
            case MTU_EXCHANGE_EVENT:
            {
                doAttMtuExchange();
    
                event = ATT_WRITE_OOB_DATA_CONFIRM_EVENT;
                Connection_ConnEventHandler(event, pMsgData);
                break;
            }
    
            case ATT_WRITE_OOB_DATA_CONFIRM_EVENT:
            {
                doAttWriteNoRspConfirm();
    
                event = ATT_WRITE_OOB_DATA_RAND_EVENT;
                Connection_ConnEventHandler(event, pMsgData);
                break;
            }
    
            case ATT_WRITE_OOB_DATA_RAND_EVENT:
            {
                doAttWriteNoRspRand();
    
                event = SET_REMOTE_OOB_DATA_EVENT;
                Connection_ConnEventHandler(event, pMsgData);
                break;
            }

    我尝试发送了16字节的数据、这些数据已成功发送。 使用监听器观察到的数据包传输序列如下图所示:

    您可以看到、即使将代码修改为使用事件、ATT_WRITE_CMD 数据包的传输速度也快于 BLE 堆栈会更改 MTU 大小。 为了证明在发送 ATT_WRITE_CMD 时 MTU 大小没有发生变化、我发送了32个字节的数据、结果是传输失败。

    如果我的代码中存在任何逻辑错误、请帮助我更正它们。 谢谢你。



    此致、

    Aki

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

    您好!

    我在用户指南的以下章节中找到了如何针对较大的 MTU 大小进行配置。 您能否确认已经执行了所述的步骤?

    https://dev.ti.com/tirex/content/simplelink_lowpower_f3_sdk_8_10_01_02/docs/ble5stack/ble_user_guide/html/ble-stack-5.x/gatt-cc23xx.html#configuring-for-larger-mtu-values

    以下部分也可能会有所帮助、因为它说明了如何使用数据长度扩展功能来发送大量数据:

    https://dev.ti.com/tirex/content/simplelink_lowpower_f3_sdk_8_10_01_02/docs/ble5stack/ble_user_guide/html/ble-stack-common/link-layer-cc23xx.html?#utilizing-dle-in-the-application

    此致、

    1月

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

    您好!

    根据您提供的两个链路、我在 App_Stack ActivitDoneHandler 中调用了 HCI_EXT_SetMaxDataLenCmd (251,2120、251,2120)、并使用监听器观察了 LL_LENGTH_REQ 数据包中的值。 但是、可以传输的最大 PDU 长度仍为27字节。

    那么,通过 GATT_ExchangeMTU ()连接后更改最大数据包长度的唯一方法是什么?

    此致、

    Aki

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

    尊敬的 Aki:

    明白了。 感谢您的测试。 完成这项最新更改后、如果随后调用 ExchangeMTU 函数、您能否分享监听器报告的内容?

    此致、

    1月

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

    您好、Jan:

    调用 ATT_ExchangeMTU 后、监听器报告显示如下:

    ATT_READ_RSP 可以发送超过27字节的数据。

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

    您好!

    如果我没有错、那么发生的情况是、用户指南中提供的代码更改将设置 PDU 可能达到的硬最大值、并且交换 MTU 更改可用于将长度更改为最大值 那么、您现在可以实现您想要的数据长度更改了吗?

    此致、

    1月

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

    您好!

    是的、 数据 PDU 设置的问题现已解决、非常感谢您的帮助!