《Zigbee技術(shù)無線傳感網(wǎng)應(yīng)用》-第8章 Z-Stack協(xié)議棧運(yùn)行機(jī)制詳解_第1頁
《Zigbee技術(shù)無線傳感網(wǎng)應(yīng)用》-第8章 Z-Stack協(xié)議棧運(yùn)行機(jī)制詳解_第2頁
《Zigbee技術(shù)無線傳感網(wǎng)應(yīng)用》-第8章 Z-Stack協(xié)議棧運(yùn)行機(jī)制詳解_第3頁
《Zigbee技術(shù)無線傳感網(wǎng)應(yīng)用》-第8章 Z-Stack協(xié)議棧運(yùn)行機(jī)制詳解_第4頁
《Zigbee技術(shù)無線傳感網(wǎng)應(yīng)用》-第8章 Z-Stack協(xié)議棧運(yùn)行機(jī)制詳解_第5頁
已閱讀5頁,還剩40頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

目錄Zigbee技術(shù)無線傳感網(wǎng)應(yīng)用四、小結(jié)二、知識講解一、任務(wù)描述三、課程思政一、任務(wù)描述掌握Z-Stack的運(yùn)行機(jī)制,能完成任務(wù)初始化函數(shù)的編寫;能掌握用戶事件處理函數(shù)的運(yùn)行流程;能掌握數(shù)據(jù)收發(fā)函數(shù)的使用。Zigbee技術(shù)無線傳感網(wǎng)應(yīng)用二、知識講解Z-Stack采用基于一個輪轉(zhuǎn)查詢式操作系統(tǒng),該操作系統(tǒng)命名為OSAL(OperatingSystemAbstractionLayer),中文為“操作系統(tǒng)抽象層”。Z-Stack協(xié)議棧將底層、網(wǎng)絡(luò)層等復(fù)雜部分屏蔽掉,讓程序員通過API函數(shù)就可以輕松地開發(fā)一套ZigBee系統(tǒng)。整個Z-stack的主要工作流程,大致分為系統(tǒng)啟動,驅(qū)動初始化,OSAL初始化和啟動,進(jìn)入任務(wù)輪循幾個階段。協(xié)議棧軟件流程如圖所示。Zigbee技術(shù)無線傳感網(wǎng)應(yīng)用Z-Stack協(xié)議棧運(yùn)行流程:二、知識講解Z-stack軟件流程圖:Zigbee技術(shù)無線傳感網(wǎng)應(yīng)用Z-Stack協(xié)議棧運(yùn)行流程:二、知識講解1、系統(tǒng)初始化:系統(tǒng)上電后,通過執(zhí)行ZMain文件夾中ZMain.c的intmain()函數(shù)實現(xiàn)硬件的初始化,其中包括關(guān)總中斷osal_int_disable(INTS_ALL)、初始化板上硬件設(shè)置HAL_BOARD_INIT()、初始化I/OInitBoard(OB_COLD)、初始化HAL層驅(qū)動HalDriverInit()、初始化非易失性存儲器osal_nv_init(NULL)、初始化MAC層ZMacInit()、分配64位地址zmain_ext_addr()、初始化操作系統(tǒng)osal_init_system()等。硬件初始化需要根據(jù)HAL文件夾中的hal_board_cfg.h文件配置寄存器8051的寄存器。TI官方發(fā)布Z-Stack的配置針對的是TI官方的開發(fā)板CC2530EB等,如采用其他開發(fā)板,則需根據(jù)原理圖設(shè)計改變。當(dāng)順利完成上述初始化時,執(zhí)行osal_start_system()函數(shù)開始運(yùn)行OSAL系統(tǒng)。在Z-stack協(xié)議棧中,OSAL負(fù)責(zé)調(diào)度各個任務(wù)運(yùn)行,如果有事件發(fā)生,就會調(diào)用相應(yīng)的任務(wù)事件處理函數(shù)進(jìn)行處理。osal_start_system()一旦執(zhí)行,則不再返回main()函數(shù)。Zigbee技術(shù)無線傳感網(wǎng)應(yīng)用Z-Stack協(xié)議棧運(yùn)行流程:二、知識講解2、OSAL

