無線傳感器網(wǎng)絡(luò):第05章 TI ZStack開發(fā)提高_第1頁
無線傳感器網(wǎng)絡(luò):第05章 TI ZStack開發(fā)提高_第2頁
無線傳感器網(wǎng)絡(luò):第05章 TI ZStack開發(fā)提高_第3頁
無線傳感器網(wǎng)絡(luò):第05章 TI ZStack開發(fā)提高_第4頁
無線傳感器網(wǎng)絡(luò):第05章 TI ZStack開發(fā)提高_第5頁
已閱讀5頁,還剩51頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、2022/7/141無線傳感器網(wǎng)絡(luò)講義TI ZStack開發(fā)提高2022/7/1425.1 NV操作5.2 單播、廣播、組播5.3 地址查詢5.4 網(wǎng)絡(luò)拓撲5.5 綁定2022/7/1435.1 NV操作NV就是Non Volatile的縮寫,即非易失性存儲器即使系統(tǒng)斷電后,存儲在該存儲器中的數(shù)據(jù)也不會丟失。在CC2530單片機中,NV=Flash存儲器。 NV有什么作用呢?在ZigBee協(xié)議棧中,NV存儲器主要用于保存網(wǎng)絡(luò)的配置參數(shù)(如網(wǎng)絡(luò)地址),因為掉電后該參數(shù)不丟失,所以,當系統(tǒng)采用電池供電時,因為電池沒電而導(dǎo)致該節(jié)點關(guān)機,則只需要更換電池,等恢復(fù)供電后,該節(jié)點還是加入原來的網(wǎng)絡(luò)中并且該

2、節(jié)點的網(wǎng)絡(luò)地址可以從NV中讀取,這樣可以保持該節(jié)點的網(wǎng)絡(luò)地址沒有變化。開發(fā)者需要掌握NV存儲器的讀和寫函數(shù)的使用,這些函數(shù)位于 協(xié)議棧OSAL文件夾下有OSAL_Nv.h和OSAL_Nv.c文件中。 2022/7/1445.1 NV操作uint8 osal_nv_item_init( uint16 id, uint16 len, void *buf)NV條目初始化函數(shù),在協(xié)議棧中使用NV存儲器時將該存儲器分成了很多條目,每個條目都有一個ID號,參看ZcomDef.h 中的定義,用戶也可以添加自己的條目 uint8 osal_nv_write( uint16 id, uint16 ndx, ui

3、nt16 len, void *buf)NV寫入函數(shù)。id: NV條目ID號 ;ndx:距離條目開始地址的偏移量; len:要寫入的數(shù)據(jù)長度;buf:指向存放寫入數(shù)據(jù)緩沖區(qū)的指針。 uint8 osal_nv_read( uint16 id, uint16 ndx, uint16 len, void *buf)NV讀取函數(shù)。id: NV條目ID號;ndx:距離條目開始地址的偏移量;len:要讀取的數(shù)據(jù)長度;buf:指向存放讀取數(shù)據(jù)緩沖區(qū)的指針。2022/7/145 / Send the message status = AF_DataRequest(&dstAddr, &sapi_epDesc

4、, commandId, len, pData, &handle, txOptions, radius);typedef struct union uint16 shortAddr; ZLongAddr_t extAddr; addr; afAddrMode_t addrMode; /地址模式:單播、廣播、組播 byte endPoint; uint16 panId; / used for the INTER_PAN feature afAddrType_t;5.2 單播、廣播、組播2022/7/146typedef enum afAddrNotPresent = AddrNotPresent

5、, afAddr16Bit = Addr16Bit, /單播 afAddr64Bit = Addr64Bit, /單播 afAddrGroup = AddrGroup, /組播 afAddrBroadcast = AddrBroadcast /廣播 afAddrMode_t;廣播:my_DstAddr.addrMode = (afAddrMode_t)AddrBroadcast;my_DstAddr.addr.shortAddr=0 xFFFF;使用廣播通信時,網(wǎng)絡(luò)地址可以有三種0 xFFFF, 數(shù)據(jù)包將在全網(wǎng)廣播,包括處于休眠狀態(tài)的節(jié)點0 xFFFD, 數(shù)據(jù)包將只發(fā)往往未處于體眠狀態(tài)的節(jié)點0

6、 xFFFC, 數(shù)據(jù)包發(fā)往網(wǎng)絡(luò)中的所有路由器節(jié)點 5.2 單播、廣播、組播2022/7/147組播:my_DstAddr.addrMode = (afAddrMode_t) AddrGroup;my_DstAddr.addr.shortAddr=GenericApp_Group.ID;可見,使用組播的方式發(fā)送數(shù)據(jù)時,需要加入特定的組中。如何表示一個組呢?如何使節(jié)點加入該組中呢? 在apsgruops.h文件中有aps_Group_t結(jié)構(gòu)體的定義: #define APS_GROUP_NAME_LEN 16 typedef struct uint16 ID; /組ID uint8 nameAPS

7、_GROUP_NAME_LENl; /組名 ) aps_Group_t;使用aps_AddGroup0函數(shù)使該端口加到組中 aps_AddGroup(uint8 endpoint, aps_Group_t *group);5.2 單播、廣播、組播2022/7/148組播用法示例:在GenericApp_init()函數(shù)中定義組: aps_Group_t GenericApp_Group; GenericApp_Group.ID=Ox0001; GenericApp_G0 =6; osal_memcpy(GenericApp_Group. name1),Groupl”, 6);

8、在GenericApp_ProcessEvent()函數(shù)中加入組: case ZDO_STATE_CHANGE: aps_AddGroup(GENERICAPP_ENDPOINT, &GenericApp_Group); 在消息發(fā)送函數(shù)調(diào)用AF_DataRequest()進行組播發(fā)送:my_DstAddr.addrMode = (afAddrMode_t) AddrGroup;my_DstAddr.addr.shortAddr=GenericApp_Group.ID;AF_DataRequest( &my_DstAddr, &GenericApp_epDesc,.)5.2 單播、廣播、組播20

