zigBee实验报告.docx

上传人:b****9 文档编号:26335283 上传时间:2023-06-17 格式:DOCX 页数:59 大小:968.05KB
下载 相关 举报
zigBee实验报告.docx_第1页
第1页 / 共59页
zigBee实验报告.docx_第2页
第2页 / 共59页
zigBee实验报告.docx_第3页
第3页 / 共59页
zigBee实验报告.docx_第4页
第4页 / 共59页
zigBee实验报告.docx_第5页
第5页 / 共59页
点击查看更多>>
下载资源
资源描述

zigBee实验报告.docx

《zigBee实验报告.docx》由会员分享,可在线阅读,更多相关《zigBee实验报告.docx(59页珍藏版)》请在冰豆网上搜索。

zigBee实验报告.docx

zigBee实验报告

ZIgBee学习心得

实验报告

项目名称基于无线传感器网络的采温实验

专业班级软件1105

学号

姓名

 

 

 

 

实验《基于无线传感器网络的采温实验》

实验学时:

1实验地点:

201实验日期:

5.10

一、实验目的

1.设计并实现一套无线传感器网络的采温系统。

2.较为详细的分析ZigBee协议栈。

二、实验内容和报告简介

完成采集器、传感器设备的设计和实现。

对ZigBee2007协议和Zstack进行较为详细的分析。

三、实验相关设备环境

介绍了开发板、CC2530和协议栈

四、实验内容

第一部分详细描述了开发的工作,附上了关键代码和注释。

第二部分分析了ZIgBee协议操作系统,描述了其运行机制;以及PHY层、MAC层、网络层、应用层。

在网络层描述了其网络拓扑结构,并针对Ad-Hoc路由算法提出了一个我自己的一个想法。

五、实验结果

通过照片展示了实验效果。

六、实验结论

说明了温度数据偏差的原因。

六、实验小结

谈了些无线通信的现状;学习的心得,不足和未来的能力方向。

 

三、实验相关设备环境

1.主要的硬件环境

ZigBee开发板(两个)本实验利用的开发板是在淘宝上买的。

应该是一个小店参考TI公司产品生产的。

外形如图1所示:

图1:

ZigBee开发板外形图

本开发板采用TI公司的CC2530芯片,外有晶振、RS232串口、按键、电源灯外围电路及元件。

本实验利用CC2530芯片集成的片上温度传感器采集温度。

部分核心板电路如图2所示:

图2:

部分核心板电路图

部分底板电路图如图3所示:

图3:

部分底板电路图

CC2530芯片

CC2530是用于2.4-GHzIEEE802.15.4、ZigBee和RF4CE应用的一个真正的片上系统(SoC)解决方案。

它能够以非常低的总的材料成本建立强大的网络节点。

CC2530结合了领先的RF收发器的优良性能,业界标准的增强型8051CPU,系统内可编程闪存,8-KBRAM和许多其他强大的功能。

CC2530具有不同的运行模式,使得它尤其适应超低功耗要求的系统。

运行模式之间的转换时间短进一步确保了低能源消耗。

图4:

CC2530框图

CC2530具有一个IEEE802.15.4兼容无线收发器。

RF内核控制模拟无线模块。

另外,它提供了MCU和无线设备之间的一个接口,这使得可以发出命令,读取状态,自动操作和确定无线设备事件的顺序。

无线设备还包括一个数据包过滤和地址识别模块。

CC2530的硬件设计也支持ZigBee协议所要求的各种协议和算法。

2.主要的软件环境

TI公司的。

ZStack是TI公司为开发者提供的符合ZigBee2007的协议栈,是开发ZigBee模块必不可少的环境(当然你也可以选择其他协议栈或自己开发一个协议栈)。

ZStack是一个免费半开源的产品。

注:

ZigBee协议是ZigBee联盟给出的一个短距离无线传输协议。

ZigBee协议栈是ZigBee协议的具体实现。

ZStack是TI公司开发的ZigBee协议栈。

四、实验内容

4.1.内容简介

本节内容主要分为以下两方面:

1.无线传感器网络采温系统实验2.ZigBee协议(ZigBee2007版,下同)和ZStack分析。

无线传感器网络采温系统实验部分是对本次开发的一个描述。

在商业的ZigBee模块开发中是都利用了ZigBee协议栈,其为开发提供了必要的接口。

开发者所做的代码工作主要是相关的硬件驱动和应用程序。

本实验室基于TI官方实例SimpleAPI所做,并对这个实例进行了必要的改写。

