Zstack協(xié)議棧專(zhuān)題培訓(xùn)課件_第1頁(yè)
Zstack協(xié)議棧專(zhuān)題培訓(xùn)課件_第2頁(yè)
Zstack協(xié)議棧專(zhuān)題培訓(xùn)課件_第3頁(yè)
Zstack協(xié)議棧專(zhuān)題培訓(xùn)課件_第4頁(yè)
Zstack協(xié)議棧專(zhuān)題培訓(xùn)課件_第5頁(yè)
已閱讀5頁(yè),還剩166頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

Zstack協(xié)議棧本章目標(biāo)理解Zstack軟件架構(gòu)掌握操作系統(tǒng)的運(yùn)行機(jī)制掌握Z(yǔ)stack各層作用2本章目標(biāo)理解Zstack軟件架構(gòu)掌握操作系統(tǒng)的運(yùn)行機(jī)制掌握Z(yǔ)stack各層作用3Zstack協(xié)議棧是德州儀器(英文簡(jiǎn)稱(chēng)TI)公司為Zigbee提供的一個(gè)解決方案,結(jié)合CC2530F256芯片可以實(shí)現(xiàn)Zigbee完整的解決方案。本章將對(duì)Zstack協(xié)議棧進(jìn)行分層剖析,以了解其運(yùn)作原理,這是進(jìn)行Zstack應(yīng)用開(kāi)發(fā)的基礎(chǔ)

6.1概述4Zstack文件結(jié)構(gòu)6.1概述雙擊此文件安裝協(xié)議棧相關(guān)文件安裝完成后生成此文件協(xié)議棧各目錄文件說(shuō)明文檔工程文檔工具文件5Zstack協(xié)議棧符合Zigbee協(xié)議結(jié)構(gòu),由物理層、MAC層、網(wǎng)絡(luò)層和應(yīng)用層組成。物理層和MAC層由IEEE802.15.4定義,網(wǎng)絡(luò)層和應(yīng)用層由Zigbee聯(lián)盟來(lái)定義。Zigbee聯(lián)盟將應(yīng)用層又詳細(xì)劃分為應(yīng)用支持子層、應(yīng)用設(shè)備框架以及Zigbee設(shè)備對(duì)象等。6.2Zstack軟件架構(gòu)6Zigbee協(xié)議棧結(jié)構(gòu)可參考本書(shū)的第2章講解,包括物理層、MAC層、NWK(網(wǎng)絡(luò)層)、APL(應(yīng)用層)、應(yīng)用支持子層APS、應(yīng)用程序框架AF、設(shè)備對(duì)象ZDO層6.2.1Zigbee協(xié)議棧7Zigbee協(xié)議棧結(jié)構(gòu)可參考本書(shū)的第2章講解,包括物理層、MAC層、NWK(網(wǎng)絡(luò)層)、APL(應(yīng)用層)、應(yīng)用支持子層APS、應(yīng)用程序框架AF、設(shè)備對(duì)象ZDO層6.2.1Zigbee協(xié)議棧物理層內(nèi)容:物理層定義了物理無(wú)線信道和MAC子層之間的接口,提供物理層數(shù)據(jù)服務(wù)單元(PD-SAP)和物理層管理服務(wù)(MLME-SAP)。MAC(介質(zhì)接入控制子層):MAC層負(fù)責(zé)處理所有物理無(wú)線信道的訪問(wèn),并產(chǎn)生網(wǎng)絡(luò)信號(hào)、同步信號(hào);支持PAN連接和分離,提供兩個(gè)對(duì)等的MAC實(shí)體之間可靠鏈路。NWK(網(wǎng)絡(luò)層):網(wǎng)絡(luò)層是Zigbee協(xié)議棧的核心部分,網(wǎng)絡(luò)層主要實(shí)現(xiàn)節(jié)點(diǎn)加入或者離開(kāi)網(wǎng)絡(luò)、接收或拋棄其它節(jié)點(diǎn)、路由查找及維護(hù)等功能。8Zigbee協(xié)議棧結(jié)構(gòu)可參考本書(shū)的第2章講解,包括物理層、MAC層、NWK(網(wǎng)絡(luò)層)、APL(應(yīng)用層)、應(yīng)用支持子層APS、應(yīng)用程序框架AF、設(shè)備對(duì)象ZDO層6.2.1Zigbee協(xié)議棧APL(應(yīng)用層):Zigbee應(yīng)用層包括應(yīng)用支持子層APS、應(yīng)用程序框架AF、Zigbee設(shè)備對(duì)象ZDO等。應(yīng)用支持子層APS:APS層在NWK層和APL層之間,提供APSDE-SAP和APSME-SAP兩個(gè)接口,兩個(gè)接口的主要功能如下:APSDE-SAP提供在同一個(gè)網(wǎng)絡(luò)中的兩個(gè)或者更多的應(yīng)用實(shí)體之間(即端點(diǎn))的數(shù)據(jù)通信。APSME-SAP提供多種服務(wù)給應(yīng)用對(duì)象ZDO,這些服務(wù)包括安全服務(wù)和綁定設(shè)備服務(wù),并維護(hù)管理對(duì)象的數(shù)據(jù)庫(kù)(即AIB)。9Zigbee協(xié)議棧結(jié)構(gòu)可參考本書(shū)的第2章講解,包括物理層、MAC層、NWK(網(wǎng)絡(luò)層)、APL(應(yīng)用層)、應(yīng)用支持子層APS、應(yīng)用程序框架AF、設(shè)備對(duì)象ZDO層6.2.1Zigbee協(xié)議棧應(yīng)用程序框架AF:運(yùn)行在Zigbee協(xié)議棧上的應(yīng)用程序?qū)嶋H是廠商自定義的應(yīng)用對(duì)象,并且遵循規(guī)范(Profile)運(yùn)行在端點(diǎn)1~240上。設(shè)備對(duì)象層ZDO:遠(yuǎn)程設(shè)備通過(guò)ZDO請(qǐng)求描述信息,接收到這些請(qǐng)求時(shí),ZDO會(huì)調(diào)用配置對(duì)象獲取相應(yīng)的描述符值。ZDO通過(guò)APSME-SAP接口提供綁定服務(wù)。106.2.2Zstack協(xié)議棧116.2.2Zstack協(xié)議棧126.2.2Zstack協(xié)議棧ZDO:ZDO設(shè)備對(duì)象目錄。ZMac:MAC層目錄,包括MAC層參數(shù)及MAC層的LIB庫(kù)函數(shù)回調(diào)處理函數(shù)。Zmain:主函數(shù)目錄,包括入口函數(shù)及硬件配置文件。Output:輸出文件目錄,由IAR自動(dòng)生成。136.2.3Zigbee協(xié)議棧與Zstack對(duì)比

Zstack協(xié)議棧是一個(gè)半開(kāi)源的協(xié)議棧,其中MAC層和ZMAC層的源碼沒(méi)有全部開(kāi)源,關(guān)于他們的具體內(nèi)容,在實(shí)際的工程開(kāi)發(fā)中也不需要詳細(xì)了解。

146.3HAL層分析Zigbee的HAL層提供了開(kāi)發(fā)板所有硬件設(shè)備(例如LED、LCD、KEY、UART等)的驅(qū)動(dòng)函數(shù)及接口。HAL文件夾為硬件平臺(tái)的抽象層,包含common、include和target三個(gè)文件夾

156.3.1Common文件夾Common目錄下包含有hal_assert.c和hal_dirvers.c兩個(gè)文件。其中hal_assert.c是聲明文件,用于調(diào)試。hal_dirvers.c是驅(qū)動(dòng)文件一般不需要修改,了解即可一些底層驅(qū)動(dòng)文件,需要用戶(hù)掌握的166.3.1Common文件夾hal_assert.chalAssertHandler()halAssertHazardLights()176.3.1Common文件夾halAssertHandler()這個(gè)函數(shù)為硬件系統(tǒng)檢測(cè)函數(shù),如果定義了ASSERT_RESET宏定義,系統(tǒng)將調(diào)用HAL_SYSTEM_RESET復(fù)位,否則將調(diào)用halAaaertHazardLights()執(zhí)行閃爍LED命令

