end device 节点失去父节点的处理方法
来源:互联网 发布:被淘宝永久封号怎么办 编辑:程序博客网 时间:2024/06/08 18:10
在TI的Zstack协议栈中,
End Device(ED)在失去父节点的时候就不会重新入网了,那
么我们该如何处理才能够让ED
重新入网呢?我所能想到的办法有以下几种:
1、入网之后,通过网络管理相关函数获取父节点短地址,然后定时同父节点进行
数据交互,即很多人称之为心跳数据包的方式,如果ED长时间得不到父节点
的ACK,那么就复位自己,方法是调用OnBoard.h中的宏函数SystemReset()。
该函数的实现是通过禁止中断,然后写看门狗,之后死等看门狗复位,具体可
以去看协议栈相关代码。
2、有TI原装开发板的同学(带LCD的),可能会发现在ED节点上加装LCD后,
如果协调器被关掉了,那么会在LCD上显示Assoc Cnf fail,
这说明在我们不人为为ED和其父节点增加心跳包的条件下,网络间一定是在不停地进行着某种
信息的交换。那么我们看看Assoc Cnf fail是哪里来的,用source insight之类的代码阅读工具找一下
Assoc Cnf fail,我们会发现它出现在Nwk_globals.c里面,即:
#if defined ( LCD_SUPPORTED )
const char PingStr[] = "Ping Rcvd from";
const char AssocCnfStr[] = "Assoc Cnf";
const char SuccessStr[] = "Success";
const char EndDeviceStr[] = "EndDevice:";
const char ParentStr[] = "Parent:";
const char ZigbeeCoordStr[] = "ZigBee Coord";
const char NetworkIDStr[] = "Network ID:";
const char RouterStr[] = "Router:";
const char OrphanRspStr[] = "Orphan Response";
const char SentStr[] = "Sent";
const char FailedStr[] = "Failed";
const char AssocRspFailStr[] = "Assoc Rsp fail";
const char AssocIndStr[] = "Assoc Ind";
const char AssocCnfFailStr[] = "Assoc Cnf fail";
const char EnergyLevelStr[] = "Energy Level";
const char ScanFailedStr[] = "Scan Failed";
#endif
我们再找一下AssocCnfFailStr,他出现在Nwk_globals.c里面的一个函数nwk_Status(),该函数的说明指出它的功能是
status report,也就是报告状态的。该函数中的:ase NWK_ERROR_ASSOC_CNF_DENIED: 位置里面是把AssocCnfFailStr
字符串写到LCD上的函数。如果能够看看那个函数调用了nwk_Status()该多好,可惜,调用部分被TI和谐掉了。
更深层次的理解没法子了,但是不影响我们的最终目标。也就是说如果能够在
AssocCnfFailStr被写到LCD上的地方软件复位CC2530就行了。那么好,我们添加一个软件复位函数在这里。这个软件复位函数有现成的可用,即OnBoard.h中的那个SystemReset()。再多做点儿工作,如果你的ED没有LCD,那么编译的时候就不能选择LCD_SUPPORT了,nwk_Status()函数的主实现也没办法执行了。怎么办?为了不破坏协议栈原来代码,我们可以用编译选项来控制一下。即在该函数开始之初添加:
#if defined (MY_BOARD)
switch(statusCode)
{
case NWK_ERROR_ASSOC_CNF_DENIED:
SystemReset();
break;
default:break;
}
#endif
这样就好了,在编译器compiler的预编译选项中添加MY_BOARD,但是不要LCD_SUPPORT,可以了。
采用上面方法,可以在ED失去同父节点联系的时候自动复位ED了。
讨论:
1、 如果你不想在失去联系的时候复位整个CC2530系统,可能系统上带着其它硬件设
备,不能乱复位,那么在调用SystemReset的地方你可以自己实现一个重新入网的寻找过程,而不是复位整个硬件系统;
2、 这个network status的变化ED是如何实现的呢?具体没有找到源码,但是我个人认
为是在ED poll父节点要数据的时候得不到父节点的ack,就认为失去了联系,从而network status 被改变了。
- end device 节点失去父节点的处理方法
- Hibernate merge、update与saveOrUpdate方法的区别
- gethibernatetemplate的find方法大全
- Hibernate discriminator-value用法
- EXECUTE IMMEDIATE
- C# Delegate (一)
- C# Delegate (二)
- DEDE换空间(移机)的详细方法
- MFC API——》PreCreateWindow
- Cannot find or open the PDB file解决方案
- Cookie and Session
- RMI、Hessian、Burlap、Httpinvoker、WebService的比较
- C#中DataGridView控件使用大全
- java_unicode和中文相互转换的工具方法
- Android Intent对应的category类别大全
- TortoiseSVN及Eclipse的svn插件安装使用
- Activity,Window,View的关系
- JAVA中clone方法详解
- Debug PHP with Sublime Text 2 and Xdebug on Ubuntu
- Java 程序员应该了解的 10 个面向对象设计原则
- csv macro
- 快点讲废话刷卡机会
- sqlserver下通用 行转列 函数
- end device 节点失去父节点的处理方法
- SQLite的WAL机制
- Junit4
- ss的sql plus学习笔记(一)
- iOS真机调试证书申请流程
- Android System Service简述
- php自学笔记外传---部分内建函数
- 盘点近年来SEO界的大事件 你知道哪些?
- 91手游网《君王2》资料片礼包炽热发放!