虽然ZigBee协议栈为开发者提供了所需的API,使得开发者不必关心ZigBee协议的具体实现,便可开发出产品,但是要想更好的开发ZigBee产品,我想还必须对ZigBee协议和协议栈进行研究分析。

本段内容的另一个部分便是对此的描述。

4.2.无线传感器网络采温系统实验

4.2.1实验简介

本实验基于ZigBee网络设计了一个无线传感器网络,可以完成无线的采温功能。

设备类型简介:

协调器(作为采集器)

协调器是一个ZB网络的第一个开始的设备,或者是一个ZB网络的启动或建立网络的设备。

协调器节点选择一个信道和网络标志符(也叫PANID),然后开始建立一个网络。

协调器设备在网络中还可以有其他作用,比如建立安全机制、网络中的绑定的建立等等。

注意:

协调器主要的作用是建立一个网络和配置该网络的性质参数。

一旦这些完成,该协调器就如同一个路由器,网络中的其他操作并不依赖该协调器,因为ZB是分布式网络。

路由器(作为传感器)

一个路由器的功能有

(1)作为普通设备加入网络

(2)多跳路由(3)辅助其它的子节点完成通信。

终端设备(作为传感器)

为了维持网络最基本的运行,对于终端设备没有指定的责任。

也就是说,在一个基本网络中,终端设备没有必不可缺少性。

所以它可以根据自己功能需要休眠或唤醒,因此为电池供电设备。

一般来说,该设备需要的内存较少(特别是内部RAM)

网络的拓扑结构

网状结构(无线mesh网络)

图5:

网络拓扑结构图

黑色的为协调器节点,作为采集器,接收温度信息,并通过串口发送到PC机上。

红色的和白色的为传感器节点,采集温度数据发送到采集器。

红色的具有路由功能。

网络从功能上讲是基于adhoc网络的,具有自组织,多跳等特点。

因此可扩展性、健壮性都很有优势。

4.2.2工程结构简介

工程结构如图5所示:

图6:

工程的工作空间

说明:

APP(ApplicationProgramming):

应用层目录,这是用户创建各种不同工程的区域,在这个目录中包含了应用层的内容和这个项目的主要内容,在协议栈里面一般是以操作系统的任务实现的。

HAL(Hardware(H/W)AbstractionLayer):

硬件层目录。

MAC:

介质接入控制子层目录,包含了MAC层的参数配置文件及其MAC的LIB库的函数接口文件。

实现的功能有:

1、能产生网络信标。

2、支持PAN的连接和断开连接。

3、同信标保持同步。

4、在对等的MAC实体之间提供一个可靠的通信链路。

5、处理和维护GTS机制。

6、信道接入采用CSMA-CA接入机制。

7、支持设备的安全性。

介质访问控制层(MAC)帧被称为MAC协议数据单元(MPDU),其长度不超过127个字节。

它具有四种不同的帧形式,即信标帧、数据帧、确认帧和命令帧。

MT(MonitorTest):

实现通过串口可控各层,与各层进行直接交互。

NWK(ZigBeeNetworkLayer):

网络层目录,含网络层配置参数文件及网络层库的函数接口文件,APS层库的函数接口。

OSAL(OperatingSystem(OS)AbstractionLayer):

协议栈的操作系统。

Profile:

AF(Applicationwork)层目录,包含AF层处理函数文件。

Security:

安全层目录,安全层处理函数,比如加密函数等。

Services:

地址处理函数目录,包括着地址模式的定义及地址处理函数。

Tools:

工程配置目录,包括空间划分及ZStack相关配置信息。

ZDO(ZigBeeDeviceObjects):

ZDO目录。

ZMac:

MAC层目录,包括MAC层参数配置及MAC层LIB库函数回调处理函数。

ZMain:

主函数目录,包括入口函数及硬件配置文件。

Output:

输出文件目录,这个EW8051IDE自动生成的。

设备功能及网络拓扑结构介绍

ZigBee设备可分为全功能设备(FFD)和简化功能设备(RFD)。

全功能设备可以作为协调器(路由器)节点,可以进行数据的转发等功能。

简化功能设备只能作为终端节点发送和接受数据。

ZigBee协议支持多种网络拓扑结构,包括星型结构,树形结构,网状结构等。

关于ZIgBee网络拓扑结构的较为详细的介绍,将在本段3节中给出。

由于我暂时只买了两个模块,所以网络拓扑结构也很简单了。

一个是协调器节点,作为采集器模块通过串口同我的笔记本相连。

另一个是终端节点作为传感器模块测量温度并传输数据。

