Board logo

标题: zigbee终端节点问题! [打印本页]

作者: luof521    时间: 2006-9-22 17:25     标题: zigbee终端节点问题!

应用环境:


协调者和路由器长期供电。


终端节点经外部条件触发供电,进行相关数据传输后断电。


存在问题:


当终端节点断电后,再上电。


Zigbee协议会这样处理:断电后,先前的NBI信息(网络地址,邻居表等)将会全部被清除;重新上电后,必须重新申请加入网络,协调者会重新分配一个网络地址。


有没有一种方法,让终端节点断电后,保持所有NBI信息;等下次上电上电恢复到之前状态?


作者: seuafu2005    时间: 2006-9-25 15:02

可以看这个文档Z-Stack Compile Flag Definitions_F8W-2004-0013_.pdf

加入NV_Restore编译字就可以了
作者: jimmytan    时间: 2006-9-25 17:06

其实,我觉得你可以不必要完全断电。你可以让中断节点处于休眠状态,RF处于Hibernate,MCU处于STOP2模式。这样可以使用外面的终端来唤醒,比如说按键。
这样终端节点的功耗是很低的。而且,醒来的时候不会重新找网络,里面的东西也不会丢掉。加上NV_Restore编译的话,断电后也可以保存在FLASH里面的。
作者: luof521    时间: 2006-9-26 09:00

jimmytan的方法好象更好,但是现在无法评估RF处于Hibernate,MCU处于STOP2模式的功耗到底有多大.可能要等做产品的时候实际实验.

根据seuafu2005的指点,我看了NV_Restore相关的程序:打开NV_Restore开关后,系统上电后会恢复各层的NBI.我找到了相关的定义:
OSAL_NV_EXTADDR OSAL_NV_BOOTCOUNTER
ZDO_NV_USERDESC ZDO_NV_NWKKEY
NWK_NV_NIB NWK_NV_DEVICE_LIST
APS_NV_BINDING_TABLE
我有几点疑问: 1.所有的NBI都会存储在NV中吗? 我只找到以上几个.其他的都在哪里定义?
2.这些定义对应的meomery地址? 在map文件中可以找到吗?
3.打开NV_Restore后,上电会恢复16位网络地址吗?还是会重新分配新的?
有没有办法固定网络地址
作者: seuafu2005    时间: 2006-9-26 09:32

1.不是很清楚保存了些什么,但是重要的内容都会保存
2。对应的地址有两个block, 0x1200-0x13ff和0x1400-0x15ff。因为要写必须擦除整块flash,所以两个block交替使用
3。16位的网络地址应该可以恢复使用,这个在Coordinator中间同样设置NV_RESTORE应该可以做到
作者: jimmytan    时间: 2006-9-26 15:59

具体的电流消耗,可以参考MC13192和GT60的数据手册。RF HIBERNATE : 3uA DOZE: 40uA
GT60 STOP2 大概 1uA.
作者: luof521    时间: 2006-9-26 17:15

1.若寻址模式设置为ieee寻址,是否意味着nwk_addr毫无意义,只是个id,可以不使用.
那么nwk_addr上电后丢失或重分配也没关系.因为ieee地址在NV中没改变.
2.终端向协调者申请加入网络,协调者会根据设定的分配地址算法产生nwk_addr,并返回给终端.协调者会保存这个nwk_addr吗?

jimmytan: 我觉得完全断电更好些,如果采取相关措施保证上电后相关信息能够恢复.

在电池供电系统中 zigbee只能用于间歇式或触发式,实时行要求低,单向通讯,或非实时双向通讯的环境.这是我的一点理解.

作者: seuafu2005    时间: 2006-9-29 14:46

1。同意你的说法,如果发送地址用64位的mac,那么16bit的网络地址也无所谓。但是网络地址可以帮助coord知道device挂在哪个router下面,如果网络大的话。
2。coord会保存这个地址,但是否断电后继续保存,就看用户的设置了,如果用NV_RESTORE,是都可以保存的


作者: GBA_WE    时间: 2006-10-19 11:04

