引用-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 Instruments\ZStack-1.4.3-1.2.1\Projects\zstack\Libraries\TI2430DB\bin这里应 该有您需要的库文件,要是可以您可以反编译看看。
至于您拿出去不能演示,那是因为您没有弄明白收到数据的现象。
希望下面的分析对您理解有 帮助!
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

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_30245867/article/details/98233899

智能推荐

python脚本开机自动运行_python脚本开机自启动-程序员宅基地

文章浏览阅读2.1k次。python 脚本自启动_python脚本开机自启动

WordPress统计文章页面浏览次数插件WP-PostViews-程序员宅基地

文章浏览阅读2.2k次。平时我们都是通过文章阅读数(浏览次数)来分析文章是否受用户欢迎,而 WordPress 站点的文章/页面的浏览次数虽然我们可以通过纯代码来实现,但是老古个人还是比较喜欢使用这款 WP-PostViews 插件。因为有了它不管站点是否使用CDN都可以统计浏览数,而且还可以轻易得到最受欢迎/不受欢迎的文章(PS:可以根据标签和分类分别统计)。WP-PostViews 插件的安装及启用登录 WordPress 后台 >> 插件 >> 安装插件 >> 搜索:WP-Post_wp-postviews

服务端渲染和客户端渲染-程序员宅基地

文章浏览阅读253次。一、前言 主要涉及: 1、什么是服务端渲染 2、什么是客户端渲染 3、两者的区别,以及什么场合使用二、主要内..._查看网页源代码有html 是客户端渲染还是服务端

win7安装wince6.0中遇到的问题 CDeviceSDKInstallShim Add/Remove failed. HR=0x8007005_wince sdk报空间问题-程序员宅基地

文章浏览阅读1.7k次。原文地址: http://blog.sina.com.cn/s/blog_5aea09bb0100m22m.html 以前用xp,安装wince6.0一切顺利,能够正常使用。最近换了一台新电脑,安装了win7操作系统,备份的资料拷贝过来,重新安装原来的开发环境,安装vs2005也没有什么问题,一路畅通;安装完成sp1的补丁继续安装wince6.0却遇到了问题,总是报错,从网上搜到解决办法,记录下来以备查询:报错信息:1、ToolsMsm_wince sdk报空间问题

开发知识点-前端Vue_yarn run dev extra semicolon-程序员宅基地

文章浏览阅读299次。(6)webpack:一款强大的文件打包工具,可以将我们的前端项目文件同一打包压缩至js中,并且可以通过vue-loader等加载器实现语法转化与加载。(2)vue-router: Vue提供的前端路由工具,利用其我们实现页面的路由控制,局部刷新及按需加载,构建单页应用,实现前后端分离。(3)vuex:Vue提供的状态管理工具,用于同一管理我们项目中各种数据的交互和重用,存储我们需要用到数据对象。(1)el表明我们的Vue需要操作哪一个元素下的区域,'#demo’表示操作id为demo的元素下区域。_yarn run dev extra semicolon

shell脚本中/bin/bash的作用-程序员宅基地

文章浏览阅读1.2w次,点赞3次,收藏11次。shell脚本通常第一句是#!/bin/bash,在很多情况中,如果没有设置好这一行,那么该程序很可能无法执行,因为系统无法判断该程序需要使用什么shell来执行通俗点讲,#!/bin/bash: 是指此脚本使用/bin/bash来解释执行。其中,#!是一个特殊的表示符,后面紧跟着解释此脚本的shell路径。bash只是shell的一种,还有很多其它shell,比如:sh,csh,ksh,tcsh等等。Linux Shell中有三种引号,分别为双引号(" ")、单引号(' ')以及反引号(_/bin/bash

随便推点

栈 实现 中缀表达式 转换成 后缀表达式 并 计算_使用栈实现中缀表达式转后缀表达式,用java伪代码形式描述实现算法.-程序员宅基地

文章浏览阅读3.6k次,点赞7次,收藏42次。#include <iostream>// cin 为输入 cout 为输出 #include <cstring>// 用栈 来 处理 一般的 中缀计算表达式// 这里 只实现了 最基本的 + - * / 也可以根据程序需要 添加 ^ 和 % 以及 开方等运算 using namespace std; int campareToChar(char ..._使用栈实现中缀表达式转后缀表达式,用java伪代码形式描述实现算法.

Python 第三方模块 绘图 Seaborn模块1_14.0% of the points cannot be placed; you may want-程序员宅基地

文章浏览阅读1.1k次,点赞2次,收藏10次。一.介绍1.功能:Seaborn是基于Matplotlib的图形可视化Python包,在Matplotlib的基础上进行了更高级的API封装,使作图更容易.在多数情况下使用Seaborn能作出更有吸引力的图,而使用Matplotlib能作出更有特色/更复杂的图.同时Seaborn能高度兼容NumPy/Pandas的数据结构及SciPy/Statsmodels的统计方法.Seaborn是针对统计绘图的.一般来说,Seaborn能满足数据分析90%的绘图需求,但如果要绘制复杂的自定义图形,还是需要Mat_14.0% of the points cannot be placed; you may want to decrease the size of t

利用uinput模拟touchscreen_qt ioctl(ui_dev_create)-程序员宅基地

文章浏览阅读3.1k次,点赞4次,收藏17次。#ifndef _GNU_SOURCE#define _GNU_SOURCE#endif#include <stdio.h>#include <stdlib.h>#include <errno.h>#include <fcntl.h>#include <paths.h>#include <string.h&gt..._qt ioctl(ui_dev_create)

一网打尽win10 Google Chrome浏览器打开后默认 桔梗 页面-程序员宅基地

文章浏览阅读1.1w次,点赞8次,收藏5次。一网打尽 win10 Google Chrome浏览器打开后默认 桔梗 页面 真是莫名其妙,突然有一天,码农coding打开Google Chrome浏览器,当当当。。。且看下图初步诊断:win10 中招了那该怎么破?于是 换其他浏览器试试看FireFox 火狐浏览器IE浏览器,老牌了TMD,啊就这“不讲武德”,都“中招”了是时候拿出我珍藏多年的秘密武器“杀手锏”了盘它不怕啊,接着 “揍它”火狐浏览器IE浏览器就是酱紫,你学废了没?真是莫名其妙,突然有一天,码农coding打开Google Chrome浏

idea +junit单元测试获取不到bean注入的解决方式_无法检索应用程序bean快照-程序员宅基地

文章浏览阅读2k次。刚开始报错获取不到bean因为配置文件1、原因一:*.properties等没有值,还是用${变量的}。获取不到,于是把所有值复制到properties文件里。2、原因二:springmvc.xml 没有某些静态资源获取报错,把src的resources下的springmvc.xml复制到test目录的resources下,删除静态资源引用。3、原因三:可去掉log4j配置。补充知识:IDEA的junit单元测试Scanner输入无效在idea的junit单元测试中用Scan_无法检索应用程序bean快照

MySQL Shell8.0数据库命令_\connect root@localhost-程序员宅基地

文章浏览阅读1.8w次,点赞2次,收藏43次。伴随MySQL8.0同时发布了MySQL Shell,这款神器具有支持多种语言(JS、python、SQL),交互式界面,多行批量执行等特点。MySQL Shell 命令 命令 简写/别名 描述 \help \h or \? 显示帮助信息 \quit \q or \exit 退出 \ SQL模式中,“\”分割多行代码以缓冲..._\connect root@localhost

推荐文章

热门文章

相关标签