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:路由器通信停止

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

https://e2e.ti.com/support/wireless-connectivity/zigbee-thread-group/zigbee-and-thread/f/zigbee-thread-forum/1364055/cc2652r-router-communication-stops

器件型号:CC2652R
主题中讨论的其他器件:CC2592

您好!

我们使用 CC2652R 和 CC2592有一个非常简单的设计、并且我们使用 SimpleLink CC13x2 26x2 SDK 4.20.01.04堆栈。  我们在数十种产品上运行我们的路由器应用、该应用通常运行良好。

在测试过程中、我们看到其中一台路由器将通电并能够发送和接收 几秒钟、但之后、它不再发送或接收任何数据。  通过使用监听器捕获、我们可以看到它发送的数据包具有强大的 RSSI (即–40或-50dBm)。  但经过一段时间(2-15?)后、它不会路由、重复广播、甚至不会发送链路状态数据包。

我们在路由器上检测了用于看门狗的代码、如果它在35分钟内没有收到任何数据包、则会将其重置、而在重置后、它会正常运行。  路由器很少进入这种状态、也不是持久的。

当35分钟计时器到期而未收到任何数据包时、我编写了代码从堆栈 和应用程序中读取一组值、并将它们写入到非易失性 blob 中。  复位后、我会在一个特殊的数据包中发送这个 blob、以帮助我们了解堆栈在未发送或接收任何内容时所处的状态。  下面是一些我要保存的数据项、以及如何获得它们。

1.堆栈对 PAN ID 和通道的看法、以及 RX_ON_TIME_IDLE 标志以及它们是否属于网络的一部分:

  • 我 每15秒调用 Zstackapi_sysConfigReadReq ()并读取 panID、chanList、macRxOnIdle 和 devPartOfNetwork 值。  当路由器进入这种坏状态且35分钟计时器超时时时时,我会在看门狗复位软件前将最近读取的值保存为 nonvol。

2.如果堆栈认为它已连接:

  • 使用 Zstackapi_sysConfigReadReg ()命令读取 devPartOfNetwork 字段的方法可能是多余的。
  •   如果 bdbCommissioningStatus 为 BDB_justing_Success,则在 App_Process 中的 zclGeneringstatus()函数中将布尔标志设置为 true。  或者、如果状态不是 BDB_TRUSION_SUCCESS、我将布尔标志设置为 FALSE。

3.监视 ZStackMessages 以查看是否收到任何"离开"或其它意外消息。

  • 在 zclGenericApp_processZStackMsgs()中,如果最近的事件与最近收到的事件不匹配,我会将其移入 U32,并保留接收到的栈消息数的计数器。  这将跟踪4个最近的堆栈事件并提供接收到多少个堆栈事件的计数器。

4.发送数据包状态

  • 我们的应用每15秒向协调器发送一个数据包。  我跟踪我们认为正在发送的数据包数量,以及来自 AF_DataRequest ()的返回状态值。

5.收到的数据包的数量

  • 每次 调用 zclGenericApp_processAfIncomingMsgInd()时,我都会递增计数器。  协调器每隔几分钟发送一次应该收到的广播命令。

6.发送功率级别

  • 我在 设置发射功率时在 ZMacSetTransmitPower()中设置一个值。

还有许多其他字段、但这些是大多数与堆栈相关的设置。  当路由器复位并发送调试信息时、我提取了以下信息:

#1 - 从  Zstackapi_sysConfigReadReq ()读取的值表示 panID 和通道是正确的。  RxOnWhenIdle 设置为 true,devPartOfNetwork 设置也为 true。  因此、堆栈似乎认为其已连接并在正确的通道和 PAN ID 上运行。

#2 -我的布尔值"加入"标志被设置为 true。

#3-最近的 ZStack 消息包括: BDB_Notification (0xc5)、 AF_DATA_CONFIRM_IND (0x91)和 INcoming_MSG_IND (0x92)。  (有两条0x91消息。)  接收到的堆栈消息的数量是4。

