zigbee 路由节点丢失后清除 该节点的残余网络信息
清除脱离网络的 路由节点(stale device)的 残留在各表中以AssociationDevList为例的残余信息。
如图所示拓扑结构中:
路由器1脱离网络后,通过协调器按键操作来 清除 协调器及路由器2 的关联表中 与路由器1 相关的条目信息。
根据AssociationDevList 条目中的age值来判断 路由节点是否脱离网络,若脱离网络,则先调用AddrMgrEntryGet( ) 获取丢失节点的短地址 和 扩展地址,然后调用NLME_LeaveReq()/AssocRemove()对表中的条目信息进行清除操作。
Z-stack中关联表AssociationDevList 主要存储与该节点有父子关系的相关节点信息,表中信息的 IEEE 地址是唯一的,每个设备加入它的父节点时会在表中添加一个记 录(一个设备掉电重启后 sniffer中显示两个短地址的一个为掉电前短地址另一个为新获取的段地址),但是子节点断电离开网络时不会删除该条记录,如果有多个子节点,频繁更换父节点会造成
AssociatedDevList 表满或溢出,使其它子节点无法加入该父节点,因此需要及时的删除一些已离开的子节点记录。其条目结构体如下:
typedef struct
{
UINT16 shortAddr; // 关联设备的短地址
uint16 addrIdx; // 条目索引号 起始为0
byte nodeRelation; //与该节点的关系
byte devStatus; // 设备状态
byte assocCnt; //联接次数,相同 IEEE 地址连接时会加 1
byte age; //连续未接收link status 的次数(终端设备始终增加)
linkInfo_t linkInfo;
} associated_devices_t;
nodeRelation 可选值如下:
// Node Relations
#define PARENT 0//父节点 一般指协调器
#define CHILD_RFD 1//简功能节点 一般指终端
#define CHILD_RFD_RX_IDLE 2//简功能节点(空闭进 RF 接收开启) 一般指终端
#define CHILD_FFD 3//全功能节点 一般指路由器
#define CHILD_FFD_RX_IDLE 4//全功能节点(空闭进 RF 接收开启) 一般指路由器
#define NEIGHBOR 5//邻居设备
#define OTHER 6//其它设备
#define NOTUSED 0xFF //没有使用
devStatus可选值如下:
#define DEV_LINK_STATUS 0x01 // 活动联接
#define DEV_LINK_REPAIR 0x02 //正在修复联接
#define DEV_SEC_INIT_STATUS 0x04 // 初后的安全
#define DEV_SEC_AUTH_STATUS 0x08 //验正过的安全
/*
* Remove a device from the list. Uses the extended address.
*/
extern byte AssocRemove( byte *extAddr );
能够 移除 关联表 中 所指定扩展地址设备的条目信息;
调用该函数的前提是 获取相关节点的 扩展地址。
/*
* @fn AddrMgrEntryGet
*
* @brief Get NWK address and EXT address based on index.
*
* @param entry
* ::user - [in] user ID //需要输入用户ID
* ::index - [in] index of data //相应表条目 索引号
* ::nwkAddr - [out] NWK address //读取相应条目 的端地址
* ::extAddr - [out] EXT address //读取相应条目的扩展地址
*
* @return uint8 - success(TRUE:FALSE) //返回读取是否成功状态值
*/
extern uint8 AddrMgrEntryGet( AddrMgrEntry_t* entry );
能够根据 索引号 读取关联表、绑定表等表中的短地址和扩展地址;
其中用户ID 主要选择对应的表,其参数为:
// user IDs - use with <AddrMgrEntry_t>
#define ADDRMGR_USER_DEFAULT 0x00 //默认用于读取Assoc
#define ADDRMGR_USER_ASSOC 0x01
#define ADDRMGR_USER_SECURITY 0x02 //用于读取安全相关
#define ADDRMGR_USER_BINDING 0x04 //用于读取绑定表
#define ADDRMGR_USER_PRIVATE1 0x08 //未知
相关代码如下所示:
HalLedSet ( HAL_LED_1, HAL_LED_MODE_TOGGLE );
uint8 _nodeCounter;
uint8 _nodeIndex;
NLME_LeaveReq_t req;
req.extAddr = removeExtAddr;
req.removeChildren = FALSE;
req.rejoin = FALSE;
req.silent = FALSE;
for ( _nodeCounter = 0; _nodeCounter < NWK_MAX_DEVICES; _nodeCounter++ )
{
if ( (AssociatedDevList[_nodeCounter].nodeRelation == CHILD_FFD_RX_IDLE) || (AssociatedDevList[_nodeCounter].nodeRelation == CHILD_FFD)
|| (AssociatedDevList[_nodeCounter].nodeRelation == PARENT))
{
HalLedSet ( HAL_LED_2, HAL_LED_MODE_TOGGLE );
if ( AssociatedDevList[_nodeCounter].age > NWK_ROUTE_AGE_LIMIT )
{
//HalLedSet ( HAL_LED_2, HAL_LED_MODE_TOGGLE );
AddrMgrEntry_t addrEntry;
addrEntry.user = ADDRMGR_USER_DEFAULT;
addrEntry.index = _nodeCounter;
if ( AddrMgrEntryGet( &addrEntry ) )
{
req.extAddr = addrEntry.extAddr;
NLME_LeaveReq(&req);
//通过leave命令 清除 stale device相关条目;
addrIndex = addrEntry.extAddr[0];
//将扩展地址最后一位无线发射做验证;
//AssocRemove( addrEntry.extAddr);
/*****
对外进行广播以清除 活动节点上 丢失节点信息
*****/
Remove_DstAddr.endPoint = 10;
Remove_DstAddr.addr.shortAddr = 0xfffc;
Remove_DstAddr.addrMode = afAddr16Bit;
if ( AF_DataRequest( &Remove_DstAddr, &GenericApp_epDesc,
GENERICAPP_CLUSTERID3,1,&addrIndex, 0,
0, AF_DEFAULT_RADIUS ) == afStatus_SUCCESS )
{
// Successfully requested to be sent.
}
}
}
}
网络中的路由设备接收到该命令后,重复如上代码清除 stale device相关条目信息,对其他表的操作类似。
测试过程中出现的问题:
1.设备丢失后 重新上电 关联表 会更新其短地址,很偶尔的出现一次同一个设备 sniffer的 link status 中显示两个短地址(原因未知);
2.有时使用NLME_LeaveReq()会出现无效的情况,更换为AssocRemove()则没问题 (原因未知);
3.对脱离网络的 终端设备相关条目删除 需要定时 的通报ED在网络中,可参考提供的链接进行尝试;
参考链接:
http://bbs.feibit.com/thread-3841-1-1.html
http://blog.csdn.net/mahaichao540174345/article/details/7973785
http://e2e.ti.com/support/low_power_rf/f/158/p/105319/676645.aspx
zigbee 路由节点丢失后清除 该节点的残余网络信息的更多相关文章
- Consul的一个更新:服务端节点故障后重连
研究了一段时间Consul,想写个攻略来着,但太赖了而且表达能力非正常人...今天发现HashiCorp果然接纳大众意见改了点东西.. 场景是: 假如Consul集群内有三个Server Node 时 ...
- js学习总结:DOM节点一(选择器,节点类型)
DOM:document object model 文档对象模型 DOM就是整个HTML文档的关系图谱(代表整个HTML文档),可以理解为下图: 一.查看元素节点 1.document.getElem ...
- es故障节点恢复后加入集群导致删除索引重新出现
es的每个shard下的文件都可以看做一个完整的lucene文件,shard数据目录下的segment文件包含了索引的分片数量,副本数量.es shard可以恢复,就是因为每个shard都包含了一份数 ...
- 探索javascript----获得节点计算后样式
节点计算后样式是一个属性与属性值的值对对象: IE: node.currentStyle; 非IE: window.getComputedStyle(node,null); 兼容方式: func ...
- rac 11g_第二个节点重启后无法启动实例:磁盘组dismount问题
原创作品,出自 "深蓝的blog" 博客,欢迎转载,转载时请务必注明以下出处,否则追究版权法律责任. 深蓝的blog:http://blog.csdn.net/huangyanlo ...
- 在单链表的第i个位置后插入一个节点(阿里+腾讯等面试题总结)
时间:2014.04.26 地点:基地 ------------------------- 一.题目 题目是非常easy和基础,就是在单链表的第i个位置后插入一个节点.要求写代码,5分钟之内完毕.面腾 ...
- C#TreeView节点选中后失去焦点时改变节点背景色
C#TreeView节点选中后失去焦点时改变节点背景色 在使用TreeView控件时候,单击一个节点,当鼠标聚焦到别的地方的时候,之前点击的这个节点就看不清楚了 举例截图 单击后 ...
- [Erlang14]怎样模拟节点互连后的各种失败情况?
情景: 当节点群互连时,会通过心跳包检查所连接节点是不是连接正常,这个心跳时间默认为60s,可以通过 net_kernel:set_net_ticktime(600). 来重设这个时间值,怎么测试? ...
- CF E. Vasya and a Tree】 dfs+树状数组(给你一棵n个节点的树,每个点有一个权值,初始全为0,m次操作,每次三个数(v, d, x)表示只考虑以v为根的子树,将所有与v点距离小于等于d的点权值全部加上x,求所有操作完毕后,所有节点的值)
题意: 给你一棵n个节点的树,每个点有一个权值,初始全为0,m次操作,每次三个数(v, d, x)表示只考虑以v为根的子树,将所有与v点距离小于等于d的点权值全部加上x,求所有操作完毕后,所有节点的值 ...
随机推荐
- .NET垃圾回收(GC)原理
作为.NET进阶内容的一部分,垃圾回收器(简称GC)是必须了解的内容.本着“通俗易懂”的原则,本文将解释CLR中垃圾回收器的工作原理. 基础知识 托管堆(Managed Heap) 先来看MSDN的解 ...
- 如何使用Worktile进行敏捷项目开发管理
Worktile在任务管理上采用了看板视图,非常适合进行敏捷项目开发管理.事实上,在开发Worktile的过程中,我们也是自产自销,使用Worktile管理Worktile本身的开发过程,在本文中跟大 ...
- Hystrix框架1--入门
介绍 在开发应用中或多或少会依赖各种外界的服务,利用各个服务来完成自己的业务需求,现在流行的微服务架构更是离不开各个服务之间的调用,这就导致整体应用的可用性依赖于各个依赖服务的可用性. 比如一个依赖3 ...
- 人之初,性本动 - G2 2.1 发布
前言 随着可视化进入深水区,G2面临了越来越多交互上的需求.动画是提升交互必不可少的一部分,也是之前G2的薄弱环节.这个版本里我们开发并替换了动画底层,统一了时间轴,使G2的动画性能大大提升,并提供了 ...
- SQL Server DDL触发器运用
一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 基础知识(Rudimentary Knowledge) DDL运用场景(DDL Scene) ...
- MVC4做网站六后台管理:6.2网站信息设置
用来实现网站标题.名称.关键字.描述.版权等信息的设置. 模型字段: 网站的设置信息前后台都要用到,所以要把模型方式Ninesky/Models文件夹中,代码如下: ///////////////// ...
- 图的广度优先搜索(BFS)
把以前写过的图的广度优先搜索分享给大家(C语言版) #include<stdio.h> #include<stdlib.h> #define MAX_VERTEX_NUM 20 ...
- Last-Modified、If-Modified-Since 实现缓存和 OutputCache 的区别
先梳理三个概念: OutputCache:页面输出缓存,一般 ASP.NET 应用程序会用到. Last-Modified:Http 响应头(Http Reponse Header),由服务器发给客户 ...
- geotrellis使用(八)矢量数据栅格化
目录 前言 栅格化处理 总结 参考链接 一.前言 首先前几天学习了一下Markdown,今天将博客园的编辑器改为Markdown,从编写博客到界面美观明显都清爽多了,也能写出各种样式的东 ...
- SPRING多个占位符配置文件解析源码研究--转
原文地址:http://www.cnphp6.com/archives/85639 Spring配置文件: <context:property-placeholder location=&quo ...