ZigBee無線傳感網(wǎng)技術(shù)與應(yīng)用 課件 項(xiàng)目六任務(wù)二 無線智能窗簾控制系統(tǒng)_第1頁
ZigBee無線傳感網(wǎng)技術(shù)與應(yīng)用 課件 項(xiàng)目六任務(wù)二 無線智能窗簾控制系統(tǒng)_第2頁
ZigBee無線傳感網(wǎng)技術(shù)與應(yīng)用 課件 項(xiàng)目六任務(wù)二 無線智能窗簾控制系統(tǒng)_第3頁
ZigBee無線傳感網(wǎng)技術(shù)與應(yīng)用 課件 項(xiàng)目六任務(wù)二 無線智能窗簾控制系統(tǒng)_第4頁
ZigBee無線傳感網(wǎng)技術(shù)與應(yīng)用 課件 項(xiàng)目六任務(wù)二 無線智能窗簾控制系統(tǒng)_第5頁
已閱讀5頁,還剩56頁未讀, 繼續(xù)免費(fèi)閱讀

付費(fèi)下載

下載本文檔

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

文檔簡介

Zigbee無線傳感網(wǎng)技術(shù)與應(yīng)用智能家居傳感網(wǎng)0601了解ZigbeeOSAL運(yùn)行原理03掌握Zigbee網(wǎng)絡(luò)串口編程方法04了解Zigbee無線傳感網(wǎng)傳輸方式02了解Zigbee協(xié)議棧原理學(xué)習(xí)目標(biāo)Learningobjectives任務(wù)二:無線智能窗簾控制系統(tǒng)任務(wù)要求要求讀者掌握使用Z-Stack組網(wǎng)程序,一個節(jié)點(diǎn)設(shè)備使用光照傳感器接收光照數(shù)值實(shí)時發(fā)送數(shù)據(jù)至協(xié)調(diào)器,協(xié)調(diào)器接收數(shù)據(jù)發(fā)送數(shù)據(jù)至PC上位機(jī)模擬開啟窗簾,當(dāng)光照大于設(shè)定數(shù)值時關(guān)閉窗簾,小于時打開窗簾。任務(wù)目標(biāo)Missionobjectives01了解什么是Z-Stack03使用OASL進(jìn)行Z-Stack組網(wǎng)02了解Z-Stack基本概念儲備知識Z-stack是挪威半導(dǎo)體公司Chipcon(目前已經(jīng)被TI公司收購)推出其CC2430開發(fā)平臺時,推出的一款業(yè)界領(lǐng)先的商業(yè)級協(xié)議棧軟件,由于這個協(xié)議棧軟件的出現(xiàn),用戶可以很容易地開發(fā)出具體的應(yīng)用程序來,也就是大家說的掌握10個函數(shù)就能使用ZigBee通訊的原因。它使用瑞典公司IAR開發(fā)的IAREmbeddedWorkbenchforMCS-51作為它的集成開發(fā)環(huán)境。Chipcon公司為自己設(shè)計(jì)的Z-Stack協(xié)議棧中提供了一個名為操作系統(tǒng)抽象層OSAL的協(xié)議棧調(diào)度程序。對于用戶來說,除了能夠看到這個調(diào)度程序外,其它任何協(xié)議棧操作的具體實(shí)現(xiàn)細(xì)節(jié)都被封裝在庫代碼中。用戶在進(jìn)行具體的應(yīng)用開發(fā)時只能夠通過調(diào)用API接口來進(jìn)行,而無權(quán)知道ZigBee協(xié)議棧實(shí)現(xiàn)的具體細(xì)節(jié),也沒必要去知道。因此在這里提醒各位開發(fā)者,在使用ZigBee協(xié)議棧進(jìn)行實(shí)際項(xiàng)目開發(fā)時,不需要關(guān)心協(xié)議棧是具體怎么實(shí)現(xiàn)的,當(dāng)然有興趣的也可以深入分析。1.什么是Z-StackZ-Stack概述儲備知識TI公司的基于ZigBee2007的協(xié)議棧Z-Stack-CC2530-2.3.0,所有文件目錄如圖紅色框所示,我們可以把它看做一個龐大的工程?;蛘呤且粋€小型的操作系統(tǒng)。采用任務(wù)輪詢的方法運(yùn)行。圖:Z-Stack工程ZigBee協(xié)議棧已經(jīng)實(shí)現(xiàn)ZigBee協(xié)議,用戶可以使用協(xié)議棧提供的API進(jìn)行應(yīng)用程序的開發(fā),在開發(fā)過程中完全不必關(guān)心ZigBee協(xié)議的具體實(shí)現(xiàn)細(xì)節(jié),要關(guān)心的問題是:應(yīng)用層的數(shù)據(jù)是使用哪些函數(shù)通過什么方式把數(shù)據(jù)發(fā)送出去或者把數(shù)據(jù)接收過來的。所以最重要的是我們要學(xué)會使用ZigBee協(xié)議棧。1.什么是Z-Stack儲備知識協(xié)議是一系列的通信標(biāo)準(zhǔn),通信雙方需要共同按照這一標(biāo)準(zhǔn)進(jìn)行正常的數(shù)據(jù)發(fā)射和接收。協(xié)議棧是協(xié)議的具體實(shí)現(xiàn)形式,通俗點(diǎn)來理解就是協(xié)議棧是協(xié)議和用戶之間的一個接口,開發(fā)人員通過使用協(xié)議棧來使用這個協(xié)議的,進(jìn)而實(shí)現(xiàn)無線數(shù)據(jù)收發(fā)。ZigBee的協(xié)議分為兩部分,IEEE802.15.4定義了PHY(物理層)和MAC(介質(zhì)訪問層)技術(shù)規(guī)范;ZigBee聯(lián)盟定義了NWK(網(wǎng)絡(luò)層)、APS(應(yīng)用程序支持子層)、APL(應(yīng)用層)技術(shù)規(guī)范。ZigBee協(xié)議棧就是將各個層定義的協(xié)議都集合在一起,以函數(shù)的形式實(shí)現(xiàn),并給用戶提供API(應(yīng)用層),用戶可以直接調(diào)用。1.什么是Z-StackZ-Stack協(xié)議儲備知識用戶實(shí)現(xiàn)一個簡單的無線數(shù)據(jù)通信時的一般步驟為:組網(wǎng):抵用協(xié)議棧的組網(wǎng)函數(shù)、加入網(wǎng)絡(luò)函數(shù),實(shí)現(xiàn)網(wǎng)絡(luò)的建立與節(jié)點(diǎn)的加入。發(fā)送:發(fā)送節(jié)點(diǎn)調(diào)用協(xié)議棧的無線數(shù)據(jù)發(fā)送函數(shù),實(shí)現(xiàn)無線數(shù)據(jù)發(fā)送。接收:接收節(jié)點(diǎn)調(diào)用協(xié)議棧的無線數(shù)據(jù)接收函數(shù),實(shí)現(xiàn)無線數(shù)據(jù)接收。通信步驟1.什么是Z-StackZibge無線傳感網(wǎng)層Zigbee無線傳感器網(wǎng)絡(luò)的協(xié)議棧主要分為物理層、數(shù)據(jù)鏈路層(MAC)、網(wǎng)絡(luò)層、傳輸層和應(yīng)用層5層。儲備知識1.什么是Z-Stack圖:Zigbee層級關(guān)系儲備知識現(xiàn)教材制作了一套上位機(jī)軟件,用來模擬窗簾控制,使用串口與電腦通信,軟件使用波特率19200、無奇偶校驗(yàn)位、默認(rèn)COM連接COM11接口(需要手動設(shè)置COM口為COM11)。其具體通信協(xié)議如下表所示。指令部分0xff表示為啟始符、中間兩位為光照度數(shù)據(jù)高8位與低8位、無終止符。表:上位機(jī)通信指令集合功能指令備注接收光照值0xFF0x110x10無圖:模擬窗簾上位機(jī)2.模擬窗簾上位機(jī)3.最簡單的Z-Stack本任務(wù)所需硬件:下載器、1塊ZigBee開發(fā)板、光照傳感器、5V電源適配器、USB下載線。環(huán)境準(zhǔn)備任務(wù)實(shí)施任務(wù)實(shí)施

