打印
[应用相关]

zigbee学习重点资料的摘录(转)

[复制链接]
1372|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
renzheshengui|  楼主 | 2018-10-10 13:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
开始学习ZIGBEE了,使用博客记录一下自己的学习过程!因为通过从网上看的一些资料加自己的做的一些项目的训练。所以这里总结的知识点是我认为比较重要的一些知识点。

   知识点:频带通道、设备类型、Zigbee协议规范号、拓扑结构、信标与非信标模式、地址的定义(64位与16位)、寻址(发送数据用)、重要地址获取、ZigBee术语、绑定操作。
   选择一个PANID和频道组建网络。ZDAPP_CONFIG_PAN_ID是PANID号,DEFAULT_CHANLIST是默认的频道列表。这两个参数好像是封装起来的它们都在f8wConfig.cfg文件中进行了配置。

频带通道
在2450MHz频带内定义了16个通道;在915MHz频带内定义了10个通道;在868MHz频带内定义了1个通道。
程序中定义声明为:
#defineMAX_CHANNELS_868MHZ     0x00000001
#defineMAX_CHANNELS_915MHZ     0x000007FE
#if !defined (MAX_CHANNELS_24GHZ )
  #define MAX_CHANNELS_24GHZ    0x07FFF800
#endif
程序的定义,不同的通道用不同的bit来定义,868MHz的通道用bit0定义,915MHz的通道用bit1-bit10来定义,2.4GHz的通道用bit11-bit26来定义。
---------------------作者:a827415225 来源:CSDN 原文:https://blog.csdn.net/a827415225/article/details/51771879?utm_source=copy 版权声明:本文为博主原创**,转载请附上博文链接!
沙发
renzheshengui|  楼主 | 2018-10-10 13:08 | 只看该作者
ZIGBEE简介
   ZigBee协议栈建立在IEEE802.154的PHY层和MAC子层规范之上。它实现了网络层(networklayer,NWK)和应用层(applicationlayer,APL)。在应用层内提供了应用支持子层(applicationsupportsub—layer,APS)和ZigBee设备对象(ZigBeeDeviceObject,ZDO)。应用框架中则加入了用户自定义的应用对象
   ZigBee的体系结构由称为层的各模块组成。每一层为其上层提供特定的服务:即由数据服务实体提供数据传输服务;管理实体提供所有的其他管理服务。每个服务实体通过相应的服务接入点(SAP)为其上层提供一个接口,每个服务接入点通过服务原语来完成所对应的功能。
   ZigBee协议栈的核心部分在网络层。网络层主要实现节点加入或离开网络、接收或抛弃其他节点、路由查找及传送数据等功能。
   应用层(APL)ZigBee应用层框架包括应用支持层(APS)、ZigBee设备对象(ZDO)和制造商所
   应用支持层的功能包括:维持绑定表、在绑定的设备之间传送消息。ZigBee设备对象的功能包括:定义设备在网络中的角色(如ZigBee协调器和终端设备),发起和响应绑定请求,在网络设备之间建立安全机制。ZigBee设备对象还负责发现网络中的设备,并且决定向他们提供何种应用服务。ZigBee应用层除了提供一些必要函数以及为网络层提供合适的服务接口外,一个重要的功能是应用者可在这层定义自己的应用对象

使用特权

评论回复
板凳
renzheshengui|  楼主 | 2018-10-10 13:09 | 只看该作者
设备类型
   在ZigBee网络中存在三种逻辑设备类型:Coordinator(协调器),Router(路由器)和End-Device(终端设备)。ZigBee网络由一个Coordinator以及多个Router和多个End_Device组成
   协调器负责启动整个网络。它也是网络的第一个设备。协调器选择一个信道和一个网络ID(也称之为PANID,即PersonalAreaNetworkID),随后启动整个网络。协调器也可以用来协助建立网络中安全层和应用层的绑定(bindings)。协调器的角色主要涉及网络的启动和配臵。一旦这些都完成后,协调器的工作就像一个路由器(或者消失goaway)。由于ZigBee网络本身的分布特性,因此接下来整个网络的操作就不在依赖协调器是否存在,因为ZigBee是分布式网络。
   路由器的功能主要是:允许其他设备加入网络,多跳路由和协助它自己的由电池供电的终端设备的通讯。 通常,路由器希望是一直处于活动状态,因此它必须使用主电源供电。但是当使用树状网 络拓扑结构时,允许路由间隔一定的周期操作一次,这样就可以使用电池给其供电。
  终端设备没有特定的维持网络结构的责任,它可以睡眠或者唤醒,因此它可以可以是一个电池供电设备。通常,终端设备对存储空间(特别是 RAM 的需要)比较小。

