《传感网原理与技术》课程设计报告设计题目:ZigBee串口使用专业:物联网工程指导教师:郭猛、孔玉静学号:085 415137姓名:李沛文同组人员:安雨柔、赵雷、李沛文成绩:评语:计算机与数据科学学院2017年12月2 6日目录一、系统环境21、硬件环境22、软件环境3二、设计目的和内容31、目的32、内容3三、功能设计3四、主要代码7事件触 发函数:7按键发送指令函数:9收到信息处理函数:11五、总结12系统环境硬件环境在实验室使用装有IAR软件的PC机来进行调试程序, 使用实验箱里面的CC2530芯片来实现RF射频通信的过程,使用多个包含CC2530的芯片,让每个CC2530芯片充当不同的角色,一 个充当协调器,一个充当路由器,一个充当终端节点,协调器负责创建网络,每个网络里只有一个协调器。路由器的功能是允许其他设备加入网络, 通常情况下路由器需要一直处于活动状态,因为它必须使用主电源供电。终端设备没有网络结构的职责,它可以睡眠或者唤醒,可以用电池供电。软 件环境Z-Stack是TI公司开发的协议栈,使用CC2530射频芯片可以使用户很容易的开发出具体的应用,Z-Stack使用IAR 软件作为它的开发集成环境。二、设计目的和内容1、目的通过学习使用Z-Stack协议栈,实现自己想要实现的一些功能和操作。能够熟 练地使用和修改官方的Z-Stack协议栈。2、内容(1)添加实验箱ZigBee主板上的S2按键功能:按下S2键(在Z-Stac k中S2键对应的是HAL_KEY_SW_6/Shift键)之后,发送一个闪烁红灯的事件消息,使得同组内的节点能够闪烁红灯(在Z-S tack中红灯对应的是HAL_LED_3)。(2)使能串口0,使得路由器/终端节点和协调器节点能实现串口透传的功能(即路由器/终端 通过RF将串口收到的数据发送出来,协调器RF接收,并通过串口输出。双方都通过串口调试助手进行串口无线透传的测试)。(3)使能串口0 ,为每个节点在联网后加上自己节点的PANID、16位短地址、终端号等基本信息,并通过串口输出这些提示信息。(4)烧写协调器、路 由器、终端节点,当按下终端节点的DN键时,实现终端节点向路由节点的单点数据发送;按下LT键时,实现终端节点向协调器的单点数据发送; 发送内容自定义,当路由器/协调器收到此数据后,通过串口将数据输出出来。(5)在修改的MyApp001工程中,找到SAMPLEAPP _SEND_PERIODIC_MSG_EVT周期性事件的数据发送和接收处理部分,将终端节点改造为每隔3秒钟左右发送一次芯片内温度数 据给协调器节点;协调器节点收集到终端节点的数据之后,通过串口UART0输出;路由器和协调器节点不再发送周期性数据,只有终端节点才周 期性发送。三、功能设计(1)实现S2按键控制红灯的亮和灭如果有按键被按下,那么就会和SampleAPP_ProcessEven t函数中的caseKEY_CHANGE:SampleApp_HandleKeys(((keyChange_t)MSGpkt)- >state,((keyChange_t)MSGpkt)->keys);break;这段代码进行匹配,执行Sample App_HandleKeys()函数,接着判断是SW6按键按下,就会执行这个发送闪灯的命令SampleApp_SendFlashM essage(SAMPLEAPP_FLASH_DURATION);在SampleApp_SendFlashMessage()函 数中会点用AF_DataRequest()函数来发送指令。然后会判断这个节点是什么状态,如果是协调器,那么就会在串口调试助手上面显 示coordSW6pressed,如果是路由器,就会显示routerSW6pressed,如果是终端设备的SW6按下的话就 会显示end_deviceSW6pressed。(2)实现透传的功能路由器/终端通过RF将串口收到的数据发送出来,协调器RF接 收,并通过串口输出。因为定义了ZAPP_P1所以执行上面所示的代码,将收到的数据发送给自己的同时也发送给协调器。也是通过AF_Da taRequest()这个函数来实现的。(3)实现单点发送使用SW3和SW4按键来实现终端节点向协调器和路由器来发送信息,路 由器和协调器在收到信息之后通过串口调试助手进行输出。协调器或者路由器收到信息之后将信息输出。具体过程如下流程图所示:(5)在修改的 MyApp001工程中,找到SAMPLEAPP_SEND_PERIODIC_MSG_EVT周期性事件的数据发送和接收处理部分,将终 端节点改造为每隔3秒钟左右发送一次芯片内温度数据给协调器节点;协调器节点收集到终端节点的数据之后,通过串口UART0输出;路由器和 协调器节点不再发送周期性数据,只有终端节点才周期性发送。四、主要代码事件触发函数:uint16SampleApp_Process Event(uint8task_id,uint16events){afIncomingMSGPacket_tMSG pkt;(void)task_id;//Intentionallyunreferencedparameterif( events&SYS_EVENT_MSG){uint8tmpstr[20];MSGpkt=(afIncomin gMSGPacket_t)osal_msg_receive(SampleApp_TaskID);while(MSGp kt){switch(MSGpkt->hdr.event){//Receivedwhenakeyisp ressedcaseKEY_CHANGE:SampleApp_HandleKeys(((keyChange_t)MSG pkt)->state,((keyChange_t)MSGpkt)->keys);break;//Received whenamessagesisreceived(OTA)forthisendpointcaseAF_INCOM ING_MSG_CMD:SampleApp_MessageMSGCB(MSGpkt);break;//Received wheneverthedevicechangesstateinthenetworkcaseZDO_STATE_ CHANGE:SampleApp_NwkState=(devStates_t)(MSGpkt->hdr.status);i f((SampleApp_NwkState==DEV_ZB_COORD)||(SampleApp_NwkState= =DEV_ROUTER)||(SampleApp_NwkState==DEV_END_DEVICE)){HalUA RTWrite(0,"\r\n",2);//串口发送回车换行符//通过串口发送节点网络状态的提示:if(SampleA pp_NwkState==DEV_ZB_COORD){HalUARTWrite(0,"coordcreatethe net\r\n",osal_strlen((char)"coordcreatethenet\r\n"));spri ntf((char)tmpstr,"shortAddr=%0x",_NIB.nwkDevAddress);HalUARTWr ite(0,tmpstr,osal_strlen((char)tmpstr));}elseif(SampleApp_Nwk State==DEV_ROUTER){HalUARTWrite(0,"routerjointhenet\r\n", osal_strlen((char)"routerjointhenet\r\n"));sprintf((char )tmpstr,"shortAddr=%0x",_NIB.nwkDevAddress);HalUARTWrite(0,tmps tr,osal_strlen((char)tmpstr));}elseif(SampleApp_NwkState==D EV_END_DEVICE){HalUARTWrite(0,"end_devicejointhenet\r\n",os al_strlen((char)"end_devicejointhenet\r\n"));sprintf((char )tmpstr,"shortAddr=%0x",_NIB.nwkDevAddress);HalUARTWrite(0,tmp str,osal_strlen((char)tmpstr));}//Startsendingtheperiodic messageinaregularinterval.osal_start_timerEx(SampleApp_Tas kID,SAMPLEAPP_SEND_PERIODIC_MSG_EVT,SAMPLEAPP_SEND_PERIODIC_MSG _TIMEOUT);}else{}break;#ifdefined(ZTOOL_P1)||defined( ZTOOL_P2)caseCMD_SERIAL_MSG:/处理串口发来的数据/SampleApp_ZTOOL_seri aldata((mtOSALSerialData_t)MSGpkt);break;#elifdefined(ZAPP_ P1)||defined(ZAPP_P2)//处理接收到的串口事件caseSPI_INCOMING_ZAPP_DATA :SampleApp_ZAPP_serialdata(MSGpkt);break;#endifdefault:break ;}osal_msg_deallocate((uint8)MSGpkt);MSGpkt=(afIncomingM SGPacket_t)osal_msg_receive(SampleApp_TaskID);}return(even ts^SYS_EVENT_MSG);}if(events&SAMPLEAPP_SEND_PERIODIC_MSG _EVT){//SendtheperiodicmessageSampleApp_SendPeriodicMessa ge();//Setuptosendmessageagaininnormalperiod(+alittle jitter)osal_start_timerEx(SampleApp_TaskID,SAMPLEAPP_SEND_PER IODIC_MSG_EVT,(SAMPLEAPP_SEND_PERIODIC_MSG_TIMEOUT+(osal_rand( )&0x00FF)));//returnunprocessedeventsreturn(events^SAM PLEAPP_SEND_PERIODIC_MSG_EVT);}//Discardunknowneventsreturn 0;}按键发送指令函数:voidSampleApp_HandleKeys(uint8shift,uint8keys) {(void)shift;//Intentionallyunreferencedparameterif(key s&HAL_KEY_SW_1){SampleApp_SendFlashMessage(SAMPLEAPP_FLASH_ DURATION);}if(keys&HAL_KEY_SW_2){aps_Group_tgrp;grp =aps_FindGroup(SAMPLEAPP_ENDPOINT,SAMPLEAPP_FLASH_GROUP);if (grp){aps_RemoveGroup(SAMPLEAPP_ENDPOINT,SAMPLEAPP_FLASH_GR OUP);}else{aps_AddGroup(SAMPLEAPP_ENDPOINT,&SampleApp_Grou p);}}if(keys&HAL_KEY_SW_3){if(SampleApp_NwkState==DE V_END_DEVICE){SampleApp_SendRouterMessage("xiaoxiaoderena!\n",16 );}}if(keys&HAL_KEY_SW_4){if(SampleApp_NwkState==DEV _END_DEVICE){SampleApp_SendCoordMessage("wudishiduomojimo!\n",18 );}}if(keys&HAL_KEY_SW_6){SampleApp_SendFlashMessage( SAMPLEAPP_FLASH_DURATION);if(SampleApp_NwkState==DEV_ZB_COORD ){HalUARTWrite(0,"coordSW6pressed\r\n",osal_strlen((char) "coordSW6pressed\r\n"));}elseif(SampleApp_NwkState==DEV_R OUTER){HalUARTWrite(0,"routerSW6pressed\r\n",osal_strlen((ch ar)"routerSW6pressed\r\n"));}elseif(SampleApp_NwkState== DEV_END_DEVICE){HalUARTWrite(0,"end_deviceSW6pressed\r\n",o sal_strlen((char)"end_deviceSW6pressed\r\n"));}}}收到信息处理函数: voidSampleApp_MessageMSGCB(afIncomingMSGPacket_tpkt){uint16 flashTime;uint8pointer1;uint16my_short_addr;switch(pkt-> clusterId){caseSAMPLEAPP_PERIODIC_CLUSTERID:break;caseSAMP LEAPP_FLASH_CLUSTERID:my_short_addr=_NIB.nwkDevAddress;if(my_ short_addr!=pkt->srcAddr.addr.shortAddr){flashTime=BUILD_UINT1 6(pkt->cmd.Data[1],pkt->cmd.Data[2]);HalLedBlink(HAL_LED_3,4 ,50,(flashTime/4));}break;///自己写的代码caseSAMPLEAPP_CLUSTE RID:my_short_addr=_NIB.nwkDevAddress;if(my_short_addr!=pkt->s rcAddr.addr.shortAddr){pointer1=&pkt->cmd.Data[0];HalUARTWrite( 0,pointer1,pkt->cmd.DataLength);}break;caseSAMPLEAPP_Coord_CL USTERID:HalUARTWrite(0,&pkt->cmd.Data[0],pkt->cmd.DataLength);break;caseSAMPLEAPP_Router_CLUSTERID:HalUARTWrite(0,&pkt->cmd.Data[0],pkt->cmd.DataLength);break;}}五、总结在这周的课程设计中,我对底层的封装有了更深的了解,从最底层的使用&+地址来访问寄存器,到后面使用结构体来进行访问,到最后直接使用一个较短的名字来访问,逐步封装的过程让寄存器使用更加方便。在使用Z-Stack的过程中,遇到了一些问题,例如在函数的中间定义变量的话就会显示有错误,将变量定义到开始的位置的时候就不会出现错误,还有因为一段代码放的位置不对,导致程序一直没法正确执行,看着语法都是没问题的,但是就是不会出来正确的结果。通过这次课设学习了很多,学会了地址的封装的过程,学会了使用Z-Stack协议栈,最重要的在慢慢的改善自己写程序的规范,让程序看起来更加正规一点,便于其他人看懂。12 |
|