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 通信中通道质量的方法

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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/1652994/cc2652r-a-method-for-evaluating-channel-quality-in-ble-communications

器件型号: CC2652R

是否可以使用“SimpleLink CC13xx/26xx BLE5-Stack “SDK 从用户应用中检索以下指标?

  • RSSI
  • PER
  • 数据包重新传输的次数
  • SNR(信噪比)或 SNIR(信噪比加噪声比)
  • 吞吐量低

 

我正在使用 Launchpad CC26X2R 硬件。

 

 

提前感谢您。

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

    您好!

    对于其中的大多数情况、您可以直接使用 HCI 命令来获取所需的信息。

    对于 RSSI、 HCI_ReadRssiCmd 函数。
    对于 PER、您可以使用 HCI_EXT_PacketErrorRateCmd 函数。
    对于重新传输、 HCI_EXT_GetTxStatisticsCmd 返回重新传输的数据包数和数据包总数以及其他信息。

    对于吞吐量、没有确切的方法来获取它、但您可以进行估算。 您可以使用 HCI_EXT_GetTxStatisticsCmd 来查看即时 T 发送的数据包数、并使用 HCI_LE_ReadMaxDataLenCmd 来读取传输的数据包的最大大小。 如果您调用 HCI_EXT_GetTxStatisticsCmd 两次并加一个延迟、您可以测量此延迟期间发送的数据包数、乘以最大长度、然后除以延迟以获得吞吐量。

    最后、据我所知、无法获得 SNR/SNIR 值。

    此致、
    Lea

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

    您好!

    感谢您的答复。

    您提供的命令是否可用于按信道检索数据?

    例如、通道 0 的 PER。

    此外、我在了解吞吐量的计算方式时会遇到一些麻烦。

    计算给定时间段内成功传输的数据包数量并将其除以该时间段的持续时间是否正确?

    如果正确、我不明白为什么需要检索最大数据包大小...

    此致、

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

    您好!  

    是的、这里有! 您可以  改用 HCI_EXT_PERbyChanCmd 命令来获取特定通道的 PER。

    对于吞吐量、我们之前在 F2 SDK 中以 CC26XX 为例。 该示例设置了外设以尽可能快地发送一堆通知。 然后、中央器件将测量接收到的位数、将其添加到计数器中并启动一个 1000ms 计时器。 计时器启动后、它会简单地打印位数并进行一秒钟的计数、从而得到以位/秒为单位的结果

    您可以在此处找到示例: https://github.com/TexasInstruments-Sandbox/ble_examples/tree/ble_examples-2.2/src /examples

    我的建议是做同样的事情,但在最新的 SDK :发送一堆数据包从外设,读取它们的长度在中央,并以这种方式测量吞吐量。 我建议使用 HCI_LE_ReadMaxDataLenCmd 的原因是获取数据包长度、但这并不是真正必要的。

    此致、
    Lea

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

    您好!

    感谢您的答复。

    所以有这样一个命令! 我很抱歉没有彻底地研究它。
    我检查了您提供的链接、但您能解释一下如何使用此命令吗?

    -每个通道的 PER 是否存储在“perByChan“参数的成员数组中? 例如、通道 0 是否存储在数组的索引 0 处?

    -当我发出此命令时,我可以从那时起为每个通道检索 PER 吗?

    -还是自发出命令以来检索 PER ?

    同时感谢您提供的吞吐量信息。 我将查看您提供的示例。

    此致、

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

    您好!

    正确、每个通道的 PER 存储在“perByChan“参数中、通道 N 存储在数组的索引 N 处。 此 HCI 命令采用指向 perByChan_t 对象的指针作为参数。 该命令将使用每个通道的 PER 值来填充对象、并且当您接收到 包含 cmd操作 码 HCI_EXT_PER_BY_CHAN 的 hciEvt_VSCmdComplete_t 事件时、数据变为有效、以便读取。 perByChan 参数指向的内存区域需要在命令的整个持续时间内存在、因此不能在调用函数的堆栈上分配。

    当您发出命令时、它将为您提供控制器累积的数据。 文档指出、由于计数器为 16 位、因此在使用尽可能小的连接间隔时、计数器可以存储至少 8 分钟的数据、而在使用更大的连接间隔时、计数器可以存储更多的时间。

    请注意、PERbyChan 命令仅提供数据包总数和每个通道的 CRC 错误总数、而使用 PacketErrorRate 命令还可以提供事件数和错过的事件数。

    此致、
    Lea

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

    您好!

    感谢您的答复。这真的有帮助。   

    我有几个问题。   

    1.您提到“因此、它不能分配在调用函数的堆栈上。“ 这是否意味着用作参数的`perByChan_t`类型的变量是模块变量或全局变量、则可以接受?   

    2.只是为了确认、当您说“它将为您提供控制器累积的数据“时、这是否是指从建立连接到发出命令为止累积的数据?   

    3.假设我们使用最短的连接间隔并保存 8 分钟的数据,之后会发生什么?

    -以后的数据不能被检索吗? 还是它未更新?

    -它是清除和新的数据开始积累吗?

    4、您提到事件发生后可以读取数据。 用户是否可以清除可从控制器读取的值?
    例如、   
     发送命令→通过事件读取值→清除值→发送命令...
    是否可以这样使用?


    我之所以提出这些问题、是因为我正在考虑用户是否可以评估每个信道的通信质量并相应地更新信道映射。

    此致、

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

    您好!

    1.是的、用户拥有的 2 个选项应该是全局变量、也应该通过动态内存分配 (malloc) 在堆上分配

    2 和 3。 我对计数器的工作方式有点错、这就是发生的情况。 对于每个连接对象、都有一个名为 perByChan_t Pointer 字段、名为“perInfoByChan“、在创建连接时设置为 NULL。 发送 HCI_EXT_PERbyChanCmd 命令时、唯一要做的是此字段现在指向作为参数给出的对象。 然后、当发生诸如发送数据包或接收 CRC 错误等 BLE 事件时、如果 perInfoByChan 指针不为空值、它将更新对象中的计数器。  这意味着计数器仅从调用函数时开始。 8 分钟后、如果使用最短的连接间隔、计数器可能会溢出、并且由于它们是无符号整数、因此它们会绕回 0、从而提供不相干数据。

    4.由于计数器由 BLE 栈增加、并通过 malloc 或全局变量存储在您一方、因此您可以根据需要实时读取和清除计数器、即使是从中断例程中也是如此。

    因此、您可以在软件开始时调用 PERbyChanCmd、每 X 秒读取一次值以做出相应的信道映射更新决策、并每 8 分钟将所有值重置为 0。

    此致、
    Lea

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

    您好、

    感谢您的答复。

    我明白、“这意味着计数器仅从您调用函数时开始。“

    我也理解柜台的概念。

    根据您之前的回答、

    我知道、对分配了`malloc`的内存调用`free`会清除计数器(结束计数)。

    是这样吗?

    此致、

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

    您好!

    如果您唯一做的是释放分配的存储器、那么您将在软件中收到分段故障、因为控制器仍会尝试写入您之前分配的存储器地址。

    您需要做的是、首先调用 HCI_EXT_PERbyChanCmd 函数并将 NULL 作为参数“perByChan“、然后释放存储器。 这是因为根据 HCI_EXT_PERbyChanCmd 的文档 :“如果 perByChan 为空,计数器累积将停止“。

    此致、
    Lea

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

    您好、

    感谢您的答复。

    我知道在释放内存之前需要将值设置为 NULL。


    我知道可以为每个通道检索 PER、但其他命令如何?

    • HCI_ReadRssiCmd
    • HCI_EXT_GetTxStatisticsCmd

    此致、

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

    您好!

    这些功能没有针对特定通道的等效功能。
    请注意、HCI_EXT_GetTxStatisticsCmd 提供与 HCI_EXT_PERbyChanCmd 相同的信息、但也提供有关控制数据包和重新传输次数的数据。

    此致、
    Lea

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

    您好!

    感谢您的答复。

    我完全理解。

    此致、