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.

[参考译文] CC2541:网络处理器模式-达到 GATT 属性的最大数量?

Guru**** 2933270 points

Other Parts Discussed in Thread: CC2541

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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/1003414/cc2541-network-processor-mode---maximum-number-of-gatt-attributes-reached

器件型号:CC2541

大家好!

我在定制电路板上使用 CC2541、其中包含 HostTest 示例、片外 GATT 数据库。

固件略有修改:

 -我使用的是'uart_all_4_configs.c'中的 UART 配置4、该配置可在旧版 wiki 上找到
 -我已修改 LED 驱动器以支持我们板上的5个 LED
 -我添加了一些 HCI 命令(按照旧 Wiki 上的示例)。 这些 HCI 命令主要返回静态数据(固件版本等)+控制 LED
 -我已经为按钮添加了一个 HCI 事件(从示例 HAL 驱动程序修改了引脚映射)-正如它在 wiki 上显示的那样。

我的任何修改都不会以任何方式与 BLE 堆栈互操作(除了切换至'processExtMsg'函数)或分配内存。

在主机处理器方面、我有一个 HCI 的自定义实现、直到今天看起来效果良好。 我在4个服务中共有130个属性(属性计数中未包括服务)。 然后、我添加了另外2个(特征+值描述符)、CC2541在按组类型读取响应时开始返回无效 PDU 错误。

因此、有效连接如下所示(在服务器上添加新特性之前、总共有134个属性):

  1. evt 0x0605 GAP_Link_established、有效载荷: 05 06 00 03 4D 6c 90 C7 00 6F 00 04 26 00 F4 01 00
  2. evt 0x0510 ATT_ReadByGrpTypeReq、有效载荷: 10 05 00 00 06 01 00 ff 00 28 (主服务、所有句柄)
  3. CMD 0xFD11 ATT_ReadByGrpTypeRsp、有效载荷: 00 00 14 01 00 23 00 ff 58 F7 E3 D8 E3 01 00 00 06 49 2c C1 B6 4e (服务#1、处理0x0001-0x0023)
  4. 0xFD11的状态 EVT、状态0x00
  5. evt 0x0510 ATT_ReadByGrpTypeReq、有效载荷: 10 05 00 00 06 24 00 ff 00 28 (主服务、从0x0024处理)
  6. CMD 0xFD11 ATT_ReadByGrpTypeRsp、有效载荷: 00 00 14 24 00 2b 00 ff 58 F7 E3 D8 E3 01 10 00 06 49 2c C1 B6 4e (服务编号2、处理0x0024-0x002B)
     [...] 为清晰起见
  7. evt 0x0510 ATT_ReadByGrpTypeReq、有效载荷: 10 05 00 00 06 7f 00 ff 00 00 28 (主服务、从0x007F 处理)
  8. CMD 0xFD11 ATT_ReadByGrpTypeRsp、有效载荷: 00 14 7f 00 86 00 ff 58 F7 E3 D8 E3 01 30 00 06 49 2c C1 B6 4e (服务#4、处理0x007F-0x0086)
  9. 0xFD11的状态 EVT、状态0x00
  10. evt 0x0508 ATT_ReadByTypeReq、有效载荷: 08 05 00 00 06 01 00 23 00 03 28 (读取句柄范围0x0001-0x0024中的特性)
  11. CMD 0xFD09 ATT_ReadByTypeRsp、有效载荷: 00 15 02 00 02 03 00 ff 58 F7 E3 D8 E3 02 00 06 49 2c C1 B6 4e
  12. 状态 EVT for0xFD09、状态0x00
    [...] 为清晰起见、请休息一下

无效连接如下所示(总共136个属性):

  1. evt 0x0605 GAP_Link_established、有效载荷: 05 06 00 03 4D 6c 90 C7 00 6F 00 04 26 00 F4 01 00
  2. evt 0x0510 ATT_ReadByGrpTypeReq、有效载荷: 10 05 00 00 06 01 00 ff 00 28 (主服务、所有句柄)
  3. CMD 0xFD11 ATT_ReadByGrpTypeRsp、有效载荷: 00 00 14 01 00 23 00 ff 58 F7 E3 D8 E3 01 00 00 06 49 2c C1 B6 4e (服务#1、处理0x0001-0x0023)
  4. 0xFD11的状态 EVT、状态 0x40 (bleInvalidPDU)
  5. evt 0x057E ATT_FlowCtrlVioletedEvt、有效载荷: 7E 05 00 00 02 10 10 (指向之前的事务)

对于测试、我尝试仅添加一个属性(仅添加特征描述符、不添加值。 我知道、这是无效的、但它是服务器上的最后一个属性、CC2541不应关心它)。 结果略有不同。 所有 ATT_ReadByGrpTypeReq 都经过 OK、但第一 个 ATT_ReadByTypeReq (第一个列表中的步骤10-11)以0x40结束(尽管我给出的响应完全相同)。

所有创建服务/添加属性调用都将通过 OK

我是否遇到了 BLE 堆栈的一些限制? 是否可以克服它(可能更改某些编译定义?)? 或者、我是否应该在主机端实现中寻找问题?

感谢您的任何建议! BTW。 我不能将 CC2541更改为 CC26xx 系列、这本来是很好的、但硬件已经制造...

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

    您好!

    我已经指派了一位专家来研究这个问题。 感谢您的详细报告。 同时、您能否为我们提供您使用的 SDK 的哪个版本?

    此致、

    1月

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

    我使用 的是 BLE-CC254x-1.5.1.1

    如果这一点很重要、我不使用绑定-仅使用"仅有效"配对(无中间人保护)。

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

    您好!

    遗憾的是、我没有 CC2541开发系统可自行测试、但我在搜索文档和报告、找不到有关限制(或错误)的特定参考。

    错误本身违反了 ATT 层流控制(0x7E、在文件 att。h 中显示)、这实际上可以指示数据传输的溢出。 下面的线程提到了这一点、因为它是由随后发出的 ATT 请求引起的、而无需等待第一个发送的指示。  

    https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/517687/att_flow_ctrl_violated_event-sequence

    https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/613123/cc2650-unable-to-test-the-flow-control-violation-scenario-for-my-device

    在这种情况下、我会检查较大的属性数组是否会导致某种延迟、或者是否会影响堆栈正确处理响应的能力-也许它需要更大的缓冲区?

    我会尝试找到其他方面来解决这种明显的限制、并在发现任何相关提示时报告。

    希望这对您有所帮助、

    拉斐尔

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

    感谢你的答复。  

    ATT 流量控制违规很可能由中央发送、因为它没有收到按组类型读取或按类型读取的回复。 此时、我没有向中央发送任何请求(无通知或指示等) 我只是响应它的请求,因为我是这里的 GATT 服务器。  

    它没有收到读取请求的回复、很可能是因为 CC2541没有通过无线方式发送(我没有监听器来确认)。 我怀疑它没有发送、因为它使用  bleInvalidPDU 回复了 ATT_ReadByGrpTypeRsp -我想错误是由 CC2541中的 BLE 堆栈生成的。

    作为一个信号、如果我没有将 ATT_ReadByGrpTypeRsp 发送到适当的请求、我会得到 ATT 流控制违反错误(当然、在一定的超时之后-与这里一样)、我想这是由中央发送的。