voidhalAssertHandler(void){//如果定義了ASSERT_RESET宏定義#ifdefASSERT_RESET//系統(tǒng)復(fù)位

HAL_SYSTEM_RESET();#else!definedASSERT_WHILE//當(dāng)檢測(cè)到錯(cuò)誤時(shí),LED燈閃爍命令函數(shù)

halAssertHazardLights();#elsewhile(1);#endif}186.3.1Common文件夾halAssertHazardLights()

此函數(shù)控制LED燈閃爍,但是根據(jù)不同的硬件平臺(tái)定義的LED的個(gè)數(shù)不同來(lái)決定閃爍不同的LED。例如CC2430和CC2530所使用的硬件平臺(tái)不同決定閃爍的LED不同

//如果硬件平臺(tái)定義的LED的個(gè)數(shù)為1#if(HAL_NUM_LEDS>=1)//LED1閃爍HAL_TOGGLE_LED1();//如果硬件平臺(tái)定義的LED的個(gè)數(shù)為2#if(HAL_NUM_LEDS>=2)//LED2閃爍HAL_TOGGLE_LED2();//如果硬件平臺(tái)定義的LED的個(gè)數(shù)為3#if(HAL_NUM_LEDS>=3)//LED3閃爍HAL_TOGGLE_LED3();//如果硬件平臺(tái)定義的LED的個(gè)數(shù)為4#if(HAL_NUM_LEDS>=4)//LED4閃爍HAL_TOGGLE_LED4();#endif#endif#endif#endif196.3.1Common文件夾hal_drivers.c:hal_drivers.c文件中包含了與硬件相關(guān)初始化和事件處理函數(shù)。此文件中有4個(gè)比較重要的函數(shù):硬件初始化函數(shù)Hal_Init()硬件驅(qū)動(dòng)初始化函數(shù)HalDriverInit()硬件事件處理函數(shù)Hal_ProcessEvent()詢(xún)檢函數(shù)Hal_ProcessPoll()206.3.1Common文件夾硬件初始化函數(shù)Hal_Init()Hal_Init()函數(shù)是硬件初始化函數(shù)。其功能是通過(guò)“注冊(cè)任務(wù)ID號(hào)”以實(shí)現(xiàn)在OSAL層注冊(cè),從而允許硬件驅(qū)動(dòng)的消息和事件由OSAL處理。

voidHal_Init(uint8task_id){//注冊(cè)任務(wù)IDHal_TaskID=task_id;}Zstack協(xié)議棧操作系統(tǒng)任務(wù)ID,216.3.1Common文件夾硬件驅(qū)動(dòng)初始化函數(shù)HalDriverInit()HalDriverInit()函數(shù)被main()函數(shù)調(diào)用,用于初始化與硬件設(shè)備有關(guān)的驅(qū)動(dòng)

voidHalDriverInit(void){//如果定義了定時(shí)器則初始化定時(shí)器#if(definedHAL_TIMER)&&(HAL_TIMER==TRUE)/*在Zstack-CC2530-2.5.1a版本中移除了定時(shí)器的初始化,但不影響Zstack的運(yùn)行。*/

#error"Thehaltimerdrivermoduleisremoved."#endif//如果定義了ADC,初始化ADC#if(definedHAL_ADC)&&(HAL_ADC==TRUE)HalAdcInit();#endif//如果定義了DMA,初始化DMA#if(definedHAL_DMA)&&(HAL_DMA==TRUE)HalDmaInit();#endif//如果定義了AES,初始化AES#if(definedHAL_AES)&&(HAL_AES==TRUE)HalAesInit();#endif226.3.1Common文件夾硬件驅(qū)動(dòng)初始化函數(shù)HalDriverInit()HalDriverInit()函數(shù)被main()函數(shù)調(diào)用,用于初始化與硬件設(shè)備有關(guān)的驅(qū)動(dòng)

//如果定義了LCD,初始化LCD#if(definedHAL_LCD)&&(HAL_LCD==TRUE)HalLcdInit();#endif//如果定義了LED,初始化LED#if(definedHAL_LED)&&(HAL_LED==TRUE)HalLedInit();#endif//如果定義了UART,初始化UART#if(definedHAL_UART)&&(HAL_UART==TRUE)HalUARTInit();#endif//如果定義了按鍵,初始化KEY#if(definedHAL_KEY)&&(HAL_KEY==TRUE)HalKeyInit();#endif//如果定義了SPI,初始化SPI#if(definedHAL_SPI)&&(HAL_SPI==TRUE)HalSpiInit();#endif//如果定義了USB,初始化USB,只限CC2531#if(definedHAL_HID)&&(HAL_HID==TRUE)usbHidInit();#endif}236.3.1Common文件夾硬件事件處理函數(shù)Hal_ProcessEvent()Hal_ProcessEvent()函數(shù)在APP層中的任務(wù)事件處理中調(diào)用,用于對(duì)相應(yīng)的硬件事件作出處理,具體包括系統(tǒng)消息事件、LED閃爍事件、按鍵處理事件和睡眠模式等。uint16Hal_ProcessEvent(uint8task_id,uint16events){uint8*msgPtr;(void)task_id;//系統(tǒng)消息事件

if(events&SYS_EVENT_MSG){msgPtr=osal_msg_receive(Hal_TaskID);while(msgPtr){osal_msg_deallocate(msgPtr);msgPtr=osal_msg_receive(Hal_TaskID);}returnevents^SYS_EVENT_MSG;}//LED閃爍事件

if(events&HAL_LED_BLINK_EVENT){#if(defined(BLINK_LEDS))&&(HAL_LED==TRUE)HalLedUpdate();#endifreturnevents^HAL_LED_BLINK_EVENT;}協(xié)議棧固有的函數(shù),在使用的時(shí)候可以直接調(diào)用,不需要大幅度的修改246.3.1Common文件夾硬件事件處理函數(shù)Hal_ProcessEvent()Hal_ProcessEvent()函數(shù)在APP層中的任務(wù)事件處理中調(diào)用,用于對(duì)相應(yīng)的硬件事件作出處理,具體包括系統(tǒng)消息事件、LED閃爍事件、按鍵處理事件和睡眠模式等。//按鍵處理事件

if(events&HAL_KEY_EVENT){#if(definedHAL_KEY)&&(HAL_KEY==TRUE)HalKeyPoll();if(!Hal_KeyIntEnable){osal_start_timerEx(Hal_TaskID,HAL_KEY_EVENT,100);}#endifreturnevents^HAL_KEY_EVENT;}//睡眠模式#ifdefPOWER_SAVINGif(events&HAL_SLEEP_TIMER_EVENT){halRestoreSleepLevel();returnevents^HAL_SLEEP_TIMER_EVENT;}#endifreturn0;}256.3.1Common文件夾詢(xún)檢函數(shù)Hal_ProcessPoll()Hal_ProcessPoll()函數(shù)在main()函數(shù)中被osal_start_system()調(diào)用,用來(lái)對(duì)可能產(chǎn)生的硬件事件進(jìn)行詢(xún)檢。

voidHal_ProcessPoll(){//定時(shí)器詢(xún)檢#if(definedHAL_TIMER)&&(HAL_TIMER==TRUE)HalTimerTick();#endif//UART詢(xún)檢#if(definedHAL_UART)&&(HAL_UART==TRUE)HalUARTPoll();#endif//定時(shí)器詢(xún)檢#if(definedHAL_TIMER)&&(HAL_TIMER==TRUE)//在Zstack-CC2530-2.5.1a版本中移除了定時(shí)器的初始化,但不影響Zstack的運(yùn)行。

#error"Thehaltimerdrivermoduleisremoved."#endif//串口詢(xún)檢#if(definedHAL_UART)&&(HAL_UART==TRUE)HalUARTPoll();#endif

協(xié)議棧固有的函數(shù),在使用的時(shí)候可以直接調(diào)用,不需要大幅度的修改266.3.1Common文件夾詢(xún)檢函數(shù)Hal_ProcessPoll()Hal_ProcessPoll()函數(shù)在main()函數(shù)中被osal_start_system()調(diào)用,用來(lái)對(duì)可能產(chǎn)生的硬件事件進(jìn)行詢(xún)檢。

//SPI詢(xún)檢#if(definedHAL_SPI)&&(HAL_SPI==TRUE)HalSpiPoll();#endif//USB詢(xún)檢(僅限CC2531)#if(definedHAL_HID)&&(HAL_HID==TRUE)usbHidProcessEvents();#endif//如果定義了休眠模式#ifdefined(POWER_SAVING)//允許在下一個(gè)事件到來(lái)之前進(jìn)入休眠模式

ALLOW_SLEEP_MODE();#endif}276.3.2Include文件夾Include目錄主要包含各個(gè)硬件模塊的頭文件,主要內(nèi)容是與硬件相關(guān)的常量定義以及函數(shù)聲明

在移植過(guò)程中可能需要修改,需要用戶(hù)掌握286.3.2Include文件夾Include目錄主要包含各個(gè)硬件模塊的頭文件,主要內(nèi)容是與硬件相關(guān)的常量定義以及函數(shù)聲明

296.3.3Target文件夾Target目錄下包含了某個(gè)設(shè)備類(lèi)型下的硬件驅(qū)動(dòng)文件、硬件開(kāi)發(fā)板上的配置文件,MCU信息和數(shù)據(jù)類(lèi)型,本書(shū)采用的硬件平臺(tái)為CC2530,因此本節(jié)以硬件設(shè)備類(lèi)型CC2530EB(EB是版本號(hào),表示是評(píng)估版)為例進(jìn)行講解

306.3.3Target文件夾在CC2530EB文件夾下包含三個(gè)子文件夾,分別是Config、Drivers、Includes需要用戶(hù)重點(diǎn)掌握316.3.3Target文件夾Config文件夾Config文件夾中包含了hal_board_cfg.h,在hal_board_cfg.h中定義了硬件CC2530硬件資源的配置,比如GPIO、DMA、ADC等。在hal_board_cfg.h文件中可以定義開(kāi)發(fā)板的硬件資源,以LED為例來(lái)講解。TI官方的CC2530EB版本定義了兩個(gè)LED:LED1和LED2

//有關(guān)LED1宏定義#defineLED1_BVBV(0)#defineLED1_SBITP1_0#defineLED1_DDRP1DIR#defineLED1_POLARITYACTIVE_HIGH//如果定義了HAL_BOARD_CC2530EB_REV17,則定義LED2和LED3#ifdefined(HAL_BOARD_CC2530EB_REV17)//有關(guān)LED2的宏定義

#defineLED2_BVBV(1)#defineLED2_SBITP1_1#defineLED2_DDRP1DIR#defineLED2_POLARITYACTIVE_HIGH//有關(guān)LED3的宏定義

#defineLED3_BVBV(4)#defineLED3_SBITP1_4#defineLED3_DDRP1DIR#defineLED3_POLARITYACTIVE_HIGH#endif326.3.3Target文件夾Config文件夾LED宏定義完成之后,設(shè)置LED的打開(kāi)和關(guān)閉,其代碼在hal_board_cfg.h文件中

/*如果定義了HAL_BOARD_CC2530EB_REV17且沒(méi)有定義HAL_PA_LNA和HAL_PA_LNA_CC2590,則定義LED的狀態(tài)*/#ifdefined(HAL_BOARD_CC2530EB_REV17)&&!defined(HAL_PA_LNA)&&!defined(HAL_PA_LNA_CC2590)//打開(kāi)LED1~LED3#defineHAL_TURN_OFF_LED1()st(LED1_SBIT=LED1_POLARITY(0);)#defineHAL_TURN_OFF_LED2()st(LED2_SBIT=LED2_POLARITY(0);)#defineHAL_TURN_OFF_LED3()st(LED3_SBIT=LED3_POLARITY(0);)#defineHAL_TURN_OFF_LED4()HAL_TURN_OFF_LED1()//關(guān)閉LED1~LED3#defineHAL_TURN_ON_LED1()st(LED1_SBIT=LED1_POLARITY(1);)#defineHAL_TURN_ON_LED2()st(LED2_SBIT=LED2_POLARITY(1);)#defineHAL_TURN_ON_LED3()st(LED3_SBIT=LED3_POLARITY(1);)#defineHAL_TURN_ON_LED4()HAL_TURN_ON_LED1()//改變LED1~LED3的狀態(tài)

#defineHAL_TOGGLE_LED1()st(if(LED1_SBIT){LED1_SBIT=0;}else{LED1_SBIT=1;})#defineHAL_TOGGLE_LED2()st(if(LED2_SBIT){LED2_SBIT=0;}else{LED2_SBIT=1;})#defineHAL_TOGGLE_LED3()st(if(LED3_SBIT){LED3_SBIT=0;}else{LED3_SBIT=1;})#defineHAL_TOGGLE_LED4()HAL_TOGGLE_LED1()336.3.3Target文件夾Drivers文件夾在Drivers文件中定義了硬件資源的驅(qū)動(dòng)文件

346.3.3Target文件夾Drivers文件夾以最常用的LED為例,在hal_led.c文件中提供了2個(gè)封裝好的函數(shù),在應(yīng)用層可以直接調(diào)用他們來(lái)控制LED,具體有以下函數(shù):HalLedSet(uint8leds,uint8mode)。HalLedBlink(uint8leds,uint8numBlinks,uint8percent,uint16period)。

356.3.3Target文件夾Drivers文件夾HalLedSet()函數(shù)是用來(lái)控制LED的亮滅,該函數(shù)的原型如下:

HalLedSet(uint8leds,uint8mode);參數(shù)leds,指LED的名稱(chēng)HAL_LED_1。HAL_LED_2。HAL_LED_3。HAL_LED_4。

參數(shù)mode,LED狀態(tài)

打開(kāi)LED:HAL_LED_MODE_ON。關(guān)閉LED:HAL_LED_MODE_OFF。改變LED狀態(tài):HAL_LED_MODE_TOGGLE

HalLedSet(HAL_LED_1,HAL_LED_MODE_ON);366.3.3Target文件夾Drivers文件夾HalLedBlink()函數(shù)是用來(lái)控制LED閃爍的,函數(shù)原型如下HalLedBlink(uint8leds,uint8numBlinks,uint8percent,uint16period)

參數(shù)leds,指LED的名稱(chēng)

HAL_LED_1。HAL_LED_2。HAL_LED_3。HAL_LED_4。

參數(shù)numBlinks,閃爍次數(shù)。參數(shù)percent,LED亮和滅的所用事件占空比,例如亮和滅所用的事件比例為1:1,則占空比為100/2=50。參數(shù)period,LED閃爍一個(gè)周期所需要的時(shí)間,以毫秒為單位。HalLedBlink(HAL_LED_1,4,50,500);LED1在500ms的時(shí)間內(nèi)閃爍4次,其亮滅時(shí)間間隔是一樣的376.4NWK層Zstack的NWK層負(fù)責(zé)的功能有:節(jié)點(diǎn)地址類(lèi)型的分配、協(xié)議棧模板、網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu)、網(wǎng)絡(luò)地址的分配的選擇等。

386.4.1節(jié)點(diǎn)地址類(lèi)型的選擇Zstack中地址類(lèi)型有兩種:64位IEEE地址和16位網(wǎng)絡(luò)地址(Zstack中也稱(chēng)短地址或網(wǎng)絡(luò)短地址)。

64位IEEE地址:即MAC地址(也稱(chēng)“長(zhǎng)地址”或“擴(kuò)展地址”),是一個(gè)全球唯一的地址,一經(jīng)分配將跟隨設(shè)備一生。通常由制造商在設(shè)備出廠或被安裝時(shí)設(shè)置。這些地址由IEEE組織來(lái)維護(hù)和分配。16位網(wǎng)絡(luò)地址:是設(shè)備加入網(wǎng)絡(luò)后,由網(wǎng)絡(luò)中的協(xié)調(diào)器分配給設(shè)備的地址(也稱(chēng)“短地址”),它在網(wǎng)絡(luò)中是唯一的,用來(lái)在網(wǎng)絡(luò)中鑒別設(shè)備和發(fā)送數(shù)據(jù)。對(duì)于協(xié)調(diào)器,網(wǎng)絡(luò)地址固定為0x0000。

396.4.1節(jié)點(diǎn)地址類(lèi)型的選擇在Zstack協(xié)議棧聲明了讀取IEEE地址和網(wǎng)絡(luò)地址的函數(shù),函數(shù)的聲明可以在NLMEDE.h文件中看到,但是具體的實(shí)現(xiàn)函數(shù)是非開(kāi)源的,在使用的時(shí)候直接調(diào)用即可。

//讀取父節(jié)點(diǎn)的網(wǎng)絡(luò)地址uint16NLME_GetCoordShortAddr(void);//讀取父節(jié)點(diǎn)的物理地址voidNLME_GetCoordExtAddr(byte*);//讀取節(jié)點(diǎn)本身的網(wǎng)絡(luò)地址uint16NLME_GetShortAddr(void);//讀取自己的物理地址byte*NLME_GetExtAddr(void);uint16shortaddrShortaddr=MLME_GetShortAddr();406.4.2協(xié)議棧模板Zstack協(xié)議棧模板由Zigbee聯(lián)盟定義,在同一個(gè)網(wǎng)絡(luò)中的設(shè)備必須符合同一個(gè)協(xié)議棧模板。Zstack協(xié)議棧使用了Zigbee聯(lián)盟定義的三種模板:Zigbee協(xié)議棧模板ZigbeePRO協(xié)議棧模板特定網(wǎng)絡(luò)模板。所有的設(shè)備只要遵循該協(xié)議,一般情況下即使在不同廠商買(mǎi)的不同設(shè)備同樣可以形成網(wǎng)絡(luò)。416.4.2協(xié)議棧模板另外,開(kāi)發(fā)者為了開(kāi)發(fā)具有特殊性的產(chǎn)品,可以向Zigbee聯(lián)盟申請(qǐng)自定義的模板,在Zstack協(xié)議棧中,開(kāi)發(fā)者申請(qǐng)了兩種自定義模板。協(xié)議棧模板由一個(gè)ID標(biāo)識(shí)符區(qū)分,此ID標(biāo)識(shí)符可以通過(guò)查詢(xún)?cè)O(shè)備發(fā)送的信標(biāo)幀獲得。在設(shè)備加入網(wǎng)絡(luò)之前,首先需要確認(rèn)協(xié)議棧模板ID標(biāo)識(shí)符。在Zstack協(xié)議棧中,各種模板的ID標(biāo)識(shí)符的定義如下“特定網(wǎng)絡(luò)”模板的ID標(biāo)識(shí)符被定義為“NETWORK_SPECIFIC”,且模板ID標(biāo)識(shí)符為0?!癦igbee協(xié)議棧”模板的ID標(biāo)識(shí)符被定義為“HOME_SPECIFIC”,且模板ID標(biāo)識(shí)符為1。其中“Zigbee協(xié)議?!蹦0宄S迷谥悄芗揖拥目刂啤!癦igbeePRO協(xié)議棧”模板的ID標(biāo)識(shí)符被定義為“ZIGBEEPRO_SPECIFIC”,且模板ID標(biāo)識(shí)符為2。426.4.2協(xié)議棧模板另外,開(kāi)發(fā)者為了開(kāi)發(fā)具有特殊性的產(chǎn)品,可以向Zigbee聯(lián)盟申請(qǐng)自定義的模板,在Zstack協(xié)議棧中,開(kāi)發(fā)者申請(qǐng)了兩種自定義模板。協(xié)議棧模板由一個(gè)ID標(biāo)識(shí)符區(qū)分,此ID標(biāo)識(shí)符可以通過(guò)查詢(xún)?cè)O(shè)備發(fā)送的信標(biāo)幀獲得。在設(shè)備加入網(wǎng)絡(luò)之前,首先需要確認(rèn)協(xié)議棧模板ID標(biāo)識(shí)符。在Zstack協(xié)議棧中,各種模板的ID標(biāo)識(shí)符的定義如下自定義模板的ID標(biāo)識(shí)符被定義為“GENERIC_STAR”和“GENERIC_TREE”,且模板ID標(biāo)識(shí)符被分別定義為3和4。從模板ID標(biāo)識(shí)符的定義來(lái)看,這兩個(gè)自定義模板分別是為星型網(wǎng)絡(luò)和樹(shù)型網(wǎng)絡(luò)專(zhuān)門(mén)定義的。436.4.2協(xié)議棧模板另外,開(kāi)發(fā)者為了開(kāi)發(fā)具有特殊性的產(chǎn)品,可以向Zigbee聯(lián)盟申請(qǐng)自定義的模板,在Zstack協(xié)議棧中,開(kāi)發(fā)者申請(qǐng)了兩種自定義模板。協(xié)議棧模板由一個(gè)ID標(biāo)識(shí)符區(qū)分,此ID標(biāo)識(shí)符可以通過(guò)查詢(xún)?cè)O(shè)備發(fā)送的信標(biāo)幀獲得。在設(shè)備加入網(wǎng)絡(luò)之前,首先需要確認(rèn)協(xié)議棧模板ID標(biāo)識(shí)符。在Zstack協(xié)議棧中,各種模板的ID標(biāo)識(shí)符的定義如下自定義模板的ID標(biāo)識(shí)符被定義為“GENERIC_STAR”和“GENERIC_TREE”,且模板ID標(biāo)識(shí)符被分別定義為3和4。從模板ID標(biāo)識(shí)符的定義來(lái)看,這兩個(gè)自定義模板分別是為星型網(wǎng)絡(luò)和樹(shù)型網(wǎng)絡(luò)專(zhuān)門(mén)定義的。446.4.2協(xié)議棧模板其三種模板的配置在nwk_globals.h文件中

//“特定網(wǎng)絡(luò)”模板ID#defineNETWORK_SPECIFIC0//Zigbee協(xié)議模板ID#defineHOME_CONTROLS1//ZigbeePRO模板ID#defineZIGBEEPRO_PROFILE2//自定義模板ID#defineGENERIC_STAR3//自定義模板ID#defineGENERIC_TREE4//如果定義了ZIGBEEPRO,那么協(xié)議棧為ZIGBEEPRO模板#ifdefined(ZIGBEEPRO)#defineSTACK_PROFILE_IDZIGBEEPRO_PROFILE#else//如果沒(méi)有定義ZIGBEEPRO,那么協(xié)議棧為ZIGBEE模板

#defineSTACK_PROFILE_IDHOME_CONTROLS#endifZStack-CC2530-2.5.1aZStack-CC2530-2.2.0-1.3.0456.4.3網(wǎng)絡(luò)參數(shù)配置網(wǎng)絡(luò)類(lèi)型參數(shù)和網(wǎng)絡(luò)深度的設(shè)置

在Zstack協(xié)議棧中星型網(wǎng)絡(luò)、樹(shù)型網(wǎng)絡(luò)和網(wǎng)狀型網(wǎng)絡(luò)三種網(wǎng)絡(luò)類(lèi)型的定義在nwk_globals.h文件中

/**********定義網(wǎng)絡(luò)類(lèi)型***********///星型網(wǎng)#defineNWK_MODE_STAR0//樹(shù)型網(wǎng)#defineNWK_MODE_TREE1//網(wǎng)狀網(wǎng)#defineNWK_MODE_MESH2466.4.3網(wǎng)絡(luò)參數(shù)配置網(wǎng)絡(luò)類(lèi)型參數(shù)和網(wǎng)絡(luò)深度的設(shè)置

在Zstack協(xié)議棧中定義的三種網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu)分別在不同的模板下定義。且每一種模板下都定義了該網(wǎng)絡(luò)的網(wǎng)絡(luò)深度。具體定義在nwk_globals.h文件中

476.4.3網(wǎng)絡(luò)參數(shù)配置網(wǎng)絡(luò)類(lèi)型參數(shù)和網(wǎng)絡(luò)深度的設(shè)置

在Zstack協(xié)議棧中定義的三種網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu)分別在不同的模板下定義。且每一種模板下都定義了該網(wǎng)絡(luò)的網(wǎng)絡(luò)深度。具體定義在nwk_globals.h文件中

486.4.3網(wǎng)絡(luò)參數(shù)配置網(wǎng)絡(luò)類(lèi)型參數(shù)和網(wǎng)絡(luò)深度的設(shè)置

在Zstack協(xié)議棧中定義的三種網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu)分別在不同的模板下定義。且每一種模板下都定義了該網(wǎng)絡(luò)的網(wǎng)絡(luò)深度。具體定義在nwk_globals.h文件中

496.4.3網(wǎng)絡(luò)參數(shù)配置網(wǎng)絡(luò)類(lèi)型參數(shù)和網(wǎng)絡(luò)深度的設(shè)置

在Zstack協(xié)議棧中定義的三種網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu)分別在不同的模板下定義。且每一種模板下都定義了該網(wǎng)絡(luò)的網(wǎng)絡(luò)深度。具體定義在nwk_globals.h文件中

506.4.3網(wǎng)絡(luò)參數(shù)配置每一級(jí)可以容納的節(jié)點(diǎn)個(gè)數(shù)的配置

在Zstack協(xié)議棧中,每一級(jí)路由可以容納的節(jié)點(diǎn)的個(gè)數(shù)的配置分為兩種情況

一個(gè)路由器或者一個(gè)協(xié)調(diào)器可以連接的子節(jié)點(diǎn)的最大個(gè)數(shù)。一個(gè)路由器或者一個(gè)協(xié)調(diào)器可以連接的具有路由功能的節(jié)點(diǎn)的最大個(gè)數(shù)。

516.4.3網(wǎng)絡(luò)參數(shù)配置每一級(jí)可以容納的節(jié)點(diǎn)個(gè)數(shù)的配置

如果前者用C來(lái)表示,后者用R來(lái)表示,那么R為C的一個(gè)子集。另外這兩個(gè)參數(shù)的設(shè)置與協(xié)議棧模板有關(guān)系,具體配置在nwk_globals.c文件中,其代碼如下://如果協(xié)議規(guī)范為ZigbeePRO模板#if(STACK_PROFILE_ID==ZIGBEEPRO_PROFILE)//定義MAX_ROUTERS為默認(rèn)值

byteCskipRtrs[1]={0};//定義MAX_ROUTERS為默認(rèn)值

byteCskipChldrn[1]={0};//如果協(xié)議規(guī)范為Zigbee模板#elif(STACK_PROFILE_ID==HOME_CONTROLS)//定義協(xié)調(diào)器和每級(jí)路由器下攜帶的路由器節(jié)點(diǎn)個(gè)數(shù)為6byteCskipRtrs[MAX_NODE_DEPTH+1]={6,6,6,6,6,0};//定義協(xié)調(diào)器和每級(jí)路由器可以攜帶的節(jié)點(diǎn)個(gè)數(shù)為20個(gè)

byteCskipChldrn[MAX_NODE_DEPTH+1]={20,20,20,20,20,0};//如果協(xié)議模板為自定義GENERIC_STAR模板#elif(STACK_PROFILE_ID==GENERIC_STAR)//定義協(xié)調(diào)器和每級(jí)路由器下攜帶的路由器節(jié)點(diǎn)個(gè)數(shù)為5byteCskipRtrs[MAX_NODE_DEPTH+1]={5,5,5,5,5,0};//定義協(xié)調(diào)器和每級(jí)路由器下攜帶的節(jié)點(diǎn)個(gè)數(shù)為56byteCskipChldrn[MAX_NODE_DEPTH+1]={5,5,5,5,5,0};//如果協(xié)議規(guī)范為自定義GENERIC_STAR規(guī)范#elif(STACK_PROFILE_ID==NETWORK_SPECIFIC)//定義協(xié)調(diào)器和每級(jí)路由器下攜帶的路由器節(jié)點(diǎn)個(gè)數(shù)為5byteCskipRtrs[MAX_NODE_DEPTH+1]={5,5,5,5,5,0};//定義協(xié)調(diào)器和每級(jí)路由器下攜帶的路由器節(jié)點(diǎn)個(gè)數(shù)為5byteCskipChldrn[MAX_NODE_DEPTH+1]={5,5,5,5,5,0};這兩個(gè)參數(shù)的設(shè)置,有時(shí)會(huì)影響網(wǎng)絡(luò)地址的分配。在Zigbee網(wǎng)絡(luò)中,網(wǎng)絡(luò)地址的分配是由網(wǎng)絡(luò)中的協(xié)調(diào)器來(lái)完成的。在網(wǎng)狀型網(wǎng)絡(luò)中,網(wǎng)絡(luò)地址的分配是由協(xié)調(diào)器隨機(jī)的分配。但是在樹(shù)型網(wǎng)絡(luò)中,網(wǎng)絡(luò)地址的分配遵循了一定的算法。526.4.3網(wǎng)絡(luò)參數(shù)配置每一級(jí)可以容納的節(jié)點(diǎn)個(gè)數(shù)的配置

在ZigbeePRO協(xié)議棧模板中定義的CskipChldrn和CskipRtrs數(shù)組為默認(rèn)值,即定義代碼如下

//如果協(xié)議規(guī)范為ZigbeePRO模板#if(STACK_PROFILE_ID==ZIGBEEPRO_PROFILE)//定義MAX_ROUTERS為默認(rèn)值

byteCskipRtrs[1]={0};//定義MAX_ROUTERS為默認(rèn)值

byteCskipChldrn[1]={0};當(dāng)一個(gè)節(jié)點(diǎn)加入時(shí),首先將接收到父節(jié)點(diǎn)的隨機(jī)分配的網(wǎng)絡(luò)地址,然后產(chǎn)生“設(shè)備聲明”(包含分配到的網(wǎng)絡(luò)地址和IEEE地址)發(fā)送至網(wǎng)絡(luò)中的其余節(jié)點(diǎn)。如果另一個(gè)節(jié)點(diǎn)有著同樣的網(wǎng)絡(luò)地址,則通過(guò)路由器廣播“網(wǎng)絡(luò)狀態(tài)-地址沖突”至網(wǎng)絡(luò)中的所有節(jié)點(diǎn)。所有發(fā)生網(wǎng)絡(luò)地址沖突的節(jié)點(diǎn)更改自己的網(wǎng)絡(luò)地址,然后再發(fā)起“設(shè)備聲明”檢測(cè)新的網(wǎng)絡(luò)地址是否沖突。

當(dāng)在協(xié)議棧模板中使用的CskipChldrn和CskipRtrs數(shù)組為默認(rèn)值時(shí),網(wǎng)絡(luò)地址遵循隨機(jī)分配機(jī)制,對(duì)新加入的節(jié)點(diǎn)使用隨機(jī)地址分配:536.4.3網(wǎng)絡(luò)參數(shù)配置樹(shù)型網(wǎng)絡(luò)中網(wǎng)絡(luò)地址分配的算法在Zigbee的樹(shù)型網(wǎng)絡(luò)中,網(wǎng)絡(luò)地址分配算法需要三個(gè)參數(shù):

網(wǎng)絡(luò)的最大深度,在Zstack協(xié)議中被定義為MAX_NODE_DEPTH。在此算法中用L表示。路由器或協(xié)調(diào)器可以連接的子節(jié)點(diǎn)的最大個(gè)數(shù),在Zstack協(xié)議棧中被定義為CskipChldrn數(shù)組中元素的值。在此算法中用C表示。路由器或協(xié)調(diào)器可以連接的具有路由功能的子節(jié)點(diǎn)的最大個(gè)數(shù),在Zstack協(xié)議棧中被定義為CskipRtrs數(shù)組中的元素的值。在此算法中用R表示。546.4.3網(wǎng)絡(luò)參數(shù)配置樹(shù)型網(wǎng)絡(luò)中網(wǎng)絡(luò)地址分配的算法以上3個(gè)參數(shù)設(shè)置完成后,如果需要計(jì)算深度為d的網(wǎng)絡(luò)地址偏移量Cskip(d),則有如下計(jì)算公式:若L=6,C=20,R=6,那么計(jì)算深度d=1的網(wǎng)絡(luò)地址偏移量Cskip(1)為5181(十六進(jìn)制為143D),協(xié)調(diào)器網(wǎng)絡(luò)地址為0x0000,那么協(xié)調(diào)器下第一個(gè)路由器的網(wǎng)絡(luò)地址為0x0001,第二個(gè)路由器的網(wǎng)絡(luò)地址為0x0001+0x143D=0x143E。

556.5Tool配置及分析Tools文件為工程設(shè)置文件目錄,比如信道、PANID、設(shè)備類(lèi)型的設(shè)置

在Tools文件中包含著5個(gè)文件,分別是f8w2530.xcl文件、f8wConfig.cfg文件、f8wCoord.cfg文件、f8wEndev.cfg文件和f8wRouter.cfg文件。其中f8w2530.xcl為CC2530的配置文件,使用Zstack協(xié)議棧時(shí)不用修改此項(xiàng)566.5Tool配置及分析f8wConfig.cfg文件f8wConfig.cfg文件為Zstack協(xié)議棧的配置文件,在此文件中設(shè)置Zigbee使用的信道和Zigbee網(wǎng)絡(luò)PANID

//信道設(shè)置//0:868MHz0x00000001//1-10:915MHz0x000007FE//11-26:2.4GHz0x07FFF800//-DMAX_CHANNELS_868MHZ0x00000001//-DMAX_CHANNELS_915MHZ0x000007FE//-DMAX_CHANNELS_24GHZ0x07FFF800//以下為信道11-26的設(shè)置//-DDEFAULT_CHANLIST=0x04000000//26-0x1A-DDEFAULT_CHANLIST=0x02000000//25-0x19//-DDEFAULT_CHANLIST=0x01000000//24-0x18//-DDEFAULT_CHANLIST=0x00800000//23-0x17//-DDEFAULT_CHANLIST=0x00400000//22-0x16//-DDEFAULT_CHANLIST=0x00200000//21-0x15//-DDEFAULT_CHANLIST=0x00100000//20-0x14//-DDEFAULT_CHANLIST=0x00080000//19-0x13//-DDEFAULT_CHANLIST=0x00040000//18-0x12//-DDEFAULT_CHANLIST=0x00020000//17-0x11//-DDEFAULT_CHANLIST=0x00010000//16-0x10//-DDEFAULT_CHANLIST=0x00008000//15-0x0F//-DDEFAULT_CHANLIST=0x00004000//14-0x0E//-DDEFAULT_CHANLIST=0x00002000//13-0x0D//-DDEFAULT_CHANLIST=0x00001000//12-0x0C//-DDEFAULT_CHANLIST=0x00000800//11-0x0B//網(wǎng)絡(luò)PANID的設(shè)置

-DZDAPP_CONFIG_PAN_ID=0xFFFF

576.5Tool配置及分析f8wConfig.cfg文件當(dāng)網(wǎng)絡(luò)PANID設(shè)置為0xFFFF時(shí),即協(xié)調(diào)器建立網(wǎng)絡(luò)時(shí)將在0x0000—0xFFFF之間隨機(jī)選擇一個(gè)數(shù)作為網(wǎng)絡(luò)的PANID。如果網(wǎng)絡(luò)的PANID為0x0000—0xFFFF之間指定的一個(gè)數(shù),則協(xié)調(diào)器建立網(wǎng)絡(luò)時(shí)將會(huì)以選定的PANID作為網(wǎng)絡(luò)PANID建立網(wǎng)絡(luò)。//網(wǎng)絡(luò)PANID的設(shè)置

-DZDAPP_CONFIG_PAN_ID=0x1234

586.5Tool配置及分析f8wCoord.cfg文件f8wCoord.cfg文件是Zstack協(xié)議棧協(xié)調(diào)器設(shè)備類(lèi)型配置文件。其功能是將程序編譯成具有協(xié)調(diào)器和路由器的雙重功能(這是因?yàn)閰f(xié)調(diào)器需要同時(shí)具有網(wǎng)絡(luò)建立和路由器功能)。/*協(xié)調(diào)器設(shè)置*///協(xié)調(diào)器功能-DZDO_COORDINATOR//路由器功能-DRTR_NWK596.5Tool配置及分析f8wRouter.cfg文件f8wRouter.cfg文件為路由器配置文件。此文件將程序編譯成具有路由器功能//路由器功能-DRTR_NWK606.5Tool配置及分析f8wEndev.cfg文件

