已阅读5页,还剩11页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
基于ZSTACK2006的简单应用开发一、建立工程使用IAR建立一个ZSTACK工程是一件十分繁琐并且枯燥的事情,每一层都有太多的文件需要被添加进去。所幸的是,我们有一个很好的投机取巧的办法。找到GENERICAPP工程的文件夹,复制此文件夹并且重命名CYRIL3APP。删除SOURCE目录下的所有文件,然后建立如下几个文件CYRIL3APPH定义应用程序全局宏CYRIL3APPCOORDMANAGEC协调器代码CYRIL3APPCOORDMANAGEH协调器宏定义OSAL_CYRIL3APPCOORDC协调器应用框架代码CYRIL3APPROUTERMANAGEC路由器代码CYRIL3APPROUTERMANAGEH路由器宏定义OSAL_CYRIL3APPROUTERC路由器应用框架代码进入CC2430DB目录,分别将GENERICAPPEWP和GENERICAPPEWW重命名为CYRIL3APPEWP和CYRIL3APPEWW。使用记事本打开这两个文件,将里面所有的GENERICAPP都改为CYRIL3APP。我们可以使用查找替换功能来解决。用IAR打开这个工程,将APP组里面的文件全部移除。在APP组里面新建“COODINATOR”和“ROUTER”两个组。分别将路由器和协调器的三个文件加入对应的两个组。这样,一个空的工程就建立好了。接下来我们就可以在这个工程里面开发我们的应用了。抛开实用性,我们仅仅来关注技术层面所发生的事情。所以,请大家不要来指责我这个东西没有任何实用性,我只是抛砖引玉。功能更加强大,更实用的应用程序需要大家去完成。既然OSAL可以支持多任务,那么我们就为我们的应用设计两个任务。第一个任务在应用层面上为我们管理整个网络的节点,第二个任务我们来做一些简单的操作。接下来我们要干点实事了。二、建立应用程序OSAL框架在背后为我们做了很多我们不容易发现却很重要的事情,但是即使这样,我们仍然需要自己做一些事情来完成这个应用程序框架。切换工作空间配置到COORDINATORDB,将ROUTER组排除编译(右键单击组名,选择OPTIONS,将左上角的“EXCLUDEFROMBUILD”的勾选去除)。打开“OSAL_CYRIL3APPCOORDC”在这个文件里面,我们完成OSAL应用程序框架的最后一些事情。1,添加如下代码CONSTPTASKEVENTHANDLERFNTASKSARRMACEVENTLOOP,NWK_EVENT_LOOP,HAL_PROCESSEVENT,APS_EVENT_LOOP,ZDAPP_EVENT_LOOP,UINT16TASKSEVENTSNULLCONSTUINT8TASKSCNTSIZEOFTASKSARR/SIZEOFPTASKEVENTHANDLERFN此代码包含了OSAL的两个十分重要的全局变量。TASKSARR保存了当前应用程序中所有的任务处理函数,当某个任务有需要响应的事件时,此任务处理函数将会被调用。当然每一个任务都只有一个任务处理函数,所以任务处理函数可以标识一个任务。TASKSEVENTS记录了当前所有任务的状态,它的初始值为0,当某个任务接收到某个事件时,相对应的位会置1。由于任务的数量一个不确定的值,所以TASKSEVENTS的空间应该是动态分配的。这里我们仅仅定义了一个这样的指针,稍后再为它分配空间。TASKSCNT记录了任务数量。2,设计我们的应用程序任务初始化函数在OSAL_CYRIL3C中添加如下函数,VOIDOSALINITTASKSVOIDUINT8TASKID0TASKSEVENTSUINT16OSAL_MEM_ALLOCSIZEOFUINT16TASKSCNTOSAL_MEMSETTASKSEVENTS,0,SIZEOFUINT16TASKSCNTMACTASKINITTASKIDNWK_INITTASKIDHAL_INITTASKIDAPS_INITTASKIDZDAPP_INITTASKID在这个函数中,我们为TASKSEVENTS分配好了足够大的空间,并且将它们全部初始化为0。然后调用所有已经存在的任务初始化函数,为他们依次递增地分配任务ID。在OSAL中,为了保证OSAL的正常运行,已经有了很多任务。我们仅仅按照如上方法添加就好。到此,我们的应用程序框架就完成了,但是这样一个程序没有任何功能,我们需要添加我们自定义的任务。三、添加任务我们的第一个任务的基本功能是管理网络上的节点。在深入浅出ZSTACK2006OSAL多任务资源分配机制中,我已经比较详细的介绍了添加任务的方法,下面我们就来具体实现。打开CYRIL3APPCOORDMANAGEC源文件,添加如下代码BYTECYRIL3APPCOORDMANAGE_TASKIDVOIDCYRIL3APPCOORDMANAGE_INITBYTETASK_IDCYRIL3APPCOORDMANAGE_TASKIDTASK_IDUINT16CYRIL3APPCOORDMANAGE_PROCESSEVENTBYTETASK_ID,UINT16EVENTSRETURN0在任务初始化函数中,我们仅仅将分配给任务的ID保存下来。在事件处理函数中,我们先什么也不干。简单的返回0代表所有的事件已经处理完毕。不过即使这样,谁也不能否认它是一个有效的事件处理函数。接着,我们在TASKSARR数组里面加入CYRIL3APPCOORDMANAGE_PROCESSEVENT这个事件处理函数,然后在OSALINITTASKS函数中调用任务的初始化函数。需要注意的是,TASKSARR数组里面各任务事件处理程序的排列顺序,必须要与OSALINITTASKS所调用任务初始化函数的顺序一致。我们第一个任务的添加到此就完成了。四、加入网络在把我们的设备加入网络之前,我需要介绍几个概念。1,IEEE地址,也叫64位长地址。在网络中,每一个节点都是一个具体的物理设备。每个物理设备都是独一无二的。如何从物理上标识网络上的设备呢我们引入了IEEE这样一个地址。IEEE地址是一个64位地址,这个地址是直接烧写进FLASH里面的,它不会因为程序的运行而改变,每个设备都有一个独一无二的IEEE地址,从而从物理上对设备加以区分。在PC机上,每个网卡都有一个世界独一无二的MAC地址,道理是一样的。2,网络地址,也叫16位短地址。当设备加入网络中以后,为了在这个网络中对节点进行标识,网络会分配给设备一个16位短地址,以此来标识此设备在网络中的地位。类似于我们常说的IP地址。3,ENDPOINT。很多资料将其翻译为“端点”,我们不如也这么叫。不过问题的关键不是它如何称呼,而是如何认识它。我们来研究这样一个事实OUTMAN在看我的帖子的同时他又使用QQ和别人聊天。假设他的电脑IP地址为19216812。那么当他的QQ好友向他发送了一句话的时候,这个信息里面包含了目的IP地址,所以通过TCP/TP协议可以到达OUTMAN的电脑。但是问题随之而来。当OUTMAN电脑上的操作系统接收到此条信息时,它将把这个信息交给浏览器(我们刚才说了,他在看帖子,所以肯定开着浏览器)呢,还是交给QQ操作系统通过怎么样的方法作出裁决呢显然,只通过IP地址是没有办法决定的,所以这条消息除了包含IP地址以外,还要告诉目的机,这条消息应该交由哪个应用程序来处理。于是端口(PORT)的概念产生了。操作系统为应用程序提供了很多端口,消息由IP地址到达操作系统,再由端口找到处理消息的应用程序。同样的道理,在ZIGBEE的应用程序框架里(结构图请看深入浅出ZSTACK2006OSAL多任务资源分配机制)包含了最多240个应用程序对象,每个应用程序对象在OSAL中对应了一个任务,当网络层接收到信息以后如何决定将此信息传递给哪个任务呢ENDPOINT决定了传递方向,于是我们可以说ENDPOINT的作用与TCP/IP协议中的端口的作用是一样的。4,CLUSTER。中文翻译为“簇”。我们如何去理解“簇”这个概念呢当一个任务接收到消息(这里所说的消息是指无线网络之中的数据)之后,一定会对消息进行处理。但是我们的应用肯定不会盲目的处理所有消息,消息一定会被分门别类。“簇”代表了消息的类型,为与相同簇的消息具有相同的类型,而这个类型可以被用户自定义。了解了这些,我们可以考虑如何将设备加入网络中。在我们的设备加电运行以后,设备会对网络发送广播消息请求入网,协调器确认其入网请求以后会给它分配网络地址,此设备将会作为网络中的一个节点运行。设备加入网络由协议栈自动完成,然而将任务作为一个ZIGBEE应用程序对象加入到ZIGBEE的应用程序框架中是如何完成的呢要将任务加入网络需要在任务重做一下两件事情1,定义此任务作为ZIGBEE应用程序对象所需要的信息。2,将这些信息注册到应用程序框架中。接下来,我们就在我们的例子中实现它。在CYRIL3APPH中定义如下宏DEFINECYRIL3APPMANAGE_ENDPOINT15DEFINECYRIL3APPMANAGE_PROFID0X0005DEFINECYRIL3APPMANAGE_DEVICEID0X0001DEFINECYRIL3APPMANAGE_DEVICE_VERSION0DEFINECYRIL3APPMANAGE_FLAGS0DEFINECYRIL3APPMANAGE_MAX_CLUSTERS1DEFINECYRIL3APPMANAGE_CLUSTERID1CYRIL3APPMANAGE_ENDPOINT定义了当前任务的端点,CYRIL3APPMANAGE_PROFID和CYRIL3APPMANAGE_DEVICEID是一些有关识别的定义,在学习实验中,我们可以任意取值。CYRIL3APPMANAGE_DEVICE_VERSION和CYRIL3APPMANAGE_FLAGS代表了硬件版本和自定义标志,我们定义为0,不影响我们的应用开发。CYRIL3APPMANAGE_MAX_CLUSTERS定义了当前任务的簇数量。CYRIL3APPMANAGE_CLUSTERID是我们自定义的一个簇,ID取为1。在CYRIL3APPCOORDMANAGEC中,我们定义如下三个全局变量CONSTUINT16CYRIL3APPCOORDMANAGE_CLUSTERLISTCYRIL3APPMANAGE_MAX_CLUSTERSCYRIL3APPMANAGE_CLUSTERIDENDPOINTDESC_TCYRIL3APPCOORDMANAGE_EPDESCCONSTSIMPLEDESCRIPTIONFORMAT_TCYRIL3APPCOORDMANAGE_SIMPLEDESCCYRIL3APPMANAGE_ENDPOINT,CYRIL3APPMANAGE_PROFID,CYRIL3APPMANAGE_DEVICEID,CYRIL3APPMANAGE_DEVICE_VERSION,CYRIL3APPMANAGE_FLAGS,CYRIL3APPMANAGE_MAX_CLUSTERS,UINT16CYRIL3APPCOORDMANAGE_CLUSTERLIST,CYRIL3APPMANAGE_MAX_CLUSTERS,UINT16CYRIL3APPCOORDMANAGE_CLUSTERLISTCYRIL3APPCOORDMANAGE_CLUSTERLIST保存了一个簇ID的列表,所有有关于此任务的簇都需要在此定义。CYRIL3APPCOORDMANAGE_EPDESC是此任务的端点描述,它定义了此任务作为ZIGBEE应用程序对象的所有信息,我们将会在初始化函数中为它赋值。然后将他注册到应用程序框架中。CYRIL3APPCOORDMANAGE_SIMPLEDESC是此任务的简单描述,它保存了此任务的一些基本信息。具体赋值我不再赘述。在任务初始化函数中,我们为端点描述赋值,并且注册到应用程序框架中。CYRIL3APPCOORDMANAGE_EPDESCENDPOINTCYRIL3APPMANAGE_ENDPOINTCYRIL3APPCOORDMANAGE_EPDESCTASK_IDCYRIL3APPCOORDMANAGE_EPDESCSIMPLEDESCSIMPLEDESCRIPTIONFORMAT_TCYRIL3APPCOORDMANAGE_EPDESCLATENCYREQNOLATENCYREQSAFREGISTER这样,我们的任务就顺利地作为ZIGBEE应用程序对象被加入到了应用程序框架中。这意味着我们可以处理来自网络层的消息了。五、处理消息下面,我们来试图实现这样一个功能当设备加入网络之后,点亮一个LED灯,表示该节点成功加入网络,并处于就绪状态。当设备成功加入网络以后,ZIGBEE设备对象(ZDO)会给所有已经在应用程序框架中注册过的任务(也就是作为ZIGBEE的应用程序对象存在的任务)发送一个“ZDO_STATE_CHANGE”消息,消息的状态指示了当前网络的状态。我们可以通过处理此消息时点亮LED等来实现这个功能。当一个消息被发送给任务时,“SYS_EVENT_MSG”事件会被传递给任务。“SYS_EVENT_MSG”这个事件通知任务有一个消息等待处理。所以,我们必须添加对于“SYS_EVENT_MSG”这个事件的响应,然后从消息队列中取出消息,判断此消息是否为“ZDO_STATE_CHANGE”。在处理“ZDO_STATE_CHANGE”消息时点亮LED灯。在CYRIL3APPCOORDMANAGEC中我们定义如下全局变量DEVSTATES_TCYRIL3APPCOORDMANAGE_NWKSTATEDEV_INITCYRIL3APPCOORDMANAGE_NWKSTATE保存了当前节点的网络状态,我们将他初始化为“未加入网络”。在CYRIL3APPCOORDMANAGE_PROCESSEVENT函数中,我们添加如下代码IFEVENTSMSGPKTAFINCOMINGMSGPACKET_TOSAL_MSG_RECEIVECYRIL3APPMANAGE_TASKIDWHILEMSGPKTSWITCHMSGPKTHDREVENTCASEZDO_STATE_CHANGECYRIL3APPCOORDMANAGE_NWKSTATEDEVSTATES_TMSGPKTHDRSTATUSIFCYRIL3APPCOORDMANAGE_NWKSTATEDEV_ZB_COORDHALLEDSETHAL_LED_1,HAL_LED_MODE_ONHALLEDSETHAL_LED_2,HAL_LED_MODE_OFFHALLEDSETHAL_LED_3,HAL_LED_MODE_OFFCYRIL3APPCOORDMANAGE_PROCESSZDOSTATECHANGEDEVSTATES_TMSGPKTHDRSTATUSBREAKDEFAULTBREAKOSAL_MSG_DEALLOCATEUINT8MSGPKTMSGPKTAFINCOMINGMSGPACKET_TOSAL_MSG_RECEIVECYRIL3APPMANAGE_TASKIDRETURNEVENTSSYS_EVENT_MSGOSAL_MSG_RECEIVE获取消息队列上相应任务的消息。OSAL_MSG_DEALLOCATE释放消息所在的消息缓冲区,回收内存资源。还是在CYRIL3APPCOORDMANAGEC中我们添加CYRIL3APPCOORDMANAGE_PROCESSZDOSTATECHANGE函数VOIDCYRIL3APPCOORDMANAGE_PROCESSZDOSTATECHANGEDEVSTATES_TSTATEHALLEDSETHAL_LED_1,HAL_LED_MODE_ON运行我们的代码,我们将可以看到在开机稍微延迟一会之后,LED1被点亮了。这说明成功地响应了“ZDO_STATE_CHANGE”消息。六,添加按键消息处理要使我们的任务能够接收到按键消息,我们必须在应用程序框架做一个简单的注册,告诉应用程序框架,如果有按键消息的话,请传递过来。在CYRIL3APPCOORDMANAGE_INIT函数中加入如下代码REGISTERFORKEYSCYRIL3APPCOORDMANAGE_TASKID此函数就是执行了这样的注册。具体情况请参考深入浅出ZSTACK2006OSAL多任务资源分配机制。这样,按键消息就会被发送至CYRIL3APPCOORDMANAGE这个任务。我们按照处理ZDO_STATE_CHANGE消息类似的方法添加如下代码CASEKEY_CHANGECYRIL3APPCOORDMANAGE_HANDLEKEYSKEYCHANGE_TMSGPKTKEYSBREAKCYRIL3APPCOORDMANAGE_HANDLEKEYS的代码如下VOIDCYRIL3APPCOORDMANAGE_HANDLEKEYSBYTEKEYSIFKEYS在我的板子上只有一个六号按键,我们在按键处理函数中让LED2进行翻转。七、发送与接收无线数据我们先来讨论如何接收无线数据。当我们的任务在ZIGBEE应用程序框架注册过后,我们的任务将会对应一个端点。当此端点接收到任务时,相对应的任务将会接收到一个AF_DATA_CONFIRM_CMD消息。注意AF_DATA_CONFIRM_CMD是一个消息而不是一个事件。下面我们来加入对此消息的处理。与ZDO_STATE_CHANGE类似,我们添加如下代码CASEAF_INCOMING_MSG_CMDCYRIL3APPCOORDMANAGE_PROCESSMSGDATAMSGPKTBREAK然后我们来添加CYRIL3APPCOORDMANAGE_PROCESSMSGDATA函数VOIDCYRIL3APPCOORDMANAGE_PROCESSMSGDATAAFINCOMINGMSGPACKET_TMSGSWITCHMSGCLUSTERIDCASECYRIL3APPMANAGE_CLUSTERIDBREAK当接收到无线数据的时候,我们需要判断此数据是属于哪一个簇的,这样可以让我们对不同簇的消息进行不一样的处理。现在我们暂时不去处理,稍后再说。既然现在我们可以接收数据,那么当然我们也需要发送数据。发送无线数据,我们使用AFSTATUS_TAF_DATAREQUESTAFADDRTYPE_TDSTADDR,ENDPOINTDESC_TSRCEP,UINT16CID,UINT16LEN,UINT8BUF,UINT8TRANSID,UINT8OPTIONS,UINT8RADIUS这个函数。此函数并不是一个完整的发送函数,它只是向应用程序框架发出数据请求,数据的发送仍需传递至下层。所以,很多人会遇到这种情况在单步调试程序时,执行过此语句后,接收端并没有接收到数据。这是因为执行完了这个函数只是完成了向应用框架发出数据请求,但是数据的发送仍然需要等待硬件调用的完成。DSTADDR目标结点的地址。SRCEP目标结点的端点。CID信息所属的簇。LEN发送的数据长度。BUF数据所在的缓冲区。TRANSID消息ID,类似于计数器的的作用。OPTIONS发送选项。RADIUS一般保持默认AF_DEFAULT_RADIUS。当成功发出数据请求(请注意仅仅是向应用程序框架发出请求)以后,函数返回AFSTATUS_SUCCESS。明白了此函数的作用和使用方法,我们就可以很容易地在我们的代码中加入无线数据发送功能。我们来完成这样一个功能当路由节点(以下简称R结点)成功入网以后,向协调器结点(以下简称C结点)发送一个登记请求,然后C结点记录其网络地址并且分配给它一个ID,发送此ID给请求登记的R结点。R结点接收到此ID后保存起来。请注意刚刚我们所说的“登记”、“ID”之类的事情都是我们自己在应用层上所定义的,与ZIGBEE协议无关。请不要混淆了。首先,我们将APPCOORDIRATOR组下的所有文件的内容,复制到APPROUTER组下的相对应的文件中。这样我们就为路由节点的应用程序快速地创建了代码。我们将三个文件中所有“CYRIL3APPCOORDMANAGE”字样替换为“CYRIL3APPROUTERMANAGE”。其次,在R结点登记与C结点返回ID这个过程中,所有发送和接受的数据,我们可以将其归为一类。我们为此类创建一个簇。在APP组的“CYRIL3APPH”文件中,我们定义了“CYRIL3APPMANAGE_CLUSTERID”这样一个簇。当时定义它的时候我们并不知道它的实际意义,现在我们将它的名字改为“CYRIL3APPMANAGE_REGISTER”。然后在代码中,我们也将相应的地方改过来,这里不再赘述。要使R结点在加入网络后自动向C结点发送登记请求,我们需要在处理“ZDO_STATE_CHANGE”消息时完成。在CYRIL3APPROUTERMANAGE_PROCESSZDOSTATECHANGE函数中,我们删除点亮LED灯的代码,添加如下代码REGISTERREQUEST_TCMDCMDREGISTERCMDCYRIL3APPMANAGE_REGISTER_REQUESTAFADDRTYPE_TTARGETADDRTARGETADDRADDRMODEAFADDR16BITTARGETADDRADDRSHORTADDR0X0000TARGETADDRENDPOINTCYRIL3APPMANAGE_ENDPOINTAF_DATAREQUESTREGISTERREQUEST_T是登记请求的数据结构体,定义如下TYPEDEFSTRUCTREGREQUINT8REGISTERCMDREGISTERREQUEST_TCYRIL3APPMANAGE_REGISTER_REQUEST是登记请求所代表的数值。我们定义如下命令DEFINECYRIL3APPMANAGE_REGISTER_REQUEST0X01DEFINECYRIL3APPMANAGE_REGISTER_CONFIRM0X02DEFINECYRIL3APPMANAGE_REGISTER_REFUSE0X03它们分别代表“请求”、“确认”、“拒绝”。这里我们将请求命令发送给了C结点(C结点网络地址为0X0000)。在C结点,我们处理R结点的登记请求。在CYRIL3APPCOORDMANAGE_PROCESSMSGDATA函数中,我们判断出CYRIL3APPMANAGE_REGISTER簇时调用如下函数VOIDCYRIL3APPCOORDMANAGE_PROCESSREGISTERCMDAFINCOMINGMSGPACKE
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 基准值法计算题目及答案
- 养老院膳食营养与卫生管理制度
- 养老院老人自治制度
- 正反比例算术题目及答案
- 用例图类图例题目及答案
- 三级分类数学题目及答案
- 办公室员工培训需求调查制度
- 门诊病历书写制度
- 销售部回款规定制度
- 造价协审人员的人员奖惩及激励制度
- 提高金刚砂地坪施工一次合格率
- 资产评估服务质量保证措施
- 职工食堂餐饮服务项目组织机构及人员配备
- 厂区整改设计方案
- 大隐静脉射频消融手术
- (正式版)JBT 3300-2024 平衡重式叉车 整机试验方法
- 云南省昆明市五华区2023-2024学年高一上学期1月期末考试地理
- HGT 20714-2023 管道及仪表流程图(P ID)安全审查规范 (正式版)
- 初高中生物知识衔接问题分析教学专业知识讲座
- 语文高考题小说说题比赛
- 建筑砌筑工(中级)理论考试题库及答案
评论
0/150
提交评论