需要指出的是,只要有足够多的节点,本实验完全能够根据实际需要设计出有效的网络拓扑结构。

main()函数和OSAL

这部分是Zstack的程序,与我们编程工作密切相关,所以进行简单说明。

一个程序是从main()函数开始运行的。

在ZStack中main()函数主要完成了各种初始化任务,以及操作系统OSAL的启动。

相关的函数代码如下:

/*********************************************************************

*@fnmain

*@briefFirstfunctioncalledafterstartup.

*@returndon'tcare

*/

intmain(void)

{

//Turnoffinterrupts

osal_int_disable(INTS_ALL);

//InitializationforboardrelatedstuffsuchasLEDs

HAL_BOARD_INIT();

//Makesuresupplyvoltageishighenoughtorun

zmain_vdd_check();

//InitializeboardI/O

InitBoard(OB_COLD);

//InitialzeHALdrivers

HalDriverInit();

//InitializeNVSystem

osal_nv_init(NULL);

//InitializetheMAC

ZMacInit();

//Determinetheextendedaddress

zmain_ext_addr();

//InitializebasicNVitems

zgInit();

#ifndefNONWK

//SincetheAFisn'tatask,callit'sinitializationroutine

afInit();

#endif

//Initializetheoperatingsystem

osal_init_system();

//Allowinterrupts

osal_int_enable(INTS_ALL);

//Finalboardinitialization

InitBoard(OB_READY);

//Displayinformationaboutthisdevice

zmain_dev_info();

/*DisplaythedeviceinfoontheLCD*/

#ifdefLCD_SUPPORTED

zmain_lcd_init();

#endif

#ifdefWDT_IN_PM1

/*IfWDTisused,thisisagoodplacetoenableit.*/

WatchDogEnable(WDTIMX);

#endif

osal_start_system();//NoReturnfromhere

return0;//Shouldn'tgethere.

}//main()

OSAL即OperatingSystem(OS)AbstractionLayer,是一个基于事件驱动的轮询式的操作系统。

它主要提供了任务切换,内存管理等功能。

我们在实验中也主要是通过它来开发并管理应用程序。

在main()函数的最后,调用了osal_start_system(),此函数是OSAL的灵魂,也体现了协议栈的工作方式和流程。

其主要方法就是:

不断查看事件表,如果有事件发生就调用相应的事件处理函数。

相关代码如下:

/*********************************************************************

*@fnosal_start_system

*

*@brief

*

*Thisfunctionisthemainloopfunctionofthetasksystem.It

*willlookthroughalltaskeventsandcallthetask_event_processor()

*functionforthetaskwiththeevent.Iftherearenoevents(for

*alltasks),thisfunctionputstheprocessorintoSleep.

*ThisFunctiondoesn'treturn.

*

*@paramvoid

*

*@returnnone

*/

voidosal_start_system(void)