此文件為終端節(jié)點(diǎn)的配置文件,在此文件中既沒(méi)有編譯協(xié)調(diào)器功能也沒(méi)有編譯路由器功能,因此,此文件一般不需要配置。

616.6Profile層分析Profile對(duì)應(yīng)Zigbee軟件架構(gòu)中的應(yīng)用程序框架AF層。Profile文件夾下面包含兩個(gè)文件:AF.c和AF.h。AF層提供應(yīng)用支持子層APS到應(yīng)用層的接口,AF層主要提供兩種功能:端點(diǎn)的管理和數(shù)據(jù)的發(fā)送和接收。626.6.1端點(diǎn)的管理在Zigbee協(xié)議中每個(gè)設(shè)備都被看作一個(gè)節(jié)點(diǎn),每個(gè)節(jié)點(diǎn)都有物理地址(長(zhǎng)地址)和網(wǎng)絡(luò)地址(短地址),長(zhǎng)地址或短地址用來(lái)作為其他節(jié)點(diǎn)發(fā)送數(shù)據(jù)的目的地址。另外每一個(gè)節(jié)點(diǎn)都有241個(gè)端點(diǎn),其中端點(diǎn)0預(yù)留,端點(diǎn)1-240被應(yīng)用層分配,每個(gè)端點(diǎn)是可尋址的。端點(diǎn)的主要作用可以總結(jié)為以下兩個(gè)方面:數(shù)據(jù)的發(fā)送和接收:當(dāng)一個(gè)設(shè)備發(fā)送數(shù)據(jù)時(shí),必須指定發(fā)送目的節(jié)點(diǎn)的長(zhǎng)地址或短地址以及端點(diǎn)來(lái)進(jìn)行數(shù)據(jù)的發(fā)送和接收,并且發(fā)送方和接收方所使用的端點(diǎn)號(hào)必須一致。綁定:如果設(shè)備之間需要綁定,那么在Zigbee的網(wǎng)絡(luò)層必須注冊(cè)一個(gè)或者多個(gè)端點(diǎn)來(lái)進(jìn)行數(shù)據(jù)的發(fā)送和接收以及綁定表的建立。636.6.1端點(diǎn)的管理端點(diǎn)的實(shí)現(xiàn)由端點(diǎn)描述符來(lái)完成,每一個(gè)端點(diǎn)描述符由一個(gè)結(jié)構(gòu)體來(lái)實(shí)現(xiàn),在端點(diǎn)描述符中又包含了一個(gè)簡(jiǎn)單描述符端點(diǎn)描述符簡(jiǎn)單描述符端點(diǎn)的注冊(cè)646.6.1端點(diǎn)的管理端點(diǎn)描述符節(jié)點(diǎn)中每一個(gè)端點(diǎn)都需要一個(gè)端點(diǎn)描述符,此端點(diǎn)描述符結(jié)構(gòu)體定義在AF.h文件中typedefstruct{byteendPoint;byte*task_id;SimpleDescriptionFormat_t*simpleDesc;afNetworkLatencyReq_tlatencyReq;}endPointDesc_t;端點(diǎn)號(hào)1~40,由用戶(hù)定義任務(wù)ID的指針,指向消息的傳遞地址指向端點(diǎn)簡(jiǎn)單描述符的指針必須用noLatencyReqs來(lái)填充

