原创 【原创】ZigBee学习之16——ZStack API解读4

2010-2-7 10:39 2275 6 6 分类: MCU/ 嵌入式

应用支持子层(APS)<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />


应用支持子层提供如下管理功能:


·                     邦定表管理


·                     组表管理


·                     快速地址查找


除了管理功能外,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组表是由分配的RAM[osal_mem_alloc()]定义得链表,因此当组表增加时,OSAL堆也将增加。表定义在nwk_globals.c,通过调整APS_MAX_GROUPS[f8wConfig.cfg]来改变组表的最大大小。用这些API需要包含aps_groups.h头文件。


组表结构体


组:组是用来将一系列节点集合到一个单地址实体的方式。一个数据请求能够到达组中的每个节点。在Zigbee协议中组是可选配置,但是在某些剖面中是必选的,比如家庭自动化剖面。组关注的是一系列设备同时执行一个行为。


typedef struct


{


  uint16 ID;                       // Unique to this table


  uint8  name[APS_GROUP_NAME_LEN]; // Human readable name of group


} aps_Group_t;


ID  -16位的组ID


name    -文本组名(人类语言)APS_GROUP_NAME_LEN为16且不可更改。


组表入口-apsGroupItem_t


组表记录(入口)


typedef struct apsGroupItem


{


  struct apsGroupItem  *next;


  uint8                endpoint;


  aps_Group_t          group;


} apsGroupItem_t;


next    -指向组表的下一个入口(组表为链表结构),推荐使用组表查找和维护函数来遍历组表。


endpoint    -接受消息的终端


group   -组ID和组名


组表维护函数


ZStatus_t aps_AddGroup( uint8 endpoint, aps_Group_t *group );


往组表中添加一个组。先定义aps_Group_t,然后填充这个结构,最后调用此函数来添加。若NV_RESTORE使能,则函数将更新保存到非易失性储存。


返回值:成功则返回ZSuccess,否则返回错误,错误可以是:ZApsDuplicateEntry,ZApsTableFull,ZMemError[ZComDef.h]


uint8 aps_RemoveGroup( uint8 endpoint, uint16 groupID );


移除一个组,若NV_RESTORE使能,则函数将更新保存到非易失性储存。


void aps_RemoveAllGroup( uint8 endpoint );


按给定的参数,移除终端的所有组。


组表查询函数


aps_Group_t *aps_FindGroup( uint8 endpoint, uint16 groupID );


endpoint    -将接收消息的终端


返回值:指向组元件的指针


uint8 aps_FindGroupForEndpoint( uint16 groupID, uint8 lastEP );


从组ID中查找终端,这个函数用来跳过终端,然后返回下一个终端。


lastEP  -返回的终端前要跳过的终端。用APS_GROUPS_FIND_FIRST来指定要查找的第一个终端。


返回终端,或者APS_GROUPS_EP_NOT_FOUND(没有找到或者找到多个)


uint8 aps_FindAllGroupsForEndpoint( uint8 endpoint, uint16 *groupList );


得到一个属于一个组的所有终端。


endpoint    -要查找的终端


groupList   -指向存放终端所有表的空间


uint8 aps_CountGroups( uint8 endpoint );


uint8 aps_CountAllGroups( void );


组表的非易失性储存


若定义了编译选项NV_RESTORE,则当组发生改变时会自动储存。组表的NV初始化和恢复在器件启动时自动执行。若用户应用改变了组表的入口,则必须直接调用Aps_GroupsWriteNV()


void aps_GroupsWriteNV( void )


若是通过正常的组添加,移除函数的调用来更改组表,则不必调用此函数。


快速地址查找


APS提供了一对函数用来做快速地址转换(查找),用这些函数在IEEE和短地址之间作转换。


uint8 APSME_LookupExtAddr(uint16 nwkAddr, uint8* extAddr );


基于短地址查找IEEE扩展地址。


nwkAddr -拥有的短地址,用来查找扩展地址。


extAddr -指向扩展地址存放的缓存


uint8 APSME_LookupNwkAddr( uint8* extAddr, uint16* nwkAddr );

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
6
关闭 站长推荐上一条 /3 下一条