使用特权

评论回复
地板
renzheshengui|  楼主 | 2018-10-10 13:09 | 只看该作者
ZigBee协议规范号
   ZigBee联盟为ZigBee协议栈2007定义了2个规范:ZigBee和ZigBeePRO。所有的设备只要遵循该规范,即使在不同厂商买的不同设备同样可以形成网络(同一个网络中所有设备的协议栈规范必须一致)。如果应用开发者改变了规范,那么他的产品将不能与遵循ZigBee联盟定义规范的产品组成网络,也就是说该开发者开发的产品具有特殊性,我们称之为“关闭的网络”,也就是说它的设备只有在自己的产品中使用,不能与其他产品通信。更改后的规范可以称之为“特定网络”规范。
   协议栈规范的ID号可以通过查询设备发送的beacon帧获得。在设备加入网络之前,首先需要确认协议栈规范的ID。“特定网络”规范ID号为0;ZigBee协议栈规范的ID号为1;ZigBeePRO协议栈规范的ID号为2。
协议栈规范的ID(STACK_PROFILE_ID)在nwk_globals.h定义:
   #define NETWORK_SPECIFIC0
   #define HOME_CONTROLS1
   #define ZIGBEEPRO_PROFILE2
   #define GENERIC_STAR3
   #define GENERIC_TREE4
   #ifdefined (ZIGBEEPRO)
   #define STACK_PROFILE_IDZIGBEEPRO_PROFILE
   #else
   #define STACK_PROFILE_IDHOME_CONTROLS
   #endif
   所以说一般情况是如果定义了ZIGBEEPRO则使用的规范为ZigBeePRO,否则使用ZigBee。如果我们想使用自己的网络,即特定网络,则可把上面的STACK_PROFILE_ID直接定义为NETWORK_SPECIFIC

使用特权

评论回复
5
renzheshengui|  楼主 | 2018-10-10 13:09 | 只看该作者
拓扑结构
   ZigBee网络支持星状、树状和网状三种网络拓扑结构,它们的介绍(优缺点)分别为
   星状网络(star)由一个PAN协调器和多个终端设备组成,只存在PAN协调器与终端的通讯,终端设备间的通讯都需通过PAN协调器的转发。
   树状网络(tree)由一个协调器和一个或多个星状结构连接而成,设备除了能与自己的父节点或子节点进行点对点直接通讯外,其他只能通过树状路由完成消息传输。
   网状网络(mesh)是树状网络基础上实现的,与树状网络不同的是,它允许网络中所有具有路由功能的节点直接互连,由路由器中的路由表实现消息的网状路由。该拓扑的优点是减少了消息延时,增强了可靠性,缺点是需要更多的存储空间开销
关于网络结构的定义同样在nwk_globals.h中定义。默认的是是选择网状结构

使用特权

评论回复
6
renzheshengui|  楼主 | 2018-10-10 13:10 | 只看该作者
信标与非信标模式
   ZigBee网络的工作模式可以分为信标(Beacon)和非信标(Non-beacon)两种模式。信标模式实现了网络中所有设备的同步工作和同步休眠,以达到最大限度的功耗节省,而非信标模式则只允许终端设备进行周期性休眠,协调器和所有路由器设备必须长期处于工作状态
   信标模式下,协调器负责以一定的间隔时间(一般在15ms-4mins之间)向网络广播信标帧,两个信标帧发送间隔之间有16个相同的时槽,这些时槽分为网络休眠区和网络活动区两个部分,消息只能在网络活动区的各时槽内发送。
   非信标模式下,ZigBee标准采用父节点为终端设备子节点缓存数据,终端设备主动向其父节点提取数据的机制,实现终端设备的周期性(周期可设臵)休眠。网络中所有父节点需为自己的终端设备子节点缓存数据帧,所有终端设备子节点的大多数时间都处于休眠模式,周期性的醒来与父节点握手以确认自己仍处于网络中,其从休眠模式转入数据传输模式一般只需要15ms。所有节点竞争同一信道,使用CSMA/CA的信道接入技术,(就是节点在发送数据之前先监听信道,如果信道空闲则可以发送数据,否则就要进行随机的退避,即延迟一段随机时间,然后再进行监听,)信标与非信标是信标接入模式。TI的Zstack协议栈采用的就是非信标模式。(网上是这么说的我也不知道在哪里定义的,稍后我去翻一翻源代码看一下)
   信道接入方式采用免冲突载波检测多址接入(CSMA-CA)机制;(这个不多说自己去查一下)

