1. 程式人生 > >繫結(Binding)——ZigBee協議棧Z-Stack開發指南

繫結(Binding)——ZigBee協議棧Z-Stack開發指南

繫結是一種兩個(或者多個)應用裝置之間資訊流的控制機制。在ZigBee2006釋出版本中,它被稱為資源繫結,所有的裝置都必須執行繫結機制。

繫結允許應用程式傳送一個數據包而不需要知道目標地址。APS層從它的繫結表中確定目標地址,然後將資料繼續向目標應用或者目標組傳送。

注意:在ZigBee的1.0版本中,繫結表是儲存在協調器(Coordinator當中)。現在所有的繫結記錄都儲存在傳送資訊的裝置當中。


3.1建立繫結表(Building a Binding Table)

有三種方法可以建立一個繫結表:

l Zigbee Device Object Bind Request——一個啟動工具可以告訴裝置建立一個繫結記錄

l Zigbee Device Object End Device Bind Request——兩個裝置可以告訴協調器它們想要建立一個繫結表記錄。協調器來協調並在兩個裝置中建立繫結表記錄。

l Device Application——一個裝置上的應用程式建立或者管理一個繫結表


3.1.1ZigBee Device Object Binding Request

任何一個裝置都可以傳送一個ZDO資訊給網路中的另一個裝置,用來建立繫結表。稱之為援助繫結,它可以為一個傳送裝置建立一個繫結記錄。


3.1.1.1啟動申請(The Commissioning Application)

一個應用程式可以通過ZDP_BindReq()函式(在ZDProfile.h),並在繫結表中包含兩個請求(地址和終點)以及想要的群ID。第一個引數(目標dstAddr)是繫結源的短地址即,16位網路地址。

確定你已經在ZDConfig.h允許了這個功能(ZDO_BIND_UNBIND_REQUEST)。

你也可以使用ZDP_UnbindReq()用同樣的引數取消繫結記錄。

目標裝置發回ZigBee Device Object Bind 或者Unbind Response資訊,該資訊是ZDO程式碼根據動作的狀態,通過呼叫ZDApp_BindRsq()或者ZDApp_UnbindRsq()函式來分析和通知ZDApp.c的。

對於繫結響應,從協調器返回的狀態將是ZDP_SUCCESS,ZDP_TABLE_FULL或者ZDP_NOT_SUPPORTED。

對於解除繫結響應,從協調器返回的狀態將是ZDP_SUCCESS,ZDP_NO_ENTRY或者ZDP_NOT_SUPPORTED。


3.1.1.2ZigBee Device Object End Device Bind Request

這個機制是在指定的時間週期(timeout period)內,通過按下選定裝置上的按鈕或者類似的動作來繫結。協調器在指定的時間週期內,蒐集終端裝置的繫結請求資訊,然後以配置ID(Profile ID)和群ID(Cluster ID)協議為基礎,建立一個繫結表記錄作為結果。預設的裝置繫結時間週期(APS_DEFAULT_MAXBINDING_TIME)是16秒鐘(在nwk_globals.h中定義)。但是將它新增到f8wConfig.cfg中,則可以更改。

在“使用者指南”中的應用程式就是一個終端裝置繫結的例子(在每個裝置上按下RIGHT按鍵)。

你應該注意到,所有的例程都有處理關鍵事件的函式(例如:在TransmitApp.c中的TransmitApp_HandleKeys()函式)。這個函式呼叫ZDApp_SendEndDeviceBindReq()(在ZDApp.c中)。這個函式蒐集所有終端節點的請求資訊,然後呼叫ZDP_EndDeviceBindReq()函式將這些資訊傳送給協調器。

協調器呼叫函式ZDP_IncomingData()【ZDProfile.c中】函式接收這些資訊,然後再呼叫ZDApp_ProcessEndDeviceBindReq ()【ZDObject.c中】函式分析這些資訊,最後呼叫ZDApp_EndDeviceBindReqCB【ZDApp.c中】函式,這個函式再呼叫ZDO_MatchEndDeviceBind()【ZDObject.c中】函式來處理這個請求。

當收到兩個匹配的終端裝置繫結請求,協調器在請求裝置中啟動建立源繫結記錄的程序。假設在ZDO終端裝置中發現了匹配的請求,協調器將執行下面的步驟:

l 傳送一個解除繫結請求給第一個裝置。這個終端裝置鎖定程序,這樣解除繫結被首先發送來去掉一個已經存在的繫結記錄。

l 等待ZDO解除繫結的響應,如果響應的狀態是ZDP_NO_ENTRY,則傳送一個ZDO繫結請求在源裝置中建立一個繫結記錄。如果狀態是ZDP_SUCCESS,則繼續前進到第一個裝置的群ID。

l 等待ZDO繫結響應,如果收到了,則繼續前進到第一個裝置的下一個群ID。

l 當地一個裝置完成後,用同樣的方法處理第二個裝置。

l 當第二個裝置也完成之後,傳送ZDO 終端裝置繫結請求訊息給兩個裝置。


3.1.1.3Device Application Binding Manager

另一種進入裝置繫結記錄的方式是應用自己管理繫結表。這就意味著應用程式需要通過呼叫下面的繫結管理函式在本地進入並且刪除繫結記錄:

l bindAddEntry()——在繫結表中增加一個記錄

l bindRemoveEntry()——從繫結表中刪除一個記錄

l bindRomoveClusterIdFromList()——從一個存在的繫結表記錄中刪除一個群ID

l bindAddClusterIdToList()——向一個已經存在的繫結記錄中增加一個群ID

l bindRemoveDev()——刪除所有地址引用的記錄

l bindRemoveSrcDev()——刪除所有源地址引用的記錄

l bindUpdateAddr()——將記錄更新為另一個地址

l bindFindExisting()——查詢一個繫結表記錄

l bindIsClusterIdInList()——在表記錄中檢查一個已經存在的群ID

l bindNumBoundTo()——擁有相同地址(源或者目的)的記錄的個數

l bindNumEntries()——表中記錄的個數

l bindCapacity()——最多允許的記錄個數

l bindWriteNV()——在NV中更新表


3.1.2配置源繫結(Configuring Source Binding)

為了在你的裝置中使能源繫結在f8wConfig.cfg檔案中包含REFLECTOR編譯標誌。同時在f8wConfig.cfg檔案中檢視配置專案NWK_MAX_BINDING_ENTRIES和MAX_BINDING_CLUSTER_IDS。NWK_MAX_BINDING_ENTRIES是限制繫結表中的記錄的最大個數,MAX_BINDING_CLUSTER_IDS是每個繫結記錄的群ID的最大個數。

繫結表在靜態RAM中(未分配),因此繫結表中記錄的個數,每條記錄中群ID的個數都實際影響著使用RAM的數量。每一條繫結記錄是8位元組多(MAX_BINDING_CLUSTER_IDS * 2位元組)。除了繫結表使用的靜態RAM的數量,繫結配置專案也影響地址管理器中的記錄的個數。