任務(wù)初始化在運(yùn)行OSAL操作系統(tǒng)之前,主函數(shù)中調(diào)用了初始化操作系統(tǒng)函數(shù)osal_init_system(),在該函數(shù)中又調(diào)用了voidosalInitTasks()函數(shù),該函數(shù)對系統(tǒng)的所有任務(wù)和事件進(jìn)行初始化工作。voidosalInitTasks()函數(shù)通過調(diào)用osal_mem_alloc()函數(shù)給各個任務(wù)分配內(nèi)存空間,在函數(shù)中定義了一個初始值為0的變量taskID作為任務(wù)編號,并以此為參數(shù),調(diào)用各個任務(wù)的初始化子函數(shù)。每初始化一個任務(wù)taskID加一。在TI官方版本Z-stack協(xié)議棧中,定義了8個系統(tǒng)任務(wù),并在其后初始化一個用戶任務(wù)SamlpeApp,SampleApp_Init(DtaskID)是這個任務(wù)的初始化函數(shù)。該函數(shù)在SampleApp.c文件中實現(xiàn)。我們可以在該任務(wù)后面,繼續(xù)定義其他新的用戶任務(wù)并進(jìn)行初始化。osalInitTasks()中的任務(wù)初始化子函數(shù)的排列順序必須要與tasksArr[]中的元素排列順序一一對應(yīng)。Zigbee技術(shù)無線傳感網(wǎng)應(yīng)用Z-Stack協(xié)議棧運(yùn)行流程:二、知識講解3、事件處理函數(shù)在OSAL_SampleApp.c文件中有如下代碼:constpTaskEventHandlerFntasksArr[],每個元素都是函數(shù)的地址(用函數(shù)名表示函數(shù)的地址),即該數(shù)組的元素都是事件處理函數(shù)的函數(shù)名,如MAC層服務(wù)macEventLoop、用戶服務(wù)SampleApp_ProcessEvent等。SampleApp_ProcessEvent就是“通用應(yīng)用任務(wù)事件處理函數(shù)名”,該函數(shù)在SampleApp.c文件中被定義了。函數(shù)SampleApp_ProcessEvent是官方模板給我們提供的用戶事件處理函數(shù)范例。再次強(qiáng)調(diào)tasksArr[]中的元素的排列順序必須要與osalInitTasks()中的任務(wù)初始化子函數(shù)排列順序一一對應(yīng)。Zigbee技術(shù)無線傳感網(wǎng)應(yīng)用Z-Stack協(xié)議棧運(yùn)行流程:二、知識講解4、任務(wù)輪循在主函數(shù)中最后執(zhí)行的是osal_start_system()函數(shù),當(dāng)該函數(shù)開始執(zhí)行,即開始運(yùn)行OSAL系統(tǒng),其本質(zhì)是調(diào)用函數(shù)osal_run_system(void),通過代碼我們可以看到該函數(shù)是一個死循環(huán),即上文所講osal_start_system()一旦執(zhí)行,則不再返回main()函數(shù)。如下所示:voidosal_start_system(void){#if!defined(ZBIT)&&!defined(UBIT)for(;;)//ForeverLoop#endif{osal_run_system();}}Zigbee技術(shù)無線傳感網(wǎng)應(yīng)用Z-Stack協(xié)議棧運(yùn)行流程:二、知識講解4、任務(wù)輪循那么我們的關(guān)注重點(diǎn)就放到了函數(shù)osal_run_system()上,下面我們重點(diǎn)講解該函數(shù),即任務(wù)輪循。通過函數(shù)osal_run_system()代碼我們可以清楚的看到代碼的主要工作是輪詢tasksEvents[idx]是否有值,不判斷為何值,若有值則執(zhí)行數(shù)組tasksArr[idx]所對應(yīng)的事件處理函數(shù),傳入?yún)?shù)為當(dāng)前的任務(wù)號以及事件值。在上述代碼中出現(xiàn)了三個非常重要的變量。tasksCnt:這是一個字節(jié)類型的變量,保存了任務(wù)的總數(shù)量。tasksEvents:這是一個指針,指向了事件列表的首地址。tasksArr:這是一個數(shù)組名,元素是函數(shù)指針,指向事件處理函數(shù)表。Zigbee技術(shù)無線傳感網(wǎng)應(yīng)用Z-Stack協(xié)議棧運(yùn)行流程:二、知識講解4、任務(wù)輪循三者的關(guān)系如圖:Zigbee技術(shù)無線傳感網(wǎng)應(yīng)用Z-Stack協(xié)議棧運(yùn)行流程:二、知識講解1、事件ZigBee協(xié)議棧是由各個層組成的,每一層都要處理各種事件,所以就為每一層定義了一個事件處理函數(shù),可以把這個處理函數(shù)理解為任務(wù),任務(wù)從消息隊列中提取消息,從消息中提取所發(fā)生的具體事件,調(diào)用相應(yīng)的具體事件處理函數(shù),比如按鍵處理函數(shù)等。在ZigBee協(xié)議棧中,事件可以是用戶定義的事件,也可以是協(xié)議棧內(nèi)部已經(jīng)定義的事件,SYS_EVENT_MSG就是協(xié)議棧內(nèi)部定義的事件之一,SYS_EVENT_MSG定義如下:#define SYS_EVENT_MSG0x8000Zigbee技術(shù)無線傳感網(wǎng)應(yīng)用事件和消息:二、知識講解1、事件由協(xié)議棧定的事件為系統(tǒng)強(qiáng)制事件(MandatoryEvents),SYS_EVENT_MSG是一個事件集合,主要包括以下幾個事件:AF_INCOMING_MSG_CMD:表示收到了一個新的無線數(shù)據(jù)事件。ZDO_STATE_CHANGE:表示當(dāng)網(wǎng)絡(luò)狀態(tài)發(fā)生變化時,會產(chǎn)生該事件。如節(jié)點(diǎn)加入網(wǎng)絡(luò)時,該事件就有效,還可以進(jìn)一步判斷加入的設(shè)備是協(xié)調(diào)器、路由器或終端。KEY_CHANGE:表示按鍵事件。ZDO_CB_MSG:表示每一個注冊的ZDO響應(yīng)消息。AF_DATA_CONFIRM_CMD:調(diào)用AF_DataRequest()發(fā)送數(shù)據(jù)時,有時需要確認(rèn)信息,該事件與此有關(guān)。Zigbee技術(shù)無線傳感網(wǎng)應(yīng)用事件和消息:二、知識講解1、事件事件變量是16位的二進(jìn)制變量(uint16占2個字節(jié))。如:在ZComDef.h文件中,定義無線新數(shù)據(jù)接收事件AF_INCOMING_MSG_CMD為0x1A;MT.h文件中,定義串口接收事件CMD_SERIAL_MSG為0x01;不同的任務(wù),事件值可以相同,例如:tasksEvents[0]=0x01,tasksEvents[1]=0x01,這都是可行的,但表示的意義不同,前者表示第1個任務(wù)的事件為0x01,后者表示第2個任務(wù)的事件為0x01。一個OSAL任務(wù)除了強(qiáng)制事件(MandatoryEvents)之外還可以定義15個事件。Zigbee技術(shù)無線傳感網(wǎng)應(yīng)用事件和消息:二、知識講解2、消息消息是收到的事件和數(shù)據(jù)的一個封裝,比如發(fā)生了一個事件(收到別的節(jié)點(diǎn)發(fā)的消息),這時就會把這個事件所對應(yīng)的事件號及收到的數(shù)據(jù)封裝成消息,放入消息隊列中。OSAL消息隊列:通常某些事件的發(fā)生,雙伴隨著一些附加數(shù)據(jù)的產(chǎn)生,這就需要將事件和數(shù)據(jù)封裝成一個消息,將消息發(fā)送到消息隊列中,然后使用osal_msg_receive(SampleApp_TaskID)函數(shù)從消息隊列中得到消息。Zigbee技術(shù)無線傳感網(wǎng)應(yīng)用事件和消息:二、知識講解2、消息OSAL維護(hù)一個消息隊列,每個消息都會被放入該消息隊列中,每個消息都包括一個消息頭osal_msg_hdr_t和用戶自定義的消息。在OSAL.h中osal_msg_hdr_t結(jié)構(gòu)體的定義為:typedefstruct { void*next; uint16len; uint8dest_id; }osal_msg_hdr_t;Zigbee技術(shù)無線傳感網(wǎng)應(yīng)用事件和消息:二、知識講解Zigbee網(wǎng)絡(luò)中進(jìn)行數(shù)據(jù)通信主要有三種類型:單播、組播、廣播。單播即傳送數(shù)據(jù)包只發(fā)送給一個設(shè)備;組播即傳送數(shù)據(jù)包給一組設(shè)備;而廣播數(shù)據(jù)包則要發(fā)送給整個網(wǎng)絡(luò)的所有節(jié)點(diǎn)。無論哪種數(shù)據(jù)發(fā)送模式,必須有發(fā)送地址模式參數(shù)。Zigbee技術(shù)無線傳感網(wǎng)應(yīng)用單播、組播與廣播:二、知識講解在AF.h文件中定義了結(jié)構(gòu)體afAddrType_t,通過配置該結(jié)構(gòu)體變量的參數(shù)來設(shè)置發(fā)送地址模式參數(shù)。typedefstruct{union{uint16shortAddr;

//用于標(biāo)識該節(jié)點(diǎn)網(wǎng)絡(luò)地址的變量ZLongAddr_textAddr;}addr;afAddrMode_taddrMode;//用于指定數(shù)據(jù)傳送模式,單播、組播還是廣播uint8endPoint;uint16panId;//usedfortheINTER_PANfeature}afAddrType_t;Zigbee技術(shù)無線傳感網(wǎng)應(yīng)用單播、組播與廣播:二、知識講解在上述結(jié)構(gòu)體中成員addrMode的值為枚舉類型,如下所示:typedefenum{afAddrNotPresent=AddrNotPresent,

//表示通過綁定關(guān)系指定目的地址afAddr16Bit=Addr16Bit,

//短地址單播發(fā)送afAddr64Bit=Addr64Bit,//長地址單播發(fā)送afAddrGroup=AddrGroup,//組播afAddrBroadcast=AddrBroadcast//廣播}afAddrMode_t;Zigbee技術(shù)無線傳感網(wǎng)應(yīng)用單播、組播與廣播:二、知識講解1、單播直接指定目標(biāo)地址的單播傳輸:是標(biāo)準(zhǔn)尋址模式,它將數(shù)據(jù)包發(fā)送給一個已經(jīng)知道網(wǎng)絡(luò)地址的網(wǎng)絡(luò)設(shè)備,將afAddrMode設(shè)置為Addr16Bit并且在數(shù)據(jù)包中攜帶目標(biāo)設(shè)備地址。協(xié)調(diào)器地址是0x0000。afAddrType_tmy_DstAddr;my_DstAddr.addrMode=(afAddrMode_t)Addr16Bit;//單播發(fā)送my_DstAddr.endPoint=SAMPLEAPP_ENDPOINT;//目的端口號my_DstAddr.addr.shortAddr=0x0000;//目標(biāo)設(shè)備網(wǎng)絡(luò)地址Zigbee技術(shù)無線傳感網(wǎng)應(yīng)用單播、組播與廣播:二、知識講解1、單播直接指定目標(biāo)地址的單播傳輸:是標(biāo)準(zhǔn)尋址模式,它將數(shù)據(jù)包發(fā)送給一個已經(jīng)知道網(wǎng)絡(luò)地址的網(wǎng)絡(luò)設(shè)備,將afAddrMode設(shè)置為Addr16Bit并且在數(shù)據(jù)包中攜帶目標(biāo)設(shè)備地址。協(xié)調(diào)器地址是0x0000。afAddrType_tmy_DstAddr;my_DstAddr.addrMode=(afAddrMode_t)Addr16Bit;//單播發(fā)送my_DstAddr.endPoint=SAMPLEAPP_ENDPOINT;//目的端口號my_DstAddr.addr.shortAddr=0x0000;//目標(biāo)設(shè)備網(wǎng)絡(luò)地址Zigbee技術(shù)無線傳感網(wǎng)應(yīng)用單播、組播與廣播:二、知識講解2、組播當(dāng)應(yīng)用程序需要將數(shù)據(jù)包發(fā)送給網(wǎng)絡(luò)上的一組設(shè)備時,使用該模式。地址模式設(shè)置為afAddrGroup并且addr.shortAddr設(shè)置為組ID。使用組播的方式需要加入特定的組。定義afAddrType_t類型變量SampleApp_Flash_DstAddr。Zigbee技術(shù)無線傳感網(wǎng)應(yīng)用單播、組播與廣播:二、知識講解2、組播(1)首先聲明一個組對象aps_Group_tSampleApp_Group;aps_Group_t結(jié)構(gòu)體的定義:typedefstruct{uint16ID;//Uniquetothistableuint8name[APS_GROUP_NAME_LEN];}aps_Group_t;每個組有個特定的ID跟組名,組名存放在name數(shù)組中。Zigbee技術(shù)無線傳感網(wǎng)應(yīng)用單播、組播與廣播:二、知識講解2、組播(2)對SampleApp_Group賦值:SampleApp_Group.ID=0x0001;osal_memcpy(SampleApp_G,"Group1",7);(3)在本任務(wù)里將端點(diǎn)加入到組中:aps_AddGroup(SAMPLEAPP_ENDPOINT,&SampleApp_Group);Zigbee技術(shù)無線傳感網(wǎng)應(yīng)用單播、組播與廣播:二、知識講解2、組播(4)設(shè)定通信的目標(biāo)地址及模式:SampleApp_Flash_DstAddr.addrMode=(afAddrMode_t)afAddrGroup;SampleApp_Flash_DstAddr.endPoint=SAMPLEAPP_ENDPOINT;SampleApp_Flash_DstAddr.addr.shortAddr=SampleApp_Group.ID;

通信時候,發(fā)送設(shè)備的輸出cluster設(shè)定為接收設(shè)備的輸入cluster,另外profileID設(shè)定相同,即可通信。Zigbee技術(shù)無線傳感網(wǎng)應(yīng)用單播、組播與廣播:二、知識講解2、組播(5)若要把一個設(shè)備加入到組中的端點(diǎn)從組中移除,調(diào)用aps_RemoveGroup:aps_Group_t*grp;grp=aps_FindGroup(SAMPLEAPP_ENDPOINT,SAMPLEAPP_FLASH_GROUP);if(grp){//Removefromthegroupaps_RemoveGroup(SAMPLEAPP_ENDPOINT,SAMPLEAPP_FLASH_GROUP);}注意組可以用來關(guān)聯(lián)間接尋址。再綁定表中找到的目標(biāo)地址可能是是單點(diǎn)傳送或者是一個組地址。另外,廣播發(fā)送可以看做是一個組尋址的特例。Zigbee技術(shù)無線傳感網(wǎng)應(yīng)用單播、組播與廣播:二、知識講解3、廣播當(dāng)應(yīng)用程序需要將數(shù)據(jù)包發(fā)送給網(wǎng)絡(luò)的每一個設(shè)備時,使用這種模式。地址模式設(shè)置為AddrBroadcast。定義afAddrType_t類型變量SampleApp_Periodic_DstAddr。目標(biāo)地址SampleApp_Periodic_DstAddr.addr.shortAddr可以根據(jù)需求設(shè)置為下面廣播地址的一種:(1)NWK_BROADCAST_SHORTADDR_DEVALL(0xFFFF)——數(shù)據(jù)包將被傳送到網(wǎng)絡(luò)上的所有設(shè)備,包括睡眠中的設(shè)備。對于睡眠中的設(shè)備,數(shù)據(jù)包將被保留在其父親節(jié)點(diǎn)直到查詢到它,或者消息超時(NWK_INDIRECT_MSG_TIMEOUT在f8wConifg.cfg中)。Zigbee技術(shù)無線傳感網(wǎng)應(yīng)用單播、組播與廣播:二、知識講解3、廣播(2)NWK_BROADCAST_SHORTADDR_DEVRXON(0xFFFD)——數(shù)據(jù)包將被傳送到網(wǎng)絡(luò)上的所有在空閑時打開接收的設(shè)備(RXONWHENIDLE),也就是說,除了睡眠中的所有設(shè)備。

(3)NWK_BROADCAST_SHORTADDR_DEVZCZR(0xFFFC)——數(shù)據(jù)包發(fā)送給所有的路由器,包括協(xié)調(diào)器。SampleApp_Periodic_DstAddr.addrMode=(afAddrMode_t)AddrBroadcast;SampleApp_Periodic_DstAddr.endPoint=SAMPLEAPP_ENDPOINT;SampleApp_Periodic_DstAddr.addr.shortAddr=0xFFFF;Zigbee技術(shù)無線傳感網(wǎng)應(yīng)用單播、組播與廣播:二、知識講解在TI官方版本的Z-stack協(xié)議棧中,定義好了一個用戶任務(wù)SampleApp,這個任務(wù)的初始化子函數(shù)是SampleApp_Init()。開發(fā)人員在進(jìn)行應(yīng)用開發(fā)的時候,可能需要對SampleApp_Init()進(jìn)行修改,或者添加新的任務(wù),編寫新的任務(wù)初始化子函數(shù)。不管是那種情況,你都要明確在任務(wù)初始化中需要做些什么工作,怎么通過代碼來實現(xiàn)這些工作。通過深入剖析SampleApp_Init()函數(shù),搞清楚任務(wù)初始化的程序流程,才能更好的進(jìn)行開發(fā)工作。Zigbee技術(shù)無線傳感網(wǎng)應(yīng)用SampleApp_Init()函數(shù)解析:二、知識講解SampleApp_Init()函數(shù)代碼較長,且在書上已通過注釋的方式進(jìn)行功能說明,具體見書籍或工程代碼。在Zigbee協(xié)議中每個設(shè)備都被看作一個端點(diǎn)(endPiont),每個節(jié)點(diǎn)都有物理地址(長地址)和網(wǎng)絡(luò)地址(短地址)),長地址或短地址用來作為其他節(jié)點(diǎn)發(fā)送數(shù)據(jù)的目的地址。端點(diǎn)(endPiont)是協(xié)議棧應(yīng)用層的入口,即入口地址,也可以理解應(yīng)用對象存在的地方,它是為實現(xiàn)一個設(shè)備描述而定義的一組群集。端點(diǎn)0預(yù)留,用于整個Zigbee設(shè)備的配置和管理,端點(diǎn)255用于向所有的端點(diǎn)進(jìn)行廣播,端點(diǎn)1-240被應(yīng)用層分配,每個端點(diǎn)是可尋址的。Zigbee技術(shù)無線傳感網(wǎng)應(yīng)用SampleApp_Init()函數(shù)解析:二、知識講解每一個端點(diǎn)的實現(xiàn)由端點(diǎn)描述符來完成,由結(jié)構(gòu)體afAddrType_t來實現(xiàn),在端點(diǎn)描述符中又包含了一個簡單描述符SimpleDescriptionFormat_t,端點(diǎn)的簡單描述符結(jié)構(gòu)體在AF.h文件中定義。每一個端點(diǎn)必有一個Zigbee簡單描述符,其他設(shè)備通過查詢這個端點(diǎn)的簡單描述符來獲得設(shè)備的一些信息。在端點(diǎn)配置成功后,需要調(diào)用afRegister()函數(shù)在AF層注冊端點(diǎn),這個函數(shù)在AF.c文件中定義,其功能是,在應(yīng)用層中將一個新的端點(diǎn)注冊到AF層。端點(diǎn)的主要作用可以總結(jié)為兩個方面:A.數(shù)據(jù)發(fā)送和接收:當(dāng)一個設(shè)備發(fā)送數(shù)據(jù)時,必須指定發(fā)送目的節(jié)點(diǎn)的長地址或短地址以及端點(diǎn)來進(jìn)行數(shù)據(jù)的發(fā)送和接收,并且發(fā)送方和接收方所使用的端點(diǎn)號必須一致。B.設(shè)備綁定:如果設(shè)備之間需要綁定,那么在Zigbee的網(wǎng)絡(luò)層必須注冊一個或者多個端點(diǎn)來進(jìn)行數(shù)據(jù)的發(fā)送和接收以及綁定表的建立。Zigbee技術(shù)無線傳感網(wǎng)應(yīng)用SampleApp_Init()函數(shù)解析:二、知識講解這個函數(shù)是用戶自定義任務(wù)SampleApp的事件處理函數(shù),其總體功能是:首先調(diào)用osal_msg_receive(SampleApp_TaskID)函數(shù)從消息隊列中接收一個消息(消息包括事件和相關(guān)的數(shù)據(jù)),然后使用if語句或switch-case語句判斷事件類型,從而調(diào)用相應(yīng)的事件處理函數(shù)。所有任務(wù)的事件處理函數(shù)代碼的設(shè)計思路和執(zhí)行流程基本差不多,我們通過了解SampleApp_ProcessEvent()這個函數(shù)的程序結(jié)構(gòu)和設(shè)計思路,舉一反三,學(xué)會事件處理函數(shù)的程序設(shè)計方法。Zigbee技術(shù)無線傳感網(wǎng)應(yīng)用SampleApp_ProcessEvent()函數(shù)解析:二、知識講解SampleApp_ProcessEvent()函數(shù)代碼較長,且在書上已通過注釋的方式進(jìn)行功能說明,具體見書籍或工程代碼。首先調(diào)用osal_msg_receive(SampleApp_TaskID)函數(shù)從消息隊列中接收一個消息,存放在變量MSGpkt中,消息包括事件和相關(guān)的數(shù)據(jù)。同一個任務(wù)可能發(fā)生了多個事件。在函數(shù)中,先用if語句對事件變量events進(jìn)行判斷,SYS_EVENT_MSG是一個事件集合,所以還要通過switch-case語句進(jìn)行不同事件的再次判斷,當(dāng)事件處理完畢,再從消息隊列中接收有效消息,然后再返回while(MSGpkt)重新處理事件,直到?jīng)]有等待消息為止。當(dāng)一個事件處理完畢之后,需要通過異或運(yùn)算,清除已處理完的事件,留下未處理的事件,并將未處理的事件返回給事件變量events。Zigbee技術(shù)無線傳感網(wǎng)應(yīng)用SampleApp_ProcessEvent()函數(shù)解析:二、知識講解Z-stack協(xié)議棧數(shù)據(jù)的發(fā)送和接收是通過定義在AF層的數(shù)據(jù)發(fā)送和接收API來實現(xiàn)的。1、數(shù)據(jù)發(fā)送函數(shù)AF_DataRequest()在事件處理函數(shù)SampleApp_ProcessEvent()里面,有一個事件SAMPLEAPP_SEND_PERIODIC_MSG_EVT,該事件由osal_start_timerEx()函數(shù)經(jīng)過參數(shù)設(shè)定的時間向參數(shù)設(shè)定的任務(wù)產(chǎn)生的。在這個事件的處理過程中,調(diào)用了數(shù)據(jù)發(fā)送函數(shù)。Zigbee技術(shù)無線傳感網(wǎng)應(yīng)用數(shù)據(jù)收發(fā)函數(shù)解析:二、知識講解數(shù)據(jù)的發(fā)送,只要調(diào)用在AF.c文件中定義的AF_DataRequest()數(shù)據(jù)發(fā)送函數(shù)即可實現(xiàn)。數(shù)據(jù)包被發(fā)送到一個注冊過的端點(diǎn),函數(shù)原型如下:afStatus_tAF_DataRequest(afAddrType_t*dstAddr,//指向發(fā)送目的地址指針endPointDesc_t*srcEP,//指向目的端點(diǎn)的端點(diǎn)描述符指針uint16cID,//指定的有效群集IDuint16len,//發(fā)送字節(jié)長度uint8*buf,//發(fā)送數(shù)據(jù)緩存的地址uint8*transID,//數(shù)據(jù)發(fā)送序列號指針uint8options,//發(fā)送選項uint8radius)//最大跳數(shù)半徑,通常設(shè)置為默認(rèn)Zigbee技術(shù)無線傳感網(wǎng)應(yīng)用數(shù)據(jù)收發(fā)函數(shù)解析:二、知識講解在應(yīng)用層通過OSAL事件處理函數(shù)中的接收信息事件AF_INCOMING_MSG_CMD來處理數(shù)據(jù)的接收。數(shù)據(jù)的接收是通過結(jié)構(gòu)體afIncomingMSGPacket_t來進(jìn)行,這個結(jié)構(gòu)體的定義在AF.h文件中。數(shù)據(jù)的接收過程是通過判斷afIncomingMSGPacket_t結(jié)構(gòu)體中的clusterId來進(jìn)行判斷是否為所需要接收的數(shù)據(jù),如果是需要接收的數(shù)據(jù),那么就做進(jìn)一步的分析和處理。數(shù)據(jù)在pkt->cmd.Data數(shù)組中。Zigbee技術(shù)無線傳感網(wǎng)應(yīng)用數(shù)據(jù)接收函數(shù)SampleApp_MessageMSGCB():二、知識講解ZigBee協(xié)議棧支持多任務(wù)運(yùn)行,那任務(wù)間同步、互斥等都需要相應(yīng)的API(應(yīng)用編程接口,ApplicationProgrammingInterface)來支持??傮w來說,OSAL提供了8個方面的API,它們分別是消息管理、任務(wù)同步、時間管理、中斷管理、任務(wù)管理、內(nèi)存管理、電源管理和非易失性閃存管理。由于API函數(shù)很多,下面只選取部分經(jīng)典的API進(jìn)行介紹。Zigbee技術(shù)無線傳感網(wǎng)應(yīng)用其他幾個重要API解析:二、知識講解1.消息管理API消息管理有關(guān)的API主要用于處理任務(wù)間消息的交換,主要包括為任務(wù)分配消息緩存、釋放消息緩存、發(fā)送消息和接收消息等API函數(shù)。①為任務(wù)分配消息緩存函數(shù)原型:uint8*osal_msg_allocat(uint16len)功能描述:為消息分配緩存空間,函數(shù)中的形參len表示需要分配存儲空間的大小。②釋放消息緩存函數(shù)原型:uint8osal_msg_deallocate(uint8*msg_ptr)功能描述:為消息釋放空間,函數(shù)中的形參msg_ptr表示消息的指針。③發(fā)送消息函數(shù)原型:uint8osal_msg_send(uint8destination_task,uint8*msg_ptr)功能描述:把一個任務(wù)的消息發(fā)送到消息隊列。④接收消息函數(shù)原型:uint8*osal_msg_receive(uint8task_id)功能描述:一個任務(wù)從消息隊列中接收屬于自己的消息。Zigbee技術(shù)無線傳感網(wǎng)應(yīng)用其他幾個重要API解析:二、知識講解2.任務(wù)同步API任務(wù)同步API主要用于任務(wù)間的同步,允許一個任務(wù)等待某個事件的發(fā)生。函數(shù)原型:uint8osal_set_event(uint8task_id,uint16event_flag)功能描述:運(yùn)行一個任務(wù)設(shè)置某一事件。Zigbee技術(shù)無線傳感網(wǎng)應(yīng)用其他幾個重要API解析:二、知識講解3.時間管理API時間管理API用于開啟和關(guān)閉定時器,定時時間一般為毫秒級定時,使用該API,用戶不必關(guān)心底層定時器是如何初始化的,只需要調(diào)用即可,在ZigBee協(xié)議棧物理層已經(jīng)將定時器初始化了。①設(shè)置時間函數(shù)原型:uint8osal_start_timerEx(uint8taskID,uint16event_id,uint16timeout_value)功能描述:設(shè)置一個定時時間,定時到后相應(yīng)的事件被設(shè)置。注意:定時是一次有效,不會周期性定時。②停止定時函數(shù)原型:uint8osal_stop_timerEx(uint8task_id,uint16event_id)功能描述:停止已經(jīng)啟動的定時器。Zigbee技術(shù)無線傳感網(wǎng)應(yīng)用其他幾個重要API解析:二、知識講解在ZigBee協(xié)議棧應(yīng)用程序

溫馨提示

  • 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論