学习zigbee入门-6

【转】学习zigbee入门-6

首先来看看 Z-Stack 的结构。

第一次打开工程印象最

深刻的就是左边一排文件夹,如图 所示。 其实这个还是很容易理解的: APP(Application Programming):应用层目录,这是用户创建各种不同工程的区域,在这个目录中包含了应用层的内容和这个项目的主要内容,在协议栈里面一般是以操作系统的任务实现的。 
HAL(Hardware (H/W) Abstraction Layer):硬件层目录,包含有与硬件相关的配置和驱动及操作函数。 
MAC:MAC 层目录,包含了 MAC 层的参数配置文件及其 MAC 的 LIB 库的函数接口文件。 
MT(Monitor Test):实现通过串口可控各层,于各层进行直接交互。(这个很重要哦)
NWK(ZigBee Network Layer):网络层目录,含网络层配置参数文件及网络层库的函数接口文件,APS 层库的函数接口
OSAL(Operating System (OS) Abstraction Layer):协议栈的操作系统。 
Profile:AF(Application work) 层目录,包含 AF 层处理函数文件。 
Security:安全层目录,安全层处理函数,比如加密函数等。 
Services:地址处理函数目录,包括着地址模式的定义及地址处理函数。 
Tools:工程配置目录,包括空间划分及 ZStack 相关配置信息。 
ZDO(ZigBee Device Objects):ZDO 目录。 
ZMac: MAC 层目录,包括 MAC 层参数配置及 MAC 层 LIB 库函数回调处理函数。
ZMain:主函数目录,包括入口函数及硬件配置文件。 
Output:输出文件目录,这个 EW8051 IDE 自动生成的。 
       那么知道各个文件夹大概是什么功能,分布在 ZIGBEE 的哪一层,那么在以后的工作中无论是查询某些功能函数还是修改某些功能函数,甚至是添加或删除某些功能函数就能顺利的找到在什么地方了,当然要想真的顺利还需要花更多的时间熟悉这个协议栈了!了解 Z-Stack 结构后那么就能看看它的功能。不用问,这个是针对 ZIGBEE 无线网络写的协议栈,呵呵!那么就要先大概了解下 ZIGBEE 这个技术。我这里就不介绍理论了,就从 Z-Stack 实际的角度介绍些实用的概念。 
1、Zigbee 网络中的节点 
       在 ZB 网络中,每个节点都有指定的配置参数,从而确定其设备类型,不同的设备类型,在网络中有着不一样网络任务。在属于多跳网络的 ZB 网络中,两个节点需要完成数据传输,可能需要经过其他中间节点的协助,所以节点的类型参数配置是非常必要的。对每个节点有两个任务: 
(i)执行指定的网络功能函数 
(ii)配置确定的参数到指定的值。 
网络功能的设置确定了该节点的类型,参数配置和指定的值确定了堆栈的模式。 
节点类型 
       在 ZB 中,设备类型分为三类:协调器,路由器和终端设备。 
就是这三种设备类型组成的一个典型网络。 


其中黑色节点为协调器, 红色节点为路由器, 白色节点为终端设备 
那么这个就是一个典型的网状网络 MESH(网状)。

       协调器---是一个 ZB 网络的第一个开始的设备,或者是一个 ZB 网络的启动或建立网络的设备。协调器节点选择一个信道和网络标志符(也叫PAN ID),然后开始建立一个网络。协调器设备在网络中还可以有其他作用,比如建立安全机制、网络中的绑定的建立等等。 注意:协调器主要的作用是建立一个网络和配置该网络的性质参数。一旦这些完成,该协调器就如同一个路由器,网络中的其他操作并不依赖该协调器,因为ZB 是分布式网络。 
       路由器---一个路由器的功能有(1)作为普通设备加入网络(2)多跳路由(3)辅助其它的子节点完成通信。 
一般来说,路由器需要一直处于工作状态,所以需要主干线供电(区别于电池供电)。但是在某指定的网络结构中可以采用电池供电,如“串树型”网络模式中,允许路由器周期的运行操作,所以可以采用电池供电。 
       终端设备---为了维持网络最基本的运行,对于终端设备没有指定的责任。也就是说,在一个基本网络中,终端设备没有必不可缺少性。所以它可以根据自己功能需要休眠或唤醒,因此为电池供电设备。一般来说,该设备需要的内存较少(特别是内部RAM) 
       堆栈模式(Stack Profile)---需要被配置为指定值的堆栈参数,连同这些值被称为堆栈模式。这些堆栈模式参数被ZB联盟定义指定。在同一个网络中的设备必须符合同一个堆栈模式(同一个网络中所有设备的堆栈模式配置参数必须一致)。

