物联网实验报告.docx

上传人:小飞机 文档编号:1672206 上传时间:2022-12-13 格式:DOCX 页数:55 大小:4.42MB
返回 下载 相关 举报
物联网实验报告.docx_第1页
第1页 / 共55页
物联网实验报告.docx_第2页
第2页 / 共55页
物联网实验报告.docx_第3页
第3页 / 共55页
物联网实验报告.docx_第4页
第4页 / 共55页
物联网实验报告.docx_第5页
第5页 / 共55页
点击查看更多>>
资源描述

《物联网实验报告.docx》由会员分享,可在线阅读,更多相关《物联网实验报告.docx(55页珍藏版)》请在三一办公上搜索。

1、20134636中南林业科技大学课程设计实验报告专业班级:2013级计算机科学与技术2班授课教师:张艳学生姓名:陆焕丽学生学号: 20134636实验一继电器闪烁一 实验目的:学会使用修改程序,使得继电器按要求闪烁。二 内容:修改以下程序,使得继电器的绿灯闪一下,红灯闪五下#include typedef unsigned int uint ;typedef unsigned char uchar;/定义控制灯的端口#define RLED P1_0/定义LED1为P10口控制#define YLED P1_1/定义LED2为P11口控制/函数声明void Delay(uint);/延时函数v

2、oid Initial(void);/初始化P0口/*/延时*/void Delay(uint n) uchar i; while(n-) for(i=200;i0;i-); /* 初始化程序*/void Initial(void) P1DIR |= 0x03; /P10、P11定义为输出 RLED = 1; YLED = 1;/LED灭/*/主函数*/void main(void) Initial();/调用初始化函数RLED = 0;/LED1YLED = 0;/LED2while(1) RLED = 0; YLED = 1; Delay(1000); RLED = 1; YLED = 0

3、; Delay(1000);三 实验记录:修改好的程序如下: #include typedef unsigned int uint ;typedef unsigned char uchar;/定义控制灯的端口#define RLED P1_0/定义LED1为P10口控制#define YLED P1_1/定义LED2为P11口控制/函数声明void Delay(uint);/延时函数void Initial(void);/初始化P0口/*/延时*/void Delay(uint n) uchar i; while(n-) for(i=200;i0;i-); /* 初始化程序*/void Ini

4、tial(void) P1DIR |= 0x03; /P10、P11定义为输出 RLED = 1; YLED = 1;/LED灭/*/主函数*/void main(void)uint i; Initial();/调用初始化函数RLED = 0;/LED1YLED = 0;/LED2while(1) RLED = 0; YLED = 1; Delay(1000); for(i=0;ihdr.event ) case AF_INCOMING_MSG_CMD: GenericApp_MessageMSGCB( MSGpkt ); break; default: break; osal_msg_dea

