ZStack API ----邦定表管理 组表管理

2024-03-16 05:48
文章标签 管理 api zstack 定表 组表

本文主要是介绍ZStack API ----邦定表管理 组表管理,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

http://www.61ic.com/Technology/Communicate/201104/31785.html

 

应用支持子层(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组表是由分配的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 );

 

这篇关于ZStack API ----邦定表管理 组表管理的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/814495

相关文章

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖

软考系统规划与管理师考试证书含金量高吗?

2024年软考系统规划与管理师考试报名时间节点: 报名时间:2024年上半年软考将于3月中旬陆续开始报名 考试时间:上半年5月25日到28日,下半年11月9日到12日 分数线:所有科目成绩均须达到45分以上(包括45分)方可通过考试 成绩查询:可在“中国计算机技术职业资格网”上查询软考成绩 出成绩时间:预计在11月左右 证书领取时间:一般在考试成绩公布后3~4个月,各地领取时间有所不同

安全管理体系化的智慧油站开源了。

AI视频监控平台简介 AI视频监控平台是一款功能强大且简单易用的实时算法视频监控系统。它的愿景是最底层打通各大芯片厂商相互间的壁垒,省去繁琐重复的适配流程,实现芯片、算法、应用的全流程组合,从而大大减少企业级应用约95%的开发成本。用户只需在界面上进行简单的操作,就可以实现全视频的接入及布控。摄像头管理模块用于多种终端设备、智能设备的接入及管理。平台支持包括摄像头等终端感知设备接入,为整个平台提

从状态管理到性能优化:全面解析 Android Compose

文章目录 引言一、Android Compose基本概念1.1 什么是Android Compose?1.2 Compose的优势1.3 如何在项目中使用Compose 二、Compose中的状态管理2.1 状态管理的重要性2.2 Compose中的状态和数据流2.3 使用State和MutableState处理状态2.4 通过ViewModel进行状态管理 三、Compose中的列表和滚动

【LabVIEW学习篇 - 21】:DLL与API的调用

文章目录 DLL与API调用DLLAPIDLL的调用 DLL与API调用 LabVIEW虽然已经足够强大,但不同的语言在不同领域都有着自己的优势,为了强强联合,LabVIEW提供了强大的外部程序接口能力,包括DLL、CIN(C语言接口)、ActiveX、.NET、MATLAB等等。通过DLL可以使用户很方便地调用C、C++、C#、VB等编程语言写的程序以及windows自带的大

如何更优雅地对接第三方API

如何更优雅地对接第三方API 本文所有示例完整代码地址:https://github.com/yu-linfeng/BlogRepositories/tree/master/repositories/third 我们在日常开发过程中,有不少场景会对接第三方的API,例如第三方账号登录,第三方服务等等。第三方服务会提供API或者SDK,我依稀记得早些年Maven还没那么广泛使用,通常要对接第三方

Sentinel 高可用流量管理框架

Sentinel 是面向分布式服务架构的高可用流量防护组件,主要以流量为切入点,从限流、流量整形、熔断降级、系统负载保护、热点防护等多个维度来帮助开发者保障微服务的稳定性。 Sentinel 具有以下特性: 丰富的应用场景:Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景,例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷、集群流量控制、实时熔断下游不可用应

NGINX轻松管理10万长连接 --- 基于2GB内存的CentOS 6.5 x86-64

转自:http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=190176&id=4234854 一 前言 当管理大量连接时,特别是只有少量活跃连接,NGINX有比较好的CPU和RAM利用率,如今是多终端保持在线的时代,更能让NGINX发挥这个优点。本文做一个简单测试,NGINX在一个普通PC虚拟机上维护100k的HTTP

PMBOK® 第六版 规划进度管理

目录 读后感—PMBOK第六版 目录 规划进度管理主要关注为整个项目期间的进度管理提供指南和方向。以下是两个案例,展示了进度管理中的复杂性和潜在的冲突: 案例一:近期,一个长期合作的客户因政策要求,急需我们为多家医院升级一个小功能。在这个过程中出现了三个主要问题: 在双方确认接口协议后,客户私自修改接口并未通知我们,直到催进度时才发现这个问题关于UI设计的部分,后台开发人员未将其传递给

Java基础回顾系列-第五天-高级编程之API类库

Java基础回顾系列-第五天-高级编程之API类库 Java基础类库StringBufferStringBuilderStringCharSequence接口AutoCloseable接口RuntimeSystemCleaner对象克隆 数字操作类Math数学计算类Random随机数生成类BigInteger/BigDecimal大数字操作类 日期操作类DateSimpleDateForma