为了互操作性,ZB联盟为06协议栈定义了一个堆栈模式,所有的设备只要遵循该模式的参数配置,即使在不同厂商买的不同设备同样可以形成网络。

如果应用开发者改变了这些参数配置,那么他的产品将不能与遵循ZB联盟定义模式的产品组成网络,也就是说该开发者开发的产品具有特殊性,我们称之为“关闭的网络”,也就是说它的设备只有在自己的产品中使用,不能与其他产品通信。       

该协议模式标志符在设备通信的信标传输中被匹配,如果不匹配,那么该设备将不能加入网络。“关闭网络”的堆栈模式有一个 0ID,而 06 协议栈模式有一个1ID。该堆栈模式被配置在 nwk_globals.h 文件中的 STACK_PROFILE_ID 参数。如:#define STACK_PROFILE_ID      HOME_CONTROLS。 
2、Zigbee 网络中的地址 
地址类型 
      ZB 设备有两种地址类型
,一个是 64 位 IEEE 地址(也可以叫 MAC 地址或扩展地址),一个是 16 位网络地址(也可以叫逻辑地址或短地址)。 64 位地址是全球唯一的,作为设备(产品)的终生地址被分配。它通常被开发商或安装的时候被指定。该地址由 IEEE 分配指定,该地址的信息和获得该地址的方法见:http://standards.ieee.org/regauth/oui/index.shtml ,16位地址在设备加入网络的时候被分配,由这个网络自动分配。该地址只能用与本网络中,标志不同的设备间传递信息。 
网络地址分配 
       ZB 分布式网络中地址分配是唯一的。为了不使网络中设备混乱,为每个设备指定确定的地址是非常必要的。 
在 分 配 地 址 之 前,一 些 参 数 必 须 被 设 置 :MAX_DEPTH, MAX_ROUTERS 和MAX_CHILDREN 。 
这些参数都是 ZB 协议模式的一部分,在 06ZS 模式中这些参数设置为 :

(MAX_DEPTH = 5, MAX_CHILDREN = 20, MAX_ROUTERS = 6). 
参数设置 
       MAX_DEPTH 决定了网络的最大深度。协调器的深度是 0,它的子设备的深度是1,他们的子设备的深度是 2,依次类推。所以 MAX_DEPTH 参数限制了网络物理上的“长度” ,MAX_CHILDREN 参数决定了一个路由器(或一个协调器)能承载子设备的最大数目。MAX_ROUTERS 参数决定了一个路由器(或一个协调器)能承载路由器的最大数目。这 个 参 数 实 际 上 是 MAX_CHILDREN 参 数 的 一 个 子 集 , 剩 下 的
(MAX_CHILDREN-MAX_ROUTERS)地址空间属于终端设备。 
开发者自定义 
       如果开发者想改变这些值,那么需要做如下几步: 
       首先得保证这些参数新的值是合法的。既然整个地址空间被限制在 2-16 内,那么 这 些 参 数 的 大 小 就 已 经 有 了 限 制 。 分 布 在 release ( 在 文 件 夹 Projects\zstack\Tools 中)的 Cskip.xls 文件能校验这些参数是否合法。在键入这些参数的值后大概这个电子表格,如果非法,一个错误信息将给出。之后选择合法的值,开发者需要确保不使用标准的协议栈模式,而用指定的协议栈模式代替(用 NETWORK_SPECIFIC 替换 STACK_PROFILE_ID 当前的值)。然后在“nwk_globals.h”文件中的 MAX_DEPTH 参数根据需要设置为适当的值。 另外,nwk_globals.c 文件中排列的 CskipChldrn 和 CskipRtrs 必须被设置,这些排列是z-stack 中的寻址 
为了在网络中发送数据到一个设备,应用层一般用 AF_DataRequest()函数。而被发送的目的设备的地址类型 afAddrType_t 被定义在“ZComDef.h”中: 
typedef struct 