使用特权

评论回复
7
renzheshengui|  楼主 | 2018-10-10 13:10 | 只看该作者
地址(16与64位地址)

   ZigBee设备有两种类型的地址。一种是64位IEEE地址,即MAC地址,另一种是16位网络地址。
   64位地址使全球唯一的地址,设备将在它的生命周期中一直拥有它。它通常由制造商或者被安装时设臵。这些地址由IEEE来维护和分配。
   16位网络地址是当设备加入网络后分配的。它在网络中是唯一的,用来在网络中鉴别设备和发送数据。其中,协调器的网络地址为0x0000.(所以16位地址是可变的)
网络地址的分配:
   对于ZigBee2006和ZigBee2007使用分布式寻址方案来分配网络地址。这个寻址算法本身的分布特性保证设备只能与他的父辈设备通讯来接受一个网络地址。不需要整个网络范围内通讯的地址分配,这有助于网络的可 测量性。
   ZigBee2007 PRO使用的随机地址分配机制,对新加入的节点使用随机地址分配,为保证网络内地址分配不重复,使用其余的随机地址再进行分配。当一个节点加入时,将接收到父节点的随机分配地址,然后产生“设备声明”(包含分配到的网络地址和 IEEE 地址)发送至网络中的其余节点。如果另一个节点有着同样的网络地址,则通过路由器广播“网络状态-地址 冲突”至网络中的所有节点。所有发生网络地址冲突的节点更改自己的网络地址,然后再发起 “设备声明”检测新的网络地址是否冲突。
   终端设备不会广播“地址冲突”,他们的父节点会帮助完成。如果一个终端设备发生了“地 址冲突”,他们的父节点发送“重新加入”消息至终端设备,并要求他们更改网络地址。然后,终端设备再发起“设备声明”检测新的网络地址是否冲突。 当接收到“设备声明”后,关联表和绑定表将被更新使用新的网咯地址,但是路由表不会 被更新。
   在每个路由加入网络之前,寻址方案需要知道和配臵一些参数。这些参数是MAX_DEPTH(最大网络深度)、MAX_ROUTERS(最多路由数)和MAX_CHILDREN(最多子节点数)。这些参数是栈配臵的一部分,它同样在nwk_globals.h中定义。
MAX_DEPTH决定了网络的最大深度。协调器(Coordinator)位于深度0,它的儿子位于深度1,他的儿子的的儿子位于深度2,以此类推。
MAX_DEPTH参数限制了网络在物理上的长度。MAX_CHILDREN决定了一个路由(Router)或者一个协调器节点可以处理的儿子节点的最大个数。
MAX_ROUTER决定了一个路由(Router)或者一个协调器(Coordinator)节点可以处理的具有路由功能的儿子节点的最大个数。这个参数是MAX_CHILDREN的一个子集,终端节点使用
   如果开发人员想改变这些值,则需要完成以下几个步骤:首先,你要保证这些参数新的赋值要合法。即,整个地址空间不能超过216,这就限制了参数能够设臵的最大值。可以使用projects\ZStack\tools文件夹下的CSkip.xls文件来确认这些值是否合法。当在表格中输入了这些数据后,如果你的数据不合法的话就会出现错误信息。当选择了合法的数据后,开发人员还要保证不再使用标准的栈配臵,取而代之的是网络自定义栈配臵(例如:在nwk_globals.h文件中将STACK_PROFILE_ID改为NETWORK_SPECIFIC)。然后nwk_globals.h文件中的MAX_DEPTH参数将被设臵为合适的值。