#4-计数器中的应用程序消息数为140,与预期的数字相匹配(4每分钟* 35分钟= 140)。  最近的 AF_DataRequest()返回状态为成功。  应用程序会在应该发送的时候发送消息、堆栈会以成功状态进行响应、即使从监听器捕获中看不到这些消息或协调器收到这些消息也是如此。

#5-接收的数据包数量只有1个。

#6 -发射功率等级被设定为我们所期望的值(0xF7)、或者-9dBm。  (请记住、这是馈送到 CC2592的功率级别。)

我还注意到、当路由器在35分钟超时后重置时、它会关联并加入新网络、并接收到新的短地址。  这似乎表明堆栈设置或其他设置有问题、使其加入而不是仅在其当前网络上恢复操作。

--

根据我的判断、当路由器停止发送或接收时、堆栈会认为它已连接到正确的网络、功率级别设置正确、堆栈会认为它应该能够传输数据包、因为它没有丢弃错误。  几个问题:

1.这些结论是否有效?  我是否要读取正确的 API、以了解堆栈是否认为它已加入、以及它认为它在哪个通道和 PAN ID 上运行?  或者有没有更好的方法来获取这些信息?  我出于某种原因想知道对讲机是否在其他信道上运行、但似乎没有。

2.是否有我们可以调用的任何其他 API 或可以检查的设置、以便尝试找出对讲机不传输或接收的原因、或确认对讲机或堆栈当前是否已启用?

3.我们是否有任何其他硬件引脚或固件设置用于解决此故障?

--

