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