项目三了解无线传感器协议栈.docx
- 文档编号:26625979
- 上传时间:2023-06-20
- 格式:DOCX
- 页数:14
- 大小:22.49KB
项目三了解无线传感器协议栈.docx
《项目三了解无线传感器协议栈.docx》由会员分享,可在线阅读,更多相关《项目三了解无线传感器协议栈.docx(14页珍藏版)》请在冰豆网上搜索。
项目三了解无线传感器协议栈
项目三了解无线传感器协议栈
项目三了解ZigBee无线传感器网络协议栈知识目标1.掌握zigbee无线传感器网络的协议栈和协议的区别等知识。
2.掌握Z-Stack协议栈的OSAL分配机制。
3.了解Z-Stack协议栈的OSAL运行机制。
4.掌握Z-Stack协议栈的OSAL常用函数。
项目三了解ZigBee无线传感器网络协议栈技能目标1.掌握Z-Stack协议栈的运行机制。
2.掌握Z-Stack协议栈中OSAL的添加新任务的方法。
项目三了解ZigBee无线传感器网络协议栈在实际zigbee无线传感器网络工程的开发过程中首先借助TI提供的协议栈中例程SampleApp,接着根据需要完成的功能,查看支持Z-Stack协议栈的硬件电路图,再查阅数据手册(CC2530的数据手册、Z-Stack协议栈说明、Z-Stack协议栈API函数使用说明等)文件,然后再进行协议栈的修改。
最后,还需要烧录器下载到相应的硬件,实现zigbee无线传感器网络的组建和开发。
设计思路3.1.1协议与协议栈协议定义的是一系列的通信标准,通信双方需要共同按照这一标准进行正常的数据收发;议栈是协议的具体实现形式。
通俗的理解为代码实现的函数库,以便于开发人员调用。
3.1Z-Stack协议栈3.1.1协议与协议栈协议栈是指网络中各层协议的总和,一套协议的规范。
其形象地反映了一个网络中文件传输的过程由上层协议到底层协议,再由底层协议到上层协议。
使用最广泛的是因特网协议栈,由上到下的协议分别是应用层(Http、Tel、DNS、Email等),运输层(TCP、UDP),网络层(IP),链路层(WI-FI、以太网、令牌环、FDDI等)。
3.1Z-Stack协议栈3.1.1协议与协议栈3.1Z-Stack协议栈3.1.1协议与协议栈Zigbee协议栈开发的基本思路如下。
①借助TI提供的协议栈中例程SampleApp进行二次开发,用户不需要深入研究复杂的zigbee协议栈,这样可以减轻开发者的工作量。
②Zigbee无线传感器网络中数据采集,只需要用户在应用层加入传感器的读取函数和添加头文件即可实现。
③如果考虑节能,可以根据数据采集周期(zigbee协议栈例程中已开发了定时程序)进行定时,定时时间到就唤醒zigbee终端节点,终端节点唤醒后,自动采集传感器数据,然后将数据发送给路由器或者直接发给协调器,即监测节点定时汇报监测数据。
④协调器(网关)根据下发的控制命令,将控制信息转发到具体的节点,即控制节点等待控制命令下发。
3.1Z-Stack协议栈3.1.2使用Z-Stack协议栈传输SampleApp.c中定义了发送函数staticvoidSampleApp_SendTheMessage(void)。
该函数通过调用AF_DataRequest来发送数据。
该函数定义在Profile目录下的AF.c文件中。
3.1Z-Stack协议栈3.1.2使用Z-Stack协议栈传输*dstAddr发送目的地址+端点地址(端点号)和传送模式。
*srcEP源(答复或确认)终端的描述(比如操作系统中任务ID等)源源EP。
cID被Profile指定的有效的集群号。
len发送数据长度。
*buf指向存放发送数据的缓冲区的指针。
*transID任务ID号。
options:
有效位掩码的发送选项。
Radius发送跳数,通常设置为AF_DEFAULT_RADIUS。
3.1Z-Stack协议栈3.2.1物理层物理层(PHY)定义了无线信道和MAC子层之间的接口,提供物理层数据服务和物理层管理服务,主要是在驱动程序的基础上,实现数据传输和管理。
物理层数据服务从无线物理信道上收发数据,管理服务包括信道能量监测(ED)、链接质量指示(LQI)、载波检测(CS)和空闲信道评估(CCA)等,维护一个由物理层相关数据组成的数据库。
3.2zigbee无线传感器网络功能层简介3.2.2质访问控制层介质访问控制层(MAC)提供点对点通信的数据确认(Per-hopAcknowledgments)以及一些用于网络发现和网络形成的命令,但是介质访问控制层不支持多跳(Multi-hop)、网型网络(Mesh)等概念3.2zigbee无线传感器网络功能层简介3.2.3网络层网络层(NWK)主要负责设备加入和退出网络、路由管理,在设备之间发现和维护路由,发现邻设备,存储邻设备信息等。
3.2zigbee无线传感器网络功能层简介3.2.3网络层网络层(NWK)主要负责设备加入和退出网络、路由管理,在设备之间发现和维护路由,发现邻设备,存储邻设备信息等。
1.地址类型2.网络地址分配3.Z-Stack寻址4.路由5.安全3.2zigbee无线传感器网络功能层简介3.2.4应用层应用层主要包括应用支持子层(APS)和Zigbee设备对象(ZDO)。
其中,APS负责维护和绑定表、在绑定设备之间传送消息;而ZDO定义设备在网络中的角色,发起和响应绑定请求,在网络设备之间建立安全机制。
3.2zigbee无线传感器网络功能层简介3.3.1OSAL基础知识1.资源(Resource)2.共享资源(SharedResource)3.任务(Task)4.多任务运行(Muti-TaskRunning)5.内核(Kernel)6.互斥(MutualExclusion)7.消息队列(MessageQueue)3.3OSAL多任务分配机制3.3.1OSAL基础知识1.资源(Resource)2.共享资源(SharedResource)3.任务(Task)4.多任务运行(Muti-TaskRunning)5.内核(Kernel)6.互斥(MutualExclusion)7.消息队列(MessageQueue)3.3OSAL多任务分配机制3.3.2OSAL简介Z-stack是TI公司开发的zigbee协议栈,并经过zigbee联盟认可而被全球众多开发商所广泛采用。
Z-Stack采用基于一个轮转查询式操作系统,帮助程序员方便地开发一套zigbee系统。
3.3OSAL多任务分配机制3.3.2OSAL简介3.3OSAL多任务分配机制3.3.2OSAL简介一般情况下,用户只需额外添加3个文件就可以完成一个项目,一个是主控文件,存放具体的任务事件处理函数(例如SampleApp_ProcessEvent或GenericApp_ProcessEvent);一个是这个主控文件的头文件(例如SampleApp.h),另外一个是操作系统接口文件(例如OSAL_SampleApp.c),该文件主要存放任务数组tasksArr[],任务数组的具体内容为每个任务的相应的处理函数指针。
3.3OSAL多任务分配机制3.3.2OSAL简介“数据实体接口”的目标是向上层提供所需的常规数据服务;“管理实体接口”的目标是向上层提供访问内部层的参数、配置和管理数据服务。
物理层和媒体接入控制子层均属于IEEE802.15.4标准,而IEEE802.15.4标准与网络/安全层、应用层一起,构成了zigbee协议栈。
3.3OSAL多任务分配机制3.3.3协议栈软件架构整个Z-Stack的主要工作流程大致分为系统启动、驱动初始化、OSAL初始化和启动、进入任务轮询几个阶段。
3.3OSAL多任务分配机制3.3.3协议栈软件架构3.3OSAL多任务分配机制3.3.3协议栈软件架构系统上电后,通过执行ZMain文件夹中ZMain.c的main()函数实现硬件的初始化。
关总中断osal_int_disable(INTS_ALL);初始化板上硬件设置HAL_BOARD_INIT();检查工作电压状态zmain_vdd_check();初始化I/O口InitBoard(OB_COLD);初始化HAL层驱动HalDriverInit();初始化非易失性存储器sal_nv_init(NULL);初始化MAC层ZMacInit();分配64位地址zmain_ext_addr();初始化Zstack的全局变量并初始化必要的NV项目zgInit();初始化操作系统osal_init_system();使能全局中断osal_int_enable(INTS_ALL);初始化后续硬件InitBoard(OB_READY);显示必要的硬件信息zmain_dev_info();最后进入操作系统调度osal_start_system()。
3.3OSAL多任务分配机制此例程的默认路径为C:
\TexasInstruments\ZStack-CC2530-2.3.0-1.4.0\Projects\zstack\Samples\SampleApp\CC2530DB下找到SampleApp.eww。
在右侧工作空间窗口打开App文件夹,我们可以看到5个文件,分别是“SampleApp.c”、“SampleApp.h”、“OSAL_SampleApp.c”、“SampleAppHw.c”、“SampleAppHw.h”。
整个程序所实现的功能都在这5个文件当中。
3.4OSAL运行机制运行机制。
3.4OSAL运行机制①①tasksCnt该变量保存了任务数,其声明为constuint8tasksCnt,其中uint8的定义为typedefunsignedcharuint8。
tasksCnt变量的定义在OSALSampleApp.c文件中。
②②tasksEvents为该变量是一个指针,指向了事件表的首地址,其声明为uint16*tasksEvents,其中uint16的定义为typedefunsignedshortuint16。
tasksEvents[]是一个指针数组,只是在OSAL_SampleApp.c文件进行定义。
③③tasksArr该变量是一个数组,该数组的每一项都是一个函数指针,指向了事件的处理函数,其声明为pTaskEventHandlerFntasksArr[],其中pTaskEventHandlerFn的定义为typedefunsignedshort(*pTaskEventHandlerFn)(unsignedchartask_id,unsignedshortevent)。
变量pTaskEventHandlerFn的定义OSAL_Tasks.h文件中。
3.4OSAL运行机制OSAL调度机制如下。
①入口程序为Zmain.c;②执行main()主程序;③任务调度初始化osal_init_system();④默认启动了osalInitTasks(),最多9个任务,添加到队列,序号0~8;⑤最后通过调用SampleApp_Init()实现用户自定义任务的初始化(用户根据项目需要修改该函数)。
3.4OSAL运行机制3.4.1OSAL任务启动和初始化任何OSAL任务的工作必须分为两步一是进行任务初始化;二是处理任务事件。
3.4OSAL运行机制开始系统初始化执行操作系统3.4.1OSAL任务启动和初始化任务初始化主要步骤如下。
①初始化应用服务变量constpTaskEventHandlerFntasksArr[]数组定义系统提供的应用服务和用户服务变量,如MAC层服务macEventLoop、用户服务SampleApp_ProcessEvent等。
②分配任务ID和分配堆栈内存voidosalInitTasks(void)主要功能是通过调用osal_mem_alloc()函数给各个任务分配内存空间,给各个已定义任务指定唯一的标识号。
③在AF层注册应用对象通过填入endPointDesc_t数据格式的EndPoint变量,调用afRegister()在AF层注册EndPoint应用对象。
通过在AF层注册应用对象的信息,告知系统afAddrType_t地址类型数据包的路由端点,例如用于发送周期信息的SampleApp_Periodic_DstAddr和发送LED闪烁指令的SampleApp_Flash_DstAddr。
④注册相应的OSAL或者HAL系统服务在协议栈中,Z-Stack提供键盘响应和串口活动响应两种系统服务,但是任何Z-Stask任务均不自行注册系统服务,两者均需要由用户应用程序注册。
值得注意的是,有且仅有一个OSALTask可以注册服务。
例如注册键盘活动响应可调用RegisterForKeys()函数。
⑤处理任务事件处理任务事件通过创建“ApplicationName”_ProcessEvent()函数处理。
一个OSAL任务可以响应16个事件,除了协议栈默认的强制事件(MandatoryEvents)之外还可以再定义15个事件。
3.4OSAL运行机制3.4.1OSAL任务启动和初始化SYS_EVENT_MSG(0x8000)是强制事件。
该事件主要用来发送全局的系统信息,包括以下信息。
AF_DATA_CONFIRM_CMD该信息用来指示通过唤醒AFDataRequest()函数发送的数据请求信息的情况。
AF_INING_MSG_CMD用来指示接收到的AF信息。
KEY_CHANGE用来确认按键动作。
ZDO_NEW_DSTADDR用来指示自动匹配请求。
ZDO_STATE_CHANGE用来指示网络状态的变化。
3.4OSAL运行机制3.4.2OSAL任务的执行osal_start_system();//运行系统[OSAL.c],进入系统调度,无返回osal_start_system();//此函数是任务系统的主循环函数,它将轮询所有任务事件然后调用相关的任务处理函数,没有任务时将进入休眠状态。
3.4OSAL运行机制事件表和函数表的关系3.4OSAL运行机制tasksEvents[0]macEventsLooptasksEvents[1]nwk_events_loopHal_ProcessEventtasksEvents[2]tasksEvents[3]tasksEvents[4]tasksEvents[5]tasksEvents[6]tasksEvents[7]tasksEvents[8]MT_ProcessEventAPS_event_loopAPSF_ProcessEventZDApp_event_loopZDNwkMgr_event_loopSampleApp_ProcessEventtasksEventtasksArr[0]tasksArr[1]tasksArr[2]tasksArr[3]tasksArr[4]tasksArr[5]tasksArr[6]tasksArr[7]tasksArr[8]taskArr这个数组里存放了所有任务的事件处理函数的地址,在这里事件处理函数就代表了任务本身,也就是说事件处理函数标识了与其对应的任务。
tasksCnt这个变量保存了当前的任务个数,最大任务数量为9。
tasksEvents是一个指向数组的指针,此数组保存了当前任务的状态。
OSAL每个任务可以有16个事件,其中SYS_EVENT_MSG定义为0x8000,为系统事件,用户可以定义剩余的15个事件。
3.4OSAL运行机制其中,任务处理函数具体如下。
macEventLoop,//MAC层任务处理函数nwk_event_loop,//网络层任务处理函数Hal_ProcessEvent,//硬件抽象层任务处理函数MT_ProcessEvent,//监控任务处理函数可选(透过编译选项MT_TASK来决定是否编译该任务处理函数,一般情况下该功能通过串行端口通信来交换实现)APS_event_loop,//应用支持子层任务处理函数,用户不用修改APSF_ProcessEvent,//应用支持子层消息分割任务处理函数(用户编译选项ZIGBEE_FRAGMENTATION来决定是否启动zigbee消息分割功能)ZDApp_event_loop,//设备应用层任务处理函数,用户可以根据需要修改ZDNwkMgr_event_loop,//网络管理层任务处理函数(用户可透过编译选项ZIGBEE_FREQ_AGILITY或ZIGBEE_PANID_CONFIG来实现该功能)SampleApp_ProcessEvent,//用户应用层任务处理函数,用户自己编写。
3.4OSAL运行机制3.4.3OSAL的事件传递机制从天线接收到数据后,会产生AF_INING_MSG_CMD消息,但是任务的事件处理函数在处理这个事件的时候,还需要得到所接收到的数据。
因此,这就需要将事件和数据封装成一个消息,将消息发送到消息队列,然后在事件处理函数中就可以使用osal_msg_receive,从消息队列中得到该消息,即MSGpkt=(afIningMSGPacket_t*)osal_msg_receive(SampleicApp_TaskID);3.4OSAL运行机制3.4.3OSAL的事件传递机制3.4OSAL运行机制用户自定义的消息uint8dest_iduint16lenvoid*next用户自定义的消息uint8dest_iduint16lenvoid*nextuint8dest_iduint16lenvoid*next用户自定义的消息3.4.3OSAL的事件传递机制
(1)协调器从没有网络到组建起网络,触发网络状态变更事件ZDO_STATE_CHANGE。
(2)路由/节点从没有接入网络到接入网络,触发网络状态变更事件ZDO_STATE_CHANGE。
3.4OSAL运行机制3.4.3OSAL的事件传递机制caseZDO_STATE_CHANGE:
SampleApp_NwkState=(devStates_t)(MSGpkt->hdr.status);if((SampleApp_NwkState==DEV_ZB_COORD)||(SampleApp_NwkState==DEV_ROUTER)||(SampleApp_NwkState==DEV_END_DEVICE)){//Startsendingtheperiodicmessageinaregularinterval.3.4OSAL运行机制3.4.3OSAL的事件传递机制这个表示默认启动第2个事件SAMPLEAPP_SEND_PERIODIC_MSG_EVT。
osal_start_timerEx(SampleApp_TaskID,SAMPLEAPP_SEND_PERIODIC_MSG_EVT,SAMPLEAPP_SEND_PERIODIC_MSG_TIMEOUT);//5s定时事件}else{//Deviceisnolongerinthework}break;3.4OSAL运行机制3.4.4OSAL添加新任务在Z-Stack中,对于每个用户自己新建立的任务通常需要2个相关的处理函数,具体如下。
(1)新任务的初始化函数例如SampleApp_Init(),这个函数是在osalInitTasks()这个OSAL(Z-Stack中自带的小操作系统)中去调用的,其目的就是把一些用户自己写的任务中的一些变量、网络模式、网络终端类型等进行初始化,并且自劢给每个任务分配一个ID。
(2)新任务的事件处理函数例如SampleApp_ProcessEvent(),这个函数是首先在constpTaskEventHandlerFntasksArr[]中进行设置,然后在osalInitTasks()中如果发生事件进行调用绑定的事件处理函数。
3.4OSAL运行机制3.4.4OSAL添加新任务1.用户自己设计的任务代码在Z-Stack中的调用过程①首先执行main()(在ZMain.c文件中)主程序,接着执行osal_init_system()。
②接着在osal_init_system()调用osalInitTasks()(在OSAL.c文件中)。
③最后在osalInitTasks()中调用SampleApp_Init()(在OSAL_SampleApp.c文件中)。
在osalInitTasks()中实现了多个任务初始化的设置,其中macTaskInit(taskID++)到ZDApp_Init(taskID++)的几行代码表示对于几个系统运行初始化任务的调用,而用户自己实现的SampleApp_Init()在最后,这里taskID随着任务的增加也随乊递增。
所以用户自己实现的任务的初始化操作应该在osalInitTasks()中增加。
3.4OSAL运行机制3.4.4OSAL添加新任务2.任务处理调用的重要数据结构这里要解释一下,在Z-Stack里,对于同一个任务可能有多种事件发生,那么需要执行不同的事件处理,为了方便,对于每个任务的事件处理函数都统一在一个处理函数中实现,然后根据任务的ID号(task_id)和该任务的具体事件(events)调用某个任务的总事件处理函数,进入了该任务的总事件处理函数乊后,再根据events再来判别是该任务的哪一种事件发生,进而执行相应的事件处理。
3.4OSAL运行机制3.4.4OSAL添加新任务OSAL将硬件的管理也作为一个任务来处理。
那么我们很自然地去寻找Hal_ProcessEvent这个事件处理函数,看看它究竟是如何管理硬件资源的。
3.4OSAL运行机制3.4.5事件的捕获3.对于不同事件发生后的任务处理函数的调用osal_start_system()很重要,决定了当某个任务的事件发生后调用对应的事件处理函数。
对应调用第idx个任务的事件处理函数,用events说明是什么事件。
events=(tasksArr[idx])(idx,events);用户自定义功能在taskApp.c文件中利用AddTask_Event()函数实现3.4OSAL运行机制1.消息管理API消息管理API主要用于处理任务间消息的交换,主要包括任务分配消息缓存、释放消息缓存、接收消息和收送消息等API函数。
①osal_msg_allocate()函数原型uint8*osal_msg_allocate(uint16len)。
功能描述为消息分配缓存空间。
②osal_msg_deallocate()函数原型uint8*osal_msg_allocate(uint8*msg_ptr)。
功能描述释放消息的缓存空间。
③osal_msg_send()函数原型uint8osal_msg_send(uint8destination_task,uint8*msg_ptr)。
功能描述一个任务发送消息到消息队列。
④osal_msg_receive()函数原型uint8*osal_msg_receive(uint8task_id)。
功能描述一个任务从消息队列接收属于自己的消息。
3.5OSAL应用编程接口2.任务同步API任务同步API主要用于任务间的同步,允许一个任务等待某个事件的发生。
osal_set_event()函数原型uint8osal_set_event(uint8task_id,uint16event_flag)。
功能描述运行一个任务时设置某一事件同时发生。
3.5OSAL应用编程接口3.时间管
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 项目 了解 无线 传感器 协议