资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,无线传感器网络实验教程,z-stack,操作系统原理实验之应用层,主讲教师:柯宗武,2013,年,9,月,Copyright:kezongwu,本章内容,了解,ZigBee,协议应用层相关概念,掌握,ZStack,添加用户任务的方法及工作原理,实验内容,编写一个任务,按下不同按键时执行不同操作。,ZigBee,协议应用层基本概念,应用支持子层,APS,应用框架,应用,Profile,设备,簇,Cluster,端点,ENDPOINT,端点描述符,Zigbee,设备对象,ZDO,术语之间的关系,一个端点代表一个无线应用,如在智能家居中通过网络控制灯的开关是一个应用,用端点,n1,标识,家庭防盗是一个应用,用端点,n2,标识,,n1,!,=n2,且,n1,、,n2,!,=0,ZigBee,协议应用层基本概念,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,: a collection of device descriptions, which together form a cooperative application.,一种,profile,的一个例子是智能家居。这个,ZigBee profile,允许一系列设备类型交换控制信息,以形成一个无线家庭自动化应用。这些设备的目的是交换已知信息来实现控制,比如开关灯,给照明控制器发送一个照明传感测量,或如果一个位置传感器探测到移动时发送一个警报信息。,应用框架,Profile,Profile,在,zigbee,设备间定义了普通行为:无线网络在网络中依靠自制设备的能力同网络连接和发现其他设备上的服务。,Profile,支持设备发现和服务发现,Profile,分为私有域和公有域,但每个,Profile,的标识符都是唯一的。一旦获得一个,Profile,标识符,就可以定义,设备描述和,cluster,标识符,每一个,zigbee,设备都必须至少有一个,zigbee Profile,,一个,zigbee,设备可以支持几个,Profile,一个,public profile,也规定了,profile,的,ID,,比如智能家居就规定是,0x104,Profile,定义了一个应用中涉及到的数据结构及用于通信的函数。,相当于定义了一类设备的“,Class”,应用框架,Profile,0101 Industial Plant Monitoring(IPM),工业用植物检测,0104 Home Automation(HA),家居自动化,0105 Commercial Building Automation(CBA),商业楼宇自动化,0107 Telecom Applications(TA),电信应用,0108 Personal Home&hospital Care(PHHC),个人家庭医院护理,0109 Advanced Metering Initiative(AMI),先进的计量倡议,设备描述与簇,在一个,profile,的规范下,又提出了,cluster,的概念,这个,cluster,要理解成一个大方向下的一个特定对象。,假设要控制一个,LED,,有一个远程节点(发命令控制,led,),一个本地节点(接受命令并真正的让,led,亮起来,),,可以设置这个操作,led,的事情是一个,cluster,,其下包含三个命令,一个,open,,一个,close,,一个,read attribute,,灯还有一个,attribute,,那就是当前的,status,,远程节点可以用,open,和,close,命令控制灯,也可以随时发一个,read attibute,命令读取本地节点,led,的状态。,端点(,endpoint,),是一个,8,位的字段,描述一个射频端所支持的不同应用。,端点,0x00,:用于寻址设备配置文件,这是每个,ZigBee,设备必须使用的端点;,端点,0xff,:用于寻址所有活动端点;,端点,0xf10xfe,:保留;,端点,0x010xf0,: 共支持,240,个应用,即一个物理信道最多支持,240,个虚拟链路。,每个端点要创建一个简单描述符,用于服务发现。,ZStack,中,Endpoint,描述符,typedef struct,byte endPoint;,/,端点号,1-240,byte *task_id;,/,任务,ID,号,SimpleDescriptionFormat_t *simpleDesc;,/,简单描述符,afNetworkLatencyReq_t latencyReq;,/,延时请求, endPointDesc_t;,/,端点描述符,ZStack,中简单描述符,typedef struct,byte EndPoint;,/,端点号,1-240,uint16 AppProfId;,/,支持的,Profile ID,uint16 AppDeviceId;,/,支持的设备,ID,byte AppDevVer:4;,/,执行的设备描述的版本,byte Reserved:4;,/,保留,byte AppNumInClusters;,/,终端支持的输入簇数目,cId_t *pAppInClusterList;,/,指向输入,Cluster ID,列表的指针,byte AppNumOutClusters;,/,终端支持的输出簇数目,cId_t *pAppOutClusterList;,/,指向输出,Cluster ID,列表的指针, SimpleDescriptionFormat_t;,/,简单描述符,ZDO-Zigbee,设备对象,ZigBee,设备对象(,ZDO,)是驻留于应用层(,APL,)的一种应用解决方案,它位于,ZigBee,协议栈的应用支持子层(,APS,)之上。,ZDO,负责初始化应用支持子层(,APS,)、网络层(,NWK,)、安全服务提供模块(,SSP,)及非,1240,端点应用的任何其他,ZigBee,设备层;另外,ZDO,还负责从终端应用收集配置信息来实现设备和服务发现、安全管理、网络管理、绑定管理和节点管理功能。,添加用户任务流程,Step1,添加文件,userApp.h,、,userApp.c,和,OSAL_UserApp.c,Step2,在头文件中定义常量、宏和声明外部函数,Step3,在,userApp.c,中定义并初始化:,簇,ID,简单描述符,端点描述,Step4,编写用户任务初始化函数,Step5,编写用户任务处理函数,Step6,osalInitTasks(),函数中调用用户初始化函数,Step7,在,tasksArr,中注册用户任务处理函数,添加用户任务流程,step3,Step3,在,userApp.c,中定义并初始化簇,ID,const cId_t GenericApp_ClusterList GENERICAPP_MAX_CLUSTERS =,GENERICAPP_CLUSTERID,;,在,userApp.h,定义簇,ID,号,#define GENERICAPP_CLUSTERID 1,添加用户任务流程,step3,Step3,在,userApp.c,中定义简单描述符,const SimpleDescriptionFormat_t GenericApp_SimpleDesc =,GENERICAPP_ENDPOINT, / int Endpoint;,GENERICAPP_PROFID, / uint16 AppProfId2;,GENERICAPP_DEVICEID, / uint16 AppDeviceId2;,GENERICAPP_DEVICE_VERSION, / int AppDevVer:4;,GENERICAPP_FLAGS, / int AppFlags:4;,GENERICAPP_MAX_CLUSTERS,(cId_t *)GenericApp_ClusterList,ERICAPP_MAX_CLUSTERS,(cId_t *)GenericApp_ClusterList,;,添加用户任务流程,step3,Step3,在,userApp.c,中定义端点描述符,endPointDesc_t GenericApp_epDesc;,端点描述符一般在,用户任务初始化函数中进行赋值。,添加用户任务流程,step4,Step4,编写用户任务初始化函数,afAddrType_t GenericApp_DstAddr;,void GenericApp_Init( byte task_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_epDesc.simpleDesc,= (SimpleDescriptionFormat_t *),GenericApp_epDesc.latencyReq = noLatencyReqs;,/,注册用户设备、端点,afRegister( ,/,注册按键事件,RegisterForKeys( GenericApp_TaskID );,HalLcdPutString16_8(0, 0, OSAL example,12, 1);,halUartCfg();,MicroWait(50000);,返回标题,添加用户任务流程,step5,Step5,编写用户任务处理函数,UINT16 GenericApp_ProcessEvent( byte task_id, UINT16 events ), .,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,:用来指示通过唤醒,AF DataRequest( ),函数发送的数据请求信息的情况。,ZSuccess,确认数据请求成功的发送。如果数据请求是通过,AF_ACK_REQUEST,置位实现的,那么,ZSussess,可以确认数据正确的到达目的地。否则,,ZSucess,仅仅能确认数据成功的传输到了下一个路由。,KEY_ CHANGE,:用来确认按键动作。,ZDO_ NEW_ DSTADDR,:用来指示自动匹配请求。,ZDO_STATE_CHANGE,:用来指示网络状态的变化。,OSAL,任务中的事件与消息,按键事件处理流程,Main,程序中调用,HalDriverInit();,HalDriverInit (),中调用,HalKeyInit();,InitBoard(),调用,HalKeyConfig (),进行按键方式选择及,IO,、回调函数的配置,HalKeyConfig( OnboardKeyIntEnable, OnBoard_KeyCallback);,在,OSAL,中调用,Hal_ProcessEvent(),进行按键的轮询,其中轮询方式下,HalKeyPoll(),若按键的值发生变化则判定有按键,返回标题,添加用户任务流程,step6,Step6 osalInitTasks(),函数中调用用户初始化函数,osalInitTasks(),任务初始化函数代码分析,void osalInitTasks( void ),uint8 taskID = 0;,tasksEvents = (uint16 *)osal_mem_alloc( sizeof( uint16 ) * tasksCnt);,osal_memset( tasksEvents, 0, (sizeof( uint16 ) * tasksCnt);,macTaskInit( taskID+ );,nwk_init( taskID+ );,Hal_Init( taskID+ );,ZDApp_Init( taskID+ );,GenericApp_Init( taskID+ );,为任务事件映射表分配存储空间,,tasksCnt,为任务数,,tasksEvents,是指向该内存空间的指针。,所有任务的所有事件置零,用户任务初始化,添加用户任务流程,step7,Step7,在,tasksArr,中注册用户任务处理函数,初始化应用服务,-,tasksArr,数组,const pTaskEventHandlerFn tasksArr = ,macEventLoop, /MAC,层任务处理函数,nwk_event_loop, /,网络层任务处理函数,Hal_ProcessEvent, /,硬件抽象层任务处理函数,ZDApp_event_loop, /,设备应用层任务处理函数,用户可以根据需要修改,GenericApp_ProcessEvent /,用户应用层任务处理函数,用户自己生成,;,THANKS,OSAL(Operating System Abstraction Layer),操作系统抽象层,定义了其它模块中事件的处理机制。它将每一模块内的所有事件放在一个任务中进行处理,任务间的通信通过传递系统消息来完成,这使得协议栈中的事件处理更类似于一个操作系统;,同时它还定义了堆内存管理、,NV(non-volatile,,非易失,),存储系统的管理、电源管理、时钟管理等。,OSAL,轮询操作系统,OSAL,的主要功能,任务的登记,加载,初始化及启动任务调度,任务之间的信息传递,任务同步,中断操作,定时器功能,内存单元管理,OSAL,在协议中的组成,调度系统核心,时间处理,内存管理系统,FLASH,管理,电源管理,定时器管理,OSAL,的任务调度,OSAL,是协议栈的核心,,Z-Stack,的任何一个子系统都作为,OSAL,的一个任务。,任务调度函数按照优先级检测各个任务是否就绪。如果存在就绪的任务则调用,tasksArr,中相对应的任务处理函数去处理该事件,直到执行完所有就绪的任务。如果任务列表中没有就绪的任务,则可以使处理器进入睡眠状态实现低功耗。,OSAL,的任务调度,Z-stack,的任何一个子系统都作为,OSAL,的一个任务,因此在开发应用层的时候,必须通过创建,OSAL,任务来运行应用程序。通过,osalInitTasks( ),函数创建,OSAL,任务,其中,TaskID,为每个任务的唯一标识号。任何,OSAL,任务必须分为两步:,分配任务内存空间,和指定唯一的标识号。,处理任务事件通过创建“,ApplicationName”_ProcessEvent(),函数处理。,在,AF,层注册应用对象,通过填入,endPointDesc_t,数据格式的,EndPoint,变量,调用,afRegister( ),在,AF,层注册,EndPoint,应用对象。,通过在,AF,层注册应用对象的信息,告知系统,afAddrType_t,地址类型数据包的路由端点。,注册相应的,OSAL,或,HAL,系统服务,在协议栈中,,Z-stack,提供键盘响应和串口活动响应两种系统服务,但是任何,Z-Stask,任务均不自行注册系统服务,两者均需要由用户应用程序注册。值得注意的是,有且仅有一个,OSAL Task,可以注册服务。例如注册键盘活动响应可调用,RegisterForKeys( ),函数。,
展开阅读全文