1ZigBee应用开发2内容摘要Z-Stack协议栈OSAL初始化流程简析Z-Stack协议栈MT层任务解析SampleApp自组无线网实例解析基于Z-Stack协议栈添加用户应用层任务的方法3Z-Stack协议栈OSAL初始化流程简析4Z-Stack软件层次整个Z-Stack的主要工作流程,大致分为系统启动,驱动初始化,OSAL初始化和启动,进入任务轮循几个阶段。5Z-Stack软件启动流程系统上电后,通过执行Zmain文件夹中ZMain.c的主函数开始系统初始化。当顺利完成上述初始化时,执行osal_start_system()函数开始运行OSAL系统。6OSAL轮询操作系统OSAL(OperatingSystemAbstractionLayer)操作系统抽象层定义了其它模块中的事件的处理机制。它将每一模块内的所有事件放在一个任务中进行处理,任务间的通信通过传递系统消息来完成,这使得协议栈中的事件处理更类似于一个操作系统;同时它还定义了堆内存管理、NV(non-volatile,非可变)存储系统的管理、电源管理、时钟管理等。7OSAL的任务调度OSAL是协议栈的核心,Z-Stack的任何一个子系统都作为OSAL的一个任务。任务调度函数按照优先级检测各个任务是否就绪。如果存在就绪的任务则调用tasksArr[]中相对应的任务处理函数去处理该事件,直到执行完所有就绪的任务。如果任务列表中没有就绪的任务,则可以使处理器进入睡眠状态实现低功耗。8任何OSAL任务必须分为两步:任务初始化分配任务内存空间,和指定唯一的标识号。处理任务事件。处理任务事件通过创建“ApplicationName”_ProcessEvent()函数处理。最终通过voidosalTaskAdd函数完成任务的添加。OSAL的任务9OSAL中有些任务是协议栈运行所必须的,因此在工程中都要加入到任务数组中去(默认)。OSAL中的重要任务10事件(EVENT)类型为uint16,位域表述,其形式为:SYS_EVENT_XXX一个OSAL任务最多定义除系统强制事件外的15个事件。事件中通常待用用于通讯的消息。消息(MSG)由uint8的ID标识,可有256个。OSAL任务中的事件与消息11SYS_EVENT_MSG(0x8000)是强制事件。该事件主要用来发送全局的系统消息,包括以下信息:AF_INCOMING_MSG_CMD:用来指示接收到的AF信息。KEY_CHANGE:用来确认按键动作。ZDO_NEW_DSTADDR:用来指示自动匹配请求。ZDO_STATE_CHANGE:用来指示网络状态的变化。通常我们都是在任务的事件循环中去处理以上事件和消息。OSAL任务中的事件与消息12OSAL任务中的事件与消息13NWK层为更高层提供了如下功能:网络管理地址管理网络参数与功能函数除了管理功能,NWK还提供了应用程序没有的数据服务。应用程序可以通过AF数据接口。AF数据接收:afIncomingData()AF数据发送:AF_DataRequest()网络层重要API14网络管理NLME_NetworkFormationRequest()此函数允许相邻的更高层请求设备组建一个新网络。NLME_NetworkDiscoveryRequest()此函数请求网络层寻找相邻路由器。NLME_JoinRequest()此函数允许相邻的更高层请求设备将自己加入到一个网络中。NLME_ReJoinRequest()使用此函重新加入一个设备已经加入过的网络。网络层重要API15地址管理NLME_GetExtAddr()这个函数将返回指向IEEE设备64地址的指针。NLME_GetShortAddr()这个函数将返回设备的(16位短)网络地址。NLME_GetCoordShortAddr()这个函数将返回设备父节点的(16位短)网络地址。NLME_GetCoordExtAddr()这个函数是将获得设备的父节点设备的IEEE(64位)地址。网络层重要API16AF数据发送网络层重要API17Z-Stack协议栈MT层任务解析18MonitorTestMT模块提供了协议栈与上位机软件交互的接口。它利用串口进行数据的物理传输,并定义了串口数据包的格式,同时定义了数据包的封装、解析与处理方法。MT层相关任务支持的编译选项:MT_TASK、ZTOOL_P1。MT层任务模块概述19协议栈在接收到上位机串口数据包后,将由串口回调函数调用MT层任务进行处理。MT层串口数据包处理流程20用户如何自定义协议栈中与上位机串口数据传输协议?串口回调函数的定义:MT层串口数据包处理流程21SampleApp自组无线网实例解析22SampleApp工程是协议栈自带的ZigBee无线网络自启动(组网)样例,该实验实现的功能主要是协调器自启动(组网),节点设备自动入网,之后两者建立无线通讯。无线数据触发方式:周期定时发送信息按键事件触发信息SampleApp工程简介23网络的管理网络的创建、加入、恢复等管理通过ZDO层来调用下层相关服务(网络原语)实现。Z-Stack协议栈中将ZDO层的服务以ZDAPP任务模块来实现。工程中通过大量的条件编译实现对启动流程的控制。SampleApp工程简介24协调器协调器实现自动组建ZigBee网络。配置文件$PROJ_DIR$\..\..\..\Tools\CC2430DB\f8wCoord.cfg$PROJ_DIR$\..\..\..\Tools\CC2430DB\f8wConfig.cfg预编译选项CC2430EB;ZTOOL_P1;MT_TASK;MANAGED_SCANSampleApp工程25协调器创建网络流程:SampleApp工程简介26路由器路由器实现自动发现并加入ZigBee网络。配置文件$PROJ_DIR$\..\..\..\Tools\CC2430DB\f8wRouter.cfg$PROJ_DIR$\..\..\..\Tools\CC2430DB\f8wConfig.cfg预编译选项CC2430EB;ZTOOL_P1;MT_TASK;SampleApp工程27路由器发现加入网络流程:SampleApp工程简介28终端节点终端节点实现自动发现并加入ZigBee网络。配置文件$PROJ_DIR$\..\..\..\Tools\CC2430DB\f8wEndev.cfg$PROJ_DIR$\..\..\..\Tools\CC2430DB\f8wConfig.cfg预编译选项CC2430EB;NWK_AUTO_POLL;ZTOOL_P1;MT_TASK;SampleApp工程29终端节点发现加入网络流程:SampleApp工程简介30发送periodic信息流程Periodic消息是通过系统定时器并定时广播出去的,因此在SampleApp_ProcessEvent事件处理函数中有如下定时器代码SampleApp工程简介31发送periodic信息流程事件SAMPLEAPP_SEND_PERIODIC_MSG_EVT处理。SampleApp_ProcessEvent()处理该事件处理函数调用SampleApp_SendPeriodicMessage()来发送周期信息。SampleApp工程简介32发送周期消息函数SampleApp工程简介33AF数据的通讯在应用层任务的SampleApp_ProcessEvent事件消息循环中,根据事件类型处理端点间的无线数据消息(AF_INCOMING_MSG_CMD)。SampleApp工程简介34AF数据的通讯消息处理函数SampleApp_MessageMSGCB中,根据簇ID来标识不同的属性(AF数据)并进一步处理。SampleApp工程简介35基于Z-Stack协议栈添加用户应用层任务的方法36如何在应用层添加自己的任务?Z-Stack协议栈以OSAL贯穿始终,用户要添加自己的应用,需要以任务的方式实现。协议栈中已经将底层的任务模块(必要任务)完成,且留有应用层相应的接口。添加任务函数:voidosalAddTasks(void)voidosalTaskAdd(pTaskInitFnpfnInit,pTaskEventHandlerFnpfnEventProcessor,bytetaskPriority)添加应用层任务37完成两个函数任务初始化函数usrTask_Init(uint8task_id)主要完成内容有任务ID的设置、网络状态的初始化、端点的AF注册等。任务事件处理函数usrTask_ProcessEvent(uint8task_id,uint16events)主要完成的内容有传递到应用层任务的事件和消息的处理。添加应用层任务38添加用户任务osalTaskAdd(usrTask_Init,usrTask_ProcessEvent,OSAL_TASK_PRIORITY_LOW);添加应用层任务39