656.6.1端點(diǎn)的管理簡(jiǎn)單描述符每一個(gè)端點(diǎn)必有一個(gè)Zigbee簡(jiǎn)單描述符,其他設(shè)備通過(guò)查詢(xún)這個(gè)端點(diǎn)的簡(jiǎn)單描述符來(lái)獲得設(shè)備的一些信息,端點(diǎn)的簡(jiǎn)單描述符結(jié)構(gòu)體在AF.h文件中定義。typedefstruct{byteEndPoint;uint16AppProfId;uint16AppDeviceId;byteAppDevVer:4;byteReserved:4;byteAppNumInClusters;cId_t*pAppInClusterList;

byteAppNumOutClusters;cId_t*pAppOutClusterList;}SimpleDescriptionFormat_t;端點(diǎn)號(hào)1~40,由用戶(hù)定義支持了端點(diǎn)定義的簇ID其值為0~0xFFFF端點(diǎn)支持的設(shè)備ID其值為0~0xFFFF端點(diǎn)上設(shè)備執(zhí)行的設(shè)備描述版本

端點(diǎn)支持的輸入簇個(gè)數(shù)端點(diǎn)支持的輸出簇個(gè)數(shù)666.6.1端點(diǎn)的管理端點(diǎn)描述符在端點(diǎn)配置成功后需要在AF層注冊(cè)端點(diǎn),用到的函數(shù)是afRegister(),此函數(shù)在AF.c文件中定義。應(yīng)用層將調(diào)用此函數(shù)注冊(cè)一個(gè)新的端點(diǎn)到AF層。

