首页 > 引用-ZIGBEE-ZSTACK网络配置相关问题

引用-ZIGBEE-ZSTACK网络配置相关问题

下面是以道友问的问题,这里简单做分析,仅供交流学习用,有什么不对之处还请各位大虾指正。鄙人邮箱为:[email protected]. 欢迎交流!!

1: 最主要的就是路由问题。我用06协议栈自带的例子程序sampleapp修改了一下,另协调器以网络地址的形式向终端发送数据,中间加入路由转发数据。拿 到室外试验了一下,结果路由根本不起作用。

zigbee06的路由程序应该怎么写? 需要什么设置么?

2:在sampleapp这个程 序中,我把终端的程序修改为之接收信号,其他事件一概不作处理,组网后用协议分析仪察看了一下,发现终端每一秒都在向协调器发送一个命令信号,协调器也会 作出应答,这

些例子程序都是协调器发送数据到路由的,请问终端要怎么设置?

3我想做的很简单:就是用协 调器用网络地址向终端发送数据,终端只负责接收,网络中存在路由器,起信息转发作用。觉得是一个很简单的程序,但是就是弄不出来,请指教以下具体应该怎么 弄?谢谢!

4:zigbee06要怎么设置网络形式?星状网状树形这些网络要怎么才能建立?需要哪些设置呢?

5:06里面,网络地址是怎 么分配的?还是用的04的分布式地址分配算法么?还是别的算法,有没有详细的解释说明呢?在协议栈 里,MAX_DEPTH,MAX_CHILDREN,MAX_ROUTER都是在那里设置的?我只在

nwk.globals.h中找到了

#if ( STACK_PROFILE_ID == HOME_CONTROLS )

    #define MAX_NODE_DEPTH      5

    #define NWK_MODE            NWK_MODE_MESH

这一个的定义。还有byte CskipRtrs[MAX_NODE_DEPTH+1] = {6,6,6,6,6,0};这一句是什么意思呢,死活看不明白了...

下面针对上面问题简要分析下:

1、06协议的路由算法已经打包成库,是不能修改的。

C:Texas InstrumentsStack-1.4.3-1.2.1ProjectszstackLibrariesTI2430DBin这里应 该有您需要的库文件,要是可以您可以反编译看看。

至于您拿出去不能演示,那是因为您没有弄明白收到数据的现象。

希望下面的分析对您理解有 帮助!

2、至于每秒发信息,个人觉得可能不是每秒,大概是发送的周期信息。因为

在网络成功建立或者成功加入后,设备都在发送周期信息,见 程序如下:

case ZDO_STATE_CHANGE:

          SampleApp_NwkState = (devStates_t)(MSGpkt->hdr.status);

          if ( (SampleApp_NwkState == DEV_ZB_COORD)

              || (SampleApp_NwkState == DEV_ROUTER)

              || (SampleApp_NwkState == DEV_END_DEVICE) )

          {

            // Start sending the periodic message in a regular interval.

            osal_start_timerEx( SampleApp_TaskID,

                              SAMPLEAPP_SEND_PERIODIC_MSG_EVT,

                              SAMPLEAPP_SEND_PERIODIC_MSG_TIMEOUT );

          }

可以看到网络状态 一旦改变(建立或者加入网络),就调用了定时触发事件:

SAMPLEAPP_SEND_PERIODIC_MSG_EVT

而 该事件为:

if ( events & SAMPLEAPP_SEND_PERIODIC_MSG_EVT )

  {

    // Send the periodic message

    SampleApp_SendPeriodicMessage();

    // Setup to send message again in normal period (+ a little jitter)

    osal_start_timerEx( SampleApp_TaskID, SAMPLEAPP_SEND_PERIODIC_MSG_EVT,

        (SAMPLEAPP_SEND_PERIODIC_MSG_TIMEOUT + (osal_rand() & 0x00FF)) );

    // return unprocessed events

    return (events ^ SAMPLEAPP_SEND_PERIODIC_MSG_EVT);

  }

这里调用了发送数据函数 SampleApp_SendPeriodicMessage(),而之后又调用了定时触发事件 SAMPLEAPP_SEND_PERIODIC_MSG_EVT,所以该事件不停的在触发并发送数据。

