【转】ZigBee快速入门

2019-07-19 13:50发布

2.ZigBee2.1 设备类型(Device Types)在ZigBee网络中存在三种逻辑设备类型:Coordinator(协调器),Router(路由器)和End-Device(终端设备)。ZigBee网络由一个Coordinator以及多个Router和多个End_Device组成。上图是一个简单的ZigBee网络示意图。其中黑 {MOD}节点为Coordinator,红 {MOD}节点为Router,白 {MOD}节点为End-Device。2.1.1Coordinator(协调器)协调器负责启动整个网络。它也是网络的第一个设备。协调器选择一个信道和一个网络ID(也称之为PAN ID,即Personal Area Network ID),随后启动整个网络。协调器也可以用来协助建立网络中安全层和应用层的绑定(bindings)。注意,协调器的角 {MOD}主要涉及网络的启动和配置。一旦这些都完成后,协调器的工作就像一个路由器(或者消失Go away)。由于ZigBee网络本身的分布特性,因此接下来整个网络的操作就不在依赖协调器是否存在。2.1.2Router(路由器)路由器的功能主要是:允许其他设备加入网络,多跳路由和协助它自己的由电池供电的儿子终端设备的通讯。通常,路由器希望是一直处于活动状态,因此它必须使用主电源供电。但是当使用树群这种网络模式时,允许路由间隔一定的周期操作一次,这样就可以使用电池给其供电。2.1.3End-Device(终端设备)终端设备没有特定的维持网络结构的责任,它可以睡眠或者唤醒,因此它可以可以是一个电池供电设备。通常,终端设备对存储空间(特别是RAM的需要)比较小。注意:在Z-Stack 1.4.1中一个设备的类型通常在编译的时候通过编译选项(ZDO_COORDINATOR 和RTR_NWK)确定。所有的应用例子都提供独立的项目文件来编译每一种设备类型。2.2 栈配置(Stack Profile)栈参数的集合需要被配置为一定的值,连同这些值在一起被称之为栈配置。ZigBee联盟定义了这些由栈配置组成的栈参数。网络中的所有设备必须遵循同样的栈配置。为了促进互用性这个目标,ZigBee联盟为ZigBee2006规范定义了栈配置。所有遵循此栈配置的设备可以在其他开发商开发的遵循同样栈配置的网络中。3. 寻址(Addressing)3.1 地址类型(Address types)ZigBee设备有两种类型的地址。一种是64位IEEE地址,即MAC地址,另一种是16位网络地址。64位地址使全球唯一的地址,设备将在它的生命周期中一直拥有它。它通常由制造商或者被安装时设置。这些地址由IEEE来维护和分配。16为网络地址是当设备加入网络后分配的。它在网络中是唯一的,用来在网络中鉴别设备和发送数据。3.2 网络地址分配(Network address assignment)ZigBee使用分布式寻址方案来分配网络地址。这个方案保证在整个网络中所有分配的地址是唯一的。这一点是必须的,因为这样才能保证一个特定的数据包能够发给它指定的设备,而不出现混乱。同时,这个寻址算法本身的分布特性保证设备只能与他的父辈设备通讯来接受一个网络地址。不需要整个网络范围内通讯的地址分配,这有助于网络的可测量性。在每个路由加入网络之前,寻址方案需要知道和配置一些参数。这些参数是MAX_DEPTH,MAX_ROUTERS和MAX_CHILDREN。这些参数是栈配置的一部分,ZigBee2006协议栈已经规定了这些参数的值:MAX_DEPTH = 5,MAX_ROUTERS = 6和MAX_CHILDREN = 20。MAX_DEPTH决定了网络的最大深度。协调器(Coordinator)位于深度0,它的儿子位于深度1,他的儿子的的儿子位于深度2,以此类推。MAX_DEPTH参数限制了网络在物理上的长度。MAX_CHILDREN决定了一个路由(Router)或者一个协调器节点可以处理的儿子节点的最大个数。MAX_ROUTER决定了一个路由(Router)或者一个协调器(Coordinator)节点可以处理的具有路由功能的儿子节点的最大个数。这个参数是MAX_CHILDREN的一个子集,终端节点使用(MAX_CHILDREN – MAX_ROUTER)剩下的地址空间。如果开发人员想改变这些值,则需要完成以下几个步骤:首先,你要保证这些参数新的赋值要合法。即,整个地址空间不能超过216,这就限制了参数能够设置的最大值。可以使用projectsStack ools文件夹下的CSkip.xls文件来确认这些值是否合法。当在表格中输入了这些数据后,如果你的数据不合法的话就会出现错误信息。当选择了合法的数据后,开发人员还要保证不再使用标准的栈配置,取而代之的是网络自定义栈配置(例如:在nwk_globals.h文件中将STACK_PROFILE_ID改为NETWORK_SPECIFIC)。然后nwk_globals.h文件中的MAX_DEPTH参数将被设置为合适的值。此外,还必须设置nwk_globals.c文件中的Cskipchldrn数组和CskipRtrs数组。这些数组的值由MAX_CHILDREN和MAX_ROUTER构成。3.3Z-Stack寻址(Addressing in z-stack)为了向一个在ZigBee网络中的设备发送数据,应用程序通常使用AF_DataRequest()函数。数据包将要发送给一个afAddrType_t(在ZComDef.h中定义)类型的目标设备。typedefstruct{union{uint16shortAddr;}addr;afAddrMode_taddrMode;byteendPoint;}afAddrType_t;注意,除了网路地址之外,还要指定地址模式参数。目的地址模式可以设置为以下几个值:typedefenum{afAddrNotPresent= AddrNotPresent,afAddr16Bit= Addr16Bit,afAddrGroup= AddrGroup,afAddrBroadcast= AddrBroadcast}afAddrMode_t;因为在Zigbee中,数据包可以单点传送(unicast),多点传送(multicast)或者广播传送,所以必须有地址模式参数。一个单点传送数据包只发送给一个设备,多点传送数据包则要传送给一组设备,而广播数据包则要发送给整个网络的所有节点。这个将在下面详细解释。3.3.1 单点传送(Unicast)Uicast是标准寻址模式,它将数据包发送给一个已经知道网络地址的网络设备。将afAddrMode设置为Addr16Bit并且在数据包中携带目标设备地址。3.3.2 间接传送(Indirect)当应用程序不知道数据包的目标设备在哪里的时候使用的模式。将模式设置为AddrNotPresent并且目标地址没有指定。取代它的是从发送设备的栈的绑定表中查找目标设备。这种特点称之为源绑定。当数据向下发送到达栈中,从绑定表中查找并且使用该目标地址。这样,数据包将被处理成为一个标准的单点传送数据包。如果在绑定表中找到多个设备,则向每个设备都发送一个数据包的拷贝。上一个版本的ZigBee(ZigBee04),有一个选项可以讲绑定表保存在协调器(Coordinator)当中。发送设备将数据包发送给协调器,协调器查找它栈中的绑定表,然后将数据发送给最终的目标设备。这个附加的特性叫做协调器绑定(Coordinator Binding)。3.3.3 广播传送(broadcast)当应用程序需要将数据包发送给网络的每一个设备时,使用这种模式。地址模式设置为AddrBroadcast。目标地址可以设置为下面广播地址的一种:NWK_BROADCAST_SHORTADDR_DEVALL(0xFFFF)——数据包将被传送到网络上的所有设备,包括睡眠中的设备。对于睡眠中的设备,数据包将被保留在其父亲节点直到查询到它,或者消息超时(NWK_INDIRECT_MSG_TIMEOUT在f8wConifg.cfg中)。NWK_BROADCAST_SHORTADDR_DEVRXON(0xFFFD)——数据包将被传送到网络上的所有在空闲时打开接收的设备(RXONWHENIDLE),也就是说,除了睡眠中的所有设备。NWK_BROADCAST_SHORTADDR_DEVZCZR(0xFFFC)——数据包发送给所有的路由器,包括协调器。3.3.4 组寻址(Group Addressing)当应用程序需要将数据包发送给网络上的一组设备时,使用该模式。地址模式设置为afAddrGroup并且addr.shortAddr设置为组ID。在使用这个功能呢之前,必须在网络中定义组。(参见Z-stack API文档中的aps_AddGroup()函数)。注意组可以用来关联间接寻址。再绑定表中找到的目标地址可能是是单点传送或者是一个组地址。另外,广播发送可以看做是一个组寻址的特例。下面的代码是一个设备怎样加入到一个ID为1的组当中:aps_Group_tgroup;//Assign yourself to group 1group.ID= 0x0001;group.name[0]= 0; // This could be a human readable stringaps_AddGroup(SAMPLEAPP_ENDPOINT, &group );3.4 重要设备地址(Important Device Adresses)应用程序可能需要知道它的设备地址和父亲地址。使用下面的函数获取设备地址(在ZStack API中定义):lNLME_GetShortAddr()——返回本设备的16位网络地址lNLME_GetExtAddr()—— 返回本设备的64位扩展地址使用下面的函数获取该设备的父亲设备的地址:lNLME_GetCoordShortAddr()——返回本设备的父亲设备的16位网络地址lNLME_GetCoordExtAddr()—— 返回本设备的父亲设备的64位扩展地址

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
2条回答
风萧寒
2019-07-19 19:09