此外,还必须设臵nwk_globals.c文件中的Cskipchldrn数组和CskipRtrs数组。这些数组的值由MAX_CHILDREN和MAX_ROUTER构成。
#if(STACK_PROFILE_ID==ZIGBEEPRO_PROFILE)
uint8CskipRtrs[1]={0};
uint8CskipChldrn[1]={0};
#elif(STACK_PROFILE_ID==HOME_CONTROLS)
uint8CskipRtrs[MAX_NODE_DEPTH+1]={6,6,6,6,6,0};
uint8CskipChldrn[MAX_NODE_DEPTH+1]={20,20,20,20,20,0};
#elif(STACK_PROFILE_ID==GENERIC_STAR)
uint8CskipRtrs[MAX_NODE_DEPTH+1]={5,5,5,5,5,0};
uint8CskipChldrn[MAX_NODE_DEPTH+1]={5,5,5,5,5,0};
#elif(STACK_PROFILE_ID==NETWORK_SPECIFIC)
uint8CskipRtrs[MAX_NODE_DEPTH+1]={5,5,5,5,5,0};
uint8CskipChldrn[MAX_NODE_DEPTH+1]={5,5,5,5,5,0};
#endif//STACK_PROFILE_ID
数组中最后一个数是0,因为在最深的地方,它已经没有子节点或路由了。

使用特权

评论回复
8
renzheshengui|  楼主 | 2018-10-10 13:10 | 只看该作者
寻址发数据

ZigBee向网络中的设备发送数据,应用程序通常使用AF_DataRequest()函数。
AF_DataRequest(afAddrType_t*dstAddr,//全ZB目的地址,包含NWK地址与ENDPoint
endPointDesc_t*srcEP,//端点描述符
uint16cID,//簇ID
uint16len,//要发送数据的长度
uint8*buf,//要发送的数据(地址)
uint8*transID,//传输序列号
uint8options,//发送选项的有效标志位
uint8radius);//一般设置为AF_DEFAULT_RADIUS
我们主要看一下第一个参数。NWK地址(这里指的是16位的地址)ENDPoint(这是那个20)
typedefstruct
{
union
{
uint16shortAddr;
ZLongAddr_textAddr;
}addr;
afAddrMode_taddrMode;
byteendPoint;
uint16panId;//usedfortheINTER_PANfeature
}afAddrType_t;
其中包括16或64为地址,网络地址。
地址模式参数
typedefenum
{
afAddrNotPresent=AddrNotPresent,
afAddr16Bit=Addr16Bit,
afAddr64Bit=Addr64Bit,
afAddrGroup=AddrGroup,
afAddrBroadcast=AddrBroadcast
}afAddrMode_t;
它主要用来表征是单点传送(unicast),多点传送(multicast)还是广播传送
   单点传送(Unicast)Uicast是标准寻址模式,它将数据包发送给一个已经知道网络地址的网络设备。将afAddrMode设臵为Addr16Bit并且在数据包中携带目标设备地址。
   间接传送(Indirect)当应用程序不知道数据包的目标设备在哪里的时候使用的模式。将模式设臵为AddrNotPresent并且目标地址没有指定。取代它的是从发送设备的栈的绑定表中查找目标设备。这种特点称之为源绑定。(这种方式一般用于绑定的情况下)当数据向下发送到达栈中,从绑定表中查找并且使用该目标地址。这样,数据包将被处理成为一个标准的单点传送数据包。如果在绑定表中找到多个设备,则向每个设备都发送一个数据包的拷贝。上一个版本的ZigBee(ZigBee2004),有一个选项可以讲绑定表保存在协调器(Coordinator)当中。发送设备将数据包发送给协调器,协调器查找它栈中的绑定表,然后将数据发送给最终的目标设备。这个附加的特性叫做协调器绑定(CoordinatorBinding)。

   广播传送(broadcast)当应用程序需要将数据包发送给网络的每一个设备时,使用这种模式。地址模式设臵为AddrBroadcast。目标地址可以设臵为下面广播地址的一种:
NWK_BROADCAST_SHORTADDR_DEVALL(0xFFFF)——数据包将被传送到网络上的所有设备,包括睡眠中的设备。对于睡眠中的设备,数据包将被保留在其父亲节点直到查询到它,或者消息超时(NWK_INDIRECT_MSG_TIMEOUT在f8wConifg.cfg中)。
NWK_BROADCAST_SHORTADDR_DEVRXON(0xFFFD)——数据包将被传送到网络上的所有在空闲时打开接收的设备(RXONWHENIDLE),也就是说,除了睡眠中的所有设备。
NWK_BROADCAST_SHORTADDR_DEVZCZR(0xFFFC)——数据包发送给所有的路由器,包括协调器。
组寻址(GroupAddressing)当应用程序需要将数据包发送给网络上的一组设备时,使用该模式。地址模式设臵为afAddrGroup并且addr.shortAddr设臵为组ID。
aps_Group_tgroup;
group.ID=0x0001;
group.name[0]=0;//Thiscouldbeahumanreadablestring,比如说“Group1”
aps_AddGroup(SAMPLEAPP_ENDPOINT,&group);
其中的aps_Group_t中只包含ID与name两个参数

使用特权

评论回复
9
renzheshengui|  楼主 | 2018-10-10 13:11 | 只看该作者
获取重要地址

NLME_GetShortAddr()——返回本设备的16位网络地址
NLME_GetExtAddr()——返回本设备的64位扩展地址
NLME_GetCoordShortAddr()——返回本设备的父亲设备的16位网络地址NLME_GetCoordExtAddr()——返回本设备的父亲设备的64位扩展地址
NLME_IsAddressBroadcast()此函数根据设备能力来评估提供的地址是否是一个有效的广播地址。
NLME_SetBroadCastFilter()此函数根据设备能力设置掩码,用于处理有效的广播地址

使用特权

评论回复
10
renzheshengui|  楼主 | 2018-10-10 13:12 | 只看该作者
Zigbee的术语


重点弄懂它们的从属关系,主要包括:节点,设备,端点,簇(群集),属性。
属性Attribute是一个反映物理数量或状态的数据值,比如开关值(On/Off),温度值、百分比等。
群集Cluster是包含一个或多个属性(attribute)的群组。简单的说,群集就是属性的集合。每个群集都被分配一个唯一的群集ID且每个群集最多有65536个属性。设备描述DeviceDescription是指一个大型目标应用的一部分,包括一个或多个群集,并且指定群集是输入还是输出。描述符有:节点描述符、电源描述符、简单描述符、端点描述符。
端点EndPoint是协议栈应用层的入口,也可以理解应用对象(ApplicationObject)存在的地方,它是为实现一个设备描述而定义的一组群集。(程序中的20吧)每个ZigBee设备可以最多支持240这样的端点,这也意味着在每个设备上可以定义240个应用对象。端点0被保留用于与ZDO接口,这是每个ZigBee设备必须使用的端点,而端点255被保留用于广播,端点241-254则被保留用于将来做扩展使用。
设备设备描述 Device Description 是指一个大型目标应用的一部分,包括一个或多个群集,并且指定群集是输入还是输出。描述符有:节点描述符、电源描述符、简单描述符、端点描述符。
节点 Node 也可以理解为一个容器,包含一组 ZigBee 设备,分享一个无线信道。每个节点有且只有一个无线信道使用。

使用特权

评论回复
11
renzheshengui|  楼主 | 2018-10-10 13:12 | 只看该作者
绑定问题

在zigaee协议中定义了一种特殊的操作,叫做绑定(binding)操作。它能够通过使用ClusterID为不同节点上的独立端点建立一个逻辑上的连接。
要实现绑定操作,端点必须向协调器发送绑定请求,协调器在有限的时间间隔内接收到两个端点的绑定请求后,便通过建立端点之间的绑定表在这两个不同的端点之间形成了一个逻辑链路。因此,在绑定后的两个端点之间进行消息传送的过程属于消息的间接传送。其中一个端点首先会将信息发送到ZigBee协调器中,ZigBee协调器在接收到消息后会通过查找绑定表,将消息发送到与这个端点相绑定的所有端点中,从而实现了绑定端点之间的通信。

使用特权