5、llocate( (uint8 *)MSGpkt ); MSGpkt = (afIncomingMSGPacket_t *)osal_msg_receive( GenericApp_TaskID ); return (events SYS_EVENT_MSG); return 0;static void GenericApp_MessageMSGCB( afIncomingMSGPacket_t *pkt ) unsigned char buf10; switch ( pkt-clusterId ) case GENERICAPP_CLUSTERID: osal_memcpy(buf,pkt-

6、cmd.Data,10); if( (buf10=C)|(buf1=h)|(buf5=S)|(buf9=i) HalLedBlink(HAL_LED_1,2,40,700); break; default: break; 上述代码实现的基本功能如下:第79行,将收到的数据拷贝到缓冲区buf中。第80行,判断接收到的数据是不是“ChinaSofti”,这里是选择性判断了4个字符。如果是则执行第82行,使LED红灯闪烁2次。注意:上述代码使用到了ZigBee协议栈提供的函数HalLedBlink(功能:使某个LED闪烁),直接使用即可。这里需要提醒读者,使用协议栈进行应用程序开发时,如果协议栈已经

7、提供了相应的函数,则只需要尽快掌握该函数的功能及使用方法即可,不需要另外实现该函数。由于我们的开发板硬件和TI的原厂开发板硬件有所不同,所以这里需要对相关的LED硬件初始化做一些调整。具体可分为以下两步:1.打开ZMain文件夹下的ZMain.c文件,找到整个协议栈的主函数main()函数,在85行(通过Tools-Options选项的Editor栏中设置show line numbers即可显示行号):HAL_BOARD_INIT();鼠标双击这个函数选定然后右击,选择跳转到函数定义处,具体如图4.7所示:2.还是在hal_board_cfg.h这个文件中,我们将116行和123行的ACTI

8、VE_HIGH改为ACTIVE_LOW,这是因为我们的LED灯是IO口低电平触发亮。通过以上两步,相关的LED函数就可以正常使用了。到此为止,协调器的编程已经基本结束,下面回忆一下上述代码所做的基本工作。(1)删除了协议栈中的GenericApp.c文件,然后添加了两个文件: Coordinator.c和Enddevice.c。(2)给出了Coordinator.c的代码,并给出了部分注释,其中 Coordinator.c文件中很多代码格式是固定的,读者只需要熟悉这些代码格式即可。在Workspace下面的下拉列表框中选择CoordinatorEB,然后右键单击Enddevice.c,在弹出的

9、下拉菜单中选择Options,如图4.8所示。图4.8 Options选项设置在弹出的对话框中,选择Exclude from build,如图4.9所示。图4.9 Exclude from build此时,Enddevice.c文件会呈灰白显示状态。同时可以打开Tools文件夹可以看到f8wEndevcfg和f8wRouter.cfg文件也是呈灰白显示状态,文件呈灰白显示状态说明该文件不参与编译,ZigBee协议栈正是使用这种方式实现对源文件编译的控制。f8w2530.xcl,f8wConfig.cfg,f8wCoord.cfg三个文件包含了节点的配置信息,具体功能如下:(1)f8w2530.

10、xcl-包含了CC2530单片机的链接控制指令(如定义堆栈大小、内存分配等),一般不需要改动。(2)f8wConfig.cfg-包含了信道选择,网络号等有关的链接命令。例如:下列代码定义了建立网络的信道默认为11,即从11信道上建立ZigBee无线网络,第59行定义了ZigBee无线网络的网络号。因此如果想从其他信道上建立zigbee网络和修改网络号,就可以在此修改。(3)f8wCoord.cfg-定义了设备类型前文讲到zigbee无线网络中的设备类型有协调器,路由器和终端节点。下述代码就定义了该设备具有协调器和路由器的功能。下面讲解一下zigbee协议栈的编译以及下载。点击工具栏上的Make

11、按钮或者点击Project下的Make,即可实现zigbee协议栈的编译。编译完成后,在窗口下方会自动弹出Message窗口,显示编译过程中的警告和出错信息。Message窗口如图4.10所示。图4.10 Message窗口最后,用CC2530仿真器将开发板和电脑连接起来,复位一下仿真器,然后选择工具栏上的Debug按钮或者点击Project下的Download and Debug,即可实现程序的下载。(2) 终端节点程序下面介绍一下终端节点的程序设计步骤。首先,在Workspace下面的下拉列表框中选择EndDeviceEB,然后右键单击Coordinator.c文件,在弹出的下拉菜单中选择

12、Options,在弹出的对话框中,选择Exclude from build,此时,Coordinator.c文件会呈灰白显示状态。在Enddevice.c文件中输入以下代码: #include OSAL.h#include AF.h#include ZDApp.h#include ZDObject.h#include ZDProfile.h#include GenericApp.h#include DebugTrace.h#if !defined( WIN32 ) #include OnBoard.h#endif#include hal_led.h#include hal_key.h#incl

13、ude hal_uart.hconst cId_t GenericApp_ClusterListGENERICAPP_MAX_CLUSTERS = GENERICAPP_CLUSTERID;const SimpleDescriptionFormat_t GenericApp_SimpleDesc = GENERICAPP_ENDPOINT, / int Endpoint; GENERICAPP_PROFID, / uint16 AppProfId2; GENERICAPP_DEVICEID, / uint16 AppDeviceId2; GENERICAPP_DEVICE_VERSION, /

14、 int AppDevVer:4; GENERICAPP_FLAGS, / int AppFlags:4; GENERICAPP_MAX_CLUSTERS, / byte AppNumInClusters; (cId_t *)GenericApp_ClusterList, / byte *pAppInClusterList; GENERICAPP_MAX_CLUSTERS, / byte AppNumInClusters; (cId_t *)GenericApp_ClusterList / byte *pAppInClusterList;endPointDesc_t GenericApp_ep

15、Desc;byte GenericApp_TaskID; devStates_t GenericApp_NwkState;byte GenericApp_TransID;afAddrType_t GenericApp_DstAddr;static void GenericApp_SendTheMessage( void );void GenericApp_Init( uint8 task_id ) GenericApp_TaskID = task_id; GenericApp_NwkState = DEV_INIT; GenericApp_TransID = 0; GenericApp_Dst

16、Addr.addrMode = (afAddrMode_t)AddrNotPresent; GenericApp_DstAddr.endPoint = 0; GenericApp_DstAddr.addr.shortAddr = 0x0000; GenericApp_epDesc.endPoint = GENERICAPP_ENDPOINT; GenericApp_epDesc.task_id = &GenericApp_TaskID; GenericApp_epDesc.simpleDesc = (SimpleDescriptionFormat_t *)&GenericApp_SimpleD

17、esc; GenericApp_epDesc.latencyReq = noLatencyReqs; afRegister( &GenericApp_epDesc );uint16 GenericApp_ProcessEvent( uint8 task_id, uint16 events ) afIncomingMSGPacket_t *MSGpkt; if ( events & SYS_EVENT_MSG ) MSGpkt = (afIncomingMSGPacket_t *)osal_msg_receive( GenericApp_TaskID ); while ( MSGpkt ) sw

18、itch ( MSGpkt-hdr.event ) case ZDO_STATE_CHANGE: GenericApp_NwkState = (devStates_t)(MSGpkt-hdr.status); if (GenericApp_NwkState = DEV_ZB_COORD) osal_start_timerEx( GenericApp_TaskID, GENERICAPP_SEND_MSG_EVT, GENERICAPP_SEND_MSG_TIMEOUT ); break; default: break; osal_msg_deallocate( (uint8 *)MSGpkt

19、); MSGpkt = (afIncomingMSGPacket_t *)osal_msg_receive( GenericApp_TaskID ); return (events SYS_EVENT_MSG); if ( events & GENERICAPP_SEND_MSG_EVT ) GenericApp_SendTheMessage(); osal_start_timerEx( GenericApp_TaskID, GENERICAPP_SEND_MSG_EVT, GENERICAPP_SEND_MSG_TIMEOUT ); return (events GENERICAPP_SEN

20、D_MSG_EVT); return 0;static void GenericApp_SendTheMessage( void ) char theMessageData = Hello World; if ( AF_DataRequest( &GenericApp_DstAddr, &GenericApp_epDesc, GENERICAPP_CLUSTERID, (byte)osal_strlen( theMessageData ) + 1, (byte *)&theMessageData, &GenericApp_TransID, AF_DISCV_ROUTE, AF_DEFAULT_

21、RADIUS ) = afStatus_SUCCESS ) HalLedBlink(HAL_LED_2,2,40,700); 4 点对点数据传输实验解析前面实验实现了ZigBee无线网络中点对点的数据传输,但是具体流程并没有讲解,主要是想尽快让读者感受一下在ZigBee无线网络里面的数据传输过程,对传输过程有个感性的认识,然后进而展开讲解。本节这是对上述实验进行原理上的讨论,具体的函数代码并没有过多的讨论,目的是为了使读者明白实验思路,具体的代码只要用多了自然就熟悉了。(1) 实验原理及流程图 协调器流程图如图4.11所示。 协调器上电后,会按照编译时给定的参数,选择合适的信道、合适的网络号,

22、建立ZigBee无线网络,这部分内容读者不需要写代码实现,ZigBee协议栈已经实现了。图4.11 协调器流程图终端节点则是加入网络后定期发送数据。流程图与协调器类似。 终端节点上电后,会进行硬件电路的初始化,然后搜索是否有ZigBee无线网络,如果有ZigBee无线网络再自动加入(这是最简单的情况,当然可以控制节点加入网络时要符合编译时确定的网络号等),然后发送数据到协调器,最后使LED闪烁。(2) 数据发送 在zigbee协议栈中进行数据发送可以调用AF_Dataquest函数实现,该函数会调用协议栈里面与硬件相关的函数最终将数据通过天线发送出去,这里面涉及对射频模块的操作,例如:打开发射

23、机,调整发射机的发送功率等内容,这些部分协议栈已经实现了,用户不需自己写代码去实现,只需要掌握AF_DataRequest函数的使用方法即可。 下面简要讲解一下AF_DataRequest数据发送函数中各个参数的具体含义。afStatus_t AF_DataRequest(afAddrType_t * dstAddr, endPointDesc_t * srcEP, uint16 cID, uint16 len, uint8 * buf, uint8 * transID,uint8 options, uint8 radius )afAddrType_t *dstAddr-该参数包含了目的节点的

24、网络地址以及发送数据的格式,如广播、单播或多播等。endPointDesc_t *srcEP-在ZigBee无线网络中,通过网络地址可以找到某个具体的节点,如协调器的网络地址是0x0000,但是具体到某一个节点,还有不同的端口( endpoint),每个节点上最多支持240个端口(endpoint)。 节点与端口的关系如图4.12所示,每个节点上最多有240个端口,端口0是默认的ZDO( ZigBee Device Object),端口1-240用户可以自己定义,引入端口主要是由于TI实现的ZigBee协议栈中加入了一个小的操作系统,这样,每个节点上的所有端口共用一个发射接收天线,不同节点上的

25、端口之间可以进行通信,如节点1的端口1可以给节点2的端口1发送控制命令来点亮LED,节点1的端口1也可以给节点2的端口2发送命令进行数据采集操作,但是节点2上端口1和端口2的网络地址是相同的,所以仅仅通过网络地址无法区分,所以,在发送数据时不但要指定网络地址,还要指定端口号。图4.12 节点与端口应此,通过使用端口号来区分同一节点上的不同端口。uint16 cID-这个参数描述的是命令号,在ZigBee协议里的命令主要用来标识不同的控制操作,不问的命令号代表了不同的控制命令,如节点1的端口1可以给节点2的端口1发送控制命令,当该命令的ID为1时表示点亮LED,为0时表示熄灭LED。因此,该参数

26、主要是为了区别不同的命令。如终端节点在发送数据时使用的命令ID是GENERICAPP_CLUSTERID,它的值为1。uint16 len-该参数标志了发送数据的长度。uint8 *buf-该参数是指向发送数据缓冲区的指针。发送数据函数会从该指针指向的地址按照指定的长度取得发送数据进行发送。uint8 *transID-该参数是一个指向发送序号的指针,每次发送数据时,发送序号会自动加1(协议栈里面实现的该功能),在接收端可以通过发送序号来判断是否丢包,同时可以计算出丢包率。 uint8 options和uint8 radius-这两个参数取默认值即可。、2、 实验目的: 了解Zigbee协议和掌握Zigbee无线传感网开发入门,了解点对点数据连接。三、实例测试及结果 打开协调器电源开关,然后打开终端节点电源开关,等终端节点连接上网络后,每隔5s,会发现协调器的LED红灯闪烁两下,这说明协调器已经成功收到了终端节点发送的“ChinaS

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

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号