afStatus_tafRegister(endPointDesc_t*epDesc)。參數(shù)描述:epDesc—指向端點(diǎn)描述符的指針。返回值:afStatus_t—如果注冊(cè)成功則返回ZSuccess,否則返回ZcomDef.h中定義的錯(cuò)誤。676.6.2數(shù)據(jù)的發(fā)送和接收Z(yǔ)stack協(xié)議棧數(shù)據(jù)的發(fā)送和接收是通過(guò)數(shù)據(jù)發(fā)送和接收API來(lái)實(shí)現(xiàn)的,數(shù)據(jù)發(fā)送和接收的API在AF層定義686.6.2數(shù)據(jù)的發(fā)送和接收數(shù)據(jù)的發(fā)送數(shù)據(jù)的發(fā)送只要通過(guò)調(diào)用數(shù)據(jù)發(fā)送函數(shù)即可實(shí)現(xiàn),數(shù)據(jù)發(fā)送函數(shù)為AF_DataRequest(),此函數(shù)在AF.c文件中定義。數(shù)據(jù)發(fā)送函數(shù)原型:

afStatus_tAF_DataRequest( afAddrType_t*dstAddr, endPointDesc_t*srcEP, uint16cID,

uint16len, uint8*buf, uint8*transID, uint8options,

uint8radius);696.6.2數(shù)據(jù)的發(fā)送和接收數(shù)據(jù)的發(fā)送發(fā)送代碼示例

