zigbee协议栈学习(二)

协议栈规范的 ID号可以通过查询设备发送的 beacon 帧获得。在设备加入网络之前,首先
需要确认协议栈规范的 ID。“特定网络”规范 ID号为0; ZigBee协议栈规范的 ID号为1; ZigBee
RO 协议栈规范的 ID 号为 2。协议栈规范的 ID(STACK_PROFILE_ID)在 nwk_globals.h 中

// Controls the operational mode of network
#define NWK_MODE_STAR         0
#define NWK_MODE_TREE         1
#define NWK_MODE_MESH         2

// Controls various stack parameter settings  id
#define NETWORK_SPECIFIC      0
#define HOME_CONTROLS         1
#define ZIGBEEPRO_PROFILE     2
#define GENERIC_STAR          3
#define GENERIC_TREE          4

地址定义:
ZigBee 设备有两种类型的地址。一种是 64 位 IEEE 地址,即 MAC 地址,另一种是 16 位网络地址。 
16 位网络地址是当设备加入网络后分配的。它在网络中是唯一的,用来在网络中鉴别设备
和发送数据。其中,协调器的网络地址为 0x00 
#define NWK_PAN_COORD_ADDR 0x0000 
地址的的分配:ZigBee 2007 PRO  使用的随机地址分配机制,对新加入的节点使用随机地址分配
当一个节点加入时,将接收到父节点的随机分配地址,然后产生“设备声明”(包含分配到的网络地
址和 IEEE 地址)发送至网络中的其余节点。“设备声明”检测新的网络地址是否冲突。

在每个路由加入网络之前,寻址方案需要知道和配臵一些参数。这些参数是 MAX_DEPTH
最大网络深度) 、MAX_ROUTERS(最多路由数)和 MAX_CHILDREN(最多子节点数) 。
这些参数是栈配臵的一部分,ZigBee2007 协议栈已经规定了这些参数的值:

MAX_DEPTH 决定了网络的最大深度。协调器(Coordinator)位于深度 0,它的儿子位于深
度1,他的儿子的的儿子位于深度 2,以此类推。MAX_DEPTH 参数限制了网络在物理上的长度。    

MAX_CHILDREN 决定了一个路由(Router)或者一个协调器节点可以处理的儿子节点的最大个数。 

MAX_ROUTER 决定了一个路由(Router)或者一个协调器(Coordinator)节点可以处理的具有
路由功能的儿子节点的最大个数。这个参数是 MAX_CHILDREN 的一个子集,终端节点使用
(MAX_CHILDREN – MAX_ROUTER)剩下的地址空间。 

还必须设臵 nwk_globals.c 文件中的 Cskipchldrn 数组和 CskipRtrs 数组这些数组的
值由MAX_CHILDREN 和MAX_ROUTER 构成

为了向一个在 ZigBee 网络中的设备发送数据,应用程序通常使用 AF_DataRequest()函数
数据包将要发送给一个 afAddrType_t(在ZComDef.h 中定义)类型的目标设备。 
typedef struct 

   union 
   { 
        uint16            shortAddr; 
        ZLongAddr_t extAddr; 
   } addr; 
   afAddrMode_t addrMode; 
   byte endPoint; 
   uint16 panId;    // used for the INTER_PAN feature 
} afAddrType_t; 

注意,除了网路地址之外,还要指定地址模式参数。目的地址模式可以设臵为以下几个值:
typedef enum 

   afAddrNotPresent = AddrNotPresent, 
   afAddr16Bit            = Addr16Bit, 
   afAddr64Bit            = Addr64Bit, 
   afAddrGroup            = AddrGroup, 
   afAddrBroadcast    = AddrBroadcast 
} afAddrMode_t; 

发送方式有数据包可以单点传送(unicast),多点传送(multicast)或者广播传送
一单点传送(Unicast) 
Uicast 是标准寻址模式,它将数据包发送给一个已经知道网络地址的网络设备。将
afAddrMode 设置为 Addr16Bit 并且在数据包中携带目标设备地址。 
二间接传送(Indirect)
当应用程序不知道数据包的目标设备在哪里的时候使用的模式。将模式设臵为
AddrNotPresent并且目标地址没有指定。取代它的是从发送设备的栈的绑定表中查找目标设备。
这种特点称之为源绑定。 
三 广播传送(broadcast) 
当应用程序需要将数据包发送给网络的每一个设备时,使用这种模式。地址模式设臵为
AddrBroadcast。目标地址可以设臵为下面广播地址的一种: 
NWK_BROADCAST_SHORTADDR_DEVALL(0xFFFF)——数据包将被传送到网络上的所有设
备,包括睡眠中的设备。对于睡眠中的设备,数据包将被保留在其父亲节点直到查询到它,或
者消息超时(NWK_INDIRECT_MSG_TIMEOUT 在f8wConifg.cfg 中)。 
NWK_BROADCAST_SHORTADDR_DEVRXON(0xFFFD)——数据包将被传送到网络上的所
有在空闲时打开接收的设备(RXONWHENIDLE),也就是说,除了睡眠中的所有设备。 
NWK_BROADCAST_SHORTADDR_DEVZCZR(0xFFFC)——数据包发送给所有的路由器,包
括协调器。  

