从零开始学习Z-Stack之6
--------------Z-Stack指导
首先来看看Z-Stack的结构。
第一次打开工程印象最深刻的就是左边一排文件夹,如图6-1所示。
其实这个还是很容易理解的:
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 Framework) 层目录,包含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中,设备类型分为三类:协调器,路由器和终端设备。
图6-2就是这三种设备类型组成的一个典型网络。
其中黑色节点为协调器
红色节点为路由器
白色节点为终端设备
那么这个就是一个典型的网状网络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() – returns this device’s parent’s 16 bit short address.
NLME_GetCoordExtAddr() – returns this device’s parent’s 64 bit extended address.
先介绍这两个概念:节点和地址。其余的就改天继续!
文章评论(0条评论)
登录后参与讨论