{

#if!

defined(ZBIT)&&!

defined(UBIT)

for(;;)//ForeverLoop

#endif

{

uint8idx=0;

osalTimeUpdate();

Hal_ProcessPoll();//ThisreplacesMT_SerialPoll()andosal_check_timer().

do{

if(tasksEvents[idx])//Taskishighestprioritythatisready.

{

break;

}

}while(++idx

if(idx

{

uint16events;

halIntState_tintState;

HAL_ENTER_CRITICAL_SECTION(intState);

events=tasksEvents[idx];

tasksEvents[idx]=0;//CleartheEventsforthistask.

HAL_EXIT_CRITICAL_SECTION(intState);

events=(tasksArr[idx])(idx,events);

HAL_ENTER_CRITICAL_SECTION(intState);

tasksEvents[idx]|=events;//Addbackunprocessedeventstothecurrenttask.

HAL_EXIT_CRITICAL_SECTION(intState);

}

#ifdefined(POWER_SAVING)

else//Completepassthroughalltaskeventswithnoactivity?

{

osal_pwrmgr_powerconserve();//Puttheprocessor/systemintosleep

}

#endif

}

}

在OSAL中提供了开发所用的API。

主要有消息管理、任务同步、时间管理、终端管理、任务管理等。

下面对其进行简单的介绍。

(1)消息管理类API主要用于处理任务间的消息的交换,主要包括任务分配消息缓存、释放消息缓存、接受消息和发送消息等。

Uint8*osal_msg_allocate(unit16len)为消息分配缓存空间。

Uint8osal_msg_deallocate(uint8*msg_ptr)释放消息的缓存空间。

Uint8osal_msg_send(unit8destination-task,uint8*msg_ptr)

一个任务发送消息到消息队列

Uint8osal_msg_receive(uint8task_id)

一个任务从消息队列接受属于自己的消息。

(2)任务同步API用于任务的同步,允许一个任务等待某个事件的发生。

Uint8osal_set_event(uint8task_id,uint16event_flag)

运行一个任务设置某个事件。

(3时间管理API开启和关闭定时器,

Uint8osal_start_timerEx(uint8task_id,uint16event_id,uint16timeout_value)

设置一个定时时间,到后,相应的事件被设置。

Uint8osal_stop_timerEx(uint8task_id,uint16event_id)

停止已经启动的定时器。

OSAL提供的API还有很多,这里仅列出了较为常用的,完整API介绍TI公司提供了相应的用户手册。

关于OSAL的较为详细的介绍,将在本段3节中给出。

4.2.5设备相关功能主要函数介绍

(1)协调器(采集器)编程协调器主要完成网络的建立维护等功能,这些功能由协议栈提供,其原理在此暂且不描述(下节将有较为详细的描述)。

在其编程过程中,我主要完成的是具体应用的开发。

就是将数据接收并发送到串口。

函数如下:

voidzb_ReceiveDataIndication(uint16source,uint16command,uint16len,uint8*pData)

这是协调器最主要的功能函数,处理的是接受到另一个数据后执行的操作。

简单来说就是数据归类处理后发送到串口。

函数的代码如下:

/******************************************************************************

*@fnzb_ReceiveDataIndication

*

*@briefThezb_ReceiveDataIndicationcallbackfunctioniscalled

*asynchronouslybytheZigBeestacktonotifytheapplication

*whendataisreceivedfromapeerdevice.

*

*@paramsource-Theshortaddressofthepeerdevicethatsentthedata

*command-ThecommandIdassociatedwiththedata

*len-ThenumberofbytesinthepDataparameter

*pData-Thedatasentbythepeerdevice

*

*@returnnone

*/

CONSTuint8strDevice[]="Device:

0x";

CONSTuint8strTemp[]="Temp:

";

CONSTuint8strBattery[]="Battery:

";

voidzb_ReceiveDataIndication(uint16source,uint16command,uint16len,uint8*pData)

{

uint8buf[32];

uint8*pBuf;

uint8tmpLen;

uint8sensorReading;

if(command==SENSOR_REPORT_CMD_ID)

{

//Receivedreportfromasensor

sensorReading=pData[1];

//Iftoolavailable,writetoserialport

//下面的功能是把发数据的设备号(网络地址)写入缓存

tmpLen=(uint8)osal_strlen((char*)strDevice);

pBuf=osal_memcpy(buf,strDevice,tmpLen);

_ltoa(source,pBuf,16);

pBuf+=4;

*pBuf++='';

if(pData[0]==BATTERY_REPORT)

{

//当传输的数据是电压时,进行如下处理。

tmpLen=(uint8)osal_strlen((char*)strBattery);

pBuf=osal_memcpy(pBuf,strBattery,tmpLen);

*pBuf++=(sensorReading/10)+'0';//高位转换

*pBuf++='.';//小数点

*pBuf++=(sensorReading%10)+'0';//低位转换

*pBuf++='';

*pBuf++='V';

}

else

{

//当传输的数据时温度时,进行如下处理。

tmpLen=(uint8)osal_strlen((char*)strTemp);

pBuf=osal_memcpy(pBuf,strTemp,tmpLen);

*pBuf++=(sensorReading/10)+'0';//高位转换

*pBuf++=(sensorReading%10)+'0';//低位转换

*pBuf++='';

*pBuf++='C';

}

*pBuf++='\r';

*pBuf++='\n';

*pBuf='\0';

#ifdefined(MT_TASK)

//debug_str((uint8*)buf);

//张温刚修改5.6

//写入串口

HalUARTWrite(0,buf,(byte)osal_strlen((void*)buf));

HalUARTWrite(0,"\n",1);

#endif

//canalsowritedirectlytouart

}

}

传感器编程主要工作是通过相应的片上传感器读取数据,然后发送的指定的采集器。

传感器相关数据的读取,分为电压值的读取uint8myApp_ReadBattery(void)与温度值的读取uint8myApp_ReadTemperature(void)。

代码如下

说明:

1.函数中用到了大量的条件编译,也就是说根据具体的条件,很多代码并没有参与编译,这也是嵌入式开发编程的特点。

为了展现原有的代码特点,我并没有对此进行省略。

2.温度传感器采用了一个效验的算法

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > PPT模板 > 其它模板

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1