8. 端到端确认(End-to-end acknowledgements)

对于非广播消息,有两种基本的消息重试类型:端到端的确认(APS ACK)和单级确认(single hop acknowledgement)(MACACK)。MAC ACK默认情况下是一直打开的,通常能够充分保证网络的高可靠性。为了提供附加的可靠性,同时使发送设备能够得到数据包已经被发送到目的地的确认,可以使用APS ACK。

APSacknowledgement在APS层完成,是从目标设备到源设备的一个消息确认系统。源设备将保留这个消息知道目标设备发送一个APS ACK消息表明它已经收到了消息。对于每个发出的消息可以通过调用函数AF_DataRequest()的选项来使能/禁止来禁止这个功能。这个选项区域是一个位映射选项,对于将要发送的消息的选项区域或上(OR)AF_ACK_REQUEST就可以使能APS ACK。消息重试(如果APS ACK消息没有收到)的次数和重试之间的时间间隔的配置项在f8wConfig.cfg文件中。APSC_MAX_FRAME_RETRIES是APS层在放弃发送数据之前,没有收到APS ACK确认重新发送消息的次数。APSC_ACK_WAIT_DURATION_POLLED是重新发送之间的时间间隔。

9. 其他(Miscellaneous)

9.1 配置信道(Configuring channel)