706.6.2數(shù)據(jù)的發(fā)送和接收發(fā)送數(shù)據(jù)目的地址在發(fā)送函數(shù)AF_DataRequest()中第一個(gè)參數(shù)是發(fā)送目的地址的信息,目的地址信息為一個(gè)結(jié)構(gòu)體,此結(jié)構(gòu)體在AF.h中定義。typedefstruct{union{uint16shortAddr;ZLongAddr_textAddr;}addr;afAddrMode_taddrMode;byteendPoint;uint16panId;}afAddrType_t;發(fā)送的目的地址:16為短地址或64位長(zhǎng)地址

地址模式:4種

端點(diǎn)

PANID

716.6.2數(shù)據(jù)的發(fā)送和接收發(fā)送數(shù)據(jù)目的地址其中addrMode被定義為枚舉類(lèi)型afAddrMode_t,afAddrMode_t成員定義了發(fā)送信息的四種地址模式,afAddrMode_t在AF.h中定義typedefenum{//間接尋址afAddrNotPresent=AddrNotPresent,//單點(diǎn)尋址,指定短地址

afAddr16Bit=Addr16Bit,//單點(diǎn)尋址,指定長(zhǎng)地址

afAddr64Bit=Addr64Bit,//組尋址

afAddrGroup=AddrGroup,//廣播尋址

afAddrBroadcast=AddrBroadcast}afAddrMode_t;726.6.2數(shù)據(jù)的發(fā)送和接收發(fā)送數(shù)據(jù)目的地址間接尋址:間接尋址多用于綁定。當(dāng)應(yīng)用程序不知道數(shù)據(jù)包的目標(biāo)地址時(shí),將尋址模式設(shè)定為AddrNotPresent。Zstack底層將自動(dòng)從堆棧的綁定表中查找目標(biāo)設(shè)備的具體網(wǎng)絡(luò)地址,這稱(chēng)為源綁定。如果在綁定表中找到多個(gè)設(shè)備,則向每個(gè)設(shè)備都發(fā)送一個(gè)數(shù)據(jù)包的拷貝。

736.6.2數(shù)據(jù)的發(fā)送和接收發(fā)送數(shù)據(jù)目的地址單點(diǎn)尋址:?jiǎn)吸c(diǎn)尋址是標(biāo)準(zhǔn)的尋址模式,是點(diǎn)對(duì)點(diǎn)的通信,它將數(shù)據(jù)包發(fā)送給一個(gè)已知網(wǎng)絡(luò)地址的網(wǎng)絡(luò)設(shè)備,單點(diǎn)尋址由兩種設(shè)置方式:Addr16Bit和Addr64Bit。

當(dāng)尋址方式設(shè)置為Addr16Bit時(shí),afAddrType_t中的目標(biāo)地址addr應(yīng)設(shè)置為shortAddr。當(dāng)尋址方式設(shè)置為Addr64Bit時(shí),afAddrType_t中的目標(biāo)地址addr應(yīng)設(shè)置為extAddr。746.6.2數(shù)據(jù)的發(fā)送和接收發(fā)送數(shù)據(jù)目的地址組尋址:當(dāng)應(yīng)用程序需要將數(shù)據(jù)包發(fā)送給網(wǎng)絡(luò)上的一組設(shè)備時(shí),使用該模式。此時(shí)地址模式設(shè)置為afAddrGroup,并且地址信息結(jié)構(gòu)體afAddrType_t中的目標(biāo)地址addr應(yīng)設(shè)置為組ID。在使用這個(gè)功能之前,必須在網(wǎng)絡(luò)中定義組。