void SampleApp_SendPeriodicMessage( void )

{

  if ( AF_DataRequest( &SampleApp_Periodic_DstAddr, &SampleApp_epDesc,

                       SAMPLEAPP_PERIODIC_CLUSTERID,

                       1,

                       (uint8*)&SampleAppPeriodicCounter,

                       &SampleApp_TransID,

                       AF_DISCV_ROUTE,

                       AF_DEFAULT_RADIUS ) == afStatus_SUCCESS )

  {

  }

  else

  {

    // Error occurred in request to send.

  }

}

如 果想知道发送的是什么数据并了解发送到什么地方,建议可以分析下AF_DataRequest()函数里各个参数的含义。

3、其实您这个应用的却 不难,主要是您对ZSTACK还不怎么熟悉,不知道怎么下手。其实就是现在ZSTACK中随便哪个例子都可以满足您的要求。就拿SAMPLE来说,都可以 满足,就2项中提到的周期发送信

息,在发送函数里有个参数为AF_DISCV_ROUTE,就是这里设置为允许去找路由器路由信息,这个参数为2,则直接启动AODV查找路由,为 1时,先查路由表,找不着路由则启动路由查找,为0时,不用AODV

,直接走树路由!而参数AF_DEFAULT_RADIUS指明了路由深度为:#define AF_DEFAULT_RADIUS                  DEF_NWK_RADIUS

#define DEF_NWK_RADIUS 10

路由深度为10,也就是只能经过10次路由,每路由一次,该数据减1,有兴趣可以用协议分析仪看一下。

4、 ZSTACK网络结构设定

找到nwk_globals.h文件

// 网络模式控制

#define NWK_MODE_STAR         0

#define NWK_MODE_TREE         1

#define NWK_MODE_MESH         2

// 网络加密控制

#define SECURITY_RESIDENTIAL  0

#define SECURITY_COMMERCIAL   1

// 协议栈参数设置

#define NETWORK_SPECIFIC      0

#define HOME_CONTROLS         1

#define ZIGBEEPRO_PROFILE     2

#define GENERIC_STAR          3

#define GENERIC_TREE          4

#define STACK_PROFILE_ID      XXXXXXXXXX

这里定义协议栈模式的,是很重要的,直接涉及到下面的 定义。这里的值就为上面定义的协议栈参数色绘制那5个,当然用户还可以继续定义的!

当XXXXXXXXXX= HOME_CONTROLS时,程序如下:

#if ( STACK_PROFILE_ID == HOME_CONTROLS )

    #define MAX_NODE_DEPTH      5

    #define NWK_MODE            NWK_MODE_MESH

    #define SECURITY_MODE       SECURITY_RESIDENTIAL

#if   ( SECURE != 0  )

    #define USE_NWK_SECURITY    1   // true or false

    #define SECURITY_LEVEL      5

#else

    #define USE_NWK_SECURITY    0   // true or false

    #define SECURITY_LEVEL      0

#endif

可以看出此时,网络结构为网状网络

当XXXXXXXXXX= GENERIC_STAR时:

#elif ( STACK_PROFILE_ID == GENERIC_STAR )

    #define MAX_NODE_DEPTH      5

    #define NWK_MODE            NWK_MODE_STAR

    #define SECURITY_MODE       SECURITY_RESIDENTIAL

#if   ( SECURE != 0  )

    #define USE_NWK_SECURITY    1   // true or false

    #define SECURITY_LEVEL      5

#else

    #define USE_NWK_SECURITY    0   // true or false

    #define SECURITY_LEVEL      0

#endif

可以看出此时,网络结构为星状网络

当XXXXXXXXXX= NETWORK_SPECIFIC 时:

#elif ( STACK_PROFILE_ID == NETWORK_SPECIFIC )

// define your own stack profile settings

    #define MAX_NODE_DEPTH          5

    #define NWK_MODE            NWK_MODE_MESH

    #define SECURITY_MODE       SECURITY_RESIDENTIAL

#if   ( SECURE != 0  )

    #define USE_NWK_SECURITY    1   // true or false

    #define SECURITY_LEVEL      5

#else

    #define USE_NWK_SECURITY    0   // true or false

    #define SECURITY_LEVEL      0

#endif

#endif