每一个设备都必须有一个DEFAULT_CHANLIST来控制信道集合。对于一个ZigBee协调起来说,这个表格用来扫描噪音最小的信道。对于终端节点和路由器几点来说,这个列表用来扫描并加入一个存在的网络。

9.2 配置PAN ID和要加入的网络(Configuring PAN ID andnetwork to join)

这个可选配置项用来控制ZigBee路由器和终端节点要加入那个网络。文件f8wConfg.cfg中的ZDO_CONFIG_PAN_ID参数可以设置为一个0~0x3FFF之间的一个值。协调器使用这个值,作为它要启动的网络的PAN ID。而对于路由器节点和终端节点来说只要加入一个已经用这个参数配置了PAN ID的网络。如果要关闭这个功能,只要将这个参数设置为0xFFFF。

要更进一步控制加入过程,需要修改ZDApp.c文件中的ZDO_NetworkDiscoveryConfirmCB函数。

9.3 最大有效载荷大小(Maximum payload size)

对于一个应用程序最大有效载荷的大小基于几个因素。MAC层提供了一个有效载荷长度常数102。NWK层需要一个固定头大小,一个有安全的大小和一个没有安全的大小。APS层必须有一个可变的基于变量设置的头大小,包括ZigBee协议版本,KVP的使用和APS帧控制设置等等。最后,用户不必根据前面的要素来计算最大有效载荷大小。AF模块提供一个API,允许用户查询栈的最大有效载荷或者最大传送单元(MTU)。用户调用函数afDataReqMTU(见af.h文件),该函数将返回MTU或者最大有效载荷大小。

