配色: 字号:
传感网原理与技术
2020-08-13 | 阅:  转:  |  分享 
  
《传感网原理与技术》课程设计报告设计题目: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
献花(0)
+1
(本文系摘摘摘丿丿...首藏)