ZigBee学习之绑定表管理函数详解——ZStack API解读 (转)
http://blog.163.com/weiqianen@126/blog/static/9204547620101129242921/
应用支持子层(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提供了一对函数用来做快速地址转换(查找),用这些函数在IEEE和短地址之间作转换。
uint8 APSME_LookupExtAddr(uint16 nwkAddr, uint8* extAddr );
基于短地址查找IEEE扩展地址。
nwkAddr -拥有的短地址,用来查找扩展地址。
extAddr -指向扩展地址存放的缓存
uint8 APSME_LookupNwkAddr( uint8* extAddr, uint16* nwkAddr );
谢谢分享
这论坛的都是zigbee高手啊