CC2530组网深度问题
1、看了好多Zigbee模块的资料,说法不一致,Zigbee2006协议中相关的说法为,网络层有个常量是nwkcMaxDepth的值是0x0f,为什么只支持15级呢?
2、默认是5级,当每个路由的终端数都是最大值时,各个中断同时像协调器发送数据,会不会出现数据竞争,网络不稳定的情况?
3、是不是级数越大,对CC2530的内部RAM的需求就越大?现有的8K能支持15级么?
4、实现可靠通信,最多支持多少级路由?
1, 现在的ZigBee协议栈标准已经是ZigBee Pro了,ZigBee2006 是早期的协议标准。这个0x0F是指广播半径的深度,也就是一个广播数据可以最多转发的次数2*0x0F. 只是一个默认的参考值而已。
#if !defined ( DEF_NWK_RADIUS )
// the default network radius set twice the value of <nwkMaxDepth>
#define DEF_NWK_RADIUS ( 2 * BEACON_MAX_DEPTH )
#endif
2, 看同时发数据的设备个数,如果是同时刻竞争方式发数据的话,肯定会有问题。有大量的重发和丢包现象。
3, 只能说是有关系,CC2530的RAM在网络参数上,主要保存了子设备的信息,邻居表信息,路由表信息,那么你这些表格设的越大RAM开销也就越大。如果你的级数很大,但是只一个设备连另外一个设备的话,这样消耗的RAM也不会很大。
4,看实际应用的需求和实际应用场景
谢谢,那网络中,某个节点退出网络时(认为节点有故障),协调器能发现、定位故障节点吗?
如果是主动离开的,会发送leave消息出来。
如果是因为电池能量不足离开的,或者故障等离开,只能是应用层做相关的心跳机制了。
但是对于End device,现在Z-stack Home 1.2.0协议栈里面加入了child aging功能,如果节点长时间不跟父节点通信,父节点会把节点信息删除掉
谢谢,在这个网络中,都是协调器主动向目的设备发起数据,那End device 会不会主动向协调器或者父节点主动发送数据呢。
节点长时间不与父节点通信,父节点删除这个节点信息之前会进行一下消息确认吗?一般这个时间有多长呢?
我们在使用的时候,可能会 一天让节点执行两次,也会一个多月不去用它,让他工作在深度睡眠模式下,直到有个外部中断信号触发唤醒。
另外,即使父节点把这个节点信息删除,是不是等节点醒来还会自动加入网络?
// Child table Management timeout values
CONST uint16 gKEEPALIVE_TIMEOUT_MAX = KEEPALIVE_TIMEOUT_MAX; //在协议栈运行过程中,被初始化以后就不会变化了,用来表示节点最大的Age时间可以是60分钟
CONST uint16 gTIMEOUT_COUNTER_MAX = TIMEOUT_COUNTER_MAX;//在协议栈运行过程中是动态变化的,协议栈中有一个1分钟的循环timer event,当timer event触发的时候,会去检测在这个在一分钟是否有收到Data request,或者其他数据,如果没有的话就会把timeoutCounter减1,如果连续60分钟没有收到的话就把这个节点放到另外一个not child 的list里面去了,在中途只要收到一条来自这个节点的数据,这个counter立刻被Reset成初始化60,这个值就是通过endDevKaTimeout获得的。
当有新的RFD设备入网的时候,初始化RFD设备的Aging Timeout时间为60分钟。
ZDO_ProcessEndDeviceTimeoutReq 就是你说的功能。
我知道路由的nwk_link_status包会重置age,这在2.6之前的core就有,最新的HA协议栈里面,终端节点发送的除了data request,其他任何数据都能重置age吗?
发送数据的时候,必定会发送data request,用data request来做标记
这个不一定吧,比如一种情况,终端设置成RxOnWhenIdle=true的时候。
对的,如果把终端节点设置为Rx always on,那还不如设置成路由呢!
一个zigbee网络中,pan id应该是唯一的吧?
网络中一台A协调器连接N台路由设备,短地址是A协调器分配的?如果同一台路由设备连接到另外一台B协调器上,再次重新组网到A设备上,这时短地址应该是重新
分配?这个网络如果最多能连接20台设备,比如5台设备反复更换网络,会把地址沾满,导致A协调器不能在连接这5台设备?
如果上述问题存在,那又如何解决连接问题呢?
谢谢
请问你这个的源码在zstack的什么源文件下,我没有找到,O(∩_∩)O谢谢
您指的是哪个源码?您可以在IAR下将工程打开,然后使用Find功能搜索
CONST uint16 gKEEPALIVE_TIMEOUT_MAX = KEEPALIVE_TIMEOUT_MAX 这个在哪啊,我搜索了 搜不到啊
您需要使用Z-Stack Home 1.2.1的协议栈
关于Child Aging的timeout定义在协议栈nwk_gloables.c文件中,如下。
// Child table Management timeout values
CONST uint16 gKEEPALIVE_TIMEOUT_MAX = KEEPALIVE_TIMEOUT_MAX;
我用的是1.2.2a版本的协议栈,这个版本没有?如果没有的话,我终端时间长不上线,协调器会不会踢我?如果踢我,这个时间怎么改变?
您可以参考http://www.deyisupport.com.edgekey.net/question_answer/wireless_connectivity/zigbee/f/104/t/92195.aspx?pi2132219853=1 中VV给出的详细解释
Z-Stack Home 1.2.1 和 Z-Stack Home 1.2.2
对Child Aging功能的实现原理是一样的。
只不过Z-Stack Home 1.2.1里面,父设备对于end device来说,他的timeout时间是在父设备上实现固定的。
// Child table Management timeout values
CONST uint16 gKEEPALIVE_TIMEOUT_MAX = KEEPALIVE_TIMEOUT_MAX;
CONST uint16 gTIMEOUT_COUNTER_MAX = TIMEOUT_COUNTER_MAX;
以上两个变量主要用来判断,end device连续多久没有poll 了,然后就删除它。
其实这种做法是不合适的,因为用户在开发产品的时候,不是所有的产品poll rate都是一样的。比方说对于门磁 poll rate可能是0,对于door lock可能是10000.
那么poll rate不同,父设备对于子设备的统计方式也不一样了。
这也是为什么Z-Stack Home 1.2.2里面,需要子设备在入网以后告诉父设备自己的poll rate是多少。
void ZDApp_AnnounceNewAddress( void )
{
#if defined ( ZIGBEEPRO )
// Turn off data request hold
APSME_HoldDataRequests( 0 );
#endif
ZDP_DeviceAnnce( NLME_GetShortAddr(), NLME_GetExtAddr(),
ZDO_Config_Node_Descriptor.CapabilityFlags, 0 );
#if defined ( ZIGBEEPRO )
// Setup the timeout
APSME_HoldDataRequests( ZDAPP_HOLD_DATA_REQUESTS_TIMEOUT );
#endif
if ( ZSTACK_END_DEVICE_BUILD )
{
if ( zgChildAgingEnable == TRUE )
{
uint8 coordExtAddr[Z_EXTADDR_LEN];
// Send the message to parent
NLME_GetCoordExtAddr( coordExtAddr );
NLME_SendEndDevTimeoutReq( NLME_GetCoordShortAddr(), coordExtAddr,
zgEndDeviceTimeoutValue,
zgEndDeviceConfiguration );
}
}
}
父设备在收到这个消息以后,就会处理,把对该节点的timeout时间修改过来了。
void NLME_ProcessEndDevTimeoutReq( NLDE_FrameFormat_t *ff )
协调器收到这个怎么处理?多久去删除一次这些终端?比如门磁1s 轮询一次,协调器多久收不到它会踢他、?假设我不想踢它,该如何修改,我看ember的协议栈跟zstack1.2.1协议栈机制类似
据我目前的理解,一个zigbee节点如果需要加入一个协调器的网络的话,需要2个参数,一个是相同的PANID,一个是相同的信道;2个参数相同的话,终端或者路由器节点就会自动加入该协调器的网络;
我的疑问:
1)我看ZHA协议栈里面的sampleswitch和samplelight的panID都是设置成0xffff,就是会变化的,那么终端的工程(目前我用switch的协调器工程,light的终端工程)是如何获取协调器的panid的呢?如何设置本身的panid呢?
2)如果所有zigbee网络都是这2个参数来组网的话,那么我是否可以认为:zigbee 2.3的协议栈,zigbee2.5.1a的协议栈,ZHA协议栈,ZLL协议栈,zigbee3.0协议栈只要设置好参数,都是可以组网并互相收发数据的?他们的不一样的地方只是本身的Profile不一样而已,对吗?如果我要和市面上的标准zigbee ZHA产品组网的话,我用zigbee2.5.1a的协议栈都是可以组网的(市面上产品作为终端,我的zigbee2.5.1a的协议栈作为协调器),对吗?