Zigbee建网和入网过程实验.docx
《Zigbee建网和入网过程实验.docx》由会员分享,可在线阅读,更多相关《Zigbee建网和入网过程实验.docx(15页珍藏版)》请在冰豆网上搜索。
Zigbee建网和入网过程实验
6.2Zigbee建网和入网过程实验
本实验通过SampleApp这个例子实现数据在ZigBee网络中的简单传输。
要求掌握网络组建及协议分析仪的使用方法。
6.2.1实验目的与器材
1)实验目的
◆熟悉zigbee协议的三种设备建网时所担任的角色;
◆学习Z-Stack2007/PRO协议栈中协调器如何建立网络;
◆学习Z-Stack2007/PRO协议栈中路由和终端如何加入网络;
◆学习TI官方提供的抓包工具(Sniffer)的应用及协议分析。
2)实验器材
◆3个CC2530开发套件(1个协调器模块,2个路由器模块);
6.2.2实验原理与步骤
1)硬件介绍
CC2530开发套件如实验一中的硬件介绍,这里就不再陈述。
2)实验原理
1设备的分类
ZigBee网络只支持两种设备:
1)全功能设备(FFDFullFunctionDevice)
2)精简功能设备(也叫半功能设备ReducedFunctionDevice)
两者的比较:
其中FFD设备能够提供MAC层的所有服务,可充当任何ZigBee节点,不仅可以接收发送数据,还具有路由功能,因此可以接收子节点;而RFD只能提供部分的MAC层服务,只能充当子节点,只负责将采集到的数据发送给协调器和路由器节点,本身并不具有路由功能,因此不能接收子节点信息,RFD之间的通信只能通过FFD来完成。
ZigBee标准在此基础上定义了三种节点:
ZigBee协调器(Coordinator)、ZigBee路由器(Routers)、ZigBee终端(EndDevice)
2所使用的设备
所用的ZigBee设备都具有连接网络和断块网路的功能。
ZigBee协调器和路由器都具有以下附加功能:
1)允许设备以如下方式连接网路:
MAC(MediumAccessControl)层的连接命令。
应用层的连接请求
2)允许设备以如下方式断开网络;
MAC层的断开命令
应用层的断开命令
对逻辑网络地址的分配
维护邻居设备
3组建网络
组建一个网状的ZigBee网络包括两个步骤:
网络的初始化和节点加入网络;而节点加入网络又有两个步骤:
通过协调器加入网络和通过已有节点入网。
1)网络的初始化
ZigBee网络的建立是由协调器(Coordinator)发起的,任何一个节点想建立一个网络必须满足两个条件:
节点是FFD节点,具有协调器功能;
节点还没有和其他网络连接(一个网络中只许有一个协调器)
网络初始化过程如图图6-2-1所示。
图6-2-1网络初始化流程
网络初始化流程如下:
1)确定网络协调器。
首先判断节点是否是FFD节点,接着判断次节点是否是其他网络里的网络协调器(通过编程设定其节点属性)。
通过主动扫描,发送一个信标请求命令(Beaconrequestcommand),然后还要设置一个扫描期限时间(T_scan_duration),如果在扫描期内没有检测到信标,那么此FFD即可建立自己ZigBee网络,并且作为这个网络的协调器不断产生信标并广播出去。
2)进行信道扫描。
包括能量扫描和主动扫描。
首先对指定的信道或默认的信道进行能量扫描,以避免可能的干扰。
为实现能量检测扫描,设备网络层通过发送扫描类型(ScanType)参数设置为能量检测扫描的MLME-SCAN.request原语到MAC层进行信道能量检测扫描扫描结果通过MLME-SCAN.confirm原语返回。
当网络层关联实体收到成功的能量检测扫描结果后,将以递增的方式对所测的能量值进行信道排序,并且抛弃那些能量值超出了可允许能量水平的信道,选择可允许能量水平的信道作下一步处理
然后,网络管理实体将通过发送MLME-SCAN.Request原语进行主动扫描,其中该原语的ScanType参数设置为主动扫描。
搜索节点通信半径内的网络信息。
这些信息以网络信标帧的形式在网络中广播,节点通过主动扫描形势接收这些信标帧,然后根据这些信息,找到一个较好的,相对安静的信道,该信道存在最少的ZigBee网络(最好也没有ZigBee设备)。
3)设置网络ID。
找到合适的网络后,协调器将为这个新网络选择一个PAN标识符(PANID,取值≦0x3FFF),这个ID在所使用的信道中必须是唯一的。
PANID可以通过监听通道内其他网络的ID来选择一个不会冲突的ID的方式来获取,也可以人为的指定。
在ZigBee网络中有两种地址模式:
扩展地址或叫做MAC地址(64位)和短地址(16位),其中扩展地址由IEEE组织分配,用于唯一的设备标识;短地址用于本地网络中的设备标识,在一个网络中,每个设备的短地址必须唯一,当节点加入网络时由其父节点分配并通过使用短地址进行通信。
对于协调器来说,短地址通常设定为0X0000;
网络初始化包括两方面的内容:
确定初始化参数和选定参数配置到节点中。
节点需要初始化的参数如下:
操作信道LogicChannel、PANID、节点自身短地址macShorAddress、信标周期BeaconOrder、超帧激活周期SuperframeOrder等。
在确定网络的初始化参数之后,将通过调用MAC层的MLNE-SAP接口的设置原语(MLME-SET)和开始原语(MLME-START)将选定的参数配置到节点的MAC中。
如图6-2-2所对应的建立网络流程。
图6-2-2建立一个新网络
4节点通过协调器加入网络
当ZigBee协调器确定以后,节点首先需要和协调器建立连接加入网络。
图6-2-3节点(FFD)与协调器连接加入网络的流程图
为了建立连接,FFD节点需要向协调器提出连接请求,协调器接收到节点的连接请求后根据情况决定是否允许其连接,然后对请求连接的节点做出响应,节点与协调器建立连接以后,才能实现数据的收发。
如图6-2-3所示,具体的流程可以分为以下几步:
1)查找网络协调器。
首先会主动扫描查找周围网络的协调器,如果在扫描期限内检测到信标,那么将获得协调器的有关信息,这时就向协调器发送连接请求,在选择合适的网络后,上层将请求MAC层对物理层和MAC层的phyCurrentChannel、macPANID等PIB(数据库)属性进行相应的设置。
如果没有检测到,间隔一段时间后,节点重新发送扫描。
2)发送关联请求命令(Associaterequestcommmand)。
节点将关联请求命令发给协调器,协调器收到后立即回复一个确认帧(ACK),同时向它的上层发送连接指示原语,表示已经收到节点的连接请求。
但这并不意味着已经建立连接,只表示协调器已经收到节点的连接请求。
当协调器的MAC层的上层接收到连接指示原语后,将根据自己的资源情况(存储空间和能量)决定是否同意此节点加入请求,然后给节点MAC层发送响应。
3)等待协调器处理。
当节点收到协调器加入请求命令的ACK后,节点的MAC将等待一段时间,接收协调器的连接响应。
在预定的时间内,如果接收到连接响应,它将这个响应向它的上层通告。
而协调器给节点的MAC层发送响应时会设置一个等待响应时间(T_ResponseWaitTime)来等待协调器对其加入请求命令的处理,若协调器资源足够,协调器会给节点分配一个16位的短地址,并产生包含新地址和连接成功状态的连接响应命令,则此节点将成功的和协调器建立连接并可以开始通信。
若协调器资源不够,待加入的节点将重新发送请求信息,直到入网成功。
4)发送数据请求命令。
如果协调器在响应时间内同意节点加入,那么将产生关联响应命令(Associatereponsecommand)并先存储这个命令。
当响应时间过后,节点发送数据请求命令(Datarequestcommand)给协调器,协调器收到后立即回复ACK,然后将存储的关联响应命令发给节点。
如果在响应时间到后,协议器还没有决定是否同意节点加入,那么节点将试图从协议器的信标帧中提取关联响应命令,成功的话就可以入网成功,否则重新发送请求信息直到入网成功。
5)回复。
节点收到关联响应命令后,立即向协调器回复一个确认帧(ACK),以确认接收到连接响应命令,此时节点将保存协调器的短地址和扩展地址,并且节点的MLME向上层发送连接确认原语,通告关联加入成功的信息。
上面的完成以后,等待加入网络的节点应该已经收到协调器的加入请求回复。
如果该请求通过,该节点将成功和协调器建立连接并获得网络地址和其他节点进行通信。
在上述连接过程中,请求建立连接的节点的上层生成连接请求原语发送给节点的MAC层。
MAC层的MLME接收到这个原语后,先向物理层发送和原语更新phyCurrentchannel和macPANID的值,然后生成一个含有建立连接请求的命令帧发送给指定的协调器。
节点在发送命令帧时使用CSMA-CA(载波侦听多址接入—冲突避免)。
如图6-2-4所示为节点连接过程原语时序图。
图6-2-4节点与协调器连接原语时序图
5节点通过已有节点加入网络
当靠近协调器的FFD节点和协调器关联成功后,处于这个网络范围内的其他节点就以这些FFD节点作为父节点加入网络了,具体加入网络的方式有两种:
通过关联(association)方式,就是待加入节点发起加入网络;也就是子设备用MAC连接程序来加入网络
直接方式(direct)方式,子设备直接同一个预先所指定的父设备连接来加入网络。
其中关联方式是ZigBee网络中新节点加入网络的主要途径
对于一个节点来说,只有没有加入网络的才能进行加入网络。
在这些节点中,有些是曾经加入过网络,但是却与父节点失去联系(这样的节点称为孤儿节点),而有些则是新节点。
当是孤儿节点时,在它的相邻表中存有原父节点的信息,于是它可以直接给源父节点发送加入网络的请求信息。
如果父节点有能量同意它加入,于是直接告知它的以前被分配的网络地址,它便入网成功;如果此时它原来的父节点的网络中,子节点数已经达到最大值,也就是说网络地址已经分配满,父节点便无法批准它加入,它只能以新节点身份重新寻找并加入网络。
而对于新节点来说,它首先会在预先设定的一个或多个信道上通过主动或被动扫描周围它可找到的网络,寻找有能批准自己加入网络的父节点,并把可以找到的所有父节点的资料存入自己的相邻表。
存入相邻表的父节点的资料包括:
ZigBee协议的版本、堆栈的规范、PANID和可以加入的信息。
在相邻表中所有的父节点中选择一个发送请求。
如果发送的请求被批准,那么父节点同时会被分配给它一个16为的网络地址,此时入网成功,子节点可以开始通信。
如果请求失败,那么重新查找相邻表,继续发送请求信息,直到加入网络或者相邻表中没有了合适的父节点。
3)实验步骤
第一步:
打开协调器,蓝灯先亮,然后黄灯闪烁几下,既而一直保持亮。
第二步:
打开路由器,蓝灯先亮,然后黄灯闪烁几下,既而一直保持亮。
第三步:
按动一下协调器的上键,这时路由器的绿灯闪烁四下。
第四步:
按动一下路由器的上键,这时协调器的绿灯闪烁四下。
4)程序清单
清单6.2.1管理协调器的孩子节点,并向这些节点发送关联消息
/******************************************************************************
*函数名ZDP_NwkAddrReq
*描述构建并发送一个网络地址请求帧。
利用广播的方式,利用IEEE地址来寻求网络地址。
*参数IEEEAddress:
获取的设备IEEE地址;ReqType:
两种获取方式。
一个是单一获取(0x0001),一个是扩展获取(0x0002)。
StartIndex:
开始索引,默认为0;SecurityEnable:
安全选项;
*返回值afStatus_t
*****************************************************************************/
afStatus_tZDP_NwkAddrReq(uint8*IEEEAddress,byteReqType,
byteStartIndex,byteSecurityEnable)
{
uint8*pBuf=ZDP_TmpBuf;
bytelen=Z_EXTADDR_LEN+1+1;//IEEEAddress+ReqType+StartIndex.
zAddrType_tdstAddr;
(void)SecurityEnable;//Intentionallyunreferencedparameter
if(osal_ExtAddrEqual(saveExtAddr,IEEEAddress)==FALSE)
{
dstAddr.addrMode=AddrBroadcast;
dstAddr.addr.shortAddr=NWK_BROADCAST_SHORTADDR_DEVRXON;
}
else
{
dstAddr.addrMode=Addr16Bit;
dstAddr.addr.shortAddr=ZDAppNwkAddr.addr.shortAddr;
}
pBuf=osal_cpyExtAddr(pBuf,IEEEAddress);
*pBuf++=ReqType;
*pBuf++=StartIndex;
returnfillAndSend(&ZDP_TransID,&dstAddr,NWK_addr_req,len);
}
6.2.3实验结果
我们可以通过协议分析仪分析ZigBee数据包来描述实验的结果。
以下是利用协议分析仪分析建立ZigBee网络,节点加入及发送数据的实验过程。
图5协调器上电之后的广播包1
图6协调器上电之后的广播包2
如图5所示,第一行,协调器首先上电,完成网络的初始化,选择一个合适的信道,并且为自己的网络选择一个PAN_ID(0x2053),然后向周围发生beaconrequest的包。
从第二行开始此协调器对信道进行扫描(主动扫描),然后不停的发送广播包(0xFFFF)。
广播的内容可以根据APSCluster确定。
此时的APSCluster为0x0001。
它是的意思是将节点要加入网络的IEEE地址发送给协调器。
具体实现方式如程序清单6.2.1所示,其中ReqType参数的请求方式类型有两种,一个为单一获取(0x0001),一个为扩展获取(0x0002)。
这里的单一获取方式0x0001标识码即为APSClusterId。
APSProfileId为不同的应用所定义的不同Profile,这里的sampleApp为0x0F08,可以在SampleApp.h文件中找到。
APSDest.Endpoint为设备的端口号,这里为0x14。
关于端口号前面已经讲过,这里就不再陈述。
在第四行,协调器发送了一个网络层的命令帧,该帧的目的地址为0xFFFC,表示只是所有的协调器和路由器才能接收到该消息。
该命令帧是路由请求命令,它允许发送该命令的设备请求其无线覆盖范围的其他设备针对一个特定的目的设备执行路由搜索,在网络中建立状态信息以使得消息能够更方便快捷地传递到目的设备。
由于目前没有打开路由设备,所以Count为0,List_status_list也为空。
每个路由请求命令帧间隔15秒,利用#defineNWK_LINK_STATUS_PERIOD15进行的设置,该宏定义在nwk_globals.h文件中。
接下来协调器广播3条地址请求信息,广播一条路由请求命令帧,直到新的节点加入。
图7路由节点0x2B38加入网络
将一个路由节点上电,这样路由节点会首先向周围的环境做一个信道能量扫描选择一个能量比较合适的信道进行网络搜寻。
这里需要注意的是信道能量是有一个等级的,在Z-Stack里面会有一个门限值,当这个能量低于这个门限会被认为没有网络。
当信道选择好之后,路由节点也会周期性的向周围发送Beaconrequest的包来寻求协调器的回复,如图7所示。
当协调器接收到路由节点的Beaconrequest包之后会发送一个包含自己IEEEMAC地址的超帧。
主要目的是为了将自己的MAC地址(64位)交给路由器,以便后续的通信。
路由器接收到超帧之后,将协调器的IEEE地址保存起来,并利用这个地址向协调器发生一个Associationrequest的包,这个包目的是寻求加入网络。
收到协调器的MAC层的确认帧之后,紧接着发生一个DataRequest的包来寻求协调器给其分配的16位网络短地址。
上述工作做完网络就已经建立一大半了,当协调器接收到DataRequest之后,首先经过NWK层的算法为其分配一个唯一的网络短地址,然后向路由器发送一个包含其网络短地址的包,这个包是通过MAC地址发送的。
因为MAC地址和网络地址都可以进行通信。
当路由器接收到这个包之后,配置自己的短地址为0x2B38,然后就可以利用这个短地址和协调器进行应用层的通信了,走到这步就表示路由器就已经成功加入到网络了。
图8节点的网络连接状态
1个路由器加入网络之后,如图8所示,第一行,协调器的NwkLinkStatus发生了变化,Count变为了1,连接的节点ADDR=0x2B38,路由器的NwkLinkStatus也发生了变化,Count变为了1,连接的节点ADDR=0x0000。
所以我们通过抓包分析器,可以大致的分析到网络的基本参数。
图9路由节点0x51EB的加入
路由节点2的加入和路由节点1的加入方式是一样的,这里就不再陈述。
加入成功时候,如图9所示,我们可以看到,NWKLinkStatus发生了变化,每个节点的连接表都发生了变化。
第一行是路由节点(0x2B38)的连接表,第二行是协调器(0x000)的连接表,第8行是路由节点(0x51EB)的连接表。