




已阅读5页,还剩1页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
ZigBee学习之39HomeAutomationProfile2TI Home Automation Profile样例Sample Light Application此例用开关簇集命令来开关LED4,或者用ZCL写入命令将IdentifyTime属性设为非0值来将设备置于认证模式(如闪烁LED4)。在文档中列出了这个示例程序所支持的属性。如:? The On/Off cluster attributes: o zclSampleLight_OnOff现在在考虑一点,就是这些属性是怎么支持的,这些属性又是怎么确定的,可能在程序中应该会有所体现,等后面分析程序时再看一下。要理解这个首先需要有个概念,就是多个属性组成一个簇集(簇集是属性和命令的集合!),而簇集又是组成应用剖面的必备条件,在规范中对不同的应用剖面其客户端和服务器端必须或可选实现的簇集都有规定,在簇集库规范中对每个簇集中必须或可选实现的属性又有相应的规范。可参考文档:【075366r01ZB_AFG-ZigBee_Cluster_Library_Public_download_version.pdf】和【075367r01ZB_AFG-Home_Automation_Profile_for_Public_Download.pdf】做初步理解。按键动作:SW2:通过ZDApp_SendEndDeviceBindReq发送绑定。Sample Switch Application此示例应用可以作为开关LED4的灯开关来使用,其中LED4所在的设备运行的是Sample Light Application。按键动作:SW1:给灯发送切换消息;SW2:通过ZDApp_SendEndDeviceBindReq发送绑定;SW4:通过ZDApp_AutoFindDestination来进行自动发现。程序分析:同样从ZMain.c开始,main()函数依然没有改变,同样是对各种设备初始化,并且初始化内存和系统,然后进入系统循环。在OSAL_SimpleLight.c模块中需要实现任务初始化队列和事件处理函数队列: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+ );#if defined( MT_TASK )MT_TaskInit( taskID+ );#endifAPS_Init( taskID+ );ZDApp_Init( taskID+ );#if defined ( ZIGBEE_FREQ_AGILITY ) | defined ( ZIGBEE_PANID_CONFLICT )/如果定义了频率捷变或者PANID冲突,才进行如下函数的初始化,频率捷变和PANID冲突解决是是ZigBee 2007和ZigBee Pro后才引入的,所以这里可以不需要。不管他,反正别预编译掉了。ZDNwkMgr_Init( taskID+ );#endifzcl_Init( taskID+ );/如果要使用ZCL,必须首先进行ZCL初始化【zcl.c】,然后才能进行ZCL应用初始化,ZCL的初始化主要是对一些数据结构赋初值,使其为空的状态,比如属性表,簇ID转换表等。zclSampleLight_Init( taskID );/在这里将注册命令回调表,终端,属性表,节点的简单描述以及为按键注册任务,这个函数一般在zcl_.c中实现TI ZStack任务系统中另一个重要的元素就是事件处理函数,当特定的任务接收到事件时就会调用相应的事件处理函数,所以还必须初始化一个事件处理函数表:const pTaskEventHandlerFn tasksArr = macEventLoop,nwk_event_loop,Hal_ProcessEvent,#if defined( MT_TASK )MT_ProcessEvent,#endifAPS_event_loop,ZDApp_event_loop,#if defined ( ZIGBEE_FREQ_AGILITY ) | defined ( ZIGBEE_PANID_CONFLICT )ZDNwkMgr_event_loop,#endifzcl_event_loop,/ZCL事件循环zclSampleLight_event_loop/这个是ZCL应用事件处理循环是我们自己针对自己的应用构建的;/此函数中事件处理循环功能函数的顺序必须和系统初始化任务列表中的顺序相一致,也就是一个任务初始化函数就对应这个一个事件处理循环至此OSAL_SimpleLight.c模块就完成了自己的任务:对系统进行初始化设定,下面我们深入到初始化函数和事件处理循环去看一下。在此例中zcl_event_loop仅接收一个事件AF_INCOMING_MSG_CMD,处理也仅仅是找到对应的终端和根据是否要发送应答来发送或者不发送应答。【zcl_samplelight.c】应用初始化函数:void zclSampleLight_Init( byte task_id )zclSampleLight_TaskID = task_id;/分配一个任务ID/ Set destination address to indirect/zclSampleLight_DstAddr.addrMode = (afAddrMode_t)AddrNotPresent;/zclSampleLight_DstAddr.endPoint = 0;/zclSampleLight_DstAddr.addr.shortAddr = 0;/ This app is part of the Home Automation Profile/注册HA剖面的简单描述和簇ID转换表zclHA_Init( &zclSampleLight_SimpleDesc );【zcl_ha.c】void zclHA_Init( SimpleDescriptionFormat_t *simpleDesc )endPointDesc_t *epDesc;/如果没有簇ID转换表则需要构建一个转换表其中保存着真是簇ID和逻辑簇ID之间的对应/ Set up the Real Cluster ID to Logical Cluster ID conversionif ( !zclHA_RegisteredClusterList )zcl_registerClusterConvertTable( ZCL_HA_PROFILE_ID,(sizeof( ha_ClusterConvertTable ) / sizeof( zclConvertClusterRec_t ) ,(GENERIC zclConvertClusterRec_t *)ha_ClusterConvertTable );zclHA_RegisteredClusterList = TRUE;/注册应用的终端描述,需要为终端描述分配内存/ Register the applications endpoint descriptor/ - This memory is allocated and never freed.epDesc = osal_mem_alloc( sizeof ( endPointDesc_t ) );if ( epDesc )/ Fill out the endpoint description.epDesc-endPoint = simpleDesc-EndPoint;epDesc-task_id = &zcl_TaskID; / all messages get sent to ZCL firstepDesc-simpleDesc = simpleDesc;epDesc-latencyReq = noLatencyReqs;/所有的终端都要注册到af层上。按照这样的话,如果在一个节点上要实现多个终端的话,是不是就需要调用几次zclHA_Init()来注册所有终端呢?还是说可以在函数外面再通过多次调用afRegister()来注册所有的终端?不过可以肯定这里注册的是设备简单描述里面的终端!这个简单描述是网络用来设别设备用的,如果仅要说明节点上的一个终端可以只定义终端描述就可以了!那么这个简单描述到底和终端描述在一个设备上的区别在哪里呢?一个节点设备肯定是需要一个简单描述,而一个终端也必须要有一个终端描述,那如果一个节点设备只有一个终端的话是不是简单描述中的的终端号和终端描述中的终端号要一致的呢?【看一下传递进来的简单描述在文件zcl_samplelight_data.c中:SimpleDescriptionFormat_t zclSampleLight_SimpleDesc =SAMPLELIGHT_ENDPOINT, /设置在节点号10上,即此宏就是10ZCL_HA_PROFILE_ID, /此设备上支持的剖面:0x0104为联盟规定的HA剖面ID;ZCL_HA_DEVICEID_DIMMABLE_LIGHT, /可调亮度灯的设备ID:0x0101,规范中规定SAMPLELIGHT_DEVICE_VERSION, /应用设备上使用的版本,可自设,此例中设为了0SAMPLELIGHT_FLAGS, /应用标志,此例中设为了0,此位为简单描述中的保留位ZCLSAMPLELIGHT_MAX_INCLUSTERS, /输入簇集数目,此例设为了5,在samplelight应用中使用了5个输入簇集: ZCL_HA_CLUSTER_ID_GEN_BASIC,ZCL_HA_CLUSTER_ID_GEN_SCENES,ZCL_HA_CLUSTER_ID_GEN_GROUPS,ZCL_HA_CLUSTER_ID_GEN_ON_OFF,ZCL_HA_CLUSTER_ID_GEN_LEVEL_CONTROL(cId_t *)zclSampleLight_InClusterList, /输入簇集列表,为一个包含所有输入簇的数组ZCLSAMPLELIGHT_MAX_OUTCLUSTERS, /输出簇集数目(cId_t *)zclSampleLight_OutClusterList /输出簇集列表,为一个包含所有输出簇的数组;以上所有联盟或者是规范中规定的ID都能在文档【075367r01ZB_AFG-Home_Automation_Profile_for_Public_Download.pdf】中找到】/ Register the endpoint description with the AFafRegister( epDesc );/注册命令回调函数(将要注册的命令回调函数和终端关联起来然后插入到链表中),第二个参数是一个一般簇命令函调函数的列表数据结构,我们只需要填充我们要用到的命令就可以了。其结构定义在【zcl_general.h】:typedef structzclGCB_BasicReset_t pfnBasicReset; / Basic Cluster Reset commandzclGCB_Identify_t pfnIdentify; / Identify commandzclGCB_IdentifyQueryRsp_t pfnIdentifyQueryRsp; / Identify Query Response commandzclGCB_OnOff_t pfnOnOff; / On/Off cluster commandszclGCB_LevelControlMoveToLevel_t pfnLevelControlMoveToLevel; / Level Control Move to Level commandzclGCB_LevelControlMove_t pfnLevelControlMove; / Level Control Move commandzclGCB_LevelControlStep_t pfnLevelControlStep; / Level Control Step commandzclGCB_LevelControlStop_t pfnLevelControlStop; / Level Control Stop commandzclGCB_GroupRsp_t pfnGroupRsp; / Group Response commandszclGCB_SceneStoreReq_t pfnSceneStoreReq; / Scene Store Request commandzclGCB_SceneRecallReq_t pfnSceneRecallReq; / Scene Recall Request commandzclGCB_SceneRsp_t pfnSceneRsp; / Scene Response commandzclGCB_Alarm_t pfnAlarm; / Alarm (Response) commandszclGCB_Location_t pfnLocation; / RSSI Location commandzclGCB_LocationRsp_t pfnLocationRsp; / RSSI Location Response command zclGeneral_AppCallbacks_t;在此例中主要实现开关的命令回调函数,其命令回调函数表定义在【zcl_samplelight.c】中:static zclGeneral_AppCallbacks_t zclSampleLight_CmdCallbacks =zclSampleLight_BasicResetCB, / Basic Cluster Reset commandzclSampleLight_IdentifyCB, / Identify command zclSampleLight_IdentifyQueryRspCB, / Identify Query Response commandzclSampleLight_OnOffCB, / On/Off cluster commandNULL, / Level Control Move to Level commandNULL, / Level Control Move commandNULL, / Level Control Step commandNULL, / Group Response commandsNULL, / Scene Store Request commandNULL, / Scene Recall Request commandNULL, / Scene Response commandNULL, / Alarm (Response) commandNULL, / RSSI Location commandsNULL, / RSSI Location Response commands;可见仅仅填充了想要实现的部分,其他均填充为NULL/ Register the ZCL General Cluster Library callback functionszclGeneral_RegisterCmdCallbacks( SAMPLELIGHT_ENDPOINT, &zclSampleLight_CmdCallbacks );/为终端注册属性,注意属性列表中属性ID必须升序排列,否则发现响应命令将不能正确获得属性信息。/zclSampleLight_Attrs定义在【zcl_samplelight_data.c】中/ Register the applications attribute listzcl_registerAttrList( SAMPLELIGHT_ENDPOINT, SAMPLELIGHT_MAX_ATTRIBUTES, zclSampleLight_Attrs );/为任务注册按键事件就不用解释了吧,前面好几个地方都有提到过来/ Register for all key events - This app will handle all key eventsRegisterForKeys( zclSampleLight_TaskID );/注册一个测试终端,此终端ID为20,和前面设备简单描述中的终端ID不同了!/ Register for a test endpointafRegister( &sampleLight_TestEp );下面我们进入zclSampleLight_event_loop看看这个应用的事件处理循环是怎么做的。uint16 zclSampleLight_event_loop( uint8 task_id, uint16 events )afIncomingMSGPacket_t *MSGpkt;if ( events & SYS_EVENT_MSG )while ( (MSGpkt = (afIncomingMSGPacket_t *)osal_msg_receive( zclSampleLight_TaskID ) )/得到系统消息,从应用任务中接收消息switch ( MSGpkt-hdr.event )case KEY_CHANGE:/处理按键事件,按下按键2时就发送绑定请求zclSampleLight_HandleKeys( (keyChange_t *)MSGpkt)-state, (keyChange_t *)MSGpkt)-
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 事业科业务培训课件
- 慢性肾脏病4期的护理
- 事业单位安全培训总结课件
- 胆管癌的术后护理
- 《老人与海》课件教学
- 招标采购从业人员考试(招标采购专业实务初级)在线复习题库及答案(2025年全国)
- 《穷人》公开课课件
- 生产企业个人工作总结
- 《眼睛的抗议书》课件
- 2025合作项目合同样本:工程建设项目合作协议范本
- GB/T 46104-2025电解水制氢系统功率波动适应性测试方法
- 信贷档案管理培训课件
- (2025)安全知识竞赛试题(附完整答案)
- 赛轮埃及年产300万条半钢子午线轮胎项目可行性研究报告
- 2025年辅警招聘考试(行政职业能力测验)复习题及答案
- 学堂在线 中国传统艺术-篆刻、书法、水墨画体验与欣赏 章节测试答案
- SMV和GOOSE报文解析
- 胜思石器时代宠物一级四围表
- 典型船体结构术语
- 调查单位基本情况表
- LI6400光合仪维护保养和简单故障处理
评论
0/150
提交评论