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.

[参考译文] RTOS/LAUNCHXL-CC2650:无法在 CC2650 Launchpad 上的 CC2650 BLE Central 中读取超过22字节的数据。

Guru**** 2470720 points
Other Parts Discussed in Thread: CC2650STK, CC2650, BLE-STACK

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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/661117/rtos-launchxl-cc2650-not-able-to-read-more-then-22-bytes-data-in-cc2650-ble-central-on-cc2650-launchpad

器件型号:LAUNCHXL-CC2650
Thread 中讨论的其他器件:CC2650STKCC2650BLE-STACK

工具/软件:TI-RTOS

你(们)好。

我正在 CC2650 Launchpad 上实施 BLE Central、该 Launchpad 可扫描来自 CC2650STK (传感器标签)的数据传感器数据。

在传感器标签中、为单个传感器提供单独的服务、并尊重读取、启用等特性

我将在一个服务中自定义所有传感器、我将从单个特征读取数据。 同时、我正在读取所有传感器数据、并构建一个 JSON 格式的单个字符串、以将数据发送到 BLE 中央。 所有传感器数据都位于一个字符串中、字符串长度超过100个字节。

当我从 BLE 中央(CC2650 Launchpad)读取此数据时、我注意 到我无法接收超过22字节的数据。 当我从 Android BLE Scanner 应用读取数据(用于测试目的)时、我将获得完整的数据。 下面的代码是我检查接收到的数据长度和构建字符串的方式。

            uint16 dataLen = pMsg->msg.readRsp.len;
            uint8 data[200]、i;
            对于(i = 0;i < dataLen;i++)
            {
                data[i]= pMsg->msg.readRsp.pValue[i];
            }
            数据[i]='\0';

为什么我无法读取完整的字节/数据?

读数限制是否有限制?

谢谢

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

    在您的简单 BLE 中央应用中、您是否在读取长特性之前执行了 MTU 交换? 您使用什么 GATT 过程来读取数据。 如果您正在执行 MTU 交换、您协商的 MTU 是什么?

    大多数 Android 设备将自动执行 MTU 交换、这可能会导致差异。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是的、我在发现之前正在进行默认 MTU 交换

    静态空 SimpleBLECentral_startDiscovery (空)

    attExchangeMTUREQ_t req;

    //初始化缓存的句柄
    svcStartHdl = svcEndHdl = charHdl = 0;

    discState = BLE_DISC_State_MTU;

    //发现 GATT 服务器的 Rx MTU 大小
    REQ.clientRxMTU = maxPdUSize - L2CAP_HDR_SIZE;

    //应将 ATT MTU 大小设置为客户端 Rx MTU 的最小值
    //和服务器 Rx MTU 值
    void GATT_ExchangeMTU (connHandle、&req、self 实体);


    当我检查"maxPdugSize - L2CAP_HDR_SIZE "时给出157、但在交换后、我得到 MTU 大小23、接收数据长度22。
    在下面的代码中、"maxPduSize"正在更新。

    静态空 SimpleBLECentral_processRoleEvent (gapCentralRoleEvent_t *pEvent)

    switch (pEvent->GAP.opcode)

    案例 GAP_DEVICE_INIT_DONE_EVENT:

    maxPduSize = pEvent->initDone.dataPtLen;
    Display_print0 (dispHandle、ROW_ZERO、0、"BLE Central");
    Display_print0 (dispHandle、ROW_ONE、0、Util_convertBdAddr2Str (pEvent->initDone.devAddr));)
    display_print0 (dispHandle、row_two、0、"已初始化");
    Display_print0 (dispHandle、ROW_SEE、0、">扫描权限);

    中断;

    GATT_ExchangeMTU()发送157但在以下代码中接收 MTU 大小23

    静态空 SimpleBLECentral_processGATTDiscEvent (gattMsgEvent_t * pMsg)

    if (discState == BLE_DISC_State_MTU)

    //收到 MTU 大小响应,发现简单 BLE 服务
    if (pMsg->method =ATT_EXCHANGE_MTU_RSP)


    #if (定义的 USE_128_bit_UUID)
    uint8 uuuid[ATT_UUUUUID_SIZE]={TI_UUID (SIMPLEPROFILE_SERV_UUID)};
    其他
    uint8_t uuuid[ATT_BT_UUID_SIZE]={LO_UINT16 (SIMPLEPROFILE_SERV_UUID)、
    hi_uint16 (SIMPLEPROFILE_SERV_UUID)};
    #endif


    //以防我们使用默认的 MTU 大小(23个八位位组)
    Display_Print1 (dispHandle、ROW_Three、0、"MTU 大小:%d"、ATT_MTU_SIZE);
    DISCSTATE = BLE_DISC_State_SVC;

    //发现简单 BLE 服务
    void GATT_DiscPrimaryServiceByUUID (connHandle、uuid、UUUID_size、self实体);


    如何更改 MTU 大小以接收100多个字节的数据?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    MTU 交换成功由两部分组成

    1.您的本地设备必须支持较大的 MTU,这意味着:
    2.您的对等设备必须支持较大的 MTU


    以下是有关 MTU 交换的一些提示/技巧
    -(仅适用于 TI BLE-Stack):本地支持的 MTU = MAX_PDU_SIZE - L2CAP_HDR_SIZE
    -这意味着对于 TI 与 TI 的通信、您需要在对等和本地器件上设置 MAX_PDU_SIZE >= 100 + L2CAP_HDR_SIZE
    重新生成+重新刷新项目。
    - GATT 客户端设备(即 Simple BLE Central)必须启动 MTU 交换(GATT_ExchangeMTU()),此调用必须成功,请确保
    检查返回参数。
    -协商的实际 MTU 将通过 ATT_MTU_Update_event 传递给应用程序,它应打印在两个设备的显示屏上
    中央和外设。 pMsg->msg.mtuEvt.MTU 应包含协商的 MTU。