9、22/7/149(1)查詢本節(jié)點有關(guān)的地址信息查看節(jié)點的網(wǎng)絡(luò)地址、MAC地址、父節(jié)點的網(wǎng)絡(luò)地址、父節(jié)點的MAC地址。調(diào)用ZigBee協(xié)議棧實現(xiàn)的網(wǎng)絡(luò)管理函數(shù)如下: uint16 NLME_GetShortAddr(void) 返回該節(jié)點的網(wǎng)絡(luò)地址。 bye NLME_GetExtAddr(void) 返回指向該節(jié)點MAC地址的指針。 uint16 NLME_GetCoordShortAddr(void) 返回父節(jié)點的網(wǎng)絡(luò)地址。 void NLME_GetCoordExtAddr(byte*buf) 該函數(shù)的參數(shù)是指向存放父節(jié)點MAC地址的緩沖區(qū)的指針。 用法見P164-1655.3 地址查詢2

10、022/7/1410(2)查詢網(wǎng)絡(luò)中其他節(jié)點有關(guān)的地址信息已知節(jié)點的16位網(wǎng)絡(luò)地址查詢節(jié)點的IEEE地址; 調(diào)用ZDP_IEEEAddrReq0函數(shù)發(fā)送地址查詢請求; 等待協(xié)調(diào)器發(fā)送自身的IEEE地址(協(xié)議棧自動完成,用戶不需要處理); 添加ZDO_CB_MSG消息響應(yīng)函數(shù),并調(diào)用ZDO_ParseAddrRsp()函數(shù)對數(shù)據(jù)包進行解析得到所需要的IEEE地址。afStatus_t ZDP_IEEEAddrReq( uint16 shortAddr, byte ReqType, byte StartIndex, byte SecurityEnable );已知節(jié)點的IEEE地址查詢該節(jié)點的網(wǎng)絡(luò)

11、地址。afStatus_t ZDP_NwkAddrReq( uint8 *IEEEAddress, byte ReqType, byte StartIndex, byte SecurityEnable );5.3 地址查詢2022/7/1411(2)查詢網(wǎng)絡(luò)中其他節(jié)點有關(guān)的地址信息- 地址查詢的返回消息的處理:/ Parse the NWK_addr_rsp and IEEE_addr_rsp messagesZDO_NwkIEEEAddrResp_t* ZDO_ParseAddrRsp( zdoIncomingMsg_t *inMsg ); typedef struct uint8 stat

12、us; uint16 nwkAddr; /短地址 uint8 extAddrZ_EXTADDR_LEN; /長地址 uint8 numAssocDevs; uint8 startIndex; uint16 devList; ZDO_NwkIEEEAddrResp_t; / in ZDObject.h在APP層初始化函數(shù)(如GenericApp_Init)中需要注冊NWK_addr_rsp或IEEE_addr_rsp類型的ZDO簇ID,以便應(yīng)用層得到該類型消息的響應(yīng),如:ZDO_RegisterForZDOMsg(GenericApp_TaskID, IEEE_addr_rsp);在事件處理函數(shù)

13、的ZDO_CB_MSG分支中處理查尋結(jié)果,如: ZDO_NwkIEEEAddrResp_t *pRsp=ZDO_ParseAddrRsp(inMsg); if(pRsp-status=ZSuccess) To_string(buf, pRsp-extAddr,8);5.3 地址查詢2022/7/14125.4 網(wǎng)絡(luò)拓撲 設(shè)置一個ZigBee網(wǎng)絡(luò)可以采用星型網(wǎng)拓撲,也可以采用網(wǎng)狀網(wǎng)拓撲,這是可以配置的。不管是那種配置,網(wǎng)絡(luò)中協(xié)調(diào)器負責網(wǎng)絡(luò)的建立和維護外,還負責與上位機進行通信,包括向上位機發(fā)送數(shù)據(jù)和接收上位機的數(shù)據(jù)并無線轉(zhuǎn)發(fā)給下面各個節(jié)點。在星型網(wǎng)中,設(shè)備類型為協(xié)調(diào)器和終端設(shè)備,且所有的終端設(shè)備

14、都直接與協(xié)調(diào)器通信。網(wǎng)狀網(wǎng)又稱MESH網(wǎng),其中的設(shè)備類型為協(xié)調(diào)器、路由器和終端節(jié)點,其中有的路由器和終端設(shè)備并不直接與協(xié)調(diào)器通信,需要中間路由器節(jié)點才能將數(shù)據(jù)上傳到協(xié)調(diào)器。路由設(shè)備除了需要根據(jù)協(xié)調(diào)器發(fā)送的命令來執(zhí)行數(shù)據(jù)采集或控制被控對象,還需承擔路由任務(wù)。 2022/7/14135.4 網(wǎng)絡(luò)拓撲 設(shè)置將Z-Stack(ZigBee 2007)協(xié)議棧設(shè)置為星型網(wǎng)時,只需要改變協(xié)議棧中的NWK文件夾下的nwk_globals.h文件中的一行代碼,注意選擇正確的PROFILE_ID分支。 #define NWK_MODE NWK_MODE_STAR /設(shè)置為星型網(wǎng)將Z-Stack(ZigBee 20

15、07)協(xié)議棧設(shè)置為Mesh網(wǎng)時,只需要改變協(xié)議棧中的NWK文件夾下的nwk_globals.h文件中的一行代碼,注意選擇正確的PROFILE_ID分支。 #define NWK_MODE NWK_MODE_MESH /設(shè)置為MESH網(wǎng) 2022/7/14145.4 網(wǎng)絡(luò)拓撲 獲取void Sendlnfo (void) /填充設(shè)備信息并向協(xié)調(diào)器發(fā)送 RFTX rftx: uint16 nwk: if (GenericApp_NwkState=DEV END_DEVICE) 判斷是否是終端節(jié)點 osal_memcpy (rftx. type. END, 3) ;if (GenericApp Nw

16、kState=DEV_ROUTER) 判斷是否是路由器 osal_memcpy (rftx. type, ROU, 3); nwk=NIME_GetShortAddr() ; /獲得本節(jié)點網(wǎng)絡(luò)地址To_string (rftx .myNWK. (uint8 *)&nwk,2) ;nwk = NLME_GetCoordShortAddr () ; /獲得父節(jié)點網(wǎng)絡(luò)地址To_string (rftx.pNWK, (uint8 *)&nwk, 2) afAddrT ype_t my_DstAddr; my_Ds tAddr. addrMode= (afAddrMode_t) Addrl6Bit; m