打開“Zstack”工程,編寫協(xié)調(diào)器代碼與節(jié)點(diǎn)代碼;

如果組網(wǎng)成功后,接收到節(jié)點(diǎn)發(fā)送的數(shù)據(jù)“1”,LED開始閃爍。任務(wù)要求編寫代碼步驟1:復(fù)制“配套資料\項(xiàng)目六\z-stack”目錄保存為“工程1”,并打開“工程1\Projects\zstack\Samples\SampleApp\CC2530DB\SampleApp.eww”工程文件,如圖所示。圖:打開工程文件與工程目錄3.最簡單的Z-Stack任務(wù)實(shí)施步驟2:刪除Coordinator.c與Coordinator.h、EndDevice.c、EndDevice.h文件,重寫協(xié)調(diào)器、節(jié)點(diǎn)代碼,如圖所示。3.最簡單的Z-Stack圖:刪除文件任務(wù)實(shí)施3.最簡單的Z-Stack圖:添加文件步驟3:在“Source”目錄下新建mycoordinator.c與mycoordinator.h文件并在App目錄下添加,如圖所示。Source目錄為用戶編寫程序目錄,表示協(xié)調(diào)器代碼與頭文件。任務(wù)實(shí)施3.最簡單的Z-Stack步驟4:在mycoordinator.c文件下編寫添加頭文件,代碼如下所示。#include"ZComDef.h"#include"OSAL.h"#include"AF.h”#include"ZDAPP.h"#include"mycoordinator.h"#include"hal_led.h"代碼小貼士:代碼:#include"AF.h"說明:后續(xù)代碼需要調(diào)用Z-Stack組網(wǎng)函數(shù),故需要添加該頭文件。代碼:#include"hal_led.h"說明:后續(xù)代碼需要調(diào)用LED閃爍函數(shù)。故需要添加頭文件。任務(wù)實(shí)施3.最簡單的Z-Stack步驟5:在mycoordinator.c代碼中編寫任務(wù)初始化函數(shù)App_Init(),代碼如下所示。#include"ZComDef.h"#include"OSAL.h"#include"AF.h"#include"mycoordinator.h"#include"hal_led.h"uint8app_taskid;voidApp_Init(uint8task_id){app_taskid=task_id;}任務(wù)實(shí)施3.最簡單的Z-Stack步驟6:在mycoordinator.c代碼中編寫任務(wù)初始化函數(shù)App_Event(),代碼如右所示。uint16App_Event(uint8task_id,uint16events){