时间: 2024-10-26 20:56:21

zigbee协议栈学习(二)的相关文章

zigbee协议栈学习(一)

学习协议栈之前我们先讲解一些基本的概念. 分为三块:协调器 路由器 终端设备    1.  ZigBee 协议栈简介   什么是 ZigBee 协议栈呢?它和 ZigBee 协议有什么关系呢?协议是一系列的通信标准,通信 双方需要共同按照这一标准进行正常的数据发射和接收.协议栈是协议的具体实现形式,通 俗点来理解就是协议栈是协议和用户之间的一个接口,开发人员通过使用协议栈来使用这个 协议的,进而实现无线数据收发. 图1展示了 ZigBee 无线网络协议层的架构图.ZigBee 的 协议分为两部分

zigbee协议栈学习(三)

这几章我们主要讲下思路和基本概念,在下一章中将具体分析代码. 下面的代码是一个设备怎样加入到一个 ID为1 的组当中: aps_Group_t group;  // Assign yourself to group 1  group.ID = 0x0001;  group.name[0] = 0; // This could be a human readable string  aps_AddGroup( SAMPLEAPP_ENDPOINT, &group );  NLME_GetShort

zigbee协议栈学习(五)

下篇文张讲解一个无线控制LED案列,这章了解系统运行的结构. 第一Z-Stack 软件架构  Z-Stack  由 main()函数开始执行,main()函数共做了 2 件事:一是系统初始 化,另外一件是开始执行轮转查询式操作系统,  FS_Zstack\ZMain.c  ZSEG int main( void )  {     osal_int_disable( INTS_ALL );   // 关闭所有中断       HAL_BOARD_INIT();        // 初始化系统时钟 

zigbee协议栈学习(四)

准备开始分析代码的,突然发现还有一个重要的知识点没有讲,没办法还是得补齐,呵呵 消息提取函数 uint8 *osal_msg_receive( uint8 task_id ) //这个函数返回一个指向所需提取信息的指针 属性(at tribute)  设备之间通信的每一种数据像开关的状态或温度计值等皆可称为属性.每个 属性可得到唯一的 ID,它们都用结构体来描述.  FS_Zstack\zcl .h  typedef struct  {     uint16    attrId;        

zigbee-关于ZigBee协议栈中的新数据类型

问题描述 关于ZigBee协议栈中的新数据类型 ZigBee协议栈中新数据类型种类繁多,跪求诸位大神整理一份ZigBee中的新数据类型清单 解决方案 zigbee 协议栈数据类型及转换 解决方案二: http://blog.csdn.net/tanqiuwei/article/details/17302517 解决方案三: com.prosyst.mbs.services.zigbee.datatype Class DataTypes java.lang.Object extended by c

ZigBee协议栈TI Z-Stack分析

ZigBee术语一.属性属性Attribute是一个反映物理数量或状态的数据值,比如 开关值(On/Off),温度值.百分比等.二.群集群集 Cluster是包含一个或多个属性(attribute)的群组.简单的说,群集就是属性的集合.每个群集都被分配一个唯一的群集ID且每个群集最多有65536个属性.三.设备描述设备描述DeviceDescription是指一个大型目标应用的一部分,包括一个或多个群集,并且指定群集是输入还是输出.四.端点端点EndPoint是协议栈应用层的入口,也可以理解应用

MySQL入门学习(二)

mysql 入门篇   上篇讲了如何安装并测试MySQL,环境建好后就可以继续我们的学习了.本篇主要熟悉一写常用命令. 1.启动MySQL服务器   实际上上篇已讲到如何启动MySQL.两种方法:   一是用winmysqladmin,如果机器启动时已自动运行,则可直接进入下一步操作.   二是在DOS方式下运行    d:mysqlbinmysqld 2.进入mysql交互操作界面   在DOS方式下,运行:   d:mysqlbinmysql    出现:   mysql    的提示符,此

OpenGL入门学习[二]

http://www.cppblog.com/doing5552/archive/2009/01/08/71532.html 一.点.直线和多边形 我们知道数学(具体的说,是几何学)中有点.直线和多边形的概念,但这些概念在计算机中会有所不同.数学上的点,只有位置,没有大小.但在计算机中,无论计算精度如何提高,始终不能表示一个无穷小的点.另一方面,无论图形输出设备(例如,显示器)如何精确,始终不能输出一个无穷小的点.一般情况下,OpenGL中的点将被画成单个的像素(像素的概念,请自己搜索之~),虽

学习二维动态数组指针做矩阵运算的方法_C 语言

本文分享了利用二维动态数组指针做矩阵运算的实现代码. 1. 头文件     // juzhen 2.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include "stdlib.h" #include "windows.h" #define OK 0 #define NG -1 typedef struct mat { int