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.

[参考译文] CC2652R:具有 BLE 外设的 DMM + Ti15.4协调器-如何发送超过125字节的帧

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

https://e2e.ti.com/support/wireless-connectivity/zigbee-thread-group/zigbee-and-thread/f/zigbee-thread-forum/1491002/cc2652r-dmm-with-ble-peripheral-ti15-4-coordinator---how-to-send-frames-longer-than-125-bytes

器件型号:CC2652R

工具与软件:

您好!

初始信息:

  • 示例:  dmm_154collector_remote_display_app_2_4g_CC26X2R1_LAUNCHXL_tirtos7_ticlang (禁用 MAC 安全性)
  • SDK:  simplelink_cc13xx_cc26xx_sdk_8_30_01_01

我正在根据示例项目  "DMM 15.4 Collector + BLE 远程显示"运行一个项目、我需要发送比平常更长的有效负载。 到目前为止、我完全支持 TI15.4堆栈的125字节帧限制、但这不适合项目需要的更多。 则需要发送稍长的有效负载。

问题1.

当尝试在不对项目配置进行任何更改的情况下发送更长的有效负载时、我遇到了意外的结果: ApiMac_mcpsDataReq 函数返回完全预期的结果 ( ApiMac_STATUS_frameTooLong )但它导致堆损坏。 和腐败一种非常奇怪的形式- MCU 开始报告具有比以往更多的可用存储器。 当进行多次发送尝试时、空闲大小超过了可用堆内存的总大小。

使用检索堆信息  iCall_getHeapStats

Q1:这是函数返回正确错误代码但底层实现破坏堆的预期结果吗?

问题2.

为了解决尝试发送过大帧的问题、我仔细阅读了最新 TI 15.4 Stack (以及一些早期版本中提供的更多文件)的可用源代码、并发现了一个可以在编译时设置以便发送更长消息的宏:  MAC_MAX_FRAME_SIZE . 我将其设置为255 (在现实场景中、我不希望再发送150、但希望有一些房间)、并且正如预期的那样、没有生成错误、  ApiMac_mcpsDataReq  当我尝试发送长度为120字节的消息时、返回成功并且未发生内存损坏。

很遗憾、消息未发送。 我使用 Ubisys 软件狗和 Wireshark 在网络形成的通道上观察到流量、但没有发现任何情况。 我决定尝试一下、发现阈值有效载荷长度为112字节。 高于此值的任何内容都将导致无法发送消息。

Q2:这是否是让 TI15.4堆栈发送更长有效负载的正确方式?

复制

通过尝试发送更长的消息、我可以在 OG 样例项目上毫无问题地重现问题。 在本例中、我决定将切换 LED 请求修改为不是1个字节、而是120个字节。 实际上、接收设备并不重要、因为从不会像在 Wireshark 上看到的那样发送消息

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

    您好、Michal、

    我假设即使讨论了 DMM 项目、您的问题也主要围绕 TI 15.4-Stack、而不是低功耗蓝牙。  您将在一个 IEEE 802.15.4 2006规范(第6.4.1节 PHY 常量)副本中发现、最大 PHY 数据包大小为127字节、因此这不是 TI 15.4-Stack 解决方案可以超出的参数。   aMaxPHYPacketSize 和 MAC_MAX_FRAME_SIZE 之间的任何差异均由数据包标头字节引起。

    因此、超过此值的数据包应由 TI 15.4-Stack 库丢弃、因此未按照您的观察结果发送消息。  ApiMac_STATUS_frameTooLong 行为不是预期行为、我不确定这是否是由于与独立的 TI 15.4-Stack 示例相比是 DMM 项目所致。

    这是 IEEE 规范的限制、因此您需要将较大的数据包分成两个或更多个较小的数据包、其中数据包2至 N 在确认前一个数据包已成功发送后发送(来自堆栈的 MAC_MCPS_DATA_CNF  在15.4应用中启动 dataCnfCB)。

    此致、
    Ryan