union 

    uint16      shortAddr; 
    ZLongAddr_t extAddr; 
} addr; 
byte addrMode; 
} zAddrType_t; 
地址模式参数 
注意
:除这个网络地址之外,地址模式参数也需要被指定。目的地址模式可能是如下值之一(AF 地址模式被定义在“AF.h”中): 
typedef enum 

afAddrNotPresent = AddrNotPresent, 
afAddr16Bit          = Addr16Bit, 
afAddrGroup      = AddrGroup, 
afAddrBroadcast = AddrBroadcast 
} afAddrMode_t; 
       地址模式参数是需要的,因为在 ZB 中,数据包能被点传输、多点传输或者广播传输。点传输被发送到单个设备,多点传输一定发送到一组设备,广播传输一般被发送到网络中的所有设备。如下是更详细的说明。 
点到传输 (Unicast) 
        这是标准地址模式,被用于发送一个数据包到网络中单个已知地址的设备。这个addrMode 参数被设置为 Addr16Bit,目的网络地址在数据包中一同被发送。 
间接寻址 
        数据包中的最终目的地址不识别的时候使用。该模式被 AddrNotPresent 设置,而且目的地址没有被指定。代替目的地址的是:一个存储在发送设备协议栈的“绑定表格”,该表格中有被绑定设备的地址。这个特性被调用是源于绑定。(看后面关于绑定部分)当被发送的信息包下载到协议栈时,从这个绑定表格中寻找使用的目的地址。然后该信息包被有规则的处理为点对点数据包。如果有多个(大于 1)目的地址在绑定表格中被发现,那么该数据包将被拷贝成对应的份数分别发送给他们。 在(ZigBee04)版本之前,在协调器中有一个存储绑定表格的选项。因此,发送设备发送数据包到这个协调器,然后协调器在它的绑定表格中查找最终的目的地址,对数据包进行在一次发送。该选项特性在协调器绑定被调用 
广播传输 
       该模式在应用层想发送一个数据包到所有网络中的所有设备时被使用。该地址模式被 AddrBroadcast 被设置,目的地址被设置为下列值之一: 
NWK_BROADCAST_SHORTADDR_DEVALL (0xFFFF)-信息将被发送到网络中的所有设备(包括休眠的设备)。对于休眠的设备,这个信息将被保持在它的父节点,直到 该 休 眠 设 备 获 得 该 信 息 或 者 该 信 息 时 间 溢 出 ( 在 f8wConfig.cfg 中 的NWK_INDIRECT_MSG_TIMEOUT 选项)。
NWK_BROADCAST_SHORTADDR_DEVRXON (0xFFFD) –该信息将被发送到网络中有接收器并处于 IDLE(RXONWHENIDLE)状态下的所有设备。也就是说,除了休眠模式设备的所有设备。 
NWK_BROADCAST_SHORTADDR_DEVZCZR (0xFFFC) –该信息被发送到所有路由器(包括协调器) 。 
组地址 
       该模式用于应用层想发送一个数据包到一个设备组的时候。该地址模式被afAddrGroup 设置这个组标志符。用 该 特 性 之 前,在 网 络 中 , 组 不 得 不 被 定 义 [ 看 ZStack API 文 档 中 的 ] aps_AddGroup() 注意:组能与间接寻址一起结合使用。该目的地址在绑定表格中发现,可以作为点对点或一个组地址。也要注意广播地址可以当作是组被提前设置,一个简单的组寻址的特例。例子代码对于一个设备添加它自己到一个组标志符 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 ); 
重要设备地址 
        一个应用可以能想知道它自身和父节点的地址,用下面的函数可以得到设备的地址(被定义在 ZStack API 文档中): 
NLME_GetShortAddr() – 返回该设备的 16 位网络地址 
NLME_GetExtAddr() –返回该设备的 64 位扩展地址. 
用下面的函数可以得到该设备的父节点的地址(被定义在 ZStack API 文档中)。
注意该函数在协调器中不被涉及到,但是被设备父节点代替(MAC 协调器): 
NLME_GetCoordShortAddr() – 返回本设备的父亲设备的16位网络地址
NLME_GetCoordExtAddr() – 返回本设备的父亲设备的64位扩展地址
先介绍这两个概念:节点和地址。其余的就改天继续!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值