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.

end device的父亲 没有发出route reply

Other Parts Discussed in Thread: Z-STACK, CC2538

小弟是开发智能家居的  由于是单火线设备 开关面板类型必须设置为 end device

以下是抓包数据

end device  地址BF6B  他的父节点是B5B1

协调器想发个数据个BF6B  发生了路由请求  但是B5B1 并没有回应路由请求  请问这个是为什么 这个偶有发生与zigbee规范上描述不一样

网关发路由请求找-BF6B的父节点B5B1并没有发路由回应.psd
  • 这个抓包数据中 B5B1 从来都不会 路由应答

    因为网络中有大量的 终端节点设备  为了维护路由的稳定性 每个end device 每隔10s 调用一次 ZDApp_AnnounceNewAddress() 保证路由的稳定性

  • ti 大神救命啊 这个问题怎么解决

  • @Jie liao

    你好,想了解你做ZigBee研发有多少时间了? 另外你用的ZIgBee协议栈是哪个版本的?

    通过抓包数据有几个问题

    1) 你在协议栈中对Coordinator和Router的Link Sttaus的周期是多少? Coordinator和Router的周期是否一样?

    2) 定期发送Device Announce出来,对网络并没有什么好处的,收到device Announce以后,认为有新的设备入网,会邻居表清空,然后你的Router之间有没有正常的Link Status来维护邻居信息。

    所以0xB5B1即便收到0x0000的Router Request也没法回复Router Reply。

    建议,

    1)把Link Status恢复正常

    2) 把定期发送的Device Announce去掉。

    另外建议可以看下ZigBee Specification中关于ZigBee协议的Spec。

  • vv 大神 你好 我开发zigbee有几年了  去掉定期发送Device Announce 确实 稳定性好多了,我这里Link Sttaus 没有改变 而是协调器上电的时候多发了一个 Link Sttaus 等一下我去掉他实验一下

    主要开发方向智能家居 单火线系列产品

    当初加入定期发送Device Announce 的目的是 为了解决  下面这个问题 

    第一步:路由器A 有个孩子E 

    第2步:A掉电了  E加入了B 并发了设备宣告 (A因为掉电了收不到)

    第3步:A又突然上电了

    第3步:当协调器想法数据给E ,先发路由请求      A与B 同时发出Router Reply

    第4步:当协调器 想法数据给E (在个时候路由已经建立好)  协调器会发给A 而不是给B   ,数据在A上保留7s 然后丢弃 ,这样E 就收不到数据了 ,然后我就尝试着周期性发设备宣告 但是好像问题更加多了~~~

    去掉周期性发设备宣告 有什么办法规避以上场景的发生

    抓包数据如下:

  • 协议栈版本  2.5.1.a  下面是两个路由器同时上报 Router Reply 导致  0x0000线发数据给6E7E, 先发数据给F28C , 而不是发给真正的父节点5775  ,因为这样 6E7E收不到数据

  • 这种发生的概率非常 高且没有办法

  • 麻烦把你的抓包文件用附件上传下,我可以打开解析着看,谢谢。

    另外麻烦私信告诉我下你的公司,可以吗?

  • @jie liao,

    你考虑的这个问题在实际应用中确实会发生,在Zigbee Alliance的最新Specification R21里面,已经讨论了这个问题,并且增加相关的功能。

    TI的最新协议栈Z-Stack Home 1.2.2里面已经把这个功能加进去了,主要用到的方法是,

    1) 如果Old Parent发数据给子设备,这个数据buffer在底层,如果长时间 没有收到data request,那么Old Parent会把该子设备从Associate List删除掉。

    2)如果是其他设备发数据给该子设备,先发送到old parent上面,那么old parent会发出来network status command告诉源地址,这个子设备不存在了,这个路由链路是无法用了,所以让源节点把路由设备删除掉。

  • 困扰好久的问题,终于有个合理的解释了;

    当时遇到这问题时,将数据发送不经路由的方式给绕过了。

    mark下

  • Hi VV:

    是否方便提供下 下载Specification R21链接?


    官网上只找到R20版本



  • @guozi,

    由于R21版本还没有正式发布,目前也只是内部草稿版的。

    等正式发布以后,便可在官网上找到了。

  • VV 说:
    如果是其他设备发数据给该子设备,先发送到old parent上面,那么old parent会发出来network status command告诉源地址,这个子设备不存在了,这个路由链路是无法用了,所以让源节点把路由设备删除掉。

    VV你好,我现在也有这个问题, 我用的协议栈是1.2.2a,开启了MTO 你说的old parent会发出来network status command告诉源地址我小抓包的时候没看到 但是会在routeRequest的回复里看到过,让女孩子这个指令会带一个回复码,但是我怎么也找不到这个指令的相关调用 ,其实找不到也就算了,但是关键是现在我的协议栈不正常,end切换父节点了而且也发出宣告了但是 协调器仍然发给了原来的父节点 打印路由表 要么就是没这个设备的路由 要么就是路径是错的 ,搞的我很烦 而且有时候end的父节点发出了RouterReply但是协调器也不回应 有点像收不到的样子 能不能帮我看看啊

    请问是不是开了concentrator_catch导致的呢,但是我用的是cc2538 按理说开启这个catch也没有问题啊 heap_size设置的6k ,再设大点编译就出错,

    被这个End的问题快搞疯了 ,各种各样的问题 难道说协议栈对mto的支持本身就不完整,天然的BUG?