您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 质量控制/管理 > 实验教程八---zstack操作系统原理之应用层实验
Copyright:kezongwu无线传感器网络实验教程z-stack操作系统原理实验之应用层主讲教师:柯宗武2013年9月本章内容了解ZigBee协议应用层相关概念掌握ZStack添加用户任务的方法及工作原理实验内容编写一个任务,按下不同按键时执行不同操作。ZigBee协议应用层基本概念应用支持子层APS应用框架应用Profile设备簇Cluster端点ENDPOINT端点描述符Zigbee设备对象ZDO术语之间的关系一个端点代表一个无线应用,如在智能家居中通过网络控制灯的开关是一个应用,用端点n1标识,家庭防盗是一个应用,用端点n2标识,n1!=n2且n1、n2!=0ZigBee协议应用层基本概念ZigBee联盟对ZigBee应用层进行了规范。ZigBee应用层规范描述了常用ZigBee设备功能。如绑定、设备发现和服务发现是如何在ZigBee设备对象内部实现的。ZigBee设备Profile内的cluster定义了所有ZigBee设备支持的功能。设备(device)一个无线传感器节点就是一个设备,对应一个无线单片机(CC2530);一个设备有一个射频端,具有唯一的IEEE地址(64位)和网络地址(16位)。在协议栈中不同的设备有相应的配置文件:协调器(全功能设备FFD)配置文件:f8wCoord.cfg路由器(全功能设备FFD)配置文件:f8wRouter.cfg终端设备(半功能设备RFD)配置文件:f8wEndev.cfg应用框架Profile在zigbee网络中,两个设备之间进行通信的关键是统一一个Profile。Profile:acollectionofdevicedescriptions,whichtogetherformacooperativeapplication.一种profile的一个例子是智能家居。这个ZigBeeprofile允许一系列设备类型交换控制信息,以形成一个无线家庭自动化应用。这些设备的目的是交换已知信息来实现控制,比如开关灯,给照明控制器发送一个照明传感测量,或如果一个位置传感器探测到移动时发送一个警报信息。应用框架ProfileProfile在zigbee设备间定义了普通行为:无线网络在网络中依靠自制设备的能力同网络连接和发现其他设备上的服务。Profile支持设备发现和服务发现Profile分为私有域和公有域,但每个Profile的标识符都是唯一的。一旦获得一个Profile标识符,就可以定义设备描述和cluster标识符每一个zigbee设备都必须至少有一个zigbeeProfile,一个zigbee设备可以支持几个Profile一个publicprofile也规定了profile的ID,比如智能家居就规定是0x104Profile定义了一个应用中涉及到的数据结构及用于通信的函数。相当于定义了一类设备的“Class”应用框架Profile0101IndustialPlantMonitoring(IPM)工业用植物检测0104HomeAutomation(HA)家居自动化0105CommercialBuildingAutomation(CBA)商业楼宇自动化0107TelecomApplications(TA)电信应用0108PersonalHome&hospitalCare(PHHC)个人家庭医院护理0109AdvancedMeteringInitiative(AMI)先进的计量倡议设备描述与簇在一个profile的规范下,又提出了cluster的概念,这个cluster要理解成一个大方向下的一个特定对象。假设要控制一个LED,有一个远程节点(发命令控制led),一个本地节点(接受命令并真正的让led亮起来),可以设置这个操作led的事情是一个cluster,其下包含三个命令,一个open,一个close,一个readattribute,灯还有一个attribute,那就是当前的status,远程节点可以用open和close命令控制灯,也可以随时发一个readattibute命令读取本地节点led的状态。端点(endpoint)是一个8位的字段,描述一个射频端所支持的不同应用。端点0x00:用于寻址设备配置文件,这是每个ZigBee设备必须使用的端点;端点0xff:用于寻址所有活动端点;端点0xf1~0xfe:保留;端点0x01~0xf0:共支持240个应用,即一个物理信道最多支持240个虚拟链路。每个端点要创建一个简单描述符,用于服务发现。ZStack中Endpoint描述符typedefstruct{byteendPoint;//端点号1-240byte*task_id;//任务ID号SimpleDescriptionFormat_t*simpleDesc;//简单描述符afNetworkLatencyReq_tlatencyReq;//延时请求}endPointDesc_t;//端点描述符ZStack中简单描述符typedefstruct{byteEndPoint;//端点号1-240uint16AppProfId;//支持的ProfileIDuint16AppDeviceId;//支持的设备IDbyteAppDevVer:4;//执行的设备描述的版本byteReserved:4;//保留byteAppNumInClusters;//终端支持的输入簇数目cId_t*pAppInClusterList;//指向输入ClusterID列表的指针byteAppNumOutClusters;//终端支持的输出簇数目cId_t*pAppOutClusterList;//指向输出ClusterID列表的指针}SimpleDescriptionFormat_t;//简单描述符ZDO---Zigbee设备对象ZigBee设备对象(ZDO)是驻留于应用层(APL)的一种应用解决方案,它位于ZigBee协议栈的应用支持子层(APS)之上。ZDO负责初始化应用支持子层(APS)、网络层(NWK)、安全服务提供模块(SSP)及非1~240端点应用的任何其他ZigBee设备层;另外ZDO还负责从终端应用收集配置信息来实现设备和服务发现、安全管理、网络管理、绑定管理和节点管理功能。添加用户任务流程Step1添加文件userApp.h、userApp.c和OSAL_UserApp.cStep2在头文件中定义常量、宏和声明外部函数Step3在userApp.c中定义并初始化:簇ID简单描述符端点描述Step4编写用户任务初始化函数Step5编写用户任务处理函数Step6osalInitTasks()函数中调用用户初始化函数Step7在tasksArr[]中注册用户任务处理函数添加用户任务流程step3Step3在userApp.c中定义并初始化簇IDconstcId_tGenericApp_ClusterList[GENERICAPP_MAX_CLUSTERS]={GENERICAPP_CLUSTERID};在userApp.h定义簇ID号#defineGENERICAPP_CLUSTERID1添加用户任务流程step3Step3在userApp.c中定义简单描述符constSimpleDescriptionFormat_tGenericApp_SimpleDesc={GENERICAPP_ENDPOINT,//intEndpoint;GENERICAPP_PROFID,//uint16AppProfId[2];GENERICAPP_DEVICEID,//uint16AppDeviceId[2];GENERICAPP_DEVICE_VERSION,//intAppDevVer:4;GENERICAPP_FLAGS,//intAppFlags:4;GENERICAPP_MAX_CLUSTERS,(cId_t*)GenericApp_ClusterList,ERICAPP_MAX_CLUSTERS,(cId_t*)GenericApp_ClusterList};添加用户任务流程step3Step3在userApp.c中定义端点描述符endPointDesc_tGenericApp_epDesc;端点描述符一般在用户任务初始化函数中进行赋值。添加用户任务流程step4Step4编写用户任务初始化函数afAddrType_tGenericApp_DstAddr;voidGenericApp_Init(bytetask_id){GenericApp_TaskID=task_id;GenericApp_NwkState=DEV_INIT;GenericApp_TransID=0;//初始化地址模式GenericApp_DstAddr.addrMode=(afAddrMode_t)AddrNotPresent;GenericApp_DstAddr.endPoint=0;GenericApp_DstAddr.addr.shortAddr=0xffff;//初始化端点描述符.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);//注册按键事件RegisterForKeys(GenericApp_TaskID);HalLcdPutString16_8(0,0,OSALexample,12,1);halUartCfg();MicroWait(50000);}返回标题添加用户任务流程step5Step5编写用户任务处理函数UINT16GenericApp_ProcessEvent(bytetask_id,UINT16events){......if(events&SYS_EVENT_MSG){MSGpkt=(afIncomingMSGPacket_t*)osal_msg_receive(GenericApp_TaskID);while(MSGpkt){switch(MSGpkt-hdr.event){case某个消息或事件:处理函数;break;......}//消息处理后,释放内存osal_msg_deallocate((uint8*)MSGpkt);//接收下一消息MSGpkt=(afIncomingMSGPacket_t*)osal_msg_receive(GenericApp_TaskID);}OSAL任务中的事件与消息事件(EVENT)类型为uint16,位域表述,其形式为:SYS_EVENT_XXX一个OSAL任务最多定义除系统强制事件外的15个事件。事件中通常带用于通讯的消息。消息(MSG)由uint8的ID标识,可有256个。OSAL任务中的事件与消息SYS_EVENT_MSG(0x8000)是强制事件。该事件主要用来发送全局的系统消息,包括以下信息:AF_INCOMING_MSG_CMD:用来指示通过唤醒AFDataRequest()函数发送的数据请求信息的情况。ZSuccess确认数据请求成功的发送。如果数据请求是通过AF_ACK_REQUEST置位实现的,那么ZSussess可以确认数据正确的到达目的地。否则,ZSucess仅仅能确认数据成功的传输到
本文标题:实验教程八---zstack操作系统原理之应用层实验
链接地址:https://www.777doc.com/doc-1873932 .html