17、y_DstAddr.endPoint=GENERICAPP_ENDPOINT; my_DstAddr. addr. shortAddr=Ox00 00; AF_DataRequest( &my_DstAddr, &GenericApp_epDesc, GENERICAPP_CLUSTERID,11, (uint8 *)&rftx, &GenericApp_TransID, AF_DISCV_ROUTE,AF_DEFAULT_RADIUS );) /向協(xié)調(diào)器發(fā)送設(shè)備信息2022/7/1415ZMonitor2022/7/14165.5 綁定 一個典型的ZigBee節(jié)點也將有很多屬性(attrib

18、ute) ,每個屬性都有自己的值。一個簇(cluster)實際上是一些相關(guān)命令和屬性的集合,這些命令和屬性一起被定義為一個應(yīng)用接口。在整個網(wǎng)絡(luò)中每個簇都被分配了一個唯一的簇ID。 例如在家居照明控制燈規(guī)范中,ZigBee為遙控開關(guān)控制器(開關(guān))定義了一個必要的輸出簇:OnOffSRC。它也為開關(guān)負載控制器(燈)定義了一個必要的輸入簇:OnOffSRC。這兩個簇的ClusterID都是OnOffSRC,因此開關(guān)便可以通過這個簇來對燈進行控制,ZigBee在On()ffSRC簇中定義了一個屬性O(shè)nOff。為它定義了三種不同的屬性值,分別是OxFF表示OnOx00表示Off0 xF0表示Toggle

19、。當需要打開照明燈時,遙控開關(guān)便通過應(yīng)用層KVP消息,發(fā)送Set命令將照明燈OnOffSRC簇中OnOff屬性設(shè)置為On。同樣如果需要關(guān)閉照明燈時,也可以通過Set命令將照明燈()nOffSRC簇中()n()ff設(shè)置為Off。Toggle屬性值的意義是,如果電燈在開的狀態(tài)下,設(shè)置這個值將會把電燈關(guān)掉;如果電燈是關(guān)閉狀態(tài),通過設(shè)定這個屬性值則又會把電燈打開。2022/7/1417 綁定(binding)操作是使用ClusterID為不同節(jié)點上的獨立端點建立一個邏輯上的連接,綁定操作能夠使用戶的應(yīng)用變得更加方便靈活。 下圖中。節(jié)點Z1中的端點EP3與節(jié)點Z2中的端點EP5, EP7, EP8綁定,

20、實現(xiàn)了開關(guān)1同時控制電燈1,2,3。5.5 綁定綁定是一種兩個(或者多個)設(shè)備之間在應(yīng)用層的信息流控制機制。在最新的Z - Stack版本中,它被稱為源綁定,所有的設(shè)備都必須執(zhí)行綁定機制。綁定允許應(yīng)用程序發(fā)送一個數(shù)據(jù)包而不需要知道目標地址。APS層從它的綁定表中確定目標地址,然后將數(shù)據(jù)繼續(xù)向目標應(yīng)用或者目標組發(fā)送。2022/7/1418綁定的建立要實現(xiàn)綁定操作,端點可向協(xié)調(diào)器發(fā)送綁定請求,協(xié)調(diào)器在有限的時間間隔內(nèi)接收到兩個端點的綁定請求后,便通過建立端點之間的綁定表在這兩個不同的端點之間形成了一個邏輯鏈路。綁定端點的消息傳送在綁定后的兩個端點之間進行消息傳送的過程屬于消息的間接傳送。其中一個端

21、點首先會將信息發(fā)送到ZigBee協(xié)調(diào)器中。ZigBee協(xié)調(diào)器在接收到消息后會通過查找綁定表,將消息發(fā)送到與這個端點相綁定的所有端點中,從而實現(xiàn)綁定端點之間的通信。5.5 綁定2022/7/1419 間接綁定:間接綁定方法比較簡單,在Profile文件中就包含這種方法,它通過按鍵來發(fā)送綁定信息。需要綁定的兩個節(jié)點在一定的時間內(nèi)發(fā)送綁定命令,當協(xié)調(diào)器在設(shè)定的時間內(nèi)收到這樣的兩條綁定信息時,它就會建立對應(yīng)的綁定表。建立了綁定關(guān)系的兩個節(jié)點之間就可以通過Endpoint來相互通信。 直接綁定(OTA):直接綁定需要用戶編寫相應(yīng)的綁定程序,ZigBee協(xié)議棧中含有綁定API,用戶可以通過適當?shù)姆椒ㄕ{(diào)用來

22、實現(xiàn)綁定功能。這種方法通常是使用一個節(jié)點直接向協(xié)調(diào)器發(fā)送兩條綁定信息,這兩條信息中的目標地址和源地址相反。這種方法需要用戶對協(xié)議棧有一定的了解,熟悉相關(guān)的API函數(shù)。使用這種方法可以通過第三方節(jié)點來配置網(wǎng)絡(luò)來是任意兩個節(jié)點之間建立綁定關(guān)系使網(wǎng)絡(luò)通信方式更加靈活。而且第三方節(jié)點可以通過與上位機互聯(lián),在上位機可以建立一個界面,通過串口向第三方節(jié)點傳遞配置信息,使配置更加方便。 直接綁定(通過串口):這種方法是使用上位機通過串口向協(xié)調(diào)器發(fā)送綁定信息,一般使用的比較少,因為通常我們的協(xié)調(diào)器需要與上位機通信,要把網(wǎng)絡(luò)的信息傳到上位機,一般不適合在同一個上位軟件再做網(wǎng)絡(luò)的配置部分。通常直接綁定(OTA)方

23、法比較適用,可以專門做一個網(wǎng)絡(luò)的配置軟件,來配置網(wǎng)絡(luò),當然間接綁定最簡單,在項目中可以綜合考慮選擇適當?shù)慕壎ǚ绞健=壎ǖ娜N方法2022/7/1420間接通信:間接通信是指各個節(jié)點通過端點的綁定建立通信關(guān)系,這種通信方式不需要知道目標節(jié)點的地址信息,包括IEEE地址或網(wǎng)絡(luò)短地址Z- Stack底層將自動從棧的綁定表中查找目標設(shè)備的具體網(wǎng)絡(luò)地址并將其發(fā)送出去。簇簇就是人們在著手建立Profile時遇到的這個概念,它是一簇網(wǎng)絡(luò)變量(attributes)的集合,在同一個Profile中,ClusterID是唯一的。在直接尋址方式和間接尋址方式中都會用到這個概念。在間接尋址方式中,建立綁定表時需要搞