return

0;}步驟7:編寫mycoordinator.h頭文件,把初始化函數(shù)、事件處理函數(shù)設(shè)為外部可調(diào)用函數(shù),代碼如下所示。#ifndefTEST_H#defineTEST_H#include"comdef.h"extern

voidApp_Init(uint8task_id);externuint16App_Event(uint8task_id,uint16events);#endif任務(wù)實(shí)施3.最簡單的Z-Stack步驟8:在App目錄下找到OSAL_SampleApp.c文件如圖所示,在OSAL_SampleApp.c中osalInitTask函數(shù)中刪除之前任務(wù)代碼,添加新任務(wù)初始化函數(shù)test_init()并傳入任務(wù)id號,代碼如右所示。voidosalInitTasks(void){uint8taskID=0;tasksEvents=(uint16*)osal_mem_alloc(sizeof(uint16)*tasksCnt);osal_memset(tasksEvents,0,(sizeof(uint16)*tasksCnt));macTaskInit(taskID++);nwk_init(taskID++);Hal_Init(taskID++);#ifdefined(MT_TASK)MT_TaskInit(taskID++);#endifAPS_Init(taskID++);#ifdefined(ZIGBEE_FRAGMENTATION)APSF_Init(taskID++);#endifZDApp_Init(taskID++);#ifdefined(ZIGBEE_FREQ_AGILITY)||defined(ZIGBEE_PANID_CONFLICT)ZDNwkMgr_Init(taskID++);#endif/*添加的新初始化函數(shù)*/test_Init(taskID);/********************/}任務(wù)實(shí)施3.最簡單的Z-Stack步驟9:在OSAL_SampleApp.c文件tasksArr[]數(shù)組最后,添加編寫的事件函數(shù)名App_Event,并刪除SampleApp_ProcessEvent事件,代碼如右所示。//TheorderinthistablemustbeidenticaltothetaskinitializationcallsbelowinosalInitTask.constpTaskEventHandlerFntasksArr[]={macEventLoop,nwk_event_loop,Hal_ProcessEvent,#ifdefined(MT_TASK)MT_ProcessEvent,#endifAPS_event_loop,#ifdefined(ZIGBEE_FRAGMENTATION)APSF_ProcessEvent,#endifZDApp_event_loop,#ifdefined(ZIGBEE_FREQ_AGILITY)||defined(ZIGBEE_PANID_CONFLICT)ZDNwkMgr_event_loop,#endif/*添加的事件*/App_Event/************/};任務(wù)實(shí)施3.最簡單的Z-Stack步驟10:在完成OSAL代碼流程編寫完成后,開始編寫組網(wǎng)代碼其中初始化注冊標(biāo)志代碼,在mycoordinator.c文件,AppInit函數(shù)中編寫代碼,代碼如右所示。uint8app_taskid;endPointDesc_tAppDesc;//節(jié)點(diǎn)描述符uint16list[2]={

