1. 程式人生 > >ZigBee學習之繫結表管理函式詳解——ZStack API解讀

ZigBee學習之繫結表管理函式詳解——ZStack API解讀

應用支援子層(APS) 
應用支援子層提供如下管理功能: 
· 邦定表管理 
· 組表管理 
· 快速地址查詢 
除了管理功能外,APS還提供資料服務,只是應用不能訪問資料服務。應用需要通過AF資料介面AF_DataRequest()來發送資料。如果要使用邦定表函式需要包含BindingTable.h標頭檔案。 
邦定表管理 

請注意,繫結服務只能在“互補”裝置之間建立。那就是,只有分別在兩個節點的簡單描述結構體(simple descriptor structure)中,同時註冊了相同的命令識別符號(command_id)並且方向相反(一個屬於輸出指令“output”,另一個屬於輸入指令“input”),才能成功建立繫結。 
APS邦定表是在靜態RAM中定義的一張表,定義在nwk_globals.c中。表的大小可以通過f8wConfig.cfg中的【NWK_MAX_BINDING_ENTRIES和MAX_BINDING_CLUSTER_IDS】萊配置。只有定義了REFLECTOR或者COORDINATOR_BINDING才能包含此表,用REFLECTOR編譯選項來支援APS層的源邦定。 
邦定表結構 – BindingEntry_t 

typedef struct 

uint16 srcIdx; // Address Manager index 
uint8 srcEP; 
uint8 dstGroupMode; // Destination address type; 0 - Normal address index, 1 - 
// Group address 
uint16 dstIdx; // This field is used in both modes (group and non-group) to 
// save NV and RAM space 
// dstGroupMode = 0 - Address Manager index 
// dstGroupMode = 1 - Group Address 
uint8 dstEP; 
uint8 numClusterIds; 
uint16 clusterIdList【MAX_BINDING_CLUSTER_IDS】; 
// Don‘t use MAX_BINDING_CLUSTERS_ID when 
// using the clusterIdList field. Use 
// gMAX_BINDING_CLUSTER_IDS 
} BindingEntry_t; 
srcIdx –源地址(繫結記錄的源地址)的地址管理器索引,地址管理器儲存著源地址的IEEE地址和短地址。 
srcEP -源終端 
dstGroupMode -目的地址型別。 
0 普通地址 
1 組地址 
dstIdx -若dstGroupMode為0,則包含目的地址的地址管理器索引,若dstGroupMode為1,則包含目的組地址 
dstEP -目的終端 
numClusterIds -clusterIdList中的入口數目 
clusterIdList -簇ID列表。列表的最大數目定義由MAX_BINDING_CLUSTER_IDS 【f8wConfig.cfg】指定 
邦定表維護 

BindingEntry_t *bindAddEntry( zAddrType_t *srcAddr, byte srcEpInt, 
zAddrType_t *dstAddr, byte dstEpInt, 
byte numClusterIds, uint16 *clusterIds ); 
在邦定表中增加一個入口。由於每個入口可以有多個cluster ID,所以此函式有可能僅僅在已有邦定條目上增加cluster ID 
srcAddr -邦定記錄源地址。為Addr16Bit或者Addr64Bit的addr資料結構 
srcEpInt -邦定記錄源終端 
dstAddr -邦定記錄目的地址,為Addr16Bit,Addr64Bit或AddrGroup addrMode,若為AddrGroup則組ID(group ID)填充到addr.shortAddr 
dstEpInt -邦定記錄目標終端,若dstAddr為組地址,則忽略此位 
clusterIds -指向要增加的cluster ID(16位)列表。 
返回值:BindingEntry_t -指向一條新加入的邦定入口 
byte bindRemoveEntry( BindingEntry_t *pBind ); 
pBind -指向邦定表中一個入口的指標 
byte bindRemoveClusterIdFromList( BindingEntry_t *entry, uint16 clusterId ); 
從已存在的邦定表入口的cluster ID列表中移除一個cluster ID。如果至少移除了一個cluster ID則返回真。此函式不檢查引數的正確性。 
entry -指向邦定表的指標 
clusterId -要移除的16位的cluster ID 
byte bindAddClusterIdToList( BindingEntry_t *entry, uint16 clusterId ); 
是上面那個函式的反操作函式 
void bindRemoveDev( zAddrType_t *Addr ); 
移除引數指定的所有邦定表入口,一旦Addr匹配了源地址或者目的地址,則對應的入口將被刪除 
void bindRemoveSrcDev( zAddrType_t *srcAddr, uint8 ep ); 
功能同上,只是限定了終端和源地址的匹配專案 
void bindUpdateAddr( uint16 oldAddr, uint16 newAddr ); 
交換邦定表中的短地址,所有oldAddr將被newAddr取代。 
BindingEntry_t *bindFindExisting( zAddrType_t *srcAddr, byte srcEpInt, 
zAddrType_t *dstAddr, byte dstEpInt ); 
按指定引數查詢一個已存在的邦定表入口。若找到則返回指向此邦定表入口的指標,否則返回NULL。 
byte bindIsClusterIDinList( BindingEntry_t *entry, uint16 clusterId ); 
檢查此cluster ID是否在簇ID列表中。如果在列表中則返回真。 
邦定表統計函式 

byte bindNumBoundTo( zAddrType_t *devAddr, byte devEpInt, byte srcMode ); 
計算符合條件的邦定表入口數目。返回找到的邦定表入口數目。 
devAddr -要查詢的邦定表地址 
devEpInt -終端 
srcMode 
TRUE 查詢源地址,FALSE 查詢目的地址 
uint16 bindNumOfEntries( void ); 
返回邦定表中的條目數,以cluster計數。 
void bindCapacity( uint16 *maxEntries, uint16 *usedEntries ); 
返回邦定表的可能最大數目,和在用的最大數目,以入口記錄計數。 
maxEntries -指向最大入口數目的變數,繫結表的最大入口可以通過 NWK_MAX_BINDING_ENTRIES【f8wConfig.cfg】更改 
usedEntries -指向在用的入口數目的變數 
邦定表的非易失性儲存 

用這些API需要首先設定編譯選項NV_RESTORE【f8wConfig.cfg】,推薦使用者使用BindWriteNV函式,因為binding NV初始化和讀取在裝置啟動的時候會自動執行。 
void BindWriteNV( void ); 
把繫結表寫入非易失性儲存器,如果使用者應用改變了邦定表則可以呼叫此函式。如果邦定表通過ZDO更新,則ZDO會呼叫此函式,使用者應用就不需呼叫了。 
組表管理