评论回复
12
renzheshengui|  楼主 | 2018-10-10 13:13 | 只看该作者
路由协议(RoutingProtocol)

        当路由器从他自身的应用程序或者别的设备那里收到一个单点发送的数据包,则网络层(NWKLayer)根据一下程序将它继续传递下去。如果目标节点是它相邻路由器中的一个,则数据包直接被传送给目标设备。否则,路由器将要检索它的路由表中与所要传送的数据包的目标地址相符合的记录。如果存在与目标地址相符合的活动路由记录,则数据包将被发送到存储在记录中的下一级地址中去。如果没有发现任何相关的路由记录,则路由器发起路径寻找,数据包存储在缓冲区中知道路径寻找结束。
ZigBee终端节点不执行任何路由功能。终端节点要向任何一个设备传送数据包,它只需简单的将数据向上发送给它的父亲设备,由它的父亲设备以它自己的名义执行路由。同样的,任何一个设备要给终端节点发送数据,发起路由寻找,终端节的的父亲节点都已它的名义来回应
注意ZigBee地址分配方案使得对于任何一个目标设备,根据它的地址都可以得到一条路径。在Z-Stack中,如果万一正常的路径寻找过程不能启动的话(通常由于缺少路由表空间),那么Z-Stack拥有自动回退机制
在Z-Stack中,执行的路由已经优化了路由表记录。通常,每一个目标设备都需要一条路由表记录。但是,通过把一定父亲节点记录与其子所有子结点的记录合并,这样既可以优化路径也可以不丧失任何功能

使用特权

评论回复
13
renzheshengui|  楼主 | 2018-10-10 13:13 | 只看该作者
路径发现与选择
路径发现是网络设备凭借网络相互协作发现和建立路径的一个过程。路由发现可以由任意一个路由设备发起,并且对于某个特定的目标设备一直执行。路径发现机制寻找源地址和目标地址之间的所有路径,并且试图选择可能的最好的路径
路径选择就是选择出可能的最小成本的路径。每一个结点通常持有跟它所有邻接点的“连接成本(linkcosts)”。通常,连接成本的典型函数是接收到的信号的强度。沿着路径,求出所有连接的连接成本总和,便可以得到整个路径的“路径成本”。路由算法试图寻找到拥有最小路径成本的路径
路径通过一系列的请求和回复数据包被发现。源设备通过向它的所有邻接节点广播一个路由请求数据包,来请求一个目标地址的路径。当一个节点接收到RREQ数据包,它依次转发RREQ数据包。但是在转发之前,它要加上最新的连接成本,然后更新RREQ数据包中的成本值。这样,沿着所有它通过的连接,RREQ数据包携带着连接成本的总和。这个过程一直持续到RREQ数据包到达目标设备。通过不同的路由器,许多RREQ副本都将到达目标设备。目标设备选择最好的RREQ数据包,然后发回一个路径答复数据包(aRouteReply)RREP给源设备。RREP数据包是一个单点发送数据包,它沿着中间节点的相反路径传送直到它到达原来发送请求的节点为止
一旦一条路径被创建,数据包就可以发送了。当一个结点与它的下一级相邻节点失去了连接(当它发送数据时,没有收到MACACK),该节点向所有等待接收它的RREQ数据包的节点发送一个RERR数据包,将它的路径设为无效。各个结点根据收到的数据包RREQ、RREP或者RERR来更新它的路由表
路径维护

中间节点沿着连接跟踪传送失败,如果一个连接被认定是坏链,那么上游节点将针对所有使用这条连接的路径启动路径修复。节点发起重新发现直到下一次数据包到达该节点,标志路径修复完成。如果不能够启动路径发现或者由于某种原因失败了,节点则向数据包的源节点发送一个路径错误包(RERR),它将负责启动新路径的发现。这两种方法,路径都自动重建。
路径期满

路由表为已经建立连接路径的节点维护路径记录。如果在一定的时间周期内,没有数据通过沿着这条路径发送,这条路径将被表示为期满。期满的路径一直保留到它所占用的空间要被使用为止。设臵ROUTE_EXPIRY_TIME为期满时间,单位为秒。如果设臵为0,则表示关闭自动期满功能。

使用特权

评论回复
14
renzheshengui|  楼主 | 2018-10-10 13:13 | 只看该作者
Z-Stack协议栈总体设计
Z-Stack由main()函数开始执行,main()函数共做了2件事:一是系统初始化,另外一件是开始执行轮转查询式操作系统,
任务初始化osalInitTasks(void)中的任务需要与声明的任务列表pTaskEventHandlerFn  tasksArr[]中的顺序一致。

