物联网实验报告资料Word下载.docx
《物联网实验报告资料Word下载.docx》由会员分享,可在线阅读,更多相关《物联网实验报告资料Word下载.docx(48页珍藏版)》请在冰豆网上搜索。
/****************************
//延时
*****************************/
voidDelay(uintn)
{
uchari;
while(n--)
{
for(i=200;
i>
0;
i--);
}
}
初始化程序
voidInitial(void)
P1DIR|=0x03;
//P10、P11定义为输出
RLED=1;
YLED=1;
//LED灭
/***************************
//主函数
***************************/
voidmain(void)
Initial();
//调用初始化函数
RLED=0;
//LED1
YLED=0;
//LED2
while
(1)
Delay(1000);
三.实验记录:
修改好的程序如下:
#include<
uinti;
for(i=0;
i<
5;
i++)
{
RLED=0;
YLED=0;
Delay(1000);
RLED=1;
}
RLED=0;
YLED=0;
实验显示结果:
继电器的绿灯闪一下,红灯闪五下,一直循环着.整个过程中所有仪器都正常。
四.实验心得:
通过这次的实验,利用C语言将程序修改,学会使用接口编程,学会使用IAR8.10与CC2530接口编程,重新温习for循环语句,掌握继电器的连接方式及工作原理
实验二
Zigbee无线传感网开发入门
一、实验内容:
1、zigbee协议栈使用简介
协议定义的是一系列的通信标准,通信双方需要共同按照这一标准进行正常的数据收发;
协议栈是协议的具体实现形式,通俗的理解为用代码实现的函数库,以便于开发人员调用。
ZigBee的协议分为两部分,IEEE802.15.4定义了物理层和MAC层技术规范,ZigBee联盟定义了网络层、安全层和应用层技术规范,ZigBee协议栈就是将各个层定义的协议都集合在一起,以函数的形式实现,并给用户提供一些应用层API,供用户调用。
注意:
虽然协议是统一的,但是协议的具体实现形式是变化的,即不同厂商提供的协议栈是有区别的,例如:
函数名称和参数列表可能有区别,用户在选择协议栈以后,需要学习具体的例子,查看厂商提供的Demo演示程序和说明文档来学习各个函数的使用方式,进而快速的使用协议栈进行应用程序的开发工作。
使用ZigBee协议栈进行开发的基本思路可以概括为如下三点:
1、用户对于ZigBee无线网络的开发就简化为应用层的c语言程序开发,用户不需要深入研究复杂的ZigBee协议栈;
2、ZigBee无线传感器网络中数据采集,只需用户在应用层加入传感器的读取函数即可;
3、如果考虑节能,可以根据数据采集周期进行定时,定时时间到就唤醒ZigBee的终端节点,终端节点唤醒后,自动采集传感器数据,然后将数据发送给路由器或者直接发给协调器。
既然ZigBee协议栈已经实现了ZigBee协议,那么用户就可以使用协议栈提供的API进行应用程序的开发,在开发过程中完全不必关心ZigBee协议的具体实现细节,只需关心一个核心的问题:
应用程序数据从哪里来到哪里去。
下面举一个例子,当用户应用程序需要进行数据通信时,需要按照如下步骤实现:
(1)调用协议栈的组网函数、加入网络函数,实现网络的建立与节点的加入;
(2)发送设备调用协议栈提供的无线数据发送函数,实现数据的发送;
(3)接收设备调用协议栈提供的无线数据接收函数,实现数据的正确接收。
因此,使用协议栈进行应用程序开发时,开发者不需要关心协议栈是具体怎么实现的(例如,每个函数是怎么实现的,每条函数代码是什么意思等),只需要知道协议栈提供的函数实现什么样的功能,会调用相应的函数来实现自己的应用需求即可。
例如,在TI提供的Zstack协议栈中,数据发送函数定义如下:
afStatus_tAF_DataRequest(afAddrType_t*dstAddr,
endPointDesc_t*srcEP,
uint16cID,
uint16len,
uint8*buf,
uint8*transID,
uint8options,
uint8radius)
用户调用该函数即可实现数据的无线发送,当然,在此函数中有8个参数,用户需要将每个参数的含义理解以后,才能达到熟练应用该函数进行无线数据通信的目的。
AF_DataRequest()函数中最核心的两个参数:
·
uint16len-----发送数据的长度;
uint8*buf-----指向存放发送数据的缓冲区的指针。
至于调用该函数后,如何初始化硬件进行数据发送等工作,用户不需要关心,ZigBee协议栈已经将所需要的初始化工作初始化好了,这就类似于学习TCP/IP网络编程时,用户只需要调用相应的数据发送、接收函数即可,而不必关心具体的网卡驱动的具体实现细节。
2zigbee协议栈安装
ZigBee协议栈具有很多版本,不同厂商提供的ZigBee协议栈有一定的区别,本手册选用的是TI推出的ZigBee2007协议栈进行讲解。
ZigBee2007协议栈ZStack-CC2530-2.5.1a要安装以后才能使用,下面讲解安装步骤。
../工程源码,双击ZStack-CC2530-2.5.1a.exe即可进行协议栈的安装,默认是安装到c盘。
然后在路径C:
\TexasInstruments\ZStack-CC2530-2.5.1a\Projects\zstack\Samples\GenericApp\CC2530DB下找到GenericApp.eww,打开该工程。
打开该工程后,可以看到GenericApp工程文件布局,如图4.1所示。
在图中所示的文件布局中,左侧有很多文件夹,如App,HAL,MAC等;
这些文件夹对应了ZigBee协议中不同的层,使用ZigBee协议栈进行应用程序的开发,一般只需要修改App目录下的文件即可。
3点对点数据传输实验
尽管到此为止,读者对ZigBee协议的基本内容都不了解,甚至ZigBee协议是什么也可能存在诸多的疑问与不解,但与其阅读“深奥”的ZigBee协议栈,不如通过一个数据传输实验来对ZigBee协议以及ZigBee协议栈建立一个形象、直观的认识,这将有助于读者对ZigBee协议的理解。
数据传输实验的基本功能:
两个ZigBee节点进行点对点通信,ZigBee节点2向节点1发送“ChinaSofti”10个字符,同时LED绿灯闪烁两下表示成功发送。
ZigBee节点1收到节点2发送过来的数据后,对接收到的数据进行判断,如果收到的数据是“ChinaSofti”,则使开发板上的LED红灯闪烁两下表示成功接收。
数据传输实验原理图如图4.2所示。
(1)协调器程序
在ZigBee无线传感器网络中有三种设备类型:
协调器、路由器和终端节点,设备类型是由ZigBee协议栈不同的编译选项来选择的。
协调器负责ZigBee网络的组建,维护,控制终端节点的加入等。
路由器主要负责数据包的路由选择,终端节点负责数据的采集,不具备路由功能。
在本实验中,ZigBee节点1配置为1个协调器,负责ZigBee网路的组建,ZigBee节点2配置为一个终端节点,上电后加入ZigBee节点1建立的网络,然后发送"
ChinaSofti"
给节点1。
将GenericApp工程中的GenericApp.c删除,删除方法是:
右键单击GenericApp.c,在弹出的下拉菜单中选择Remove即可,如图4.3所示。
单击File,在弹出的下拉菜单中选择New,然后选择File,如图4.4所示。
图4.4新建源文件
将该文件保存为Coordinator.c,然后以同样的方法建立一个Enddevice.c文件(最佳保存路径:
就保存在GenericApp工程中的Source文件夹下,具体路径为C:
\TexasInstruments\ZStack-CC2530-2.5.1a\Projects\zstack\Samples\GenericApp\Source)。
下面讲解向该工程添加源文件的方法:
右键单击App,在弹出的下拉菜单中选择Add,然后选择AddFlies,如图4.5所示,选择刚才建立的两个文件Coordinator.c和Enddevice.c即可。
添加完上述文件后,GenericApp工程文件布局如图4.6所示。
在Coordinator.c中输入以下代码:
#include"
OSAL.h"
AF.h"
ZDApp.h"
ZDObject.h"
ZDProfile.h"
GenericApp.h"
DebugTrace.h"
#if!
defined(WIN32)
#include"
OnBoard.h"
#endif
hal_led.h"
hal_key.h"
hal_uart.h"
constcId_tGenericApp_ClusterList[GENERICAPP_MAX_CLUSTERS]=
GENERICAPP_CLUSTERID
};
constSimpleDescriptionFormat_tGenericApp_SimpleDesc=
GENERICAPP_ENDPOINT,
GENERICAPP_PROFID,
GENERICAPP_DEVICEID,
GENERICAPP_DEVICE_VERSION,
GENERICAPP_FLAGS,
GENERICAPP_MAX_CLUSTERS,
(cId_t*)GenericApp_ClusterList,
(cId_t*)GenericApp_ClusterList
endPointDesc_tGenericApp_epDesc;
byteGenericApp_TaskID;
byteGenericApp_TransID;
staticvoidGenericApp_MessageMSGCB(afIncomingMSGPacket_t*pckt);
voidGenericApp_Init(uint8task_id)
GenericApp_TaskID=task_id;
GenericApp_TransID=0;
GenericApp_epDesc.endPoint=GENERICAPP_ENDPOINT;
GenericApp_epDesc.task_id=&
GenericApp_TaskID;
GenericApp_epDesc.simpleDesc
=(SimpleDescriptionFormat_t*)&
GenericApp_SimpleDesc;
GenericApp_epDesc.latencyReq=noLatencyReqs;
afRegister(&
GenericApp_epDesc);
//节点注册
uint16GenericApp_ProcessEvent(uint8task_id,uint16events)
afIncomingMSGPacket_t*MSGpkt;
if(events&
SYS_EVENT_MSG)
MSGpkt=(afIncomingMSGPacket_t*)osal_msg_receive(GenericApp_TaskID);
while(MSGpkt)
switch(MSGpkt->
hdr.event)
caseAF_INCOMING_MSG_CMD:
GenericApp_MessageMSGCB(MSGpkt);
break;
default:
osal_msg_deallocate((uint8*)MSGpkt);
return(events^SYS_EVENT_MSG);
return0;
staticvoidGenericApp_MessageMSGCB(afIncomingMSGPacket_t*pkt)
unsignedcharbuf[10];
switch(pkt->
clusterId)
caseGENERICAPP_CLUSTERID:
osal_memcpy(buf,pkt->
cmd.Data,10);
if((buf[10]=='
C'
)||(buf[1]=='
h'
)||(buf[5]=='
S'
)||(buf[9]=='
i'
))
HalLedBlink(HAL_LED_1,2,40,700);
上述代码实现的基本功能如下:
第79行,将收到的数据拷贝到缓冲区buf中。
第80行,判断接收到的数据是不是“ChinaSofti”,这里是选择性判断了4个字符。
如果是则执行第82行,使LED红灯闪烁2次。
上述代码使用到了ZigBee协议栈提供的函数HalLedBlink(功能:
使某个LED闪烁),直接使用即可。
这里需要提醒读者,使用协议栈进行应用程序开发时,如果协议栈已经提供了相应的函数,则只需要尽快掌握该函数的功能及使用方法即可,不需要另外实现该函数。
由于我们的开发板硬件和TI的原厂开发板硬件有所不同,所以这里需要对相关的LED硬件初始化做一些调整。
具体可分为以下两步:
1.打开ZMain文件夹下的ZMain.c文件,找到整个协议栈的主函数main()函数,在85行(通过Tools->
Options选项的Editor栏中设置showlinenumbers即可显示行号):
HAL_BOARD_INIT();
鼠标双击这个函数选定然后右击,选择跳转到函数定义处,具体如图4.7所示:
2.还是在hal_board_cfg.h这个文件中,我们将116行和123行的ACTIVE_HIGH改为ACTIVE_LOW,这是因为我们的LED灯是IO口低电平触发亮。
通过以上两步,相关的LED函数就可以正常使用了。
到此为止,协调器的编程已经基本结束,下面回忆一下上述代码所做的基本工作。
(1)删除了协议栈中的GenericApp.c文件,然后添加了两个文件:
Coordinator.c和Enddevice.c。
(2)给出了Coordinator.c的代码,并给出了部分注释,其中Coordinator.c文件中很多代码格式是固定的,读者只需要熟悉这些代码格式即可。
在Workspace下面的下拉列表框中选择CoordinatorEB,然后右键单击Enddevice.c,在弹出的下拉菜单中选择Options,如图4.8所示。
图4.8Options选项设置
在弹出的对话框中,选择Excludefrombuild,如图4.9所示。
图4.9Excludefrombuild
此时,Enddevice.c文件会呈灰白显示状态。
同时可以打开Tools文件夹可以看到f8wEndev.cfg和f8wRouter.cfg文件也是呈灰白显示状态,文件呈灰白显示状态说明该文件不参与编译,ZigBee协议栈正是使用这种方式实现对源文件编译的控制。
f8w2530.xcl,f8wConfig.cfg,f8wCoord.cfg三个文件包含了节点的配置信息,具体功能如下:
(1)f8w2530.xcl----包含了CC2530单片机的链接控制指令(如定义堆栈大小、内存分配等),一般不需要改动。
(2)f8wConfig.cfg----包含了信道选择,网络号等有关的链接命令。
例如:
下列代码定义了建立网络的信道默认为11,即从11信道上建立ZigBee无线网络,第59行定义了ZigBee无线网络的网络号。
因此如果想从其他信道上建立zigbee网络和修改网络号,就可以在此修改。
(3)f8wCoord.cfg----定义了设备类型
前文讲到zigbee无线网络中的设备类型有协调器,路由器和终端节点。
下述代码就定义了该设备具有协调器和路由器的功能。
下面讲解一下zigbee协议栈的编译以及下载。
点击工具栏上的Make按钮或者点击Project下的Make,即可实现zigbee协议栈的编译。
编译完成后,在窗口下方会自动弹出Message窗口,显示编译过程中的警告和出错信息。
Message窗口如图4.10所示。
图4.10Message窗口
最后,用CC2530仿真器将开发板和电脑连接起来,复位一下仿真器,然后选择工具栏上的Debug按钮或者点击Project下的DownloadandDebug,即可实现程序的下载。
(2)终端节点程序
下面介绍一下终端节点的程序设计步骤。
首先,在Workspace下面的下拉列表框中选择EndDeviceEB,然后右键单击Coordinator.c文件,在弹出的下拉菜单中选择Options,在弹出的对话框中,选择Excludefrombuild,此时,Coordinator.c文件会呈灰白显示状态。
在Enddevice.c文件中输入以下代码:
GENERICAPP_ENDPOINT,//intEndpoint;
GENERICAPP_PROFID,//uint16AppProfId[2];
GENERICAPP_DEVICEID,//uint16AppDeviceId[2];
GENERICAPP_DEVICE_VERSION,//intAppDevVer:
4;
GENERICAPP_FLAGS,//intAppFlags:
GENERICAPP_MAX_CLUSTERS,//byteAppNumInClusters;
(cId_t*)GenericApp_ClusterList,//byte*pAppInClusterList;
(cId_t*)GenericApp_ClusterList//byte*pAppInClusterList;
devStates_tGenericApp_NwkState;
byteGenericA