下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、#ifdefined(BUILD_ALL_DEVICES)/TheDemotargetissetuptohaveBUILD_ALL_DEVICESandHOLD_AUTO_START/Wearelookingatajumper(definedinSampleAppHw.c)tobejumpered/together-iftheyare-wewillstartupacoordinator.Otherwise,/thedevicewillstartasarouter.if(readCoordinatorJumper()/根据 P02 和 P03 是否有跳线来判断是协调器还是路由器zgDeviceL
2、ogicalType=ZG_DEVICETYPE_COORDINATOR;elsezgDeviceLogicalType=ZG_DEVICETYPE_ROUTER;#endif/BUILD_ALL_DEVICES#ifdefined(HOLD_AUTO_START)/HOLD_AUTO_STARTisacompileoptionthatwillsurpressZDApp/fromstartingthedeviceandwaitfortheapplicationto该 project 实现了按键发送的功能。同时实现了信息的广播和组播:SampleApp_SendPeriodicMessage(v
3、oid);/阶段发送,广播形式SampleApp_SendFlashMessage();/闪烁发送,组播形式同时按键 up 键可以进行控制信息的发送,即控制 Group1 中所有设备的 LED1 灯的闪烁时间按键 right 键进行设备加入/退出 Group1 的切换。由于在 SampleApp_Init(uint8task_id)中添加了 SampleApp_Init(taskID);(最后一个任务)在操作系统启动的过程中,调用 SampleApp_Init(uint8task_id)调用顺序:main(void)-osal_init_system();-osalInitTasks()-Sa
4、mpleApp_Init(taskID);voidSampleApp_Init(SampleApp_TaskIDSampleApp_NwkStateSampleApp_TransIDuint8task_id)task_id;=DEV_INIT;0;/Devicehardware/Ifthehardware/Ifthehardwareinitializationisapplicationisotherpartscanbeaddedspecific-addofthedevicehereorinmain()ithere.additinmain().(Zmain.c)./startthedevice.
5、ZDOInitDevice(0);/开始启动设备,协调器建立网络此时 LED3 闪烁,别的设备加入网络,加入后 LED3 一直亮着,说明加入成功#endif/Setupfortheperiodicmessagesdestinationaddress/这儿设置了组播和广播的短地址以及填写了端点号/BroadcasttoeveryoneSampleApp_Periodic_DstAddr.addrMode=(afAddrMode_t)AddrBroadcast;SampleApp_Periodic_DstAddr.endPoint=SAMPLEAPP_ENDPOINT;SampleApp_Peri
6、odic_DstAddr.addr.shortAddr=0 xFFFF;/Setupfortheflashcommandsdestinationaddress-Group1SampleApp_Flash_DstAddr.addrMode=(afAddrMode_t)afAddrGroup;SampleApp_Flash_DstAddr.endPoint=SAMPLEAPP_ENDPOINT;SampleApp_Flash_DstAddr.addr.shortAddr=SAMPLEAPP_FLASH_GROUP;/Fillouttheendpointdescription.SampleApp_e
7、pDesc.endPoint=SAMPLEAPP_ENDPOINT;SampleApp_epDesc.task_id=&SampleApp_TaskID;SampleApp_epDesc.simpleDesc=(SimpleDescriptionFormat_t*)&SampleApp_SimpleDesc;SampleApp_epDesc.latencyReq=noLatencyReqs;/RegistertheendpointdescriptionwiththeAFafRegister(&SampleApp_epDesc);/将填写好的端点向 AF 层进行注册,以便收到符合的消息时可以送到
8、应用层/Registerforallkeyevents-ThisappwillhandleallkeyeventsRegisterForKeys(SampleApp_TaskID);/注册所有的按键信息,由 SampleApp_TaskID 对应的 SampleApp_ProcessEvent()进行处理/Bydefault,alldevicesstartoutinGroup1/这儿填写的组的内容,如组名,组标识,然后力口入SAMPLEAPP_ENDPOINT 组中SampleApp_Group.ID=0 x0001;osal_memcpy(SampleApp_G,Group
9、1,7);aps_AddGroup(SAMPLEAPP_ENDPOINT,&SampleApp_Group);#ifdefined(LCD_SUPPORTED)HalLcdWriteString(SampleApp,HAL_LCD_LINE_1);#endif这样的初始工作就已经完成了,接下来的就是分析按键事件及响应过程了首先当网络形成时,下层会向应用层发送消息 ZDO_STATE_CHANGE 它由 SampleApp_ProcessEvent()进行处理caseZDO_STATE_CHANGE:SampleApp_NwkState=(devStates_t)(MSGpkt-hdr.stat
10、us);if(SampleApp_NwkState=DEV_ZB_COORD)|(SampleApp_NwkState=DEV_ROUTER)|(SampleApp_NwkState=DEV_END_DEVICE)/Startsendingtheperiodicmessageinaregularinterval.osal_start_timerEx(SampleApp_TaskID,SAMPLEAPP_SEND_PERIODIC_MSG_EVT,SAMPLEAPP_SEND_PERIODIC_MSG_TIMEOUT);else/Deviceisnolongerinthenetworkbreak
11、;可以看出它启动了一个定时器,每次时间到时会触发 SAMPLEAPP_SEND_PERIODIC_MSG_EVT 事件,它由 SampleApp_ProcessEvent()进行处理if(events&SAMPLEAPP_SEND_PERIODIC_MSG_EVT)/SendtheperiodicmessageSampleApp_SendPeriodicMessage();/发送广播信息/Setuptosendmessageagaininnormalperiod(+alittlejitter)osal_start_timerEx(SampleApp_TaskID,SAMPLEAPP_SEND_
12、PERIODIC_MSG_EVT,(SAMPLEAPP_SEND_PERIODIC_MSG_TIMEOUT+(osal_rand()&0 x00FF);/returnunprocessedeventsreturn(eventsASAMPLEAPP_SEND_PERIODIC_MSG_EVT);我们可以看出,在发送广播信息后又设置了同样的定时器,从而循环的发送。当有案件时,由于对按键进行了注册,所以由 SampleApp_ProcessEvent()进行处理caseKEY_CHANGE:SampleApp_HandleKeys(keyChange_t*)MSGpkt)-state,SGpkt)-
13、keys);/进行本函数进行处理 break;voidSampleApp_HandleKeys(uint8shift,uint8keys)(void)shift;/Intentionallyunreferencedparameterif(keys&HAL_KEY_SW_1SampleApp_SendFlashMessage(信息if(keys&HAL_KEY_SW_2/*TheFlashrCommandissenttoGroup1.*Thiskeytogglesthisdeviceinandoutofgroup1.*Ifthisdevicedoesntbelongtogroup1,thisap
14、plication*willnotreceivetheFlashcommandsenttogroup1.*/aps_Group_t*grp;grp=aps_FindGroup(SAMPLEAPP_ENDPOINT,SAMPLEAPP_FLASH_GROUP);/若已经加入组中,则退出组,若没有加入则加入if(grp)/Removefromthegroupaps_RemoveGroup(SAMPLEAPP_ENDPOINT,SAMPLEAPP_FLASH_GROUP);/(该函数的源码不公开,只公布接口)else/Addtotheflashgroupaps_AddGroup(SAMPLEAPP_
15、ENDPOINT,&SampleApp_Group);再看 SampleApp_SendFlashMessage 函数voidSampleApp_SendFlashMessage(uint16flashTime)/主要调用 AF_DataRequest()函数发送uint8buffer3;buffer0=(uint8)(SampleAppFlashCounter+);(keyChange_t*)MSAMPLEAPPFLASHDURATION);/发送闪烁控制buffer1=LO_UINT16(flashTime);buffer2=HI_UINT16(flashTime);if(AF_DataR
16、equest(&SampleApp_Flash_DstAddr,&SampleApp_epDesc,SAMPLEAPP_FLASH_CLUSTERID,3,buffer,&SampleApp_TransID,AF_DISCV_ROUTE,AF_DEFAULT_RADIUS)=afStatus_SUCCESS)else/Erroroccurredinrequesttosend.别的设备在接受到后,仍然由 SampleApp_ProcessEvent()进行处理caseAF_INCOMING_MSG_CMD:SampleApp_MessageMSGCB(MSGpkt);break;可见它由 Sam
17、pleApp_MessageMSGCB(MSGpkt);处理voidSampleApp_MessageMSGCB(afIncomingMSGPacket_t*pkt)uint16flashTime;switch(pkt-clusterId)caseSAMPLEAPP_PERIODIC_CLUSTERID:/对于收到的广播信息,忽略break;caseSAMPLEAPP_FLASH_CLUSTERID:flashTime=BUILD_UINT16(pkt-cmd.Data1,pkt-cmd.Data2);/对接受到的组播信息,控制 LED4 即 LED1 的闪烁HalLedBlink(HAL_L
18、ED_4,4,50,(flashTime/4);break;这样的话我们就搞清楚了其中的脉络,总之,他就是举了一个按键发送的简单的例子,循环发送广播信息,按 UP 发送组播信息。对接收到的广播信息不予理睬,对收到的组播信息控制 LED1 的闪烁。同时按键 Right 时进行设备加入/退出组的切换。SAMPLEAPP 程序主要说明2012-05-0310:12:54|分类:zigbee|标签:|字号大中小订阅程序执行流程如下:ZMain.c的main()-osal.c的osal_init_system()-OSAL_SampleApp.c的osalInitTasks()之后分两部分执行首先执行S
19、ampleApp.c的SampleApp_Init(),接着执行osal.c中的事件循环,不停的执行SampleApp_ProcessEvent(),进行应用层事件检测两个关键函数1.SampleApp_Init2.SampleApp_ProcessEvent分析如下SampleApp_initvoidSampleApp_Init(uint8task_id)/osal应用层的任务ID赋值SampleApp_TaskID=task_id;设备状态设定为ZDO层中定义的初始化状态SampleApp_NwkState=DEV_INIT;/定义消息IDSampleApp_TransID=0;后面的de
20、mo例子中用到这个编译选项#ifdefined(SOFT_START)如果选择了SOFT编译选项,则作为协调器启动zgDeviceLogicalType=ZG_DEVICETYPE_COORDINATOR;#endif/SOFT_START如果定义了HOLD_AUTO_START选项,则调用层的ZDOInitDevice,按照默认顺序网络中的第一个设备作为协调器,其他的设备作为子设备#ifdefined(HOLD_AUTO_START)ZDOInitDevice(0);#endif定义广播地址地址模式SampleApp_Periodic_DstAddr.addrMode=(afAddrMode
21、_t)AddrBroadcast;指定端点号SampleApp_Periodic_DstAddr.endPoint=SAMPLEAPP_ENDPOINT/指定目的网络地址为广播地址SampleApp_Periodic_DstAddr.addr.shortAddr=0 xFFFF;/设定flash中命令即按键命令要发送的目的地址SampleApp_Flash_DstAddr.addrMode=(afAddrMode_t)afAddrGroup;SampleApp_Flash_DstAddr.endPoint=SAMPLEAPP_ENDPOINT;SampleApp_Flash_DstAddr.a
22、ddr.shortAddr=SAMPLEAPP_FLASH_GROUP;/定义本设备用来通信的APS层端点描述符/端点号SampleApp_epDesc.endPoint=SAMPLEAPP_ENDPOINT;/任务IDSampleApp_epDesc.task_id=&SampleApp_TaskID;简单描述符SampleApp_epDesc.simpleDesc=(SimpleDescriptionFormat_t*)&SampleApp_SimpleDesc;延时策略SampleApp_epDesc.latencyReq=noLatencyReqs;/向AF层注册端点描述符afRegi
23、ster(&SampleApp_epDesc);/向osal层注册按键消息RegisterForKeys(SampleApp_TaskID);/设定一个新的组/组号SampleApp_Group.ID=0 x0003;设定组名osal_memcpy(SampleApp_G,Group3,7);把该组添加到网络中aps_AddGroup(SAMPLEAPP_ENDPOINT,&SampleApp_Group);#ifdefined(LCD_SUPPORTED)如果选择了LCD_SUPPORTED编译选项,会打印一串字符Print8(HAL_LCD_LINE_2,20,Sampl
24、eApp,1);#endif)uint16SampleApp_ProcessEvent(uint8task_id,uint16events)(定义应用层数据包afIncomingMSGPacket_t*MSGpkt;/判断osal层的消息类型如果系统消息到来if(events&SYS_EVENT_MSG)(接收数据包MSGpkt=(afIncomingMSGPacket_t*)osal_msg_receive(SampleApp_TaskID);如果数据包不为空while(MSGpkt)(判断消息类型switch(MSGpkt-hdr.event)(/如果是按键消息caseKEY_CHANGE:调用按键处理函数SampleApp_HandleKeys(keyChange_t*)MSGpkt)-state,(keyChange_t*)MSGpkt)-keys);break;/如果是别的组设备周期发送的消息caseAF_INCOMING_MSG_CMD:调用对周期消息的处理函数SampleApp_MessageMSGCB(MSGpkt);break;/如果是设备状态变换的命令caseZDO_STATE_CHANGE:获取设备状态SampleApp_NwkState=(devStates_t)(MSGpkt-hdr.st
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 钛合金泵项目可行性研究报告-图文
- 钻井泥浆泵阀箱项目可行性研究报告申请报告
- 银川阀门项目可行性研究报告参考范文
- 闸阀工程安装方案范本大全
- 阅读的课题研究报告
- 防水行业分析研究报告
- 青岛航空项目可行性研究报告
- 高中生物教学备课教案基因工程与生物技术的伦理问题的实验设计
- 城市智慧公园物联网云系统解决方案
- 2020-2025年一级注册建筑师之建筑结构通关试题库(有答案)
- 2025年中医确有专长考试题(附答案)
- 2025-2026学年苏教版二年级上册数学期中测试卷(含参考答案)三套
- 学堂在线 经济学原理(微观部分) 章节测试答案
- TCTBA 001-2019 非招标方式采购代理服务规范
- 胃肠间质瘤诊疗共识
- 网络安全等保三级建设整改方案网络安全等级保护第三级建设整改方案
- 电厂烟气脱硝(脱硫)施工组织设计
- 项目支出绩效评价共性指标体系
- DB34T3587-2020 《城镇排水管道检测与修复技术规程》
- 近三年上海高考英语真习题汇编之概要写作
- 辽宁智能机器人项目建议书(范文参考)
评论
0/150
提交评论