1};//用來描述一個ZigBee設(shè)備節(jié)點(diǎn),稱為簡單設(shè)備描述符constSimpleDescriptionFormat_tApp_SimDesc={

20,0x0f08,0x0001,0,0,2,(cId_t*)list,0,(cId_t*)NULL,};voidApp_Init(uint8task_id){app_taskid=task_id;AppDesc.endPoint=20;//端口號AppDesc.task_id=&app_taskid;//任務(wù)IDAppDesc.simpleDesc=(SimpleDescriptionFormat_t*)&App_SimDesc;AppDesc.latencyReq=noLatencyReqs;//延時策略afRegister(&AppDesc);//注冊組網(wǎng)}任務(wù)實(shí)施3.最簡單的Z-Stack代碼小貼士:代碼:endPointDesc_tAppDesc;說明:結(jié)構(gòu)體為節(jié)點(diǎn)描述符,提供給afRegister函數(shù)注冊使用。包含有端口任務(wù)ID等信息。代碼:constSimpleDescriptionFormat_tApp_SimDesc={ 20,0x0f08,0x0001,0,0,2,(cId_t*)list,0,(cId_t*)NULL,}說明:在AppDesc結(jié)構(gòu)體中更具體的通信地址等信息,暫不理解直接使用。代碼:afRegister(&AppDesc);說明:注冊組網(wǎng)信息,只有注冊才可使用組網(wǎng)功能函數(shù)。任務(wù)實(shí)施3.最簡單的Z-Stack步驟11:在mycoordinator.c文件編寫,事件處理函數(shù)App_Event()代碼,代碼如下所示。uint16App_Event(uint8task_id,uint16events){afIncomingMSGPacket_t*msg;

if(events&SYS_EVENT_MSG){//接收事件與數(shù)據(jù)msg=(afIncomingMSGPacket_t*)osal_msg_receive(app_taskid);

while(msg){}

return(events^SYS_EVENT_MSG);}

return

0;}代碼小貼士:代碼:afIncomingMSGPacket_t*msg;說明:該結(jié)構(gòu)體保存著各種事件與接收的數(shù)據(jù)。代碼:msg=(afIncomingMSGPacket_t*)osal_msg_receive(app_taskid);說明:osal_msg_receive函數(shù)為接收事件消息數(shù)據(jù)的函數(shù)。任務(wù)實(shí)施步驟12:在mycoordinator.c文件編寫,事件處理函數(shù)App_Event()代碼,代碼如下所示。3.最簡單的Z-Stackuint16App_Event(uint8task_id,uint16events){afIncomingMSGPacket_t*msg;

if(events&SYS_EVENT_MSG){//接收數(shù)據(jù)

msg=(afIncomingMSGPacket_t*)osal_msg_receive(app_taskid);

while(msg){

switch(msg->hdr.event){

caseAF_INCOMING_MSG_CMD://接收到數(shù)據(jù)

App_Msg(msg);//接收到數(shù)據(jù)處理函數(shù)

break;

}osal_msg_deallocate((uint8*)msg);//清除緩存空間//再次接收數(shù)據(jù),直到?jīng)]有事件

msg=(afIncomingMSGPacket_t*)osal_msg_receive(app_taskid);}

return(events^SYS_EVENT_MSG);}

return

0;}任務(wù)實(shí)施3.最簡單的Z-Stack代碼小貼士:代碼:while(msg)說明:循環(huán)接收數(shù)據(jù),直到?jīng)]有事件數(shù)據(jù)后退出。代碼:switch(msg->hdr.event)說明:msg結(jié)構(gòu)體中hdr.event變量為系統(tǒng)接收事件標(biāo)志,其中AF_INCOMING_MSG_CMD表示接收到數(shù)據(jù)代碼:osal_msg_deallocate((uint8*)msg);說明:處理事件后,需要釋放存儲空間,在Zigbee協(xié)議棧中存放是一直累加的,所以需要使用函數(shù)釋放空間。任務(wù)實(shí)施步驟13:在mycoordinator.c文件編寫,事件接收到數(shù)據(jù)處理函數(shù)App_Msg()代碼,代碼如下所示。3.最簡單的Z-Stackuint16tmp=0;voidApp_Msg(afIncomingMSGPacket_t*m){

switch(m->clusterId){

case

0x0001://接收到包

if(m->cmd.Data[0]=='1'){HalLedBlink(HAL_LED_2,0,50,500);}

break;}}任務(wù)實(shí)施3.最簡單的Z-Stack代碼小貼士:代碼:switch(m->clusterId)說明:m->cluserID表示數(shù)據(jù)包的標(biāo)識符,0x0001為節(jié)點(diǎn)發(fā)送數(shù)據(jù)給協(xié)調(diào)器時的數(shù)據(jù)包標(biāo)識符。代碼:case0x0001:說明:如果標(biāo)識符為0x0001,則開始判斷包內(nèi)容代碼:if(m->cmd.Data[0]=='1')說明:m->cmd.Data有著發(fā)送數(shù)據(jù)包的具體內(nèi)容,判斷第0位是否為字符1,如果是則執(zhí)行if內(nèi)代碼。任務(wù)實(shí)施3.最簡單的Z-Stack代碼小貼士:代碼:HalLedBlink(HAL_LED_2,0,50,500);說明:函數(shù)在hal_led.h頭文件中被定義,調(diào)用函數(shù)則LED開始閃爍 參數(shù)1:表示LED的IO 參數(shù)2:閃縮次數(shù),0表示一直閃 參數(shù)3:亮與滅的比例,50表示各占一半 參數(shù)4:周期,500表示0.5s閃爍任務(wù)實(shí)施步驟14:在mycoordinator.h頭文件編寫,事件接收到數(shù)據(jù)處理函數(shù)App_Msg()引用,代碼如下所示。3.最簡單的Z-Stack#ifndefMYCOORDINATOR_H#defineMYCOORDINATOR_Hextern