设置事件发生标志。我知道的有两种方式。
1、osal_set_event(uint8task_id,uint16event_flag)
2、osal_start_timerEx(uint8taskID,uint16event_id,uint16timeout_value)
第一种方法直接设置标志flag置位,第二种方式则等待timeout_value时间然后再设置置位。

使用特权

评论回复
15
renzheshengui|  楼主 | 2018-10-10 13:14 | 只看该作者
ZigBee2007协议栈中使用的各个层次:

设备对象层,即ZDO(ZigBeeDeviceObject)层,提供了管理一个ZigBee节点所要使用的功能函数。ZDOAPI为协调器、路由器和终端设备提供了应用端点的管理函数,其中包括:建立、发现和加入一个ZigBee网络,绑定应用端点和安全管理。
应用框架层,即AF(ApplicationFramework),提供了针对协议栈的应用端点(EndPoint1~240)和设备对象端点(EndPoint0)接口,其中主要包含:设备描述数据结构和数据收、发函数。在ZigBee应用中,提供2种标准服务类型:键值对(KVP)或报文(MSG)
应用支持子层,即APS(ApplicationSupportSublayer),为设备对象和应用实体提供了一系列的支持服务
网络层,即NWK(ZigBeenetwork),为上层提供了管理服务和数据服务。
介质访问层,即ZMAC,在802.15.4MAC与网络层之间提供接口
运行 在 ZigBee 协 议 栈上 的 应用 程 序实 际上 就 是厂 商 自定 义的 应 用对 象 ,并 且 遵循 规 范(profile)运 行 在端 点 1~ 240 上 。在 ZigBee 应 用中 , 提供 2 种 标 准服 务类 型 :键 值 对(KVP) 或 报文 ( MSG)

应用函数接口
ZDO
设备网络启动
设备和服务发现
终端设备绑定、绑定和取消绑定服务
网络管理服务

设备网络启动
ZDApp_Init()—>ZDOInitDevice()
但是如果定义了HOLD_AUTO_START,则不进行设备网络启动,等待按键控制启动

使用特权

评论回复
16
renzheshengui|  楼主 | 2018-10-10 13:14 | 只看该作者
启动过程的要点

无论是协调器还是路由器或是终端设备,其启动过程至网络初始步骤均是一样的,只是不同设备的配置文件在编译时有所区别:
协调器:F8wCoord.cfg
-DZDO_COORDINATOR      // Coordinator Functions
-DRTR_NWK                          // Router Functions

路由器:F8wRouter.cfg
/*RouterSettings*/
-DRTR_NWK//RouterFunctions

终端设备:F8wEndev.cfg


对于协调器,在 Workspace 区域的下拉菜单中选择 CoordinatorEB-Pro,鼠标点击上方的“ make 按钮”后,所有文件对应的红色“ *”将消失,此时配置文件 f8wCoord.cfg 将被使用, 而 f8wEndev.cfg 和 f8wRouter.cfg 不会使用。对于路由和终端也是同样的配置,唯一不同是,路由情况下f8wRouter.cfg,其它两个不使用;终端情况下f8wEndev.cfg,其它两个不使用。
IAR中编译选项,
要为协调器工程选项添加一条编译选项则操作方法是,打开 SampleApp 工 程 后 ,选 中 工 程 名SampleApp-CoordinatorEB,然后根据工程选项设置的路径:Project->Options->C/C++ Compiler->Preprocessor->Defined 。如下图所示。只需在 Defined symbols 框内添加一条新选项即可;要取 消编译选项,只需在该编译选项的左侧添加“ x”即可。
对于路由和终端位置相同,只不过以开始分别要workspace下面选RouterEB和EnddeviceEB以切换不同的工程(里面没有定义ZIGBEEPRO,说明我们的程序使用的是ZIGBEEPRO 2007)
所以说关于程序编译的宏定义是两个地方综合的结果,一个是IAR选项设置,另外一个是.cfg配置文件中的介绍。

针对不同配置文件有
在F8wCoord.cfg中定义了ZDO_COORDINATOR和RTR_NWK
在F8wRouter.cfg中定义了RTR_NWK
在F8wEndev.cfg中没有做定义。