756.6.2數(shù)據(jù)的發(fā)送和接收發(fā)送數(shù)據(jù)目的地址廣播尋址:當(dāng)應(yīng)用程序需要將數(shù)據(jù)包發(fā)送給網(wǎng)絡(luò)中的每一個(gè)設(shè)備時(shí),使用此模式。此時(shí)將地址模式設(shè)置為AddrBrodcast,地址信息結(jié)構(gòu)體afAddrType_t中的目標(biāo)地址addr可以設(shè)置為以下廣播地址中的一種:0xFFFF:如果目的地址為0xFFFF時(shí),數(shù)據(jù)包將被傳送到網(wǎng)絡(luò)上的所有設(shè)備,包括睡眠中的設(shè)備。對(duì)于睡眠中的設(shè)備,數(shù)據(jù)包將被保留在其父節(jié)點(diǎn),直到它蘇醒后主動(dòng)到父節(jié)點(diǎn)查詢(xún),或者直到消息超時(shí)丟失此數(shù)據(jù)包。0xFFFF是廣播模式目標(biāo)地址的默認(rèn)值。0xFFFD:如果目的地址為0xFFFD時(shí)數(shù)據(jù)包將被傳送到網(wǎng)絡(luò)上所有空閑時(shí)打開(kāi)接收的設(shè)備,即除了睡眠中的所有設(shè)備。766.6.2數(shù)據(jù)的發(fā)送和接收發(fā)送數(shù)據(jù)目的地址廣播尋址:當(dāng)應(yīng)用程序需要將數(shù)據(jù)包發(fā)送給網(wǎng)絡(luò)中的每一個(gè)設(shè)備時(shí),使用此模式。此時(shí)將地址模式設(shè)置為AddrBrodcast,地址信息結(jié)構(gòu)體afAddrType_t中的目標(biāo)地址addr可以設(shè)置為以下廣播地址中的一種:0xFFFC:如果目的地址為0xFFFC時(shí),數(shù)據(jù)包發(fā)送給所有的路由器,其中也包括協(xié)調(diào)器。0xFFFE:如果目的地址為0xFFFE時(shí),應(yīng)用層將不指定目標(biāo)設(shè)備,而是通過(guò)協(xié)議棧讀取綁定表獲得相應(yīng)額度目標(biāo)設(shè)備的短地址。776.6.2數(shù)據(jù)的發(fā)送和接收發(fā)送數(shù)據(jù)目的地址廣播尋址地址分配方法786.6.2數(shù)據(jù)的發(fā)送和接收數(shù)據(jù)的接收數(shù)據(jù)包被發(fā)送到一個(gè)登記注冊(cè)過(guò)的端點(diǎn),在應(yīng)用層通過(guò)OSAL事件處理函數(shù)中的接收信息事件AF_INCOMING_MSG_CMD來(lái)處理數(shù)據(jù)的接收。其中數(shù)據(jù)的接收是通過(guò)在AF層定義的結(jié)構(gòu)體afIncomingMSGPacket_t來(lái)進(jìn)行,此結(jié)構(gòu)體定義在AF.h文件中。OSAL消息隊(duì)列

消息的組ID,如果組ID號(hào)為0,即沒(méi)有設(shè)置組尋址

消息的簇ID

源地址信息

目的地址的短地址

端點(diǎn)

接收的數(shù)據(jù)796.6.2數(shù)據(jù)的發(fā)送和接收數(shù)據(jù)的接收在Zstack中,數(shù)據(jù)的接收過(guò)程是通過(guò)判斷afIncomingMSGPacket_t結(jié)構(gòu)體中的clusterId來(lái)進(jìn)行判斷是否為所需要接收的數(shù)據(jù),以下示例為示例6-5的接收部分,首先判斷接收的輸入簇ID是否為發(fā)送函數(shù)的輸出簇ID,然后再判斷是否接收到的數(shù)據(jù)是否為“LED1”,如果是“LED1”,則執(zhí)行LED1閃爍命令,具體實(shí)現(xiàn)如下

806.7ZDO層分析ZDO(TheZigbeeDeviceObjects,即Zigbee設(shè)備對(duì)象)層提供了Zigbee設(shè)備管理功能,包括:網(wǎng)絡(luò)建立,發(fā)現(xiàn)網(wǎng)絡(luò)、加入網(wǎng)絡(luò)、應(yīng)用端點(diǎn)的綁定和安全管理服務(wù)。

ZDP(ZigbeeDeviceProfile,即Zigbee設(shè)備規(guī)范)描述了ZDO內(nèi)部一般性的Zigbee設(shè)備功能是如何實(shí)現(xiàn)的。其定義了相關(guān)的命令和相應(yīng)的函數(shù)。ZDP為ZDO和應(yīng)用程序提供如下功能:

設(shè)備網(wǎng)絡(luò)啟動(dòng)。設(shè)備和服務(wù)發(fā)現(xiàn)。終端設(shè)備綁定、綁定和取消綁定服務(wù)。網(wǎng)絡(luò)管理服務(wù)。816.7.1ZDO網(wǎng)絡(luò)設(shè)備啟動(dòng)ZDApp_Init()

Zigbee網(wǎng)絡(luò)設(shè)備的啟動(dòng)是通過(guò)ZDApp_Init()函數(shù)來(lái)實(shí)現(xiàn)的,ZDApp_Init()函數(shù)在ZDApp.c中定義。voidZDApp_Init(uint8task_id){//保存taskIDZDAppTaskID=task_id;//初始化ZDO網(wǎng)絡(luò)設(shè)備短地址

ZDAppNwkAddr.addrMode=Addr16Bit;ZDAppNwkAddr.addr.shortAddr=INVALID_NODE_ADDR;//獲得長(zhǎng)地址信息

(void)NLME_GetExtAddr();//檢測(cè)到手工設(shè)置SW_1則會(huì)設(shè)置devState=DEV_HOLD,從而避開(kāi)網(wǎng)絡(luò)初始化

ZDAppCheckForHoldKey();//通過(guò)判斷預(yù)編譯器來(lái)開(kāi)啟一些函數(shù)功能

ZDO_Init();//在AF層注冊(cè)端點(diǎn)描述符

afRegister((endPointDesc_t*)&ZDApp_epDesc);//初始化用戶(hù)描述符#ifdefined(ZDO_USERDESC_RESPONSE)ZDApp_InitUserDesc();#endif//設(shè)備是否啟動(dòng)

if(devState!=DEV_HOLD){ZDOInitDevice(0);}else{//閃燈命令

HalLedBlink(HAL_LED_4,0,50,500);}ZDApp_RegisterCBs();}826.7.1ZDO網(wǎng)絡(luò)設(shè)備啟動(dòng)ZDApp_Init()

的判斷是根據(jù)是否定義了“HOLD_AUTO_START”選項(xiàng)來(lái)進(jìn)行的,因?yàn)樵趨f(xié)調(diào)器的程序中沒(méi)有定義HOLD_AUTO_START,所以初始化devStat=DEV_INIT,具體代碼如下:

#ifdefined(HOLD_AUTO_START)devStates_tdevState=DEV_HOLD;#elsedevStates_tdevState=DEV_INIT;#endif836.7.1ZDO網(wǎng)絡(luò)設(shè)備啟動(dòng)ZDOInitDevice()

ZDOInitDevice()函數(shù)用于開(kāi)啟設(shè)備,其函數(shù)原型為uint8ZDOInitDevice(uint16startDelay);

參數(shù):startDelay—設(shè)備啟動(dòng)延時(shí)(毫秒)。返回值有三種:ZDO_INITDEV_RESTORED_NETWORK_STATE,網(wǎng)絡(luò)狀態(tài)為“恢復(fù)”。ZDO_INITDEV_NEW_NETWORK_STATE,網(wǎng)絡(luò)狀態(tài)為“初始化”。ZDO_INITDEV_LEAVE_NOT_STARTED,網(wǎng)絡(luò)狀態(tài)為“未啟動(dòng)”。846.7.2終端設(shè)備綁定、綁定和取消綁定綁定是指兩個(gè)節(jié)點(diǎn)在應(yīng)用層上建立起來(lái)的一條邏輯鏈路。在同一個(gè)節(jié)點(diǎn)上可以建立多個(gè)綁定服務(wù),分別對(duì)應(yīng)不同種類(lèi)的數(shù)據(jù)包,此外,綁定也允許有多個(gè)目標(biāo)設(shè)備。比如在一個(gè)燈控制的網(wǎng)絡(luò)中,有多個(gè)開(kāi)關(guān)和燈光設(shè)備,每個(gè)開(kāi)關(guān)可以控制一個(gè)或多個(gè)燈光設(shè)備。在這種情況下,需要在每個(gè)開(kāi)關(guān)和燈設(shè)備之間建立綁定服務(wù)。這使得開(kāi)關(guān)中的應(yīng)用服務(wù)在不知道燈光設(shè)備確切的目標(biāo)地址時(shí),可以順利地向燈光設(shè)備發(fā)送數(shù)據(jù)

856.7.2終端設(shè)備綁定、綁定和取消綁定綁定的API函數(shù)在ZDO層定義,綁定服務(wù)包括終端設(shè)備綁定、綁定和取消綁定。終端設(shè)備綁定輔助綁定866.7.2終端設(shè)備綁定、綁定和取消綁定終端設(shè)備綁定終端設(shè)備綁定是通過(guò)協(xié)調(diào)器來(lái)實(shí)現(xiàn)的,綁定雙方需要在一定的時(shí)間內(nèi)同時(shí)向協(xié)調(diào)器發(fā)送綁定請(qǐng)求,通過(guò)協(xié)調(diào)器來(lái)建立綁定服務(wù),終端設(shè)備綁定不僅僅只用于“終端節(jié)點(diǎn)”之間的綁定,還可以用于路由器與路由器之間的綁定。其具體過(guò)程如下:

協(xié)調(diào)器首先需要調(diào)用ZDO_RegisterForZDOMsg()函數(shù)在應(yīng)用層注冊(cè)綁定請(qǐng)求信息End_Device_Bind_req。“需要綁定的節(jié)點(diǎn)”即“本地節(jié)點(diǎn)”調(diào)用ZDP_EndDeviceBindReq()函數(shù)發(fā)送終端設(shè)備綁定請(qǐng)求至協(xié)調(diào)器;“需要被綁定的節(jié)點(diǎn)”即“遠(yuǎn)程節(jié)點(diǎn)”必須在規(guī)定時(shí)間內(nèi)(在Zstack協(xié)議棧中規(guī)定為6秒),調(diào)用ZDP_EndDeviceBindReq()函數(shù)發(fā)送終端設(shè)備綁定請(qǐng)求至協(xié)調(diào)器。協(xié)調(diào)器接收到該請(qǐng)求信息后,調(diào)用ZDO_MatchEndDeviceBind()函數(shù)處理終端設(shè)備綁定請(qǐng)求。876.7.2終端設(shè)備綁定、綁定和取消綁定終端設(shè)備綁定終端設(shè)備綁定是通過(guò)協(xié)調(diào)器來(lái)實(shí)現(xiàn)的,綁定雙方需要在一定的時(shí)間內(nèi)同時(shí)向協(xié)調(diào)器發(fā)送綁定請(qǐng)求,通過(guò)協(xié)調(diào)器來(lái)建立綁定服務(wù),終端設(shè)備綁定不僅僅只用于“終端節(jié)點(diǎn)”之間的綁定,還可以用于路由器與路由器之間的綁定。其具體過(guò)程如下:

終端設(shè)備綁定請(qǐng)求信息處理完畢后,協(xié)調(diào)器將調(diào)用ZDP_EndDeviceBindRsp()函數(shù)將反饋信息發(fā)送給“本地節(jié)點(diǎn)”和“遠(yuǎn)程節(jié)點(diǎn)”?!氨镜毓?jié)點(diǎn)”和“遠(yuǎn)程節(jié)點(diǎn)”收到協(xié)調(diào)器的反饋信息后,兩者之間將建立起綁定。

886.7.2終端設(shè)備綁定、綁定和取消綁定ZDO_RegisterForZDOMsg()

協(xié)調(diào)器調(diào)用ZDO_RegisterForZDOMsg()函數(shù)(一般是在用戶(hù)任務(wù)初始化時(shí)調(diào)用)在應(yīng)用層注冊(cè)設(shè)備綁定請(qǐng)求信息End_Device_Bind_req

ZStatus_tZDO_RegisterForZDOMsg(uint8taskID,uint16clusterID);

參數(shù)描述:taskID—任務(wù)ID號(hào);clusterID—需要注冊(cè)的信息,在這里取End_Device_Bind_req。返回值:Zstatus_t是定義在ZcomDef.h中的數(shù)據(jù)類(lèi)型,本質(zhì)上是無(wú)符號(hào)的8位整形,用于描述函數(shù)的返回狀態(tài)。函數(shù)執(zhí)行成功返回SUCCESS,失敗返回Error。896.7.2終端設(shè)備綁定、綁定和取消綁定ZDP_EndDeviceBindRep()“本地節(jié)點(diǎn)”和“遠(yuǎn)程節(jié)點(diǎn)”調(diào)用ZDP_EndDeviceBindRep()函數(shù)將建立和發(fā)送一個(gè)終端設(shè)備綁定請(qǐng)求,在綁定建立之后,“本地節(jié)點(diǎn)”與“遠(yuǎn)程節(jié)點(diǎn)”之間可以相互通信目的地址本地節(jié)點(diǎn)16位短地址應(yīng)用端點(diǎn)應(yīng)用規(guī)范ID輸入簇個(gè)數(shù)輸出簇列表輸出簇個(gè)數(shù)輸出簇列表安全使能位906.7.2終端設(shè)備綁定、綁定和取消綁定ZDP_EndDeviceBindRsp()協(xié)調(diào)器調(diào)用ZDP_EndDeviceBindRsp()函數(shù)來(lái)響應(yīng)終端設(shè)備的綁定請(qǐng)求信息

916.7.2終端設(shè)備綁定、綁定和取消綁定輔助綁定任何一個(gè)設(shè)備和一個(gè)應(yīng)用程序都可以通過(guò)無(wú)線信道向網(wǎng)絡(luò)上的另一個(gè)設(shè)備發(fā)送一個(gè)ZDO消息,幫助其他節(jié)點(diǎn)建立一個(gè)綁定記錄,這稱(chēng)為輔助綁定。輔助綁定是在消息發(fā)向的設(shè)備上建立一個(gè)綁定條目。其綁定過(guò)程如下首先協(xié)調(diào)器在ZDO層注冊(cè)Bind_rsp消息事件;待綁定節(jié)點(diǎn)在ZDO層注冊(cè)Bind_Req消息事件;協(xié)調(diào)器調(diào)用ZDP_BindReq()函數(shù)發(fā)起綁定請(qǐng)求;待綁定節(jié)點(diǎn)接收到綁定請(qǐng)求后,處理綁定請(qǐng)求,建立綁定表,并且通過(guò)調(diào)用函數(shù)ZDP_SendData()發(fā)送響應(yīng)消息至協(xié)調(diào)器;協(xié)調(diào)器接收到綁定反饋消息后調(diào)用函數(shù)ZDMatchSendState()處理綁定反饋信息。926.7.2終端設(shè)備綁定、綁定和取消綁定ZDP_BindReq()通過(guò)調(diào)用ZDP_BindReq()函數(shù)創(chuàng)建和發(fā)送一個(gè)綁定請(qǐng)求,使用此函數(shù)來(lái)請(qǐng)求Zigbee協(xié)調(diào)器基于簇ID綁定的應(yīng)用。

936.7.2終端設(shè)備綁定、綁定和取消綁定ZDP_BindRsp()

調(diào)用函數(shù)ZDP_BindRsp來(lái)響應(yīng)綁定請(qǐng)求

946.7.2終端設(shè)備綁定、綁定和取消綁定解除綁定

解除綁定即通過(guò)發(fā)送一個(gè)信息來(lái)請(qǐng)求Zigbee協(xié)調(diào)器移除一個(gè)綁定,協(xié)調(diào)器通過(guò)解除綁定信息來(lái)響應(yīng)移除請(qǐng)求。解除綁定請(qǐng)求解除綁定響應(yīng)956.7.2終端設(shè)備綁定、綁定和取消綁定解除綁定請(qǐng)求解除綁定請(qǐng)求通過(guò)調(diào)用函數(shù)ZDP_UnbindReq()來(lái)實(shí)現(xiàn)這個(gè)過(guò)程

966.7.2終端設(shè)備綁定、綁定和取消綁定解除綁定響應(yīng)通過(guò)調(diào)用ZDP_UnbindRsp()來(lái)響應(yīng)解除綁定請(qǐng)求

976.8API函數(shù)Zstack協(xié)議棧依靠協(xié)議棧內(nèi)部的OS(即OSAL)才能運(yùn)行起來(lái),OSAL提供以下服務(wù)和管理:信息管理、任務(wù)同步、時(shí)間管理、中斷管理、任務(wù)管理、內(nèi)存管理、電源管理以及非易失存儲(chǔ)管理。下面介紹這些服務(wù)和管理的API函數(shù)。986.8.1信息管理API信息管理API為任務(wù)和處理單元之間的信息交換提供了一種具有不同處理環(huán)境的機(jī)制(例如,在一個(gè)控制循環(huán)中調(diào)用中斷服務(wù)常規(guī)程序或函數(shù))。這個(gè)API中的函數(shù)可以使任務(wù)分配或回收信息緩沖區(qū),給其它任務(wù)發(fā)送命令信息以及接收回復(fù)信息。

osal_msg_allocate()

:這個(gè)函數(shù)被一個(gè)任務(wù)調(diào)用去分配一個(gè)信息緩沖,這個(gè)任務(wù)/函數(shù)將填充這信息并且調(diào)用osal_msg_send()發(fā)送信息到另外一個(gè)任務(wù)中

osal_msg_deallocate()

:此函數(shù)用來(lái)回收一個(gè)信息緩沖區(qū),在完成處理一個(gè)接收信息后這個(gè)函數(shù)被一個(gè)任務(wù)(或處理機(jī)單元)調(diào)用

996.8.1信息管理API信息管理API為任務(wù)和處理單元之間的信息交換提供了一種具有不同處理環(huán)境的機(jī)制(例如,在一個(gè)控制循環(huán)中調(diào)用中斷服務(wù)常規(guī)程序或函數(shù))。這個(gè)API中的函數(shù)可以使任務(wù)分配或回收信息緩沖區(qū),給其它任務(wù)發(fā)送命令信息以及接收回復(fù)信息。

osal_msg_send()

:此函數(shù)的功能是被一個(gè)任務(wù)調(diào)用,給另一個(gè)任務(wù)或處理單元發(fā)送命令或數(shù)據(jù)信息

osal_msg_receive()

:此函數(shù)被一個(gè)任務(wù)調(diào)用來(lái)檢索一條已經(jīng)收到的命令信息。調(diào)用osal_msg_deallocate()處理信息之后,

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論