当然这些参数用户都是可以自己设定的,当然 也不能乱设定哈!

5、ZSTACK网络参数设定

// 网络中最多设备个数

#if !defined( NWK_MAX_DEVICE_LIST )

  #define NWK_MAX_DEVICE_LIST     20  // 目前设置为20个

#endif

路由器个数和终端节点个数 设定,通过wk_globals.c 中的下面代码来实现。

    byte CskipRtrs[MAX_NODE_DEPTH+1] = {6,6,6,6,6,0};

    byte CskipChldrn[MAX_NODE_DEPTH+1] = {20,20,20,20,20,0};

在这里 CskipRtrs[MAX_NODE_DEPTH+1] = {5,0};是通过一个数组的方式来定义的,元素0 表示在路由0 级的时候最多挂载的路由器节点个数,元素1,表示在路由1 级中最多挂载的的路由器节点个数。这

里我们定义了在0 级(协调器直接通讯)最多挂载5 个路由器,第一级不挂载。

CskipChldrn[MAX_NODE_DEPTH+1] = {50,0};同样是通过一个数组的方式来定义的,元素0 表示在路由0 级的时候最多挂载的终端节点个数,元素1,表示在路由1 级中最多挂载的的终端节点个数。这里

我们定义了在0 级(协调器直接通讯)最多挂载50 个终端,第一级不挂载。如下所示。

#if defined ( RTR_NWK )

  // change this if using a different stack profile...

  // Cskip array

  uint16 *Cskip;

  #if ( STACK_PROFILE_ID == HOME_CONTROLS )

    byte CskipRtrs[MAX_NODE_DEPTH+1] = {6,6,6,6,6,0};

    byte CskipChldrn[MAX_NODE_DEPTH+1] = {20,20,20,20,20,0};

  #elif ( STACK_PROFILE_ID == GENERIC_STAR )

    byte CskipRtrs[MAX_NODE_DEPTH+1] = {5,5,5,5,5,0};

    byte CskipChldrn[MAX_NODE_DEPTH+1] = {5,5,5,5,5,0};

  #elif ( STACK_PROFILE_ID == NETWORK_SPECIFIC )

    byte CskipRtrs[MAX_NODE_DEPTH+1] = {5,5,5,5,5,0};

    byte CskipChldrn[MAX_NODE_DEPTH+1] = {5,5,5,5,5,0};

  #endif // STACK_PROFILE_ID

#endif  // RTR_NWK

那么这里的 CskipRtrs[MAX_NODE_DEPTH+1] = {6,6,6,6,6,0};意思就是允许每级R或C最多能加入6各路由器。而byte CskipChldrn[MAX_NODE_DEPTH+1] = {20,20,20,20,20,0};表示每个路由器或协调器最

多挂在20个子节点,为什么有6维呢,那是因为参数MAX_NODE_DEPTH为5嘛,我想这个不用我多解释了哈

转载于:https://www.cnblogs.com/victoire/archive/2010/02/01/1661020.html

更多相关:

  • 题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=2819 题意:给一张n*n的01矩阵,可以任意交换其中的行或者列,问是否可以交换出来一个对角线上都是1的矩阵。 按行列号建图,如果(i,j)为1的话,则i和j就有一条边。匹配出的结果可以认为如何交换使得行列相等,输出结果要注意不...

  • U-Boot 实验指导书 一、获得U-Boot 源码 我们的光盘中提供了直接从U-Boot的官方网站下载的源代码,版本是1.3.2,放在src目录下。将u-boot-1.3.2.tar.bz2拷贝了工作目录下,解压源码包: [root@localhost root]# mkdir 2410-s [root@localhost roo...

  • USB设备枚举过程中使用到的常量定义如下: /*-------------------------------------------------------------------------  * Standard Chapter 9 definition  *----------------------------------...

  • 一个数组存储了非负整型数据,数组中的第i个元素a[i],代表了可以从数组第i个 位置最多向前跳跃a[i]步;已知数组各元素的情况下,求是否可以从数组的第0个位置跳跃到数组的最后一个元素的位置,返回最少跳跃的次数以及跳跃过程的路径(以数组下标标识) 例如: nums = [2, 3, 1, 1, 4] ,可以从nums[0] = 2...