voidApp_Init(uint8task_id);externuint16App_Event(uint8task_id,uint16events);extern

voidApp_Msg(afIncomingMSGPacket_t*m);#endif任務(wù)實(shí)施步驟15:編譯代碼,設(shè)置系統(tǒng)是否被運(yùn)行成功,成功進(jìn)入事件,如圖所示。3.最簡單的Z-Stack圖:成功進(jìn)入事件任務(wù)實(shí)施步驟16:協(xié)調(diào)器代碼編寫完成,接下來開始編寫節(jié)點(diǎn)代碼,新建一個文件“myenddevice.c”文件,并添加至APP目錄下如圖所示。3.最簡單的Z-Stack圖:節(jié)點(diǎn)文件任務(wù)實(shí)施步驟17:將在CoordinatorEB工程下屏蔽myenddevice.c,如圖所示。3.最簡單的Z-Stack圖:屏蔽文件任務(wù)實(shí)施步驟18:切換至EndDeviceEB,并屏蔽mycoordinator.c文件,如圖所示。3.最簡單的Z-Stack圖:模式切換、屏蔽文件任務(wù)實(shí)施步驟19:復(fù)制mycoordinator.c代碼至myenddevice.c文件下,刪除接收數(shù)據(jù)事件AF_INCOMING_MSG_CMD代碼,保留其他代碼。刪除后的App_Event函數(shù)代碼如右所示。3.最簡單的Z-Stackuint16App_Event(uint8task_id,uint16events){afIncomingMSGPacket_t*msg;

if(events&SYS_EVENT_MSG){//接收數(shù)據(jù)msg=(afIncomingMSGPacket_t*)osal_msg_receive(app_taskid);

while(msg){

switch(msg->hdr.event){

}osal_msg_deallocate((uint8*)msg);//清除緩存空間//再次接收數(shù)據(jù),直到?jīng)]有事件msg=(afIncomingMSGPacket_t*)osal_msg_receive(app_taskid);}

return(events^SYS_EVENT_MSG);}

return

0;}任務(wù)實(shí)施步驟20:在myenddevice.c判斷事件函數(shù)代碼中添加一段代碼,用于判斷組網(wǎng)是否完成,代碼如下所示。3.最簡單的Z-Stackuint16App_Event(uint8task_id,uint16events){afIncomingMSGPacket_t*msg;

//系統(tǒng)事件定義

if(events&SYS_EVENT_MSG){//接收數(shù)據(jù)msg=(afIncomingMSGPacket_t*)osal_msg_receive(app_taskid);

while(msg){

switch(msg->hdr.event){

caseZDO_STATE_CHANGE://組網(wǎng)發(fā)送改變

if(msg->hdr.status==DEV_ZB_COORD||

msg->hdr.status==DEV_ROUTER||msg->hdr.status==DEV_END_DEVICE)App_Send();//發(fā)送數(shù)據(jù)函數(shù)}

break;}osal_msg_deallocate((uint8*)msg);//清楚緩存空間//接收數(shù)據(jù)msg=(afIncomingMSGPacket_t*)osal_msg_receive(app_taskid);}

return(events^SYS_EVENT_MSG);}

return

0;}任務(wù)實(shí)施3.最簡單的Z-Stack代碼小貼士:代碼:caseZDO_STATE_CHANGE:說明:該事件為組網(wǎng)發(fā)生改變時的事件。代碼:if(msg->hdr.status==DEV_ZB_COORD||msg->hdr.status==DEV_ROUTER||msg->hdr.status==DEV_END_DEVICE)說明:判斷組網(wǎng)標(biāo)志是否為指定標(biāo)志,DEV_ZB_COORD為協(xié)調(diào)器、DEV_ROUTER為路由器、DEV_END_DEVICE為節(jié)點(diǎn)。為其中一個則證明組網(wǎng)成功??砂l(fā)送數(shù)據(jù)給協(xié)調(diào)器。任務(wù)實(shí)施步驟21:在myenddevice.c文件下,添加一個發(fā)送數(shù)據(jù)函數(shù)“App_Send()”代碼如下所示。3.最簡單的Z-StackvoidApp_Send(void){afAddrType_tmyaddr;myaddr.addrMode=(afAddrMode_t)Addr16Bit;//地址模式為16位模式myaddr.endPoint=20;myaddr.addr.shortAddr=0x0000;//表示發(fā)送給協(xié)調(diào)器AF_DataRequest(&myaddr,&AppDesc,1,2,"1",0,AF_DISCV_ROUTE,AF_DEFAULT_RADIUS);}任務(wù)實(shí)施3.最簡單的Z-Stack代碼小貼士:代碼:afAddrType_tmyaddr;說明:發(fā)送數(shù)據(jù)給協(xié)調(diào)器時需要聲明該結(jié)構(gòu)體,該結(jié)構(gòu)體存儲發(fā)送的模式地址等信息。代碼:myaddr.addrMode=(afAddrMode_t)Addr16Bit;說明:表示地址模式共三種 1、短地址模式Addr16Bit 2、擴(kuò)展地址模式Addr64Bit 3、無地址模式AddrNotPresent代碼:myaddr.endPoint=20;說明:與協(xié)調(diào)器保持一致即可,為20。代碼:myaddr.addr.shortAddr=0x0000;說明:0x0000表示均表示為發(fā)送給協(xié)調(diào)器任務(wù)實(shí)施3.最簡單的Z-Stack代碼小貼士:代碼:AF_DataRequest(&myaddr,&AppDesc,0x0001,2,"1",0,AF_DISCV_ROUTE,AF_DEFAULT_RADIUS);說明:該函數(shù)為發(fā)送數(shù)據(jù)函數(shù)至指定設(shè)備板函數(shù)。 參數(shù)1:afAddrType_t結(jié)構(gòu)體發(fā)送設(shè)備地址等信息 參數(shù)2:描述符 參數(shù)3:事件ID號、與接收中事件m->clusterId匹配 參數(shù)4:發(fā)送數(shù)據(jù)的長度 參數(shù)5:發(fā)送的數(shù)據(jù) 參數(shù)6:校驗(yàn)包自動加1 參數(shù)7:發(fā)現(xiàn)路由默認(rèn)為AF_DISCV_ROUTE 參數(shù)8:傳送跳數(shù)默認(rèn)為AF_DEFAULT_RADIUS任務(wù)實(shí)施步驟22:在mycoordinator.h頭文件編寫,事件接收到數(shù)據(jù)處理函數(shù)App_Send()引用,代碼如下所示。3.最簡單的Z-Stack#ifndefMYCOORDINATOR_H#defineMYCOORDINATOR_Hextern

voidApp_Init(uint8task_id);externuint16App_Event(uint8task_id,uint16events);extern

voidApp_Msg(afIncomingMSGPacket_t*m);externvoidApp_Send(void);#endif任務(wù)實(shí)施步驟23:開啟協(xié)調(diào)器設(shè)備電源,下載節(jié)點(diǎn)代碼至設(shè)備中,設(shè)置斷點(diǎn)查看是否組網(wǎng)成功,如圖所示。3.最簡單的Z-Stack圖:組網(wǎng)成功任務(wù)實(shí)施步驟24:全速執(zhí)行,查看協(xié)調(diào)器是否閃爍。閃爍則證明協(xié)調(diào)器接收到數(shù)據(jù),如圖所示。3.最簡單的Z-Stack圖:燈閃爍任務(wù)實(shí)施一、修改代碼,在節(jié)點(diǎn)設(shè)備發(fā)送數(shù)據(jù)“helloworld”,協(xié)調(diào)器接收數(shù)據(jù)并使LED閃爍,頻率為2s一次。二、在節(jié)點(diǎn)設(shè)備創(chuàng)建新事件,并在新事件下每2秒發(fā)送一次數(shù)據(jù)至協(xié)調(diào)器。技能拓展3.最簡單的Z-Stack4.無線智能窗簾控制系統(tǒng)本任務(wù)所需硬件:下載器、1塊ZigBee開發(fā)板、光照傳感器、5V電源適配器、USB下載線。環(huán)境準(zhǔn)備任務(wù)實(shí)施任務(wù)實(shí)施

節(jié)點(diǎn)設(shè)備獲取光照傳感器接收光照數(shù)值實(shí)時發(fā)送數(shù)據(jù)至協(xié)調(diào)器;

協(xié)調(diào)器接收數(shù)據(jù)發(fā)送數(shù)據(jù)至PC上位機(jī)模擬開啟窗簾;

當(dāng)光照大于設(shè)定數(shù)值時關(guān)閉窗簾,小于時打開窗簾。任務(wù)要求編寫代碼步驟1:復(fù)制“上述任務(wù)代碼”目錄保存為“工程2”,并打開“工程2\Projects\zstack\Samples\SampleApp\CC2530DB\SampleApp.eww”工程文件,如圖所示。包含mycoordinator、myenddevice文件內(nèi)容。4.無線智能窗簾控制系統(tǒng)圖:文件目錄任務(wù)實(shí)施步驟2:雙擊打開“mycoordinator.c”文件添加串口初始化函數(shù),串口發(fā)送字符、字符串函數(shù)代碼,代碼如右所示。4.無線智能窗簾控制系統(tǒng)voidUartInit(void){P0SEL|=0x0c;//設(shè)置外設(shè)PERCFG=0x00;//設(shè)置I/O位置U0CSR|=0x80;//設(shè)置UART模式U0BAUD=59;//設(shè)置波特率為19200U0GCR=9;//設(shè)置波特率為19200EA=1;//開啟總中斷}voidsend(unsigned

chars){U0DBUF=s;//發(fā)送a

while(!UTX0IF);UTX0IF=0;}voidsendstr(unsigned

char*s,unsigned

charlen){

intcount=0;

while(len--){send(*(s+count));count++;}}任務(wù)實(shí)施代碼小貼士:根據(jù)上位軟件協(xié)議波特率為19200,查看項(xiàng)目四表得出U0BAUD=59、U0GCR=94.無線智能窗簾控制系統(tǒng)步驟3:雙擊打開“mycoordinator.h”頭文件添加串口初始化函數(shù),串口發(fā)送字符、字符串函數(shù)代碼聲明,代碼如下所示。extern

voidUartInit(void);extern

voidsend(unsigned

chars);extern

voidsendstr(unsigned

char*s,unsigned

charlen);任務(wù)實(shí)施步驟4:在mycoordinator.c,初始化函數(shù)App_Init()添加調(diào)用UartInit()串口初始化函數(shù),代碼如下所示。4.無線智能窗簾控制系統(tǒng)voidApp_Init(uint8task_id){app_taskid=task_id;AppDesc.endPoint=20;//端點(diǎn)號AppDesc.task_id=&app_taskid;//任務(wù)IDAppDesc.simpleDesc=(SimpleDescriptionFormat_t*)&App_SimDesc;AppDesc.latencyReq=noLatencyReqs;//延時策略afRegister(&AppDesc);//注冊組網(wǎng)UartInit();//調(diào)用串口初始化}任務(wù)實(shí)施步驟5:在mycoordinator.c,事件消息處理函數(shù)App_Msg()添加接收到數(shù)據(jù)到發(fā)送串口代碼,代碼如下所示。4.無線智能窗簾控制系統(tǒng)voidApp_Msg(afIncomingMSGPacket_t*m){

unsigned

chartmp[3];

switch(m->clusterId){

case

0x0001://接收到包tmp[0]=0xff;tmp[1]=m->cmd.Data[0];tmp[2]=m->cmd.Data[1];sendstr(tmp,3);

break;}}任務(wù)實(shí)施4.無線智能窗簾控制系統(tǒng)代碼小貼士:說明:tmp[0]=0xff;tmp[1]=m->cmd.Data[0];tmp[2]=m->cmd.Data[1];代碼:在發(fā)送緩存發(fā)送頭0xff,m->cmd.Data[0]數(shù)據(jù)高8位,m->cmd.Data[1]數(shù)據(jù)低8位。任務(wù)實(shí)施4.無線智能窗簾控制系統(tǒng)步驟6:切換至EndDeviceEB模式下,開始編寫EndDevice代碼如圖所示。圖:EndDeviceEB任務(wù)實(shí)施步驟7:在myenddevice.c文件中編寫Adc初始化函數(shù)、Adc獲取數(shù)據(jù)函數(shù),代碼如下所示。4.無線智能窗簾控制系統(tǒng)voidAdcInit(){APCFG|=0x01;//設(shè)置P0_0為ADC使用P0SEL|=0x01;//設(shè)置P0_0為外設(shè)口}unsigned

intAdcGet(){

unsigned

inttmp=0;

//參考電壓AVDD5引腳、12位精度ADC、P0_0通道

//啟動轉(zhuǎn)換ADCCON3=(0x80|0x30|0x00);ADCIF=0;//清除標(biāo)志

while(!ADCIF);//等待完成tmp=ADCL;//提取低位tmp|=(unsigned

int)(ADCH<<8);//提取高位tmp=tmp>>3;//轉(zhuǎn)換為12位

returntmp;}任務(wù)實(shí)施步驟8:在mycoordinator.h頭文件中編寫Adc初始化函數(shù)、Adc獲取數(shù)據(jù)函數(shù),代碼如下所示。4.無線智能窗簾控制系統(tǒng)extern

voidAdcInit(void);extern

unsigned

intAdcGet(void);步驟9:在myenddevice.c文件中App_Init()函數(shù)下調(diào)用Adc初始化函數(shù),代碼如下所示。voidApp_Init(uint8task_id){app_taskid=task_id;AppDesc.endPoint=20;//端點(diǎn)號AppDesc.task_id=&app_taskid;//任務(wù)IDAppDesc.simpleDesc=(SimpleDescriptionFormat_t*)&App_SimDesc;AppDesc.latencyReq=noLatencyReqs;//延時策略afRegister(&AppDesc);//注冊組網(wǎng)AdcInit();//adc初始化}任務(wù)實(shí)施步驟10:在myenddevice.c文件中App_Event()函數(shù)下加入一個OSAL時間事件每秒發(fā)生一次,代碼如下所示。4.無線智能窗簾控制系統(tǒng)uint16App_Event(uint8task_id,uint16events){afIncomingMSGPacket_t*msg;

//系統(tǒng)事件定義

if(events&SYS_EVENT_MSG){msg=(afIncomingMSGPacket_t*)osal_msg_receive(app_taskid);//接收數(shù)據(jù)

while(msg){

switch(msg->hdr.event){

caseZDO_STATE_CHANGE://組網(wǎng)發(fā)送改變

if(msg->hdr.status==DEV_ZB

溫馨提示

  • 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

提交評論