根据以上配置的定义,在ZGlobals.h中确定了设备的类型
#if!defined ( ZSTACK_DEVICE_BUILD )
  #if defined ( ZDO_COORDINATOR )
    #define ZSTACK_DEVICE_BUILD  (DEVICE_BUILD_COORDINATOR)
  #elif defined ( RTR_NWK )
    #define ZSTACK_DEVICE_BUILD  (DEVICE_BUILD_ROUTER)
  #else
    #define ZSTACK_DEVICE_BUILD  (DEVICE_BUILD_ENDDEVICE)
  #endif
#endif

使用特权

评论回复
17
renzheshengui|  楼主 | 2018-10-10 13:15 | 只看该作者
ZDO 任务事件处理函数

这一张表介绍的比较全,建立网络过程中用到的各种各样的函数




ZigBee 网络支持单播、组播和广播数据包。在实现组播通信时,需要将通信的端点加入到 工作组中。:
grp = aps_FindGroup( SAMPLEAPP_ENDPOINT, SAMPLEAPP_FLASH_GROUP); 如果同在一个工作组内,将该端点从工作组中删除:
aps_RemoveGroup( SAMPLEAPP_ENDPOINT, SAMPLEAPP_FLASH_GROUP ); 如果不在该工作组内,则将该端点加入到工作组中:
aps_AddGroup( SAMPLEAPP_ENDPOINT, &SampleApp_Group );

Zigbee终端是不是使用路由,要根据路径的优化来确定,它会选择最优的路径进行数据的传输。

MicroWait (n);微秒级延时

使用特权

评论回复
18
renzheshengui|  楼主 | 2018-10-10 13:15 | 只看该作者
关于Zigbee的安全与加密

Zigbee规范定义了信任中心的用途,信任中心是在网络分配安全钥匙的一种令人信任的设备。Zigbee提供了一套基于128为AES算法的安全类和软件,并集成802.15.4的安全元素。Zigbee协议栈类为MAC、网络和应用层定义了安全性。它的安全服务包括针对关键进程建立和传输、设备管理和框架保护的方法。
安全方案有一组在MAC层的帧上所执行的操作完成,以提供安全服务,安全方案的名称表明对称加密算法、模式和完整性码的长度。

CC2530硬件支持128bit的AES加密算法
如何开启Z-stack中的加密算法。
1、 将f8wConfig.cfg文件中的-DSECURE=1,设置为1,这个变量在协议栈中作为if语句的条件使用,条件为真语句就是开启加密算法的函数。
2、 将ZGlobals.c中的uint8 zgPreConfigKeys= FLASE修改为uint8 zgPreConfigKeys = TRUE
3、 准备一个key,这个可以在函数nwk_global.c中修改,具体是以下数组
CONST byte defaultKey[SEC_KEY_LEN] =
{
#if defined ( APP_TP ) || defined ( APP_TP2 )
  // Key for ZigBeeConformance Testing
  0xbb, 0xbb, 0xbb, 0xbb,0xbb, 0xbb, 0xbb, 0xbb,
  0xaa, 0xaa, 0xaa, 0xaa,0xaa, 0xaa, 0xaa, 0xaa
#else
  // Key for In-HouseTesting
  0x08, 0x01, 0x02, 0x03,0x04, 0x05, 0x06, 0x07,
  0x08, 0x09, 0x0A, 0x0B,0x0C, 0x0D, 0x0E, 0x0F
#endif
};

如果使用了加密算法后,网络中所有设备都需要开启这个算法,且各个设备中的key必须相同。
加密算法开启以后,如果你需要修改代码,就必须改变你的key,或者是擦除一次你的flash。

OSAL维护了一个消息队列,每个消息都会被放到这个消息队列中去,当任何接收到事件后,可以从消息队列中获取属于自己的消息,然后调用消息处理函数进行相应处理即可。

每个消息都包含一个消息头osal_msg_hdr_t和用户自定义的消息,osal_msg_hdr_t结构体的定义为:
typedef struct

    void     *next;
    uint16   len;
   uint8    dest_id;
}osal_msg_hdr_t;

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

78

主题

4079

帖子

2

粉丝