如果coord和router都设置NV_RESTORE保存相关信息,我试过了。这样的话,假设现在所有router都开着并已经加入了coord的网络,然后关掉coord,这时候任何一个router在复位后都无法重新加入到其他router的网络,因为他的NV中保存了coord的信息,他只加入coord的网络。
作者: GBA_WE    时间: 2006-10-19 11:10

这样当网络很大的时候,节点很多的时候。只要有一个router死机,话故障的话,直接关联在他下面的所有节点就都没法再加入网络了,岂不是损失一大片。但是如果不设置NV的话,虽然可以随时关联到不同的router,可短地址就会变化,可能会造成短地址重复,使得通信混乱。这样有什么两全气煤的方法吗?
作者: jimmytan    时间: 2006-10-20 15:59

我不赞同你的理解。首先,如果router加入网络,它会根据路由算法来重新选择网络。不存在router死机的话,它下面的router无法加入网络。因为这是动态路由,它可以去找其他的router.还有就是,在同一个网络,短地址是不会重复的。你可以做一下试验。
作者: GBA_WE    时间: 2006-10-20 17:01

我用的是Z-Stack协议栈,当在编译router的选项里加NV_RESTORE后,烧到板子上后,开机第一次关联到那个设备就保存下来了,如果被关联的设备关掉,重启router,他就关联不到其他设备上了。(我是看Led3没有亮得出的结论)。如果不加NV_RESTORE编译的话是可以关联到其他设备下面,但是假设他下面还有子节点,那么他的子节点的信息就都没了。
但是如果coord或router都不加NV_RESTORE编译的话,那么当coord重启后,原来关联在他下面的设备信息都丢失了,接下来再有新的设备加入coord,coord就会重新分配短地址,这样不是会和先前关联到coord的设备的短地址重复吗。(这个试验我也做过,结果是,coord发给一台设备,短地址相同的两台设备都会收到数据)
所以想找一个可以同时解决这两个问题的方法。
作者: wmf1001    时间: 2006-10-20 23:26

能知道Z-Stack协议栈中采用了什么动态路由算法吗?
作者: jimmytan    时间: 2006-10-23 12:00

NV_RESTORE主要是用来存贮一些信息,以便在关机后重新关机,可以直接找到他关联的信息。不需要重新去扫描之类的。我觉得这个功能要根据你具体的情况来确定,要不要这个功能。我觉得,如果你要用这个功能的话,要求你的这个网络要比较的问题。然后你需要这个网络在开关机后,比较方便。在实际的应用中,不一定要用这个功能。
作者: GBA_WE    时间: 2006-10-23 15:23

当后加入网络的route会保存前面设备的信息到路由表中,这样不是越是后加入网络的,保存的路由信息越全吗?有没有可以在所以设备加入网络后,刷新路由表的函数啊?好像找不到啊

作者: jimmytan    时间: 2006-10-24 11:39

每个router都会有一个路由表的,但是这个路由表只会有和他直接关联的parent,children,neighbors信息。所以后面加入的router也是这样的。关于mesh routing的算法和路由表的刷新都是在网络层完成的,网络层的函数是库函数,是不对用户开放的。其实用户也不需要去访问底层的函数的。只需要在应用层调用API,发送到目标地址。
作者: GBA_WE    时间: 2006-10-24 15:18

非常感谢你的解答!但是我在nwk_globals.c中看到了路由表的数组// Routing table
rtgEntry_t rtgTable[MAX_RTG_ENTRIES];我在router加入网络后,把这个数组打出到串口看时,发现都是0xFF 0xFE 0xFF 0xFE 0x00 0x00,对应的数据结构是uint16 dstAddress;
uint16 nextHopAddress; byte expiryTime; byte status;好像没有下一跳的地址信息嘛。对这个路由表的操作应该也在库里进行的吧。
作者: jimmytan    时间: 2006-10-25 09:57

在mesh routing table中,包含有nexthop地址信息,status,destination地址信息。uint16 nextHopAddress就是下一跳的地址信息啊,是16位的短地址。这个路由表的操作是在网络层完成的。




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0