zigbee实验报告.docx
《zigbee实验报告.docx》由会员分享,可在线阅读,更多相关《zigbee实验报告.docx(11页珍藏版)》请在冰豆网上搜索。
![zigbee实验报告.docx](https://file1.bdocx.com/fileroot1/2022-12/7/23e60cd4-55d8-43a1-ad53-ede0d2d30649/23e60cd4-55d8-43a1-ad53-ede0d2d306491.gif)
zigbee实验报告
《接入技术课题报告》
学院:
计算机与信息学院
专业班级:
通信工程一班
课题名称:
Zigbee实现树状网络
日期:
2014年5月9日
课题任务:
1.用zigbee开发套件实现zigbee设备的组网;
2.了解PAN协调器的启动过程;
3.了解路由器与设备加入网络的过程;
4.通过zigbee网络传输温度与湿度的数据;
5.理解Z-stack的协议架构;
6.用抓包器分析MAC帧的内容。
课题结果:
任务1:
用zigbee开发套件实现zigbee设备的组网
Zigbee组网就是调用协议栈的组网函数、加入网络函数,实现网络的建立与节点的加
入。
组网可有多种方案而且还有不同的拓扑结构,如任务4中我们所建立的数据传输网络也是其中的一部分。
详见任务4。
任务2:
了解PAN协调器的启动过程
建立网络是一个自动的过程,协调器在应用指定的网络信道范围内进行能量扫描,通过在各个信道上进行监听,获取各信道能量水平。
协调器会选择一个干扰和冲突最少的信道建立网络。
确定了工作信道后,设备可以进一步设置其余网络参数,包括PAN标识,网络地址,扩展PAN标识等。
应用层通过NLME-NETWORK-FORMATION.request触发网络层进行网络建立过程。
原语包括扫描信道,扫描时间,信标阶,超帧阶,电池寿命扩展标志等参数。
网络建立的具体过程:
调用MAC层MLME-SCAN原语先后进行能量扫描和主动扫描,在选择好信道、PAN标识等参数后调用NLME-SET原语先后对参数进行设置,最后通过MLME-START原语启动协调器。
具体过程如下:
ZSEGintmain(void)
{
……
//初始化操作系统
osal_init_system();
……
}
OSAL.c
byteosal_init_system(void)
{
……
//初始化系统的任务
osalInitTasks();
……
}
OSAL_SampleApp.c
voidosalInitTasks(void)
{
……
ZDApp_Init(taskID++);
SampleApp_Init(taskID);
}
ZDApp.c
voidZDApp_Init(bytetask_id)
{
ZDAppTaskID=task_id;
//InitializetheZDOglobaldeviceshortaddressstorage
ZDAppNwkAddr.addrMode=Addr16Bit;//地址模式为16bit短地址
ZDAppNwkAddr.addr.shortAddr=INVALID_NODE_ADDR;//短地址=0xFFFE
(void)NLME_GetExtAddr();//API函数,用于得到64bitIEEE地址
//InitializeZDOitemsandsetupthedevice-typeofdevicetocreate.
ZDO_Init();
afRegister((endPointDesc_t*)&ZDApp_epDesc);//为设备注册端点0描述符
//Startthedevice?
if(devState!
=DEV_HOLD)//无HOLD_AUTO_START此项预编译,所以devState=DEV_INIT
{
ZDOInitDevice(0);
}
ZDApp_RegisterCBs();
}
ZDApp.c
uint8ZDOInitDevice(uint16startDelay)
{
uint8networkStateNV=ZDO_INITDEV_NEW_NETWORK_STATE;//0x01,初始化该设备新的网络状态
devState=DEV_INIT;//无连接
ZDAppDetermineDeviceType();//确定该设备的类型
extendedDelay=(uint16)((NWK_START_DELAY+startDelay)
+(osal_rand()&EXTENDED_JOINING_RANDOM_MASK));//加入网络的时延
ZDApp_NetworkInit(extendedDelay);//开始形成网络
}
ZDApp.c
voidZDApp_NetworkInit(uint16delay)
{
if(delay)
{
//Waitawhilebeforestartingthedevice
osal_start_timerEx(ZDAppTaskID,ZDO_NETWORK_INIT,delay);
}
else
{
osal_set_event(ZDAppTaskID,ZDO_NETWORK_INIT);
}
}
UINT16ZDApp_event_loop(bytetask_id,UINT16events)
{
if(events&ZDO_NETWORK_INIT)//网络初始化事件处理
{
//Initializeappsandstartthenetwork
devState=DEV_INIT;
ZDO_StartDevice((uint8)ZDO_Config_Node_Descriptor.LogicalType,devStartMode,
DEFAULT_BEACON_ORDER,DEFAULT_SUPERFRAME_ORDER);
HalLedSet(HAL_LED_1,HAL_LED_MODE_ON);//点亮LED1表示网络初始化完成。
ZDObject.c
voidZDO_StartDevice(bytelogicalType,devStartModes_tstartMode,bytebeaconOrder,bytesuperframeOrder)
{
devState=DEV_COORD_STARTING;
ret=NLME_NetworkFormationRequest(zgConfigPANID,zgDefaultChannelList,
zgDefaultStartingScanDuration,beaconOrder,superframeOrder,false);
……
}
任务3:
了解路由器与设备加入网络的过程
zigbee协调器设备建立网络后,路由器设备或者终端设备,可以加入协调器建立的网络,具体加入网络有两种方式,一种是通过关联方式,就是待加入的设备发起加入网络,具体实现方式后面讨论,另一中是直接方式,就是待加入的设备具体加入到那个设备下,作为该设备的子节点,由以前网络中的设备,想待加入的设备作为其子设备决定。
由于我们一般都用方式一所以我们只了解方式一。
加入一个设备,是两个设备的事,即子设备和待定父设备,对于子设备,首先子设备调用NLME-NETWORK-DISCOVERY.request原语,设定待扫描的信道,以及每个信道扫描的时间,网络层收到这个原语,将要求MAC层执行被动或主动扫描。
具体发送到设备外的是一个beconrequest帧,当在这个信道中的设备收到该帧,将会发送becon帧,这是子设备通过BEACON-NOTIFY.indication原语,告知该设备的MAC层,该becon帧包含了发送该帧的地址信息,以及是否允许其他设备以其子节点的方式加入。
待加入的设备,在网络层,将检查该becon帧协议ID是否是zigbeeID。
如果不是,将忽略;如果是,该设备将复制收到每个becon帧的相关信息到其关联表中(neighbortable)。
一旦MAC层完成了扫描,将发送MLME-SCAN.confirm原语,告知网络层,网络层将发送NLME-NETWORK-DISCOVERY.confirm原语,告知应用层。
应用层收到该原语,应用层将根据情况,要么重新要求扫描,或者从关联表中选择所发现的网络加入。
调用NLME-JOIN.request原语,原语中各个参数的设置参看协议。
如果在关联表中找不到合适的准父节点,将调用原语告知应用层,如果由多个设备可以满足要求,将选择到协调器节点深度最低的设备,如果有几个设备的深度相同,且都是最小深度,将从中随机选择一个。
一旦潜在的父节点确定,网络层将调用MLME-ASSOCIATE.request原语到MAC层。
具体设置参看协议相关部分,连接状态将通过MLME-ASSOCIATE.confirm原语反馈。
如果试图加入不成功,网络层将收到MAC层通过MLME-ASSOCIATE.confirm告知的加入失败,如果收到的是潜在父节点拒绝该设备加入,这时候,网络层将会在关联表中,把该潜在父节点的相应部分,潜在父节点位(potentialparentbit)置为零,确保网络层,不再给这个设备二次发送加入请求。
如果一次加入没成功,将选择另一个潜在的父节点加入,指导找到一个合适的设备加入或者所有的设备都不适合。
如果加入成功,网络层收到的MLME-ASSOCIATE.confirm原语,将含有该设备可用的16唯一的逻辑地址,网络层将在关联表中设置与其父节点的关系,同时,这个父节点也会在其关联表中加入这个新设备。
如果是以路由器(router)形式成功加入网络,该设备的应用层将发送NLME-STAT_ROUTER. request原语,网络层将发送MLME-STAT.request 原语到MAC层。
收到了MLME-START.confirm原语,网络层将发送 NLME-START-ROUTER.confirm原语,含有同样的状态值。
对于父节点设备:
只有协调器或路由器,可以加入设备,进行该操作,首先从MAC层开始,MAC接收到一帧(ASSOCIATE)数据 ,通过MLME_ASSOCIATE.indication原语传到网罗层,潜在的父节点收到这帧数据,首先判断该设备是否已经存在其关联表中,如果找到,NLME将获取相应的16位网络地址,并发送association response到MAC层,如果没有找到,将分配一个在这个网络中唯一的地址给待加入的设备,如果潜在父节点已经用完了地址分配,NLME将中止,通过MLME-ASSOCIATE.reponse原语,告知该设备,不能接收子设备了,在多跳网络中,其他的设备还可以接收。
如果设备加入得到许可,这时候,将在关联表中创建一个表项,作为其子节点,并通过MLME-ASSOCIATE.reponse原语,告知该设备,已经成功加入网络。
代码:
路由器入网
ZDObject.c
voidZDO_StartDevice(bytelogicalType,devStartModes_tstartMode,bytebeaconOrder,bytesuperframeOrder)
{
devState=DEV_NWK_DISC;
ret=NLME_NetworkDiscoveryRequest(zgDefaultChannelList,zgDefaultStartingScanDuration);
……
}
终端设备入网
ZDObject.c
voidZDO_StartDevice(bytelogicalType,devStartModes_tstartMode,bytebeaconOrder,bytesuperframeOrder)
{
devState=DEV_NWK_DISC;
ret=NLME_NetworkDiscoveryRequest(zgDefaultChannelList,zgDefaultStartingScanDuration);
……
}
任务4:
通过zigbee网络传输温度与湿度的数据
代码如下:
#include
#include
#include"UART.H"
#include"DHT11.H"
voidmain(void)
{
Delay_ms(1000);//让设备稳定
InitUart();//串口初始化
while
(1)
{
DHT11();//获取温湿度
P0DIR|=0x40;//IO口需要重新配置
/******温湿度的ASC码转换*******/
temp[0]=wendu_shi+0x30;
temp[1]=wendu_ge+0x30;
humidity[0]=shidu_shi+0x30;
humidity[1]=shidu_ge+0x30;
/*******信息通过串口打印********/
Uart_Send_String(temp1,5);
Uart_Send_String(temp,2);
Uart_Send_String("\n",1);
Uart_Send_String(humidity1,9);
Uart_Send_String(humidity,2);
Uart_Send_String("\n",1);
Delay_ms(2000);//延时,使周期性2S读取1次
}
}
实验结果如图:
吹气前的结果:
对着温湿度传感器吹气的结果
显然可见吹气后所得到的温度和湿度数据明显变化,且之种变化也是符合常理的。
任务5:
理解Z-stack的协议架构
Z-Stack采用分层的软件结构,目的是为了使各层相对独立,每一层都提供一些服务,服务由协议定义,程序员只需关心与他的工作直接相关的那些层的协议,它们向高层提供服务,并由低层提供服务。
硬件抽象层(HAL)提供各种硬件模块的驱动,包括定时器Timer,通用I/O接口GPIO,通用异步收发传输器UART,模数转换ADC的应用程序接口API,提供各种服务的扩展集。
操作系统抽象层OSAL实现了一个易用的操作系统平台,通过时间片轮转函数实现任务调度,提供多任务处理机制。
用户可以调用OSAL提供的相关API进行多任务编程,将自己的应用程序作为一个独立的任务来实现。
整个Z-Stack协议栈结构如图
Z-Stack在项目中的目录结构:
1.APP:
应用层目录,这是用户创建各种不同工程的区域,在这个目录中包含了
应用层的内容和用户创建项目的主要内容,在协议栈里面是以操作系统的任务实
现的"
2.HAL:
硬件层目录,包含有与硬件相关的配置和驱动及操作函数"
3.MAC:
MAC层目录,包含了MAC层的参数配置文件及其MAC的LIB库的
函数接口文件"
4.MT:
监制调试层目录,该目录下的文件主要用于调试目的,即实现通过串口调试各层,与各层进行直接交互。
5.NWK:
网络层目录,含网络层配置参数文件及网络层库的函数接口文件,APS
层库的函数接口"
6.OSAL:
协议栈的操作系统"
7.Profile:
AF层目录,ApplicationFarmework应用框架,包含AF层处理函数接口文件。
8.Seeurity:
安全层目录,安全层处理函数
9.Services:
ZigBee和802.15.4设备地址处理函数目录,包括地址模式的定义及地址处理函数
10.Tools:
工作配置目录,包括空间划分及Z-Stack相关配置信息
11.ZDO:
指ZigBee设备对象,可认为是一种公共的功能集,文件用户用自定义的对象调用APS子层的服务和NWK层的服务
12.ZMac:
MAC层目录,包括MAC层参数配置及MAC层LIB库函数回调处理
函数"
13.ZMain:
主函数目录,包括入口函数及硬件配置文件
14.Output:
输出文件目录
任务6:
用抓包器分析MAC帧的内容
用PacketSniffer软件来分析MAC帧的内容,实验结果如下
总结:
通过此次作业的练习,学习到了很多东西。
第一是对Zigbee有了进一步的了解,;第二是加强了在资料的搜索与资料的筛选,;第三是一个小小的团队分工合作的重要性。
我们这个作业所涉及的内容很多,而且我和我的队友事先对我们这次的作业也没有太多的了解,很多东西都得自己去慢慢查阅和筛选资料,我和我队友进行分工合作,直到最后把作业完成。
参考文献:
FS_ZigBee协议栈实验指导书锋硕电子科技有限公司王锋