1,由于我所搭建的整个网络是Mesh网络,不牵涉到低功耗的情况,所以网络中只有两种类型的设备:协调器和路由器即:1个协调器+N个路由器

2,为了防止协调器在掉电的情况下路由器去维持整个网络,这样协调器就不能再加入到原来的网络中,所以协调器和N个路由器都开启了:NV_INIT, NV_RESTORE

3,我在协调器中建立了一个关联表用于维护所有路由节点的网络短地址,这样协调器和路由器通信的时候都采用单播的方式通信。

下面是产生的几个问题描述:

(1)我在协调器和N个路由器都开启NV_INIT NV_RESTORE的情况下,再打开AES加密功能。设置-DSECURE=1 , zgPreConfigKeys = TRUE,协调器和路由器设置相同的defaultKey(在nwk_global.c中修改)。

1.1   但是出现加密后路由器和协调器通信出现断断续续的情况,有的时候数据能够收到,有的时候收不到?

[VV] 这个跟是否加密没有关系,既然你能收到数据,而且数据加解密都正常,那说明这个加密本身是没有问题的。

1.2    重启路由器,路由器在上电加入网络出现收不到协调器发送过来的数据的情况。

[VV] 是协调器没有发出来呢,还是发出来了没有收到?用空中抓包看下

1.3   如果把所有节点的NV_INIT NV_RESTORE选项去掉,加密通信是没有问题的,请问:这两个选项和加密设置不能共同设置吗?相互之间会影响?

[VV] 可以共同设置,不会有影响的。

(2) 所有的路由器都开启了NV_RESTORE选项,如果路由器A通过路由器B加入到协调器的网络中,即路由器B是路由器A的parent父节点。

2.1    如果此时路由器B掉线,那么路由器A在开启NV_RESTORE的情况下回去选择新的路由器C作为父节点吗?如果会那么路由器C会给A分配新的网络地址                     吗?

[VV] 对于路由器只有在第一次入网的时候会选择一个父设备入网,主要目的是为了能获得父设备分配的网络地址,然后入网。一旦入网以后路由器的通信并不是一定依赖于父设备的,它自己可以维护邻居表和路由表和其他的节点进行通信,即便父设备不存在了,它不会重新选择父设备,而是继续维持正常工作。

2.2   如果路由器A更换了新的父亲节点,当原来的路由器B上电后,路由器B认为A节点还是自己的孩子节点,单播发送数据给路由A节点能收到吗?

[VV] 不会更换。通信不会有影响。

2.3   协调器也并不知道路由器A节点更换了新的父亲节的,保留的还是原来的路由路径,那么通过协调器单播数据给路由器A节点的时候能收到吗?

[VV] 不会更换,可以收到。

2.4  我看网上说可以通过路由器A节点调用ZDApp_AnnounceNewAddress()函数向网络中的所有设备进行新的地址更新通知,网络中协调器和所有的路由器在收到A节点的Device announce这个消息后判断A节点已经更换了父节点,会删除associated device list里面A节点的地址。协调器收到A节点的Device announce判断A节点更换了父亲节的,会更新老的路由路径为新的路由路径。

[VV] 在开启了NV的条件下,路由器不会重新入网了。

请问具体的代码是如何实现的呢?可以详细给下代码吗?路由A的代码和其他路由的代码,还有协调器的相应处理代码。

[VV] 你需要实现什么?

谢谢!

建议:

1) 一定要说下你用的协议栈版本。

2)学会用Sniffer 抓包分析ZigBee的通信问题,很重要。