最后、我们刚刚注意到、此问题似乎与 此处报告的问题非常相似、尽管那是在多年前发布的、使用的是旧得多的堆栈。  但附近确实有 Wifi 路由器、因此信道干扰可能是罪魁祸首。  如果这与链路中的问题类似,我应该能够像文章中所建议的那样通过监视链路开销大于0的邻居的数量来检测问题,然后在路由器降为0时重置路由器。

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

    大家好, Damon Stewart,  

    对我来说、重点在于第5点、它仅接收到一个数据包。 我们是否知道器件应接收的特定数量的数据包(比如18、因为您等待了35分钟)?  

    关联并加入新网络并收到新的短地址。

    -所以在超时后,设备加入一个新的网络,只是确认这里,但协调器没有为它设置一个新的网络( IE 旧的网络仍在使用)。  

    我们还可以尝试隔离 WiFi 路由器、以查看这是否有助于测试。  

    1.谢谢您提供了这么多信息,我认为您在这里的道路是正确的。

    2.我们可以检查这两个线程以获取额外信息:

    https://e2e.ti.com/f/1/t/1360488/

    https://e2e.ti.com/f/1/t/1324931/

    谢谢。
    A·F

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

    尊敬的 Alex:

    我没有 预期的 Rx 数据包计数的确切数字、但这很容易达到几十个。  (我可以从监听器捕获中获取该数字、但假设1比应有的值小得多。)  它显示 TX 和 RX 在几秒钟内正常工作、然后两个电路都停止工作、直到复位。

    您是正确的、协调器没有设置新的网络。  在这一点上的一个有趣现象是,路由器需要关联才能恢复网络,而不是仅仅启动并恢复运行。

    我同意您关于隔离 WiFi 路由器的想法-我会尝试将其关闭、看看是否会变得更难重现此情况。  我还将尝试让另一个设备在路由器处于此状态时发送信标请求、看看这是否可以恢复它。

    感谢您提供主题链接。 我没有花几分钟时间来查看它们、但它们似乎都与路由问题有关。  由于我们的传输请求将返回成功状态、而且当路由器进入此状态时我们甚至看不到发送的链路状态消息、因此这些消息可能与我们看到的问题无关、但值得记住。

    达蒙

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

    Damon 您好!

    感谢您的回复。我还想问一下、该设备是在通信量大时加入、还是在其他许多设备加入时加入?  

    -网络中有多少设备,它们是否同时加入?

    然后、您可以尝试在设备检测到不路由、重复或发送链路状态数据包时立即重置设备、而不是在35分钟后超时和休眠。 (2分钟后没有看到计数递增时、可能会立即复位)   

    谢谢。
    A·F

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

    为了大致描述我们的设置、我将大约30个路由器加入到协调器中。  它们每15秒向协调器发送一次单播 ping 消息、并且我们有一个 Web 应用程序、可监控这些路由器的"运行状况"并指示在过去几分钟内收到的 ping 消息百分比。

    在此特定测试中、我将对所有路由器进行下电上电、并观察它们几分钟、以确保它们在下电上电后能够与协调器通信。  在我确认所有路由器都在与协调器通信后、我再次复位它们并重复测试。  有时会失败通信、我们发现它处于此状态、此时不再传输或接收任何数据包。  我们的固件检测到这种情况、35分钟后、它将一组诊断数据写入 nonvol、并复位套接字。  当坏设备的超时到期时、它将重置并关联到网络、并接收到新的短地址。  当路由器重置"不良状态"时,没有其他设备加入或重置。

    就检测思想而言、是的、我想检测这种情况并提高复位速度。  我只添加了用于监控邻居表的 TX 成本的代码。  如果所有相邻器件的 TX 成本降至0、那么我应该能够重置路由器。  这看起来是一个合理的算法吗?

    此外、我刚刚让另一台路由器进入此 TX/Rx 故障状态、并且让另一台路由器发送信标请求时未恢复该状态。

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

    Damon 您好!

    感谢您为您的系统提供额外的背景知识!  

    还有一个类似的问题、在这种情况下、30台路由器同时连接、一些坏路由器的 NIB.nwkState NWK_init、并破坏 DEV_END_DEVICE。 在这种情况下,问题是由 NLME_StartRouterRequest 失败引起的。 一个 可能的 原因是,如果路由器在执行 ZMacStartReg 时收到大量广播,该函数将不会成功;您能检查 ZMacStartReg 的状态吗?  

    就检测思想而言、是的、我想检测这种情况并提高复位速度。  我只添加了用于监控邻居表的 TX 成本的代码。  如果所有相邻器件的 TX 成本降至0、那么我应该能够重置路由器。  这看起来是一个合理的算法吗?

    [/报价]

    -考虑到每15秒向协调器发送 ping 消息,我们不能用它来更快地检测故障路由器吗? 但是、没错、您的检测听起来确实不错、但可能需要进行一些测试。  

     谢谢。
    A·F

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

    尊敬的 Damon:

    [quote userid="597396" url="~/support/wireless-connectivity/zigbee-thread-group/zigbee-and-thread/f/zigbee-thread-forum/1364055/cc2652r-router-communication-stops 近期的 AF_DataRequest ()返回状态为成功。  因此,应用程序在应该发送消息时,堆栈会以成功状态进行响应,即使这些消息从未被监听器捕获或协调器接收到。

    这是 AF_DataRequest 返回的正确行为、一旦命令发送到无线电内核、这些行为就会立即返回。 实际无线结果由 zstackmsg_Cmdids_AF_DATA_CONFIRM_IND 回调决定 、状态(与您用于发送消息的 transID 对齐)将 进一步指示 问题可能出在何处、   

    https://dev.ti.com/tirex/explore/content/simplelink_cc13xx_cc26xx_sdk_7_40_00_77/docs/zigbee/html/zigbee/z-stack-overview.html?highlight=zstackmsg_cmdids_af_data_confirm_ind#end-to-end-acknowledgments

    此致、
    瑞安

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

    很遗憾、出于各种原因、我们的应用程序不使用端到端确认。  希望 AF_DATA_CONFIRMATE_IND()也给出了 Mac 层传输的状态。  如果是、我可以对此进行监控、看看我们是否可以从它中学到任何东西、以便更快地检测到这种情况。

    我还可以检查  ZMacStartReg 状态。

    感谢 Ryan 和 Alex 的建议。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    AF_DATA_CONFIRM_IND()给出了 Mac 层传输的状态

    完全如此。  否则、 zstackmsg_CmdIDs_AF_DATA_CONFIRM_IND 如果 APS ACK 标志被禁用、则当堆栈成功发送 APS 层帧时、或将返回 FAIL 消息通知应用出现问题时、将发生此情况。  "