




下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、#ifdefined(BUILD_ALL_DEVICES)/TheDemotargetissetuptohaveBUILD_ALL_DEVICESandHOLD_AUTO_START/Wearelookingatajumper(definedinSampleAppHw.c)tobejumpered/together-iftheyare-wewillstartupacoordinator.Otherwise,/thedevicewillstartasarouter.if(readCoordinatorJumper()/根據(jù) P02 和 P03 是否有跳線來判斷是協(xié)調(diào)器還是路由器zgDeviceL
2、ogicalType=ZG_DEVICETYPE_COORDINATOR;elsezgDeviceLogicalType=ZG_DEVICETYPE_ROUTER;#endif/BUILD_ALL_DEVICES#ifdefined(HOLD_AUTO_START)/HOLD_AUTO_STARTisacompileoptionthatwillsurpressZDApp/fromstartingthedeviceandwaitfortheapplicationto該 project 實現(xiàn)了按鍵發(fā)送的功能。同時實現(xiàn)了信息的廣播和組播:SampleApp_SendPeriodicMessage(v
3、oid);/階段發(fā)送,廣播形式SampleApp_SendFlashMessage();/閃爍發(fā)送,組播形式同時按鍵 up 鍵可以進(jìn)行控制信息的發(fā)送,即控制 Group1 中所有設(shè)備的 LED1 燈的閃爍時間按鍵 right 鍵進(jìn)行設(shè)備加入/退出 Group1 的切換。由于在 SampleApp_Init(uint8task_id)中添加了 SampleApp_Init(taskID);(最后一個任務(wù))在操作系統(tǒng)啟動的過程中,調(diào)用 SampleApp_Init(uint8task_id)調(diào)用順序: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);/開始啟動設(shè)備,協(xié)調(diào)器建立網(wǎng)絡(luò)此時 LED3 閃爍,別的設(shè)備加入網(wǎng)絡(luò),加入后 LED3 一直亮著,說明加入成功#endif/Setupfortheperiodicmessagesdestinationaddress/這兒設(shè)置了組播和廣播的短地址以及填寫了端點號/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 層進(jìn)行注冊,以便收到符合的消息時可以送到
8、應(yīng)用層/Registerforallkeyevents-ThisappwillhandleallkeyeventsRegisterForKeys(SampleApp_TaskID);/注冊所有的按鍵信息,由 SampleApp_TaskID 對應(yīng)的 SampleApp_ProcessEvent()進(jìn)行處理/Bydefault,alldevicesstartoutinGroup1/這兒填寫的組的內(nèi)容,如組名,組標(biāo)識,然后力口入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這樣的初始工作就已經(jīng)完成了,接下來的就是分析按鍵事件及響應(yīng)過程了首先當(dāng)網(wǎng)絡(luò)形成時,下層會向應(yīng)用層發(fā)送消息 ZDO_STATE_CHANGE 它由 SampleApp_ProcessEvent()進(jìn)行處理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、;可以看出它啟動了一個定時器,每次時間到時會觸發(fā) SAMPLEAPP_SEND_PERIODIC_MSG_EVT 事件,它由 SampleApp_ProcessEvent()進(jìn)行處理if(events&SAMPLEAPP_SEND_PERIODIC_MSG_EVT)/SendtheperiodicmessageSampleApp_SendPeriodicMessage();/發(fā)送廣播信息/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);我們可以看出,在發(fā)送廣播信息后又設(shè)置了同樣的定時器,從而循環(huán)的發(fā)送。當(dāng)有案件時,由于對按鍵進(jìn)行了注冊,所以由 SampleApp_ProcessEvent()進(jìn)行處理caseKEY_CHANGE:SampleApp_HandleKeys(keyChange_t*)MSGpkt)-state,SGpkt)-
13、keys);/進(jìn)行本函數(shù)進(jìn)行處理 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);/若已經(jīng)加入組中,則退出組,若沒有加入則加入if(grp)/Removefromthegroupaps_RemoveGroup(SAMPLEAPP_ENDPOINT,SAMPLEAPP_FLASH_GROUP);/(該函數(shù)的源碼不公開,只公布接口)else/Addtotheflashgroupaps_AddGroup(SAMPLEAPP_
15、ENDPOINT,&SampleApp_Group);再看 SampleApp_SendFlashMessage 函數(shù)voidSampleApp_SendFlashMessage(uint16flashTime)/主要調(diào)用 AF_DataRequest()函數(shù)發(fā)送uint8buffer3;buffer0=(uint8)(SampleAppFlashCounter+);(keyChange_t*)MSAMPLEAPPFLASHDURATION);/發(fā)送閃爍控制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.別的設(shè)備在接受到后,仍然由 SampleApp_ProcessEvent()進(jìn)行處理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;這樣的話我們就搞清楚了其中的脈絡(luò),總之,他就是舉了一個按鍵發(fā)送的簡單的例子,循環(huán)發(fā)送廣播信息,按 UP 發(fā)送組播信息。對接收到的廣播信息不予理睬,對收到的組播信息控制 LED1 的閃爍。同時按鍵 Right 時進(jìn)行設(shè)備加入/退出組的切換。SAMPLEAPP 程序主要說明2012-05-0310:12:54|分類:zigbee|標(biāo)簽:|字號大中小訂閱程序執(zhí)行流程如下:ZMain.c的main()-osal.c的osal_init_system()-OSAL_SampleApp.c的osalInitTasks()之后分兩部分執(zhí)行首先執(zhí)行S
19、ampleApp.c的SampleApp_Init(),接著執(zhí)行osal.c中的事件循環(huán),不停的執(zhí)行SampleApp_ProcessEvent(),進(jìn)行應(yīng)用層事件檢測兩個關(guān)鍵函數(shù)1.SampleApp_Init2.SampleApp_ProcessEvent分析如下SampleApp_initvoidSampleApp_Init(uint8task_id)/osal應(yīng)用層的任務(wù)ID賦值SampleApp_TaskID=task_id;設(shè)備狀態(tài)設(shè)定為ZDO層中定義的初始化狀態(tài)SampleApp_NwkState=DEV_INIT;/定義消息IDSampleApp_TransID=0;后面的de
20、mo例子中用到這個編譯選項#ifdefined(SOFT_START)如果選擇了SOFT編譯選項,則作為協(xié)調(diào)器啟動zgDeviceLogicalType=ZG_DEVICETYPE_COORDINATOR;#endif/SOFT_START如果定義了HOLD_AUTO_START選項,則調(diào)用層的ZDOInitDevice,按照默認(rèn)順序網(wǎng)絡(luò)中的第一個設(shè)備作為協(xié)調(diào)器,其他的設(shè)備作為子設(shè)備#ifdefined(HOLD_AUTO_START)ZDOInitDevice(0);#endif定義廣播地址地址模式SampleApp_Periodic_DstAddr.addrMode=(afAddrMode
21、_t)AddrBroadcast;指定端點號SampleApp_Periodic_DstAddr.endPoint=SAMPLEAPP_ENDPOINT/指定目的網(wǎng)絡(luò)地址為廣播地址SampleApp_Periodic_DstAddr.addr.shortAddr=0 xFFFF;/設(shè)定flash中命令即按鍵命令要發(fā)送的目的地址SampleApp_Flash_DstAddr.addrMode=(afAddrMode_t)afAddrGroup;SampleApp_Flash_DstAddr.endPoint=SAMPLEAPP_ENDPOINT;SampleApp_Flash_DstAddr.a
22、ddr.shortAddr=SAMPLEAPP_FLASH_GROUP;/定義本設(shè)備用來通信的APS層端點描述符/端點號SampleApp_epDesc.endPoint=SAMPLEAPP_ENDPOINT;/任務(wù)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);/設(shè)定一個新的組/組號SampleApp_Group.ID=0 x0003;設(shè)定組名osal_memcpy(SampleApp_G,Group3,7);把該組添加到網(wǎng)絡(luò)中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)(定義應(yīng)用層數(shù)據(jù)包afIncomingMSGPacket_t*MSGpkt;/判斷osal層的消息類型如果系統(tǒng)消息到來if(events&SYS_EVENT_MSG)(接收數(shù)據(jù)包MSGpkt=(afIncomingMSGPacket_t*)osal_msg_receive(SampleApp_TaskID);如果數(shù)據(jù)包不為空while(MSGpkt)(判斷消息類型switch(MSGpkt-hdr.event)(/如果是按鍵消息caseKEY_CHANGE:調(diào)用按鍵處理函數(shù)SampleApp_HandleKeys(keyChange_t*)MSGpkt)-state,(keyChange_t*)MSGpkt)-keys);break;/如果是別的組設(shè)備周期發(fā)送的消息caseAF_INCOMING_MSG_CMD:調(diào)用對周期消息的處理函數(shù)SampleApp_MessageMSGCB(MSGpkt);break;/如果是設(shè)備狀態(tài)變換的命令caseZDO_STATE_CHANGE:獲取設(shè)備狀態(tài)SampleApp_NwkState=(devStates_t)(MSGpkt-hdr.st
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 學(xué)校生物室管理制度
- 學(xué)生會設(shè)備管理制度
- 學(xué)生項目部管理制度
- 安保部綜合管理制度
- 安全管理與管理制度
- 定向井公司管理制度
- 實訓(xùn)室水電管理制度
- 客戶保證金管理制度
- 客運包車牌管理制度
- 家裝業(yè)務(wù)員管理制度
- 新生兒重癥監(jiān)護(hù)病房捐贈人乳應(yīng)用與管理專家共識(2025)解讀
- 皮膚科進(jìn)修心得分享
- 2025年上半年廣東省廣州市白云區(qū)委宣傳部政府雇員招聘5人重點基礎(chǔ)提升(共500題)附帶答案詳解
- 項目經(jīng)理講安全課件
- 《休閑農(nóng)業(yè)》課件 項目二 休閑農(nóng)業(yè)分類及模式分析
- 2025年安徽省省情試題及答案
- 2025年消控室考核試題及答案
- 江西省吉安市遂川縣2024-2025學(xué)年數(shù)學(xué)三下期末達(dá)標(biāo)檢測試題含解析
- 衛(wèi)健系統(tǒng)2025年上半年安全生產(chǎn)工作總結(jié)
- 第一章體育與健康基礎(chǔ)知識 第一節(jié) 科學(xué)發(fā)展體能 課件 2024-2025學(xué)年人教版初中體育與健康八年級全一冊
- 高三數(shù)學(xué)復(fù)習(xí)策略
評論
0/150
提交評論