Zigbee協(xié)議網(wǎng)絡(luò)相關(guān)的東西(2)
Zigbee的術(shù)語
重點(diǎn)弄懂它們的從屬關(guān)系,主要包括:節(jié)點(diǎn),設(shè)備,端點(diǎn),簇(群集),屬性。
屬性Attribute是一個(gè)反映物理數(shù)量或狀態(tài)的數(shù)據(jù)值,比如開關(guān)值(On/Off),溫度值、百分比等。
群集Cluster是包含一個(gè)或多個(gè)屬性(attribute)的群組。簡(jiǎn)單的說,群集就是屬性的集合。每個(gè)群集都被分配一個(gè)唯一的群集ID且每個(gè)群集最多有65536個(gè)屬性。設(shè)備描述DeviceDescription是指一個(gè)大型目標(biāo)應(yīng)用的一部分,包括一個(gè)或多個(gè)群集,并且指定群集是輸入還是輸出。描述符有:節(jié)點(diǎn)描述符、電源描述符、簡(jiǎn)單描述符、端點(diǎn)描述符。
端點(diǎn)EndPoint是協(xié)議棧應(yīng)用層的入口,也可以理解應(yīng)用對(duì)象(ApplicationObject)存在的地方,它是為實(shí)現(xiàn)一個(gè)設(shè)備描述而定義的一組群集。(程序中的20吧)每個(gè)ZigBee設(shè)備可以最多支持240這樣的端點(diǎn),這也意味著在每個(gè)設(shè)備上可以定義240個(gè)應(yīng)用對(duì)象。端點(diǎn)0被保留用于與ZDO接口,這是每個(gè)ZigBee設(shè)備必須使用的端點(diǎn),而端點(diǎn)255被保留用于廣播,端點(diǎn)241-254則被保留用于將來做擴(kuò)展使用。
設(shè)備設(shè)備描述 Device Description 是指一個(gè)大型目標(biāo)應(yīng)用的一部分,包括一個(gè)或多個(gè)群集,并且指定群集是輸入還是輸出。描述符有:節(jié)點(diǎn)描述符、電源描述符、簡(jiǎn)單描述符、端點(diǎn)描述符。
節(jié)點(diǎn) Node 也可以理解為一個(gè)容器,包含一組 ZigBee 設(shè)備,分享一個(gè)無線信道。每個(gè)節(jié)點(diǎn)有且只有一個(gè)無線信道使用。
?
綁定問題
在zigaee協(xié)議中定義了一種特殊的操作,叫做綁定(binding)操作。它能夠通過使用ClusterID為不同節(jié)點(diǎn)上的獨(dú)立端點(diǎn)建立一個(gè)邏輯上的連接。
要實(shí)現(xiàn)綁定操作,端點(diǎn)必須向協(xié)調(diào)器發(fā)送綁定請(qǐng)求,協(xié)調(diào)器在有限的時(shí)間間隔內(nèi)接收到兩個(gè)端點(diǎn)的綁定請(qǐng)求后,便通過建立端點(diǎn)之間的綁定表在這兩個(gè)不同的端點(diǎn)之間形成了一個(gè)邏輯鏈路。因此,在綁定后的兩個(gè)端點(diǎn)之間進(jìn)行消息傳送的過程屬于消息的間接傳送。其中一個(gè)端點(diǎn)首先會(huì)將信息發(fā)送到ZigBee協(xié)調(diào)器中,ZigBee協(xié)調(diào)器在接收到消息后會(huì)通過查找綁定表,將消息發(fā)送到與這個(gè)端點(diǎn)相綁定的所有端點(diǎn)中,從而實(shí)現(xiàn)了綁定端點(diǎn)之間的通信。
?
路由協(xié)議(RoutingProtocol)
? ? ? ??當(dāng)路由器從他自身的應(yīng)用程序或者別的設(shè)備那里收到一個(gè)單點(diǎn)發(fā)送的數(shù)據(jù)包,則網(wǎng)絡(luò)層(NWKLayer)根據(jù)一下程序?qū)⑺^續(xù)傳遞下去。如果目標(biāo)節(jié)點(diǎn)是它相鄰路由器中的一個(gè),則數(shù)據(jù)包直接被傳送給目標(biāo)設(shè)備。否則,路由器將要檢索它的路由表中與所要傳送的數(shù)據(jù)包的目標(biāo)地址相符合的記錄。如果存在與目標(biāo)地址相符合的活動(dòng)路由記錄,則數(shù)據(jù)包將被發(fā)送到存儲(chǔ)在記錄中的下一級(jí)地址中去。如果沒有發(fā)現(xiàn)任何相關(guān)的路由記錄,則路由器發(fā)起路徑尋找,數(shù)據(jù)包存儲(chǔ)在緩沖區(qū)中知道路徑尋找結(jié)束。
ZigBee終端節(jié)點(diǎn)不執(zhí)行任何路由功能。終端節(jié)點(diǎn)要向任何一個(gè)設(shè)備傳送數(shù)據(jù)包,它只需簡(jiǎn)單的將數(shù)據(jù)向上發(fā)送給它的父親設(shè)備,由它的父親設(shè)備以它自己的名義執(zhí)行路由。同樣的,任何一個(gè)設(shè)備要給終端節(jié)點(diǎn)發(fā)送數(shù)據(jù),發(fā)起路由尋找,終端節(jié)的的父親節(jié)點(diǎn)都已它的名義來回應(yīng)
注意ZigBee地址分配方案使得對(duì)于任何一個(gè)目標(biāo)設(shè)備,根據(jù)它的地址都可以得到一條路徑。在Z-Stack中,如果萬一正常的路徑尋找過程不能啟動(dòng)的話(通常由于缺少路由表空間),那么Z-Stack擁有自動(dòng)回退機(jī)制
在Z-Stack中,執(zhí)行的路由已經(jīng)優(yōu)化了路由表記錄。通常,每一個(gè)目標(biāo)設(shè)備都需要一條路由表記錄。但是,通過把一定父親節(jié)點(diǎn)記錄與其子所有子結(jié)點(diǎn)的記錄合并,這樣既可以優(yōu)化路徑也可以不喪失任何功能
?
路徑發(fā)現(xiàn)與選擇
路徑發(fā)現(xiàn)是網(wǎng)絡(luò)設(shè)備憑借網(wǎng)絡(luò)相互協(xié)作發(fā)現(xiàn)和建立路徑的一個(gè)過程。路由發(fā)現(xiàn)可以由任意一個(gè)路由設(shè)備發(fā)起,并且對(duì)于某個(gè)特定的目標(biāo)設(shè)備一直執(zhí)行。路徑發(fā)現(xiàn)機(jī)制尋找源地址和目標(biāo)地址之間的所有路徑,并且試圖選擇可能的最好的路徑
路徑選擇就是選擇出可能的最小成本的路徑。每一個(gè)結(jié)點(diǎn)通常持有跟它所有鄰接點(diǎn)的“連接成本(linkcosts)”。通常,連接成本的典型函數(shù)是接收到的信號(hào)的強(qiáng)度。沿著路徑,求出所有連接的連接成本總和,便可以得到整個(gè)路徑的“路徑成本”。路由算法試圖尋找到擁有最小路徑成本的路徑
路徑通過一系列的請(qǐng)求和回復(fù)數(shù)據(jù)包被發(fā)現(xiàn)。源設(shè)備通過向它的所有鄰接節(jié)點(diǎn)廣播一個(gè)路由請(qǐng)求數(shù)據(jù)包,來請(qǐng)求一個(gè)目標(biāo)地址的路徑。當(dāng)一個(gè)節(jié)點(diǎn)接收到RREQ數(shù)據(jù)包,它依次轉(zhuǎn)發(fā)RREQ數(shù)據(jù)包。但是在轉(zhuǎn)發(fā)之前,它要加上最新的連接成本,然后更新RREQ數(shù)據(jù)包中的成本值。這樣,沿著所有它通過的連接,RREQ數(shù)據(jù)包攜帶著連接成本的總和。這個(gè)過程一直持續(xù)到RREQ數(shù)據(jù)包到達(dá)目標(biāo)設(shè)備。通過不同的路由器,許多RREQ副本都將到達(dá)目標(biāo)設(shè)備。目標(biāo)設(shè)備選擇最好的RREQ數(shù)據(jù)包,然后發(fā)回一個(gè)路徑答復(fù)數(shù)據(jù)包(aRouteReply)RREP給源設(shè)備。RREP數(shù)據(jù)包是一個(gè)單點(diǎn)發(fā)送數(shù)據(jù)包,它沿著中間節(jié)點(diǎn)的相反路徑傳送直到它到達(dá)原來發(fā)送請(qǐng)求的節(jié)點(diǎn)為止
?
一旦一條路徑被創(chuàng)建,數(shù)據(jù)包就可以發(fā)送了。當(dāng)一個(gè)結(jié)點(diǎn)與它的下一級(jí)相鄰節(jié)點(diǎn)失去了連接(當(dāng)它發(fā)送數(shù)據(jù)時(shí),沒有收到MACACK),該節(jié)點(diǎn)向所有等待接收它的RREQ數(shù)據(jù)包的節(jié)點(diǎn)發(fā)送一個(gè)RERR數(shù)據(jù)包,將它的路徑設(shè)為無效。各個(gè)結(jié)點(diǎn)根據(jù)收到的數(shù)據(jù)包RREQ、RREP或者RERR來更新它的路由表
?
路徑維護(hù)
中間節(jié)點(diǎn)沿著連接跟蹤傳送失敗,如果一個(gè)連接被認(rèn)定是壞鏈,那么上游節(jié)點(diǎn)將針對(duì)所有使用這條連接的路徑啟動(dòng)路徑修復(fù)。節(jié)點(diǎn)發(fā)起重新發(fā)現(xiàn)直到下一次數(shù)據(jù)包到達(dá)該節(jié)點(diǎn),標(biāo)志路徑修復(fù)完成。如果不能夠啟動(dòng)路徑發(fā)現(xiàn)或者由于某種原因失敗了,節(jié)點(diǎn)則向數(shù)據(jù)包的源節(jié)點(diǎn)發(fā)送一個(gè)路徑錯(cuò)誤包(RERR),它將負(fù)責(zé)啟動(dòng)新路徑的發(fā)現(xiàn)。這兩種方法,路徑都自動(dòng)重建。
?
路徑期滿
路由表為已經(jīng)建立連接路徑的節(jié)點(diǎn)維護(hù)路徑記錄。如果在一定的時(shí)間周期內(nèi),沒有數(shù)據(jù)通過沿著這條路徑發(fā)送,這條路徑將被表示為期滿。期滿的路徑一直保留到它所占用的空間要被使用為止。設(shè)臵ROUTE_EXPIRY_TIME為期滿時(shí)間,單位為秒。如果設(shè)臵為0,則表示關(guān)閉自動(dòng)期滿功能。
?
Z-Stack協(xié)議??傮w設(shè)計(jì)
Z-Stack由main()函數(shù)開始執(zhí)行,main()函數(shù)共做了2件事:一是系統(tǒng)初始化,另外一件是開始執(zhí)行輪轉(zhuǎn)查詢式操作系統(tǒng),
任務(wù)初始化osalInitTasks(void)中的任務(wù)需要與聲明的任務(wù)列表pTaskEventHandlerFn ?tasksArr[]中的順序一致。
設(shè)置事件發(fā)生標(biāo)志。我知道的有兩種方式。
1、osal_set_event(uint8task_id,uint16event_flag)
2、osal_start_timerEx(uint8taskID,uint16event_id,uint16timeout_value)
第一種方法直接設(shè)置標(biāo)志flag置位,第二種方式則等待timeout_value時(shí)間然后再設(shè)置置位。
?
?ZigBee2007協(xié)議棧中使用的各個(gè)層次:
設(shè)備對(duì)象層,即ZDO(ZigBeeDeviceObject)層,提供了管理一個(gè)ZigBee節(jié)點(diǎn)所要使用的功能函數(shù)。ZDOAPI為協(xié)調(diào)器、路由器和終端設(shè)備提供了應(yīng)用端點(diǎn)的管理函數(shù),其中包括:建立、發(fā)現(xiàn)和加入一個(gè)ZigBee網(wǎng)絡(luò),綁定應(yīng)用端點(diǎn)和安全管理。
應(yīng)用框架層,即AF(ApplicationFramework),提供了針對(duì)協(xié)議棧的應(yīng)用端點(diǎn)(EndPoint1~240)和設(shè)備對(duì)象端點(diǎn)(EndPoint0)接口,其中主要包含:設(shè)備描述數(shù)據(jù)結(jié)構(gòu)和數(shù)據(jù)收、發(fā)函數(shù)。在ZigBee應(yīng)用中,提供2種標(biāo)準(zhǔn)服務(wù)類型:鍵值對(duì)(KVP)或報(bào)文(MSG)
應(yīng)用支持子層,即APS(ApplicationSupportSublayer),為設(shè)備對(duì)象和應(yīng)用實(shí)體提供了一系列的支持服務(wù)
網(wǎng)絡(luò)層,即NWK(ZigBeenetwork),為上層提供了管理服務(wù)和數(shù)據(jù)服務(wù)。
介質(zhì)訪問層,即ZMAC,在802.15.4MAC與網(wǎng)絡(luò)層之間提供接口
運(yùn)行 在 ZigBee 協(xié) 議 棧上 的 應(yīng)用 程 序?qū)?際上 就 是廠 商 自定 義的 應(yīng) 用對(duì) 象 ,并 且 遵循 規(guī) 范(profile)運(yùn) 行 在端 點(diǎn) 1~ 240 上 。在 ZigBee 應(yīng) 用中 , 提供 2 種 標(biāo) 準(zhǔn)服 務(wù)類 型 :鍵 值 對(duì)(KVP) 或 報(bào)文 ( MSG)
?
應(yīng)用函數(shù)接口
ZDO
設(shè)備網(wǎng)絡(luò)啟動(dòng)
設(shè)備和服務(wù)發(fā)現(xiàn)
終端設(shè)備綁定、綁定和取消綁定服務(wù)
網(wǎng)絡(luò)管理服務(wù)
?
設(shè)備網(wǎng)絡(luò)啟動(dòng)
ZDApp_Init()—>ZDOInitDevice()
但是如果定義了HOLD_AUTO_START,則不進(jìn)行設(shè)備網(wǎng)絡(luò)啟動(dòng),等待按鍵控制啟動(dòng)
啟動(dòng)過程的要點(diǎn)
?無論是協(xié)調(diào)器還是路由器或是終端設(shè)備,其啟動(dòng)過程至網(wǎng)絡(luò)初始步驟均是一樣的,只是不同設(shè)備的配置文件在編譯時(shí)有所區(qū)別:
協(xié)調(diào)器:F8wCoord.cfg
-DZDO_COORDINATOR ? ? ?// Coordinator Functions
-DRTR_NWK ? ? ? ? ? ? ? ? ? ? ? ? ?// Router Functions
路由器:F8wRouter.cfg
/*RouterSettings*/
-DRTR_NWK//RouterFunctions
終端設(shè)備:F8wEndev.cfg
無
?
對(duì)于協(xié)調(diào)器,在 Workspace 區(qū)域的下拉菜單中選擇 CoordinatorEB-Pro,鼠標(biāo)點(diǎn)擊上方的“ make 按鈕”后,所有文件對(duì)應(yīng)的紅色“ *”將消失,此時(shí)配置文件 f8wCoord.cfg 將被使用, 而 f8wEndev.cfg 和 f8wRouter.cfg 不會(huì)使用。對(duì)于路由和終端也是同樣的配置,唯一不同是,路由情況下f8wRouter.cfg,其它兩個(gè)不使用;終端情況下f8wEndev.cfg,其它兩個(gè)不使用。?
IAR中編譯選項(xiàng),
要為協(xié)調(diào)器工程選項(xiàng)添加一條編譯選項(xiàng)則操作方法是,打開 SampleApp 工 程 后 ,選 中 工 程 名SampleApp-CoordinatorEB,然后根據(jù)工程選項(xiàng)設(shè)置的路徑:Project->Options->C/C++ Compiler->Preprocessor->Defined 。如下圖所示。只需在 Defined symbols 框內(nèi)添加一條新選項(xiàng)即可;要取 消編譯選項(xiàng),只需在該編譯選項(xiàng)的左側(cè)添加“ x”即可。
對(duì)于路由和終端位置相同,只不過以開始分別要workspace下面選RouterEB和EnddeviceEB以切換不同的工程(里面沒有定義ZIGBEEPRO,說明我們的程序使用的是ZIGBEEPRO 2007)
所以說關(guān)于程序編譯的宏定義是兩個(gè)地方綜合的結(jié)果,一個(gè)是IAR選項(xiàng)設(shè)置,另外一個(gè)是.cfg配置文件中的介紹。
?
針對(duì)不同配置文件有
在F8wCoord.cfg中定義了ZDO_COORDINATOR和RTR_NWK
在F8wRouter.cfg中定義了RTR_NWK
在F8wEndev.cfg中沒有做定義。
?
根據(jù)以上配置的定義,在ZGlobals.h中確定了設(shè)備的類型
#if!defined ( ZSTACK_DEVICE_BUILD )
? #if defined ( ZDO_COORDINATOR )
??? #define ZSTACK_DEVICE_BUILD? (DEVICE_BUILD_COORDINATOR)
? #elif defined ( RTR_NWK )
??? #define ZSTACK_DEVICE_BUILD? (DEVICE_BUILD_ROUTER)
? #else
??? #define ZSTACK_DEVICE_BUILD? (DEVICE_BUILD_ENDDEVICE)
? #endif
#endif
?
ZDO 任務(wù)事件處理函數(shù)
這一張表介紹的比較全,建立網(wǎng)絡(luò)過程中用到的各種各樣的函數(shù)
?
?
?
ZigBee 網(wǎng)絡(luò)支持單播、組播和廣播數(shù)據(jù)包。在實(shí)現(xiàn)組播通信時(shí),需要將通信的端點(diǎn)加入到 工作組中。:
grp = aps_FindGroup( SAMPLEAPP_ENDPOINT, SAMPLEAPP_FLASH_GROUP);?如果同在一個(gè)工作組內(nèi),將該端點(diǎn)從工作組中刪除:
aps_RemoveGroup( SAMPLEAPP_ENDPOINT, SAMPLEAPP_FLASH_GROUP );?如果不在該工作組內(nèi),則將該端點(diǎn)加入到工作組中:
aps_AddGroup( SAMPLEAPP_ENDPOINT, &SampleApp_Group );
?
Zigbee終端是不是使用路由,要根據(jù)路徑的優(yōu)化來確定,它會(huì)選擇最優(yōu)的路徑進(jìn)行數(shù)據(jù)的傳輸。
?
MicroWait (n);微秒級(jí)延時(shí)
?
關(guān)于Zigbee的安全與加密
Zigbee規(guī)范定義了信任中心的用途,信任中心是在網(wǎng)絡(luò)分配安全鑰匙的一種令人信任的設(shè)備。Zigbee提供了一套基于128為AES算法的安全類和軟件,并集成802.15.4的安全元素。Zigbee協(xié)議棧類為MAC、網(wǎng)絡(luò)和應(yīng)用層定義了安全性。它的安全服務(wù)包括針對(duì)關(guān)鍵進(jìn)程建立和傳輸、設(shè)備管理和框架保護(hù)的方法。
安全方案有一組在MAC層的幀上所執(zhí)行的操作完成,以提供安全服務(wù),安全方案的名稱表明對(duì)稱加密算法、模式和完整性碼的長(zhǎng)度。
?
CC2530硬件支持128bit的AES加密算法
如何開啟Z-stack中的加密算法。
1、 將f8wConfig.cfg文件中的-DSECURE=1,設(shè)置為1,這個(gè)變量在協(xié)議棧中作為if語句的條件使用,條件為真語句就是開啟加密算法的函數(shù)。
2、 將ZGlobals.c中的uint8 zgPreConfigKeys= FLASE修改為uint8 zgPreConfigKeys = TRUE
3、 準(zhǔn)備一個(gè)key,這個(gè)可以在函數(shù)nwk_global.c中修改,具體是以下數(shù)組
CONST byte defaultKey[SEC_KEY_LEN] =
{
#if defined ( APP_TP ) || defined ( APP_TP2 )
? // Key for ZigBeeConformance Testing
? 0xbb, 0xbb, 0xbb, 0xbb,0xbb, 0xbb, 0xbb, 0xbb,
? 0xaa, 0xaa, 0xaa, 0xaa,0xaa, 0xaa, 0xaa, 0xaa
#else
? // Key for In-HouseTesting
? 0x08, 0x01, 0x02, 0x03,0x04, 0x05, 0x06, 0x07,
? 0x08, 0x09, 0x0A, 0x0B,0x0C, 0x0D, 0x0E, 0x0F
#endif
};
?
如果使用了加密算法后,網(wǎng)絡(luò)中所有設(shè)備都需要開啟這個(gè)算法,且各個(gè)設(shè)備中的key必須相同。
加密算法開啟以后,如果你需要修改代碼,就必須改變你的key,或者是擦除一次你的flash。
?
OSAL維護(hù)了一個(gè)消息隊(duì)列,每個(gè)消息都會(huì)被放到這個(gè)消息隊(duì)列中去,當(dāng)任何接收到事件后,可以從消息隊(duì)列中獲取屬于自己的消息,然后調(diào)用消息處理函數(shù)進(jìn)行相應(yīng)處理即可。
每個(gè)消息都包含一個(gè)消息頭osal_msg_hdr_t和用戶自定義的消息,osal_msg_hdr_t結(jié)構(gòu)體的定義為:
typedef struct
{
??? void? ???*next;
??? uint16?? len;
???uint8??? dest_id;
}osal_msg_hdr_t;