typedefstruct

{

uint8kvp;

APSDE_DataReqMTU_taps;

}afDataReqMTU_t;

uint8afDataReqMTU( afDataReqMTU_t* fields )

通常afDataReqMTU_t结构只需要设置kvp的值,这个值表明KVP是否被使用。而aps保留。

9.4 离开网络(Leave Network)

ZDO管理器执行函数“ZDO_ProcessMgmtLeaveReq”,这个函数提供对“NLME-LEAVE.request”原语的访问。“NLME-LEAVE.request”原语设备移除它自身或者它的一个儿子设备。ZDO_ProcessMgmtLeaveReq根据提供给它的IEEE地址移除设备。如果设备要移除它自己,它需等待大约5秒钟然后复位。一旦设备复位它将重新回来,并处于空闲模式。它将不在试图连接或者加入网络。如果设备要移除它的儿子设备,它将从本地的群从表(accociation table)中删除该设备。只有在它的儿子设备是个终端节点的情况下,NWK地址才会被重新使用。如果儿子节点是个路由器设备,NWK地址将不再使用。

如果一个儿子节点的父亲节点离开了网络,儿子节点依然存在于网络。

尽管“NLME-LEAVE.request”原语提供了一些可选参数,但是ZigBee2006(TI当前的应用也一样)却限制了这些参数的使用。现在,在ZDO_ProcessMgmtLeaveReq函数中使用的可选参数(“RemoveChildren”、“Rejion”and “Silent”)都应该使用默认值。如果改变这些值,将会发生不可预料的结果。

9.5 描述符(Descriptors)

ZigBee网络中的所有设备都有一个描述符,用来描述设备类型和它的应用。这个信息可以被网络中的其他设备获取。

配置项在文件ZDOConfig.h和ZDOConfig.c中定义和创建。这两个文件还包含节点,电源描述符和默认用户描述符。确认改变这些描述符来定义你的网络。

9.6 非易失性存储项(Non-volatile Memory Items)

9.6.1 网络层非易失性存储器(Network Layer Non-VolatileMemory)

ZigBee设备有许多状态信息需要被存储到非易失性存储空间中,这样能够让设备在意外复位或者断电的情况下复原。否则它将无法重新加入网络或者起到有效作用。

为了启用这个功能,需要包含NV_RESTORE编译选项。注意,在一个真正的ZigBee网络中,这个选项必须始终启用。关闭这个选项的功能也仅仅是在开发阶段使用。

ZDO层负责保存和恢复网络层最重要的信息,包括最基本的网络信息(Network Information Base NIB,管理网络所需要的最基本属性);儿子节点和父亲节点的列表;包含应用程序绑定表。此外,如果使用了安全功能,还要保存类似于帧个数这样信息。

当一个设备复位后重新启动,这类信息恢复到设备当中。如果设备重新启动,这些信息可以使设备重新恢复到网络当中。在ZDAPP_Init中,函数NLME_RestoreFromNV()的调用指示网络层通过保存在NV中的数据重新恢复网络。如果网络所需的NV空间没有建立,这个函数的调用将同时初始化这部分NV空间。

9.6.2 应用的非易失性存储器(Application Non-VolatileMemory)

NV同样可以用来保存应用程序的特定信息,用户描述符就是一个很好的例子。NV中用户描述符ID项是ZDO_NV_USERDESC(在ZComDef.h中定义)。

在ZDApp_Init()函数中,调用函数osal_nv_item_init()来初始化用户描述符所需要的NV空间。如果这个针对这个NV项,这个函数是第一次调用,这个初始化函数将为用户描述符保留空间,并且将它设置为默认值ZDO_DefaultUserDescriptor。

当需要使用保存在NV中的用户描述符时,就像ZDO_ProcessUserDescReq()(在ZDObject.c中)函数一样,调用osal_nv_read()函数从NV中获取用户描述符。

如果要更新NV中的用户描述符,就像ZDO_ProcessUserDescSet()(在ZDObject.c中)函数一样,调用osal_nv_write()函数更新NV中的用户描述符。

