我们测试了一个80个路由节点的网络,用一个协调器对网络中的路由随机发送固定长度数据。然后分别在AF_DATA_CONFIRM_CMD消息和MAC_CbackEvent的MAC_MCPS_DATA_CNF中,添加了一个串口命令输出消息。
最后,通过对AF_DATA_CONFIRM_CMD返回所有的发送失败进行诊断,发现ZMacChannelAccessFailure和ZMacNoACK这两个错误,在NWK层重发(NWK层在使用ZMacDataReq发送失败后,会有一次重发)时的方式不合理,存在bug。
ZMacChannelAccessFailure错误处理如下
aa 0e 03 00 82 f5 c0 00 00 00 01 7d 10 01 c4 ac // AF_DataRequest发送数据到节点0xF5C0
aa 0a 81 21 b1 0c e1 97 75 b8 77 12 // MAC_MCPS_DATA_CNF消息,出现0xe1(ZMacChannelAccessFailure)错误,dataCnf.pDataReq->mac.dstAddr为0x9775,dataCnf.msduHandle = 0xB8
aa 0a 81 21 b2 0c e1 f5 c0 b8 0a c5 // MAC_MCPS_DATA_CNF消息,出现0xe1(ZMacChannelAccessFailure)错误,dataCnf.pDataReq->mac.dstAddr为0xF5C0,dataCnf.msduHandle = 0xB8说明这个是NWK层的重发
aa 0d c3 00 82 f5 c0 e1 00 00 01 7d 10 9f e4 // AF_DATA_CONFIRM_CMD 消息,发送给0xF5C0的包出现0xe1(ZMacChannelAccessFailure)错误。
ZMacNoACK错误处理如下
aa 0e 03 00 db 37 02 00 00 00 01 d6 10 01 a6 ca // AF_DataRequest发送数据到节点0x3702
aa 0a 81 21 80 0c e9 45 e4 60 c5 d9 // MAC_MCPS_DATA_CNF消息,出现0xe9(ZMacNoACK)错误,dataCnf.pDataReq->mac.dstAddr为0x45E4,dataCnf.msduHandle = 0x60
aa 0a 81 21 81 0c e9 45 e4 60 14 d8 // MAC_MCPS_DATA_CNF消息,出现0xe9(ZMacNoACK)错误,dataCnf.pDataReq->mac.dstAddr为0x45E4,dataCnf.msduHandle = 0x60说明这个是NWK层的重发
aa 0d c3 00 db 37 02 e9 00 00 01 d6 10 f1 62 // AF_DATA_CONFIRM_CMD 消息,发送给0x3702的包出现0xe9(ZMacNoACK)错误。
从以上的抓包,发现一个很严重的问题,协调器在发送数据到目标时,如果发给下一个HOP的时候出现了ZMacChannelAccessFailure错误,协调器在NWK重发时,MAC目标地址就会切换成最终的目标地址。但是遇到发送给下一个HOP出现ZMacNoACK,NWK重发依然是发给下一个HOP的。这样的处理并不合理,正确处理方式应该反过来,在下一个HOP出现ZMacChannelAccessFailure时,NWK重发依然是下一个HOP。而再遇到下一个HOP出现ZMacNoACK时,说明下一个HOP出现故障,这个时候才应该去切换下一个HOP。
VV:
Aries,
感谢你的反馈。
按照正常的理解,如果出现ZMacChannelAccessFailure说明本身信道,环境有干扰造成不能发送,这种情况的话发送给下一个hop也没有意思,而是直接发出去给到目的地址。
ZMacNoACK的话,发送下一跳,如果再没有ACK的话,会通过router discovery,或者其他的路由来切换路径