AF_DataRequest函数发送失败后NWK层不停有广播的问题
如题,我使用zstack2.4.0版本,ZIGBEEPRO版本,开启NV_RESTORE,协调器与路由器使用AF_DataRequest函数通讯,函数添加了AF_DISCV_ROUTE参数经路由转发,使用Packet Sniffer抓包分析,正常情况路由器发送命令协调器应答,
上图可以看出在NWK Frame control field中DR项(Discover router)为1,表示AF_DISCV_ROUTE参数是有效的,发送的数据会自动经过路由器转发的。
但如果此时,协调器离网,掉电了,路由器经过8次重发后,就会出现NWK层的一个CMD命令,发送目的地址是0xFFFD,发送给所有在网络内没有休眠的设备,应该是一个广播来的,而此后所有发送的数据,看NWK Frame control field中DR项(Discover router)都变为0了,而我的程序没变,AF_DataRequest函数还是有AF_DISCV_ROUTE参数的,但仍可以通过路由转发命令,但命令的反应开始变慢,延时变长,而且长时间网络会不稳定。
如何停止这个NWK层的广播的发送呢?各位有遇到这种情况吗?
ken chan:
回复 Yue TANG:
例子是由SerialApp修改的,我在Coordinator与Router的通讯中,加入了类似心跳的机制,Router入网后5秒发一个心跳到Coordinator,Coordinator则回复,由此双方都知道对方是否在网内。
Coordinator的编译配置:
ZIGBEE_FRAGMENTATION
HAL_UART=TRUE
SERIAL_APP_PORT=0
NV_RESTORE
HAL_IRGEN=TRUE
HAL_IRGEN_CARRIER
NWK_MANAGER
Router的编译配置:
HAL_UART=FALSE
SERIAL_APP_PORT=0
NV_RESTORE
ZIGBEE_FRAGMENTATION
ken chan:
回复 Yue TANG:
例子是由SerialApp修改的,我在Coordinator与Router的通讯中,加入了类似心跳的机制,Router入网后5秒发一个心跳到Coordinator,Coordinator则回复,由此双方都知道对方是否在网内。
Coordinator的编译配置:
ZIGBEE_FRAGMENTATION
HAL_UART=TRUE
SERIAL_APP_PORT=0
NV_RESTORE
HAL_IRGEN=TRUE
HAL_IRGEN_CARRIER
NWK_MANAGER
Router的编译配置:
HAL_UART=FALSE
SERIAL_APP_PORT=0
NV_RESTORE
ZIGBEE_FRAGMENTATION
CZ:
回复 ken chan:
这个广播是一条路由请求指令,如果目标节点不存在了,你所发的每一条消息都会引起路由请求,你可以关闭路由请求参数AF_DISCV_ROUTE
ken chan:
回复 CZ:
AF_DISCV_ROUTE在zstack2.4-1.4.0里面已经是写死在代码里,去掉会造成数据无法通过路由发送到指定的节点。我是奇怪这个路由请求为何一直存在,不会停止,感觉是一个bug,或者是我配置不对,造成的死循环一样!
CZ:
回复 ken chan:
你的Router入网后不是每隔5秒会发一个信息跟Coordinator吗,如果coordinator找不到,每次都会触发路由请求指令。
ken chan:
回复 CZ:
是的,我每隔5秒发送一次信息,如果coordinator找不到,路由请求发送是正常,但coordinator上电,回到网内,这个路由请求还一直在发送,这点我就不解了。
CZ:
回复 ken chan:
首先,请更新你的协议栈到最新的版本Zstack2.5.1,我用这个版本测过是没有这个问题的
仔细看了一下你的Sniffer封包,每次的路由请求指令都连续发了两个,中间只隔了3ms,这可能是问题出现的原因,
正常情况下是只发一个路由请求指令封包,你看看代码里是否有连续做了两次AF_DataRequest,
附件是我的抓包数据,用2.5.1版本测的。
ken chan:
回复 CZ:
感谢CZ的帮助,我看到你的抓包数据,确实在节点丢失后重新回到网络NWK Route Request发送几次后就停止了,,我会尝试一下改到zstack2.5.1,另外这个例子也是基于2.5.1的SerialApp例程修改的吗?是否有修改默认的f8wconfig.cfg或者nwk_globals.h里面的默认参数呢?如果方便可以上传一下这个测试程序吗?谢谢