记住:NV中的项都是独一无二的。如果用户应用程序要创建自己的NV项,那么必须从应用值范围0x0201~0x0FFF中选择ID。

10. 安全(Security)

10.1 概述(Overview)

ZigBeesecurity is built with the AES block cipher and the CCM mode of operation asthe underlying security primitive。AES/CCM安全算法是ZigBee联盟以外的研究人员发明的,并且广泛应用于其他通讯协议之中。

ZigBee提供如下的安全特性:

l 构造安全 (Infrastructure security)

l 网络访问控制(Network access control)

l 应用数据安全

10.2 配置(Configuration)

为了拥有一个安全的网络,首先所有的设备镜像的创建,必须将预处理标志位SECURE都置为1。在文件“f8wConfig.cfg”文件中可以找到。

接下来,必须选择一个默认的密码。这个可以通过“f8wConfig.cfg”文件中的DEFAULT_KEY来设置。理论上,这个值设置为一个随机的128位数据。

这个默认的密码可以预先配置到网络上的每个设备或者只配置到协调器上,然后分发给假如网络的所有设备。这个可以通过文件“nwk_globals.c”文件的gPreConfigKeys选项来配置。如果这个值为真,那么默认的密码将被预先配置到每一个网络设备上。如果这个值为假,那么默认的密码只需配置到协调器设备当中。注意,在以后的场合,这个密码将被分发到每一个加入网络当中的设备。因此,加入网络期间成为“瞬间的弱点”,竞争对手可以通过侦听获取密码,从而降低了网络的安全性能。

10.3 网络访问控制(Network access control)

在一个安全的网络中,当一个设备加入网络时会被告知一个信任中心(协调器)。协调器拥有允许设备保留在网络或者拒绝网络访问这个设备的选择权。

信任中心可以通过任何逻辑方法决定一个设备是否允许进入这个网络中。其中一种就是信任中心只允许一个设备在很短的窗口时间加入网络。这个时可能的,举例说明,如果一个信任中心设备有一个“push”按键。当按键按下,在这个很短的时间窗口中,它允许任何设备加入网络。否则所有的加入请求都将被拒绝。以他们的IEEE地址为基础,一个秒级的时间段将被配置在信任中心用来接收或者拒绝设备。

这种类型的策略可以通过修改ZDSeeMgr.c模块中的ZDSecMgrDeviceValidate()函数来实现。

10.4 更新密码(Key Updates)

信任中心可以根据自己的判断更新通用网络密码。应用程序开发人员修改网络密码更新策略。默认信任中心执行能够用来符合开发人员的指定策略。一个样例策略将按照一定的间隔周期更新网络密码。另外一种将根据用户输入来更新网络密码。ZDO安全管理器(ZDSecMgr.c)API通过 “ZDSecMgrUpdateNwkKey”和“ZDSecMgrSwitchNwkKey”提供必要的功能。“ZDSecMgrUpdateNwkKey”允许信任中心向网络中的所有设备广播新的网络密码,此时,新的网络密码将被作为替代密码保存在所有网络设备中。一旦信任中心调用“ZDSecMgrSwitchNwkKey”,一个全网范围的广播将触发所有的网络设备使用替代密码。

10.5 快速参考(Quick Reference)

使能安全(Enabling Security)SECURE = 1(f8wConfig.cfg)使能预配置网络密码(Enabling Preconfig Network Key)gPreConfigKeys = TRUE(nwk_globals.c)设置预配置网络密码(Setting Preconfig Network Key)设置defautlKey = {KEY}(ZDSecMgr.c)使能/禁止信任中心的加入许可功能(Enabling/Disabling joining permission on the Trust Center)调用函数ZDSecMgrPermitJoining()(ZDSecMgr.c)加入期间特定设备批准(Specific device validation during joining)修改ZDSecMgrDeviceValidate(ZDSecMgr.c)网络密码更新(Network key updates)调用ZDSecMgrUpdateNwkKey()和ZDSecMgrSwitchNwkKEy()函数(ZDSecMgr.c)

一周热门 更多>