24、清楚Cluster的含義與屬性。對于可以建立綁定關(guān)系的兩個節(jié)點,它們的Cluster的屬性必須一個選擇“輸入”,另一個選擇“輸出”,而且ClusterID值相等,只有這樣,它們彼此才能建立綁定,而在間接通信是指各個節(jié)點通過端點的綁定建立通信關(guān)系,這種通信方式不需要知道目標節(jié)點的地址信息,包括IEEE地址或網(wǎng)絡(luò)短地址Z- Stack底層將自動從棧的綁定表中查找目標設(shè)備的具體網(wǎng)絡(luò)地址并將其發(fā)送出去。2022/7/1421SimpleApp解析 SimpleApp工程主要提供兩個應(yīng)用實例:溫度傳感器實驗和燈開關(guān)實驗。SimpleSensor和SimpleCollector用于溫度傳感器實驗Simpl

25、eSwitch和SimpleController用于燈開關(guān)實驗。2022/7/1422用戶打開SimpleApp工程后,會在Workspace區(qū)域看到不同的設(shè)備類型,不同的設(shè)備類型下均包含App文件夾,里面存放著各種應(yīng)用實現(xiàn)的源文件。可以發(fā)現(xiàn),每種設(shè)備類型都包含sapi.c、sapi.h和SimpleApp.h文件,即每種設(shè)備程序運行時的任務(wù)初始化函數(shù)、任務(wù)事件處理函數(shù)均是在sapi.c中實現(xiàn)。1 任務(wù)初始化函數(shù) SAPI_Init( byte task_id )負責初始化該任務(wù)的所有初始量,如相關(guān)硬件初始化、表格初始化和上電啟動通知等。/*函數(shù)描述:SimpleApp的初始化函數(shù)/*函數(shù)參數(shù)

26、:task_id 是OSAL分配的任務(wù)ID,該ID用于發(fā)送消息和設(shè)定定時器在任務(wù)初始化函數(shù)中,主要用到了以下Z - Stack的API函數(shù)和變量定義:(1) afRegister 該函數(shù)為ZigBee設(shè)備注冊一個新的端口。應(yīng)用程序中的每一個端口都必須使用該函數(shù)進行注冊。函數(shù)原型 afStatus_t afRegister( endPointDesc_t * epDesc)函數(shù)參數(shù):epDesc-指向端口描述符的指針返回值 afStatus_t在ZComDef.h的Zstatus_t結(jié)構(gòu)中定義的狀態(tài)值。工程程序架構(gòu)(1)2022/7/1423(2) afSetMatch (允許綁定或不允許) 默

27、認情況下ZigBee設(shè)備對ZDO的匹配描述做出響應(yīng)。可以使用該函數(shù)改變其響應(yīng)行為。如果參數(shù)action的值是false,那么ZDO將不會對ZDO的匹配描述請求做出響應(yīng)。 函數(shù)原型: uint8 afSetMatch( uint8 ep, uint8 action ) 函數(shù)參數(shù):ep-端口號。action-允許響應(yīng)時是true(默認情況),不允許時是false。 返回值: 成功的話返回值是true如果返回false表示沒有找到ep端口號。(3) ZDO_RegisterForZDOMsg 該函數(shù)被用于注冊一個接收請求或響應(yīng)信息的事件。該信息將被發(fā)送至OSAL的信息隊列中。接收到該信息的任務(wù)自動分

28、析該信息,或者是調(diào)用ZDO的分析函數(shù)處理該信息。 注意:只有響應(yīng)信息才可以使用ZDO的分析函數(shù)。 使用該函數(shù)注冊信息后,ZigBee設(shè)備接收的無線信息(OTA)會作為ZDO_CB_MSG信息發(fā)送至任務(wù)隊列進行下一步處理。 函數(shù)原型 ZStatus_t ZDO_RegisterForZDOMsg(uint8 taskID. uint16 clusterID); 函數(shù)參數(shù):taskID-該信息準備發(fā)送至的任務(wù)ID clustered-準備接收的信息類型(clusterID,例如NWK_add_rsp)。返回值: ZStatus_t在ZComDef.h的Zstatus_t結(jié)構(gòu)中定義的狀態(tài)值。工程程序

29、架構(gòu)(2)2022/7/1424(4) RegisterForKeys 按鍵注冊函數(shù),將按鍵的變化信息發(fā)送至某一個任務(wù)。函數(shù)原型 byte RegisterForKeys( byte task_id);函數(shù)參數(shù) Task_id-任務(wù)的ID號;返回值 byte-按鍵所對應(yīng)的狀態(tài)值。 (5) osal_set_event 調(diào)用該函數(shù)啟動任務(wù)。 函數(shù)原型: byte osal_set_event( byte task_id, UINT16 event_flag); 函數(shù)參數(shù): task_ id-任務(wù)ID號; event_flag -占用2字節(jié),每一位對應(yīng)一個事件,其中,系統(tǒng)事件只有SYS_EVENT

30、_MSG,剩余的事件/標志位,由接收任務(wù)定義; 返回值: 若返回ZSUCCESS,表示成功;返回INVALID_TASK,表明是一個無效的任務(wù)。工程程序架構(gòu)(3)2022/7/1425任務(wù)事件處理函數(shù) SAPI_ProcessEvent(taskid, event)在SAPl_lnit函數(shù)的最后調(diào)用osal_set_event( task_id, ZB_ENTRY_EVENT)這將觸發(fā)任務(wù)的事件處理函數(shù)SAPI_ProcessEvent該函數(shù)處理任務(wù)所有的事件,包括時間、消息和其他用戶定義的事件。里面的所有確認函數(shù)都是用戶編寫,向應(yīng)用(用戶)指示該事件發(fā)生,繼而可以做相關(guān)的處理,如發(fā)現(xiàn)網(wǎng)絡(luò)設(shè)備

31、后,可以把該設(shè)備的信息輸出到LCD或串口;接收到數(shù)據(jù)后把該數(shù)據(jù)輸出到LCD或串口;接收到命令后,根據(jù)命令做相應(yīng)的處理(閃燈等);發(fā)生鍵盤事件可以調(diào)用鍵盤處理函數(shù);發(fā)送完數(shù)據(jù)包后,可以閃爍LED指示發(fā)送完畢等。(1) ZB_ENTRY_EVENT事件 - 由SimpleAPI定義的啟動事件 由于初始化函數(shù)的最后觸發(fā)了ZB_ENTRY_EVENT事件事件處理函數(shù)首先處理該事件。其中調(diào)用了zb_ HandleOsaIEvent函數(shù),該函數(shù)由具體的應(yīng)用設(shè)備程序來實現(xiàn),如果在Workspace中選擇SimpleCollectEB設(shè)備,則該函數(shù)的定義在SimpleCollector.c中,該函數(shù)默認為空,

32、用戶可以自己添加相應(yīng)操作。工程程序架構(gòu)(4)2022/7/1426由SAPI_ProcessEvent流程及ZB_ENTRY_EVENT事件的觸發(fā)處理可知:應(yīng)用程序首先讀取非易失性存儲器中已有的信息,并保存在startOptions中。接下來,通過if語句判斷是啟動Z- Stack協(xié)議棧建立網(wǎng)絡(luò)加入網(wǎng)絡(luò),還是閃爍紅色指示燈(LED2)提示用戶。(2) SYS_EVENT_MSG事件 - 由OSAL定義的強制事件 SYS_EVENT_MSG是OSAL規(guī)定的強制事件,當信息經(jīng)OSAL調(diào)度發(fā)送至程序任務(wù)的時候任務(wù)事件處理函數(shù)將根據(jù)其中的信息不同而采取不同的操作。 KEY_CHANGE:該信息表示鍵盤

33、動作。還以SimpleCollcetorEB設(shè)備為例,當任務(wù)檢測到按鍵事件發(fā)生時,它將調(diào)用zb_HandleKeys函數(shù)(在SimpleCollector.c中實現(xiàn))工程程序架構(gòu)(5)2022/7/1427SimpleApp的啟動流程由ZB_ENTRY_EVENT事件的處理流程可知,打開ZigBee設(shè)備的電源后,系統(tǒng)閃爍LED2(紅燈),并進入等待狀態(tài)。直到用戶進行按鍵操作,使不同的設(shè)備建立網(wǎng)絡(luò)加入網(wǎng)絡(luò),并進行數(shù)據(jù)發(fā)送的操作。 當按下SW1鍵時,首先判斷設(shè)備是否處于初始化狀態(tài),通過zb_ReadConfiguration判斷設(shè)備的類型,并最終使其擔任協(xié)調(diào)器的角色。然后,通過zb_WriteCo

34、nfiguration設(shè)置ZCD_NV_STARTUP OPTION的值為ZCD _STARTOPT_AUTO_START,然后調(diào)用zb_SystemReset函數(shù)重新啟動設(shè)備。 通過上述的操作之后,應(yīng)用程序會將ZCD_NV_STARTUP_OPTION的值設(shè)為ZCD_STARTOPT_AUTO_START,并將其寫入非易失性存儲器;這樣,當用戶第二次打開ZigBee設(shè)備的時候,它將自動啟動Z - Stack進行相關(guān)的操作。2022/7/1428按鍵事件發(fā)生的流程2022/7/1429 按鍵事件的觸發(fā)傳遞 HAL(Hardware Lay)檢測到按鍵狀態(tài)變化(通過H/W中斷或者H/W輪詢操作)

35、。 HAL對應(yīng)的OSAL任務(wù)檢測到按鍵的狀態(tài)變化,觸發(fā)OSAL按鍵變化的回調(diào)函數(shù)。 OSAL按鍵變化回調(diào)函數(shù)發(fā)送一個OSAL的系統(tǒng)事件消息給已徑注冊過的任務(wù)。2022/7/1430溫度傳感器數(shù)據(jù)采集的例程系統(tǒng)配置:傳感節(jié)點(終端設(shè)備, sensor nodes) + 采集節(jié)點(協(xié)調(diào)器,collection node)。采集節(jié)點負責建立網(wǎng)絡(luò),傳感節(jié)點加入網(wǎng)絡(luò)并與采集節(jié)點建立綁定后,將溫度值和電壓值發(fā)送給采集節(jié)點。功能需求:整個應(yīng)用程序應(yīng)該具備以下基本功能:自動建立一個網(wǎng)絡(luò);傳感節(jié)點能夠自動發(fā)現(xiàn)采集節(jié)點,而且一旦加入網(wǎng)絡(luò)后,能夠自動與一個采集節(jié)點建立綁定;傳感節(jié)點能夠周期性地向一個采集節(jié)點發(fā)送數(shù)據(jù)

36、,并采用端到端確認(acknowledgement)的發(fā)送模式;如果傳感節(jié)點沒有收到采集節(jié)點的確認消息,它將解除與該采集節(jié)點的綁定,然后,重新發(fā)現(xiàn)采集節(jié)點并與其建立綁定(重新發(fā)現(xiàn)的采集節(jié)點可能是另外一個采集節(jié)點)。2022/7/1431原理(1)每個設(shè)備都有一組能被配置的參數(shù)整個配置參數(shù)在代碼中已經(jīng)定義了默認值(在f8wConfig. cfg中)。在同一個網(wǎng)絡(luò)中,所有設(shè)備的“網(wǎng)絡(luò)細節(jié)”配置參數(shù)(如PANID、Channel等)應(yīng)該被設(shè)置成一樣的值。每個設(shè)備的“設(shè)備細節(jié)”配置參數(shù)(Coordinator、Router、EndDevice等)可以配置為不同的值。 2022/7/1432原理(2)Z

37、CD_NV_LOGICAL_TYPE的設(shè)置必須確保:有正確的一個設(shè)備作為協(xié)調(diào)器被配置;所有電池供電的設(shè)備作為終端設(shè)備被配置。一旦這些工作都完成,這個設(shè)備就可以以任意方式啟動。協(xié)調(diào)器設(shè)備將建立網(wǎng)絡(luò),其他設(shè)備將發(fā)現(xiàn)和加入這個網(wǎng)絡(luò)。 協(xié)調(diào)器將掃描所有被ZCD_NV_CHANLIST參數(shù)制定的通道,選擇1個最小能量的通道。協(xié)調(diào)器將選擇用ZCD_NV_PANID參數(shù)指定的網(wǎng)絡(luò)ID。路由器和終端設(shè)備將掃描用ZCD_NV_CHANLIST配置參數(shù)指定的通道和試圖發(fā)現(xiàn)ID為ZCD_NV_PANID參數(shù)指定的網(wǎng)絡(luò)。2022/7/1433原理(3) - (1)協(xié)調(diào)器格式化網(wǎng)絡(luò) 協(xié)調(diào)器將掃描DEFAULT_CHAN

38、I_IST指定的通道,最后在其中之一上形成網(wǎng)絡(luò)。如果ZDAPP_CONFIG_PAN_ID被定義為0 xFFFF,那么協(xié)調(diào)器將根據(jù)自身的IEEE地址建立一個隨機的PAN ID;如果ZDAPP_CONFIG_PAN_ID沒有被定義為0 xFFFF,那么協(xié)調(diào)器建立網(wǎng)絡(luò)的PAN ID將由ZDAPP_CONFIG_PAN_ID指定。 當所有的參數(shù)配置好后,可調(diào)用下面函數(shù)來格式化網(wǎng)絡(luò): ZStatus_t NLME_NetworkFormationRequest(uint16 Panld, uint32 ScanChannels, byte ScanDuration, byte BeaconOrder,

39、 byte SuperframeOrder byte BatteryLifeExtension);一般不直接使用上面的函數(shù)建立網(wǎng)絡(luò),而是使用ZDO_StartDevice()函數(shù)來啟動一個設(shè)備。2022/7/1434原理(4)(2)路由器和終端設(shè)備加入網(wǎng)絡(luò) 路由器和終端設(shè)備啟動后,將掃描DEFAULT_CHANLIST指定的頻道。如果ZDAPP_CONFIG_PAN_ID沒有被定義為0 xFFFF,則路由器將強制加入ZDAPP_CONFIG_PAN_ID走義的網(wǎng)絡(luò)。 發(fā)現(xiàn)一個網(wǎng)絡(luò)將調(diào)用下面的函數(shù):ZStatus_t NLME_NetworkDiscoveryRequest( uint32 Sc

40、anChannels, byte ScanDuration) ; 該函數(shù)要求網(wǎng)絡(luò)層去發(fā)現(xiàn)鄰居路由器節(jié)點,并且應(yīng)該在進行網(wǎng)絡(luò)掃描之前調(diào)用,掃描的結(jié)果由ZDO_NetworkDiscoveryConfirmCB()函數(shù)返回。其中: ScanChannels-準備掃描的信道號(信道號的范圍為1126,即僅對2.4 GHz頻段有效)。 ScanDuration-規(guī)定了在新的網(wǎng)絡(luò)開始建立之前,其他網(wǎng)絡(luò)可以掃描每個信道的時間長度。 2022/7/1435原理(6)(3) ZDO_StartDevice() 實際上, ZigBee設(shè)備啟動時不直接調(diào)用NLME_NetworkFormationRequest、

41、NLME_NetworkDiscoveryRequest和ZStatus_t NLME_OrphanjoinRequest去形成網(wǎng)絡(luò),而是通過調(diào)用ZDO_StartDevice()函數(shù)來啟動設(shè)備。 在任務(wù)事件處理函數(shù)中,當ZB_ENTRY_EVENT事件觸發(fā)時,一旦ZCD_NV_STARTUP_OPTION的值被設(shè)置為ZCD_STARTOPT_AUTO_START,則應(yīng)用程序調(diào)用zb_StartRequest()函數(shù)。設(shè)備打開電源之后,由于還未形成網(wǎng)絡(luò),所以經(jīng)過設(shè)備邏輯類型的判斷后程序會跳轉(zhuǎn)至ZDOlnitDevice( zgStartDelay)其中的ZDApp_Networklnit()函

42、數(shù)會觸發(fā)ZDO_NETWORK_INIT事件而ZDO_NETWORK_INIT事件的處理函數(shù)位于Z- Stack虛用層的任務(wù)事件處理函數(shù)ZDApp_event_loop()中,包含了ZDO_StartDevice()2022/7/1436原理(5)(2)路由器和終端設(shè)備加入網(wǎng)絡(luò) .發(fā)現(xiàn)網(wǎng)絡(luò)存在后,就調(diào)用下面的函數(shù)加入網(wǎng)絡(luò)。ZStatus_t NLME_OrphanjoinRequest( uint32 ScanChannels, byte ScanDuration); 該函數(shù)要求網(wǎng)絡(luò)層以孤節(jié)點的形式加入網(wǎng)絡(luò)。函數(shù)調(diào)用的結(jié)果由ZDO_JoinConfirmCB()返回。 注意:如果協(xié)調(diào)器和踣由器

43、或終端設(shè)備都沒有定義ZDAPP_CONFIG_ PAN_ID為0 xFFFF則兩者之間不一樣的定義可能會出現(xiàn)一些意外的結(jié)果;如果ZDAPP_CONFIG_PAN_ID被定義為一個正確的值(小于或等于0 x3FFF),那么協(xié)調(diào)器就只在指定的PAN ID上試圖建立網(wǎng)絡(luò)。2022/7/1437原理(6)2數(shù)據(jù)傳輸 只有建立了網(wǎng)絡(luò)并加入到網(wǎng)絡(luò)中,ZigBee設(shè)備才可以傳輸數(shù)據(jù)。在溫度傳感器實驗中,采集節(jié)點和傳感節(jié)點首先建立綁定關(guān)系然后將采集的溫度值和電壓值發(fā)送給采集節(jié)點。 (1)數(shù)據(jù)發(fā)送 當傳感節(jié)點與采集節(jié)點建立綁定時,傳感節(jié)點會調(diào)用zb_BindConfirm函數(shù),該函數(shù)的主要功能是,如果建立綁定成

44、功,則傳感節(jié)點開始向采集節(jié)點發(fā)送傳感數(shù)據(jù);否則,重新搜索采集節(jié)點。傳感節(jié)點向采集節(jié)點發(fā)送傳感數(shù)據(jù)的函數(shù)是myApp_StartReporting()MY_REPORT_TEMP_EVT和MY_REPORT_BATT_EVT的事件處理過程,在SimpleSensor.c的zb_ HandleOsaIEvent函數(shù)中實現(xiàn)2022/7/1438原理(7)2數(shù)據(jù)傳輸無論發(fā)送溫度信息還是電壓信息,都將調(diào)用zb_SendDataRequest函數(shù), 在AF.c中定義,負責發(fā)送數(shù)據(jù)。其函數(shù)原型為:afStatus_t AF_DataRequest(afAddrType_t *dstAddr* endPoin

45、tDesc_t -x srcEP, uint16 cID, uint16 len. uint8 x buf. uint8 x transID, uint8 Options, uint8 radius) dstAddr-目的地址指針。可選的地址模式有:afAddrNotPresent,表示通過綁定關(guān)系指定目的地址;afAddrGroup,向一個組發(fā)送數(shù)據(jù);afAddrBroadcast,發(fā)送廣播消息;afAddr16Bit,單播發(fā)送。 srcEP-發(fā)送節(jié)點的端點描述符指針; cID-ClusID; len-發(fā)送的字節(jié)數(shù); transID-傳輸序列號,該序列號隨著信息的發(fā)送而增加; options

46、-發(fā)送選項; radius-最大傳輸半徑(發(fā)送的跳數(shù))。2022/7/1439原理(8)3數(shù)據(jù)接收(2)數(shù)據(jù)接收 在采集節(jié)點中,當其接收到傳感節(jié)點發(fā)送昀信息后,將觸發(fā)SYS_EVENT_MSG事件,并對AF_INCOMING_MSG_CMD信息做出處理。 case AF_INCOMING_MSG_CMD: pMSGpkt一(aflncomingMSGPacket_t*)pMsg; SAPI_ReceiveDatalndication( pMSGpkt - srcAddr. addr. shortAddr, pMSGpkt - clusterld, pMSGpkt - cmd. DataLeng

47、th, pMSGpkt - cmd. Data); break; 即采集節(jié)點接收到傳感節(jié)點發(fā)送的信息后,將調(diào)用SAPI_ReceiveDatalndication函數(shù)進行處理。默認情況下zb_ReceiveDatalndication函數(shù)將被調(diào)用2022/7/1440SimpleSensor和SimpleConllector溫度傳感器實驗中的綁定1)SimpleSensor 發(fā)現(xiàn)可用的協(xié)調(diào)器時自動綁定到該協(xié)調(diào)器。 if ( event & MY_FIND_COLLECTOR_EVT ) / Find and bind to a collector device zb_BindDevice( T

48、RUE, SENSOR_REPORT_CMD_ID, (uint8 *)NULL ); 2) SimpleConllector協(xié)調(diào)器的按鍵處理函數(shù)zb_HandleKeys中,當SW1被按下后,若設(shè)備已經(jīng)進行了初始化,則將調(diào)用zb_AllowBind函數(shù),進入允許綁定的模式 / Turn ON Allow Bind mode indefinitelyzb_AllowBind( 0 xFF );HalLedSet( HAL_LED_1, HAL_LED_MODE_ON );2022/7/1441SimpleSensor和SimpleCollector溫度傳感器實驗中的綁定3) SimpleSen

49、sor調(diào)用zb_SendDataRequest進行數(shù)據(jù)發(fā)送zb_SendDataRequest的功能是啟動一個數(shù)據(jù)包傳輸?shù)侥繕嗽O(shè)備。傳輸?shù)哪繕丝赡苁菍Ψ皆O(shè)備的16位短地址或無效地址(0 xFFFE)。在后一種情況下,數(shù)據(jù)包將被發(fā)送到以前為這個特定的CommandID建立了綁定的設(shè)備(S)。zb_SendDataRequest函數(shù)立即返回。發(fā)送完成時回調(diào)函數(shù)zb_SendDataConfirm 將被調(diào)用。2022/7/1442SimpleAPI中綁定的實現(xiàn)(1)Zigbee2006開始采用Source Binding,也就說發(fā)送數(shù)據(jù)的節(jié)點保存綁定表。在綁定響應(yīng)端zb_AllowBind的實現(xiàn)中,

50、調(diào)用了afSetMatch, 該設(shè)備對ZDO的匹配描述將做出響應(yīng)。在綁定請求端Zb_BindDevice的函數(shù)實現(xiàn)中,會調(diào)用ZDO_AnyClusterMatches和ZDP_MatchDescReq等一系列函數(shù)。ZDO_AnyClusterMatches的作用是命令列表匹配比較,ZDP_MatchDescReq的作用是發(fā)送一個匹配(Match_Desc_req)消息,盡量與一個處于允許綁定模式 的設(shè)備進行匹配。2022/7/1443SimpleAPI中綁定的實現(xiàn)(2)當綁定請求設(shè)備發(fā)送了匹配消息并有設(shè)備(響應(yīng)設(shè)備)對其進行響應(yīng)時,那么在綁定請求設(shè)備中會觸發(fā)SYS_EVENT_MSG事件,在事

51、件處理函數(shù)SAPI_ProcessEvent中會調(diào)用ZDO_CB_MSG的處理函數(shù)SAPI_ProcessZDOMsgs。case ZDO_CB_MSG: SAPI_ProcessZDOMsgs( (zdoIncomingMsg_t *)pMsg ); break;.在SAPI_ProcessZDOMsgs 的實現(xiàn)代碼中,有關(guān)于匹配消息響應(yīng)Match_Desc_rsp的處理,應(yīng)用程序為所有正確響應(yīng)的設(shè)備建立綁定列表,并通過發(fā)送綁定確認消息通知應(yīng)用上層。從而完成綁定過程。2022/7/1444void SAPI_ProcessZDOMsgs( zdoIncomingMsg_t *inMsg )

52、switch ( inMsg-clusterID ) . case Match_Desc_rsp: / 匹配消息的響應(yīng)消息 zAddrType_t dstAddr; ZDO_ActiveEndpointRsp_t *pRsp = ZDO_ParseEPListRsp( inMsg ); if ( sapi_bindInProgress != 0 xffff ) / 創(chuàng)建綁定表項 dstAddr.addrMode = Addr16Bit; dstAddr.addr.shortAddr = pRsp-nwkAddr; if ( APSME_BindRequest( sapi_epDesc.simp

53、leDesc-EndPoint, sapi_bindInProgress, &dstAddr, pRsp-epList0 ) = ZSuccess ) osal_stop_timerEx(sapi_TaskID, ZB_BIND_TIMER); osal_start_timerEx( ZDAppTaskID, ZDO_NWK_UPDATE_NV, 250 ); sapi_bindInProgress = 0 xffff; / Find IEEE addr ZDP_IEEEAddrReq( pRsp-nwkAddr, ZDP_ADDR_REQTYPE_SINGLE, 0, 0 ); / 給上層發(fā)

54、送綁定確認消息 zb_BindConfirm( sapi_bindInProgress, ZB_SUCCESS ); break; 2022/7/1445Zigbee綁定綁定是控制信息流在兩個設(shè)備的應(yīng)用層之間流動的一種機制。在Z - Stack2006版本中,綁定可以在任何設(shè)備上實現(xiàn),稱為源綁定。 綁定允許應(yīng)用層發(fā)送信息而無需指定目的地址APS層從它的綁定表格中確定目的地址,然后在信息前端加上這個目的地址或組地址。注意:在Z - Stack2004版本中所有綁定條目都存儲在協(xié)調(diào)器中,而最新的Z- Stack2006中所有綁定條目都存儲在發(fā)送數(shù)據(jù)的設(shè)備中。綁定就是在兩個設(shè)備應(yīng)用層上的邏輯鏈接。多

55、重綁定能在一個設(shè)備上被創(chuàng)建,另外,一個綁定可能有多個目的設(shè)備(一個到多個綁定)。2022/7/1446Zigbee綁定一旦綁定被創(chuàng)建,就可以不需要指定目的地址,在調(diào)用函數(shù)zb_SendDataRequest()時,只需要將0 xFFFE作為目的地址就可發(fā)送數(shù)據(jù)了。如果設(shè)定了NV_RESTORE編譯選項綁定信息將保存在非易失性存儲器中。當設(shè)備意外復(fù)位或電池需要充電時,能夠自動恢復(fù)綁定信息。綁定只能在“互為補充” ( complementary)的設(shè)備間被創(chuàng)建。也就是說,當兩個設(shè)備已經(jīng)在他們的簡單描述符結(jié)構(gòu)中注冊為一樣的命令I(lǐng)D并且一個作為輸入另一個作為輸出時,綁定才能成功。2022/7/1447

56、Zigbee綁定綁定表格形式:(as,es,cs)=(ad1|,ed1|),(ad2|,ed2|),(adn| ,edn|)其中:as為綁定源設(shè)備的地址; es為綁定源設(shè)備EP的標識符; cs為綁定連接的簇標識符; adi為i綁定分配的目的地址或目的組地址; edi為i綁定分配的EP標識符。 注意:只有當adi是一個設(shè)備地址時,才會有edi。2022/7/1448Zigbee綁定建立一個綁定表格有三種方式: ZDO綁定請求通過一個命令告訴設(shè)備創(chuàng)建一個綁定記錄。 ZDO終端設(shè)備綁定請求設(shè)備能告訴協(xié)調(diào)器它們想建立綁定記錄。該協(xié)調(diào)器將在這兩個設(shè)備上創(chuàng)建綁定表格條目。 設(shè)備應(yīng)用設(shè)備應(yīng)用程序能建立或管理

57、一個綁定表。 任何一個設(shè)備或應(yīng)用能在網(wǎng)絡(luò)中發(fā)送一個ZDO信息到另一個設(shè)備建立一個綁定記錄。2022/7/1449ZDO綁定請求通過調(diào)用函數(shù)ZDP_BindReq()發(fā)送一個綁定請求。第一個參數(shù)(dstAddr)是綁定源地址的短地址。這之前應(yīng)該確定允許綁定,在ZDConfig.h文件中有參數(shù)ZDO_BIND_UNBIND_REQUEST允許綁定。 能用同樣的參數(shù)調(diào)用函數(shù)ZDP_UnbindReq()移除綁定。 目標設(shè)備將調(diào)用函數(shù)ZDApp_BindRsp()或ZDApp_UnbindRsp()對綁定或解除綁定請求做出應(yīng)答。,2022/7/1450ZDO終端設(shè)備綁定請求該機制是用一個按鈕按下或其他

58、類似的動作來選擇設(shè)備在指定時間內(nèi)被綁定。在規(guī)定時間內(nèi),該終端設(shè)備綁定請求信息被收集到協(xié)調(diào)器,并創(chuàng)建一個基于配置( Profile)ID和簇(Cluster)ID的規(guī)定的綁定表格條目。默認的終端設(shè)備綁定超時時間(APS_DEFAULT_MAX_BINGDING_TIME)為16 s(定義在nwk_globals.h中)但是這個時間可以被改變。 ,2022/7/1451設(shè)備應(yīng)用綁定管理應(yīng)用層管理綁定表格,即應(yīng)用層將調(diào)用下列函數(shù)添加和移除綁定表格條目: bindAddEntry():增加綁定表格條目。 bindRemoveEntry():從綁定表格中移除條目。 bindRemoveClusterld

59、FromList():從綁定表格項目中移除一個簇ID。 bindAddClusterldToIist():添加一個簇ID到一個存在的綁定表格。 bindRemoveDev():移除指定地址的所有綁定條目。 bindRemoveSrcDev():移除源地址的所有條目。 bindUpdateAddr():更新條目到另一個地址。 bindFindExisting():發(fā)現(xiàn)一個綁定表條目。 bindlsClusterIDinList():在綁定表條目中核對一個存在的簇。 bindNumBoundTo():同一個地址(源或目的)的條目數(shù)。 bindNumOfEntries():表格條目數(shù)。 bindCapacity():最大條目允許。 bindWriteNV():在NV中更新表格。 ,2022/7/1452綁定建立的兩種機制如果目的設(shè)備的擴展地址是已知的,則zb_BindDeviceRequest()函數(shù)能創(chuà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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論