ZigBee學習之繫結表管理函式詳解——ZStack API解讀
阿新 • • 發佈:2019-02-06
應用支援子層(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會呼叫此函式,使用者應用就不需呼叫了。
組表管理
應用支援子層提供如下管理功能:
· 邦定表管理
· 組表管理
· 快速地址查詢
除了管理功能外,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會呼叫此函式,使用者應用就不需呼叫了。
組表管理