清除脱离网络的 路由节点(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 路由节点丢失后清除 该节点的残余网络信息的更多相关文章

  1. Consul的一个更新:服务端节点故障后重连

    研究了一段时间Consul,想写个攻略来着,但太赖了而且表达能力非正常人...今天发现HashiCorp果然接纳大众意见改了点东西.. 场景是: 假如Consul集群内有三个Server Node 时 ...

  2. js学习总结:DOM节点一(选择器,节点类型)

    DOM:document object model 文档对象模型 DOM就是整个HTML文档的关系图谱(代表整个HTML文档),可以理解为下图: 一.查看元素节点 1.document.getElem ...

  3. es故障节点恢复后加入集群导致删除索引重新出现

    es的每个shard下的文件都可以看做一个完整的lucene文件,shard数据目录下的segment文件包含了索引的分片数量,副本数量.es shard可以恢复,就是因为每个shard都包含了一份数 ...

  4. 探索javascript----获得节点计算后样式

    节点计算后样式是一个属性与属性值的值对对象: IE:    node.currentStyle; 非IE: window.getComputedStyle(node,null); 兼容方式: func ...

  5. rac 11g_第二个节点重启后无法启动实例:磁盘组dismount问题

    原创作品,出自 "深蓝的blog" 博客,欢迎转载,转载时请务必注明以下出处,否则追究版权法律责任. 深蓝的blog:http://blog.csdn.net/huangyanlo ...

  6. 在单链表的第i个位置后插入一个节点(阿里+腾讯等面试题总结)

    时间:2014.04.26 地点:基地 ------------------------- 一.题目 题目是非常easy和基础,就是在单链表的第i个位置后插入一个节点.要求写代码,5分钟之内完毕.面腾 ...

  7. C#TreeView节点选中后失去焦点时改变节点背景色

    C#TreeView节点选中后失去焦点时改变节点背景色 在使用TreeView控件时候,单击一个节点,当鼠标聚焦到别的地方的时候,之前点击的这个节点就看不清楚了 举例截图 单击后           ...

  8. [Erlang14]怎样模拟节点互连后的各种失败情况?

    情景: 当节点群互连时,会通过心跳包检查所连接节点是不是连接正常,这个心跳时间默认为60s,可以通过 net_kernel:set_net_ticktime(600). 来重设这个时间值,怎么测试? ...

  9. 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,求所有操作完毕后,所有节点的值 ...

随机推荐

  1. ubuntu升级内核后vmware-player启动失败

    在虚拟机软件中,vmware player是对硬件支持很好的,通过它可以很方便的使用网银.单片机开发等等工作.但是最近ubuntu每次升级内核后,vmware都会启动失败,提示:Before you ...

  2. Module Zero之角色管理

    返回<Module Zero学习目录> 角色实体 角色管理者 多租户 角色实体 角色实体代表了该应用的一个角色.它应该派生自AbpRole类,如下所示: public class Role ...

  3. 《Entity Framework 6 Recipes》中文翻译系列 (7) -----第二章 实体数据建模基础之拆分实体到多表以及拆分表到多实体

    2-6 拆分实体到多表 问题 你有两张或是更多的表,他们共享一样的主键,你想将他们映射到一个单独的实体. 解决方案 让我们用图2-15所示的两张表来演示这种情况. 图 2-15,两张表,Prodeuc ...

  4. 2016苹果春季发布会 iPhone SE发布

    配置如下 主屏尺寸:4英寸 主屏分辨率:1336x640像素 后置摄像头:1200万像素 前置摄像头:120万像素 电池容量:1624mAh 核心数:双核 操作系统:iOS 9 核心数:双核 CPU: ...

  5. Viewport---响应式 Web 设计----在路上(13)

    什么是 Viewport? viewport 是用户网页的可视区域. viewport 翻译为中文可以叫做"视区". 手机浏览器是把页面放在一个虚拟的"窗口"( ...

  6. css绝对定位如何在不同分辨率下的电脑正常显示定位位置?

    有时候我们在写页面中,会发现绝对定位的父级元素已经相对定位了,但是在不同分辨率的电脑下,绝对定位还是会错乱,似乎父级的相对定位并没有起了作用. 首先要明白如下几个原理: 1.笔记本电脑的分辨率一般为1 ...

  7. ClickOnce部署(2):自动更新

    上次我们说了如何用最基本的方式用ClickOnce技术部署应用程序项目,本篇我们来认识一下如何让应用程序具备自动更新的功能. 我们依然通过实例来学习. 第一步,随便建一个应用程序项目,至于是控制台.W ...

  8. jQuery 2.0.3 源码分析 Deferred概念

    JavaScript编程几乎总是伴随着异步操作,传统的异步操作会在操作完成之后,使用回调函数传回结果,而回调函数中则包含了后续的工作.这也是造成异步编程困难的主要原因:我们一直习惯于“线性”地编写代码 ...

  9. ASP.NET MVC之如何看待内置配置来提高性能优化(四)

    前言 前几篇我们比较基础的讲了下MVC中的知识,这一节我们穿插点知识,讲讲MVC中我们可以提高性能的办法. Razor视图引擎优化(优化一) 我们知道默认情况下配置MVC去解析一个视图会首先约定通过查 ...

  10. iOS UIWebView 拦截点击事件(双击缩放)

    在平时的开发中,要使用到webview,但类似微信的webview在数据没有加载完成的时候 双击屏幕,webview不会缩放,其实实现这个功